016a796188
- permesso utilizzo di pezzi e di copie di pezzi (Duplo) - a SpecialMoveZup aggiunta variabile EMC.FLAG (flag del movimento in rapido).
323 lines
11 KiB
C++
323 lines
11 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2015-2016
|
|
//----------------------------------------------------------------------------
|
|
// File : MachMgrParts.cpp Data : 16.04.15 Versione : 1.6d3
|
|
// Contenuto : Implementazione gestione pezzi della classe MachMgr.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 16.04.15 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "DllMain.h"
|
|
#include "MachMgr.h"
|
|
#include "MachConst.h"
|
|
#include "/EgtDev/Include/EGkGdbIterator.h"
|
|
#include "/EgtDev/Include/EgtPointerOwner.h"
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
MachMgr::GetPartInRawPartCount( int nRawId) const
|
|
{
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return 0 ;
|
|
// conto i gruppi appartenenti al grezzo (sono i pezzi)
|
|
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( m_pGeomDB)) ;
|
|
if ( IsNull( pIter))
|
|
return 0 ;
|
|
int nPartCount = 0 ;
|
|
bool bIter = pIter->GoToFirstGroupInGroup( nRawId) ;
|
|
while ( bIter) {
|
|
++ nPartCount ;
|
|
bIter = pIter->GoToNextGroup() ;
|
|
}
|
|
// ritorno numero dei pezzi nel grezzo
|
|
return nPartCount ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
MachMgr::GetFirstPartInRawPart( int nRawId) const
|
|
{
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return GDB_ID_NULL ;
|
|
// cerco il primo gruppo appartenente al grezzo
|
|
return m_pGeomDB->GetFirstGroupInGroup( nRawId) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
MachMgr::GetNextPartInRawPart( int nId) const
|
|
{
|
|
// verifico validita GeomDB
|
|
if ( m_pGeomDB == nullptr)
|
|
return GDB_ID_NULL ;
|
|
// verifico che il pezzo appartenga ad un grezzo della macchinata corrente
|
|
int nRawId = m_pGeomDB->GetParentId( nId) ;
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return GDB_ID_NULL ;
|
|
// cerco il prossimo gruppo appartenente allo stesso grezzo
|
|
return m_pGeomDB->GetNextGroup( nId) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::AddPartToRawPart( int nPartId, const Point3d& ptPos, int nRawId)
|
|
{
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return false ;
|
|
// verifico che il pezzo sia tale o un duplicato
|
|
if ( ! ExeIsPart( nPartId) && ! ExeIsDuplo( nPartId))
|
|
return false ;
|
|
// recupero il box del solido del grezzo in locale
|
|
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
|
|
BBox3d b3RawSolid ;
|
|
if ( ! m_pGeomDB->GetLocalBBox( nRawSolidId, b3RawSolid))
|
|
return false ;
|
|
// recupero box del pezzo
|
|
BBox3d b3Part ;
|
|
if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part, BBF_EXACT))
|
|
return false ;
|
|
// recupero il riferimento del pezzo
|
|
Frame3d frPart ;
|
|
m_pGeomDB->GetGroupGlobFrame( nPartId, frPart) ;
|
|
// muovo riferimento del pezzo per posizionare correttamente nel grezzo
|
|
Vector3d vtMove = b3RawSolid.GetMin() + ptPos - b3Part.GetMin() ;
|
|
frPart.Translate( vtMove) ;
|
|
// inserisco il pezzo
|
|
int nGroup = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawId, frPart) ;
|
|
if ( nGroup == GDB_ID_NULL ||
|
|
! m_pGeomDB->GroupSwap( nPartId, nGroup, true, true))
|
|
return false ;
|
|
// impongo il livello system al gruppo
|
|
m_pGeomDB->SetLevel( nGroup, GDB_LV_SYSTEM) ;
|
|
// mi assicuro sia visibile il pezzo e nascosto il gruppo
|
|
m_pGeomDB->SetStatus( nPartId, GDB_ST_ON) ;
|
|
m_pGeomDB->SetStatus( nGroup, GDB_ST_OFF) ;
|
|
// gestisco la visualizzazione dei layer legati ai gruppi di lavoro
|
|
UpdateStatusMgoLayers( nPartId, true) ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
MachMgr::GetRawPartFromPart( int nPartId)
|
|
{
|
|
// verifico DB geometrico
|
|
if ( m_pGeomDB == nullptr)
|
|
return false ;
|
|
// recupero l'indice del grezzo
|
|
int nRawId = m_pGeomDB->GetParentId( nPartId) ;
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return GDB_ID_NULL ;
|
|
return nRawId ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::RemovePartFromRawPart( int nPartId)
|
|
{
|
|
// verifico DB geometrico
|
|
if ( m_pGeomDB == nullptr)
|
|
return false ;
|
|
// recupero l'indice del grezzo
|
|
int nRawId = m_pGeomDB->GetParentId( nPartId) ;
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return false ;
|
|
// devo riportare il pezzo in lista generale
|
|
int nBase ;
|
|
if ( m_pGeomDB->GetInfo( nPartId, GDB_SI_BASE, nBase)) {
|
|
// eseguo lo scambio
|
|
m_pGeomDB->GroupSwap( nPartId, nBase, true, true) ;
|
|
// mi assicuro sia nascosto
|
|
m_pGeomDB->SetStatus( nPartId, GDB_ST_OFF) ;
|
|
// nascondo tutti i layer del pezzo legati ai gruppi di lavoro
|
|
UpdateStatusMgoLayers( nPartId, false) ;
|
|
// cancello il gruppo di riferimento
|
|
m_pGeomDB->Erase( nBase) ;
|
|
return true ;
|
|
}
|
|
return false ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::TranslatePartInRawPart( int nPartId, const Vector3d& vtMove)
|
|
{
|
|
// verifico DB geometrico
|
|
if ( m_pGeomDB == nullptr)
|
|
return false ;
|
|
// recupero l'indice del grezzo
|
|
int nRawId = m_pGeomDB->GetParentId( nPartId) ;
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return false ;
|
|
// eseguo traslazione in globale
|
|
return m_pGeomDB->TranslateGlob( nPartId, vtMove) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::RotatePartInRawPart( int nPartId, const Vector3d& vtAx, double dAngRotDeg)
|
|
{
|
|
// verifico DB geometrico
|
|
if ( m_pGeomDB == nullptr)
|
|
return false ;
|
|
// recupero l'indice del grezzo
|
|
int nRawId = m_pGeomDB->GetParentId( nPartId) ;
|
|
// verifica validità grezzo
|
|
if ( ! VerifyRawPart( nRawId))
|
|
return false ;
|
|
// recupero riferimento globale del pezzo
|
|
Frame3d frRef ;
|
|
if ( ! m_pGeomDB->GetGroupGlobFrame( nPartId, frRef))
|
|
return false ;
|
|
// recupero box del pezzo in locale (non cambia con la giacitura globale)
|
|
BBox3d b3Box ;
|
|
if ( ! m_pGeomDB->GetLocalBBox( nPartId, b3Box, BBF_EXACT))
|
|
return false ;
|
|
// ne calcolo il centro e lo porto in globale
|
|
Point3d ptCen ;
|
|
b3Box.GetCenter( ptCen) ;
|
|
ptCen.ToGlob( frRef) ;
|
|
// eseguo rotazione in globale attorno al centro del pezzo
|
|
return m_pGeomDB->RotateGlob( nPartId, ptCen, vtAx, dAngRotDeg) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::SwapParts( bool bToRawPart)
|
|
{
|
|
// recupero il gruppo dei grezzi correnti
|
|
int nRawGroupId = GetCurrRawGroupId() ;
|
|
if ( nRawGroupId == GDB_ID_NULL)
|
|
return true ;
|
|
// ciclo sui grezzi
|
|
int nRawId = m_pGeomDB->GetFirstGroupInGroup( nRawGroupId) ;
|
|
while ( nRawId != GDB_ID_NULL) {
|
|
// sistemo i pezzi del grezzo
|
|
SwapRawPartParts( nRawId, bToRawPart) ;
|
|
// passo al successivo
|
|
nRawId = m_pGeomDB->GetNextGroup( nRawId) ;
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::SwapRawPartParts( int nRawId, bool bToRawPart)
|
|
{
|
|
// ciclo sui gruppi nel grezzo
|
|
int nId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// recupero il successivo
|
|
int nNextId = m_pGeomDB->GetNextGroup( nId) ;
|
|
// eseguo lo swap del pezzo
|
|
SwapRawPartPart( nId, bToRawPart) ;
|
|
// passo al successivo
|
|
nId = nNextId ;
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
MachMgr::SwapRawPartPart( int nId, bool bToRawPart)
|
|
{
|
|
// se devo portare i pezzi dalla radice al grezzo
|
|
if ( bToRawPart) {
|
|
// se è un riferimento al pezzo
|
|
int nSou ;
|
|
if ( m_pGeomDB->GetInfo( nId, GDB_SI_SOURCE, nSou)) {
|
|
m_pGeomDB->GroupSwap( nSou, nId, true, true) ;
|
|
// mi assicuro sia visibile
|
|
int nMode = GDB_MD_STD ; m_pGeomDB->GetMode( nSou, nMode) ;
|
|
if ( nMode != GDB_MD_STD) {
|
|
m_pGeomDB->SetMode( nSou, GDB_MD_STD) ;
|
|
m_pGeomDB->SetInfo( nSou, GDB_SI_DRAWMODE, nMode) ;
|
|
}
|
|
m_pGeomDB->SetStatus( nSou, GDB_ST_ON) ;
|
|
// gestisco la visualizzazione dei layer legati ai gruppi di lavoro
|
|
UpdateStatusMgoLayers( nSou, bToRawPart) ;
|
|
return nSou ;
|
|
}
|
|
}
|
|
// altrimenti dal grezzo alla radice
|
|
else {
|
|
// se è un pezzo spostato
|
|
int nBase ;
|
|
if ( m_pGeomDB->GetInfo( nId, GDB_SI_BASE, nBase)) {
|
|
m_pGeomDB->GroupSwap( nId, nBase, true, true) ;
|
|
// se necessario, ripristino il modo precedente
|
|
int nMode ;
|
|
if ( m_pGeomDB->GetInfo( nId, GDB_SI_DRAWMODE, nMode)) {
|
|
m_pGeomDB->RemoveInfo( nId, GDB_SI_DRAWMODE) ;
|
|
m_pGeomDB->SetMode( nId, nMode) ;
|
|
}
|
|
// mi assicuro sia nascosto e di livello utente
|
|
m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ;
|
|
m_pGeomDB->SetLevel( nId, GDB_LV_USER) ;
|
|
// nascondo tutti i layer del pezzo legati ai gruppi di lavoro
|
|
UpdateStatusMgoLayers( nId, bToRawPart) ;
|
|
return nBase ;
|
|
}
|
|
}
|
|
return GDB_ID_NULL ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::UpdateStatusMgoLayers( int nPartId, bool bToRawPart)
|
|
{
|
|
// se dalla radice al grezzo
|
|
if ( bToRawPart) {
|
|
// gestisco la visualizzazione dei layer legati ai gruppi di lavoro
|
|
int nLayId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
|
while ( nLayId != GDB_ID_NULL) {
|
|
int nMgoId ;
|
|
if ( m_pGeomDB->GetInfo( nLayId, GDB_SI_MGRPONLY, nMgoId))
|
|
m_pGeomDB->SetStatus( nLayId, ( nMgoId == m_nCurrMGrpId ? GDB_ST_ON : GDB_ST_OFF)) ;
|
|
nLayId = m_pGeomDB->GetNextGroup( nLayId) ;
|
|
}
|
|
}
|
|
// altrimenti dal grezzo alla radice
|
|
else {
|
|
// nascondo tutti i layer del pezzo legati ai gruppi di lavoro
|
|
int nLayId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
|
while ( nLayId != GDB_ID_NULL) {
|
|
if ( m_pGeomDB->ExistsInfo( nLayId, GDB_SI_MGRPONLY))
|
|
m_pGeomDB->SetStatus( nLayId, GDB_ST_OFF) ;
|
|
nLayId = m_pGeomDB->GetNextGroup( nLayId) ;
|
|
}
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
MachMgr::ShowRootParts( bool bShow)
|
|
{
|
|
// ciclo sui gruppi in radice
|
|
int nId = m_pGeomDB->GetFirstGroupInGroup( GDB_ID_ROOT) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// se pezzo, lo nascondo
|
|
int nLevel ;
|
|
if ( m_pGeomDB->GetCalcLevel( nId, nLevel) && nLevel == GDB_LV_USER)
|
|
m_pGeomDB->SetStatus( nId, ( bShow ? GDB_ST_ON : GDB_ST_OFF)) ;
|
|
// passo al successivo
|
|
nId = m_pGeomDB->GetNextGroup( nId) ;
|
|
}
|
|
return true ;
|
|
}
|