Files
EgtMachKernel/MachMgrParts.cpp
T
Dario Sassi 016a796188 EgtMachKernel 2.3b1 :
- permesso utilizzo di pezzi e di copie di pezzi (Duplo)
- a SpecialMoveZup aggiunta variabile EMC.FLAG (flag del movimento in rapido).
2021-02-08 08:43:03 +00:00

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 ;
}