EgtGeomKernel 1.5c1 :
- aggiunta prima gestione attributi.
This commit is contained in:
+88
-65
@@ -13,22 +13,22 @@
|
||||
|
||||
//--------------------------- Include ----------------------------------------
|
||||
#include "stdafx.h"
|
||||
#include "\EgtDev\Include\EGnStringUtils.h"
|
||||
#include "GdbGroup.h"
|
||||
#include "IdManager.h"
|
||||
|
||||
#include "\EgtDev\Include\EGnStringUtils.h"
|
||||
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
GdbGroup::GdbGroup( void)
|
||||
: m_nNodeCount( 0), m_pFirstNode( nullptr), m_pLastNode( nullptr)
|
||||
: m_nObjCount( 0), m_pFirstObj( nullptr), m_pLastObj( nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
GdbGroup::~GdbGroup( void)
|
||||
{
|
||||
// elimino i figli
|
||||
Clear() ;
|
||||
}
|
||||
|
||||
@@ -36,18 +36,16 @@ GdbGroup::~GdbGroup( void)
|
||||
bool
|
||||
GdbGroup::Clear( void)
|
||||
{
|
||||
GdbNode* pNode ;
|
||||
|
||||
|
||||
// disalloco gli oggetti
|
||||
pNode = GetFirstNode() ;
|
||||
while ( pNode != nullptr) {
|
||||
GdbObj* pObj ;
|
||||
pObj = GetFirstObj() ;
|
||||
while ( pObj != nullptr) {
|
||||
// lo rimuovo dalla lista
|
||||
pNode->Remove() ;
|
||||
pObj->Remove() ;
|
||||
// lo disalloco
|
||||
delete pNode ;
|
||||
delete pObj ;
|
||||
// passo al nuovo primo
|
||||
pNode = GetFirstNode() ;
|
||||
pObj = GetFirstObj() ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
@@ -57,41 +55,44 @@ GdbGroup::Clear( void)
|
||||
GdbGroup*
|
||||
GdbGroup::Clone( int nId, IdManager& IdMgr) const
|
||||
{
|
||||
GdbGroup* pGdbGroup ;
|
||||
const GdbNode* pNode ;
|
||||
GdbNode* pNewNode ;
|
||||
|
||||
|
||||
// alloco gruppo Gdb
|
||||
GdbGroup* pGdbGroup ;
|
||||
pGdbGroup = new(nothrow) GdbGroup ;
|
||||
if ( pGdbGroup == nullptr)
|
||||
return nullptr ;
|
||||
|
||||
// copio dati oggetto Gdb
|
||||
pGdbGroup->GdbObj::Copy( this) ;
|
||||
|
||||
// assegno nuovo Id
|
||||
pGdbGroup->m_nId = nId ;
|
||||
IdMgr.UpdateMaxId( nId) ;
|
||||
|
||||
// copio dati gruppo
|
||||
pGdbGroup->m_gfrFrame = m_gfrFrame ;
|
||||
|
||||
// clono i nodi figli
|
||||
pNode = GetFirstNode() ;
|
||||
while ( pNode != nullptr) {
|
||||
// clono gli oggetti figli
|
||||
const GdbObj* pObj = GetFirstObj() ;
|
||||
while ( pObj != nullptr) {
|
||||
// eseguo copia
|
||||
pNewNode = pNode->Clone( IdMgr.GetNewId(), IdMgr) ;
|
||||
if ( pNewNode == nullptr) {
|
||||
GdbObj* pNewObj = pObj->Clone( IdMgr.GetNewId(), IdMgr) ;
|
||||
if ( pNewObj == nullptr) {
|
||||
delete pGdbGroup ;
|
||||
return nullptr ;
|
||||
}
|
||||
// lo inserisco nella lista dei figli
|
||||
if ( ! pNewNode->AddTail( pGdbGroup)) {
|
||||
delete pNewNode ;
|
||||
if ( ! pNewObj->AddTail( pGdbGroup)) {
|
||||
delete pNewObj ;
|
||||
delete pGdbGroup ;
|
||||
return nullptr ;
|
||||
}
|
||||
// lo inserisco nella mappa dei nomi
|
||||
if ( ! IdMgr.AddNode( pNewNode->m_nId, pNewNode))
|
||||
// lo inserisco nella mappa degli Id
|
||||
if ( ! IdMgr.AddObj( pNewObj->m_nId, pNewObj)) {
|
||||
delete pGdbGroup ;
|
||||
return nullptr ;
|
||||
// passo al prossimo nodo
|
||||
pNode = pNode->GetNext() ;
|
||||
}
|
||||
// passo al prossimo oggetto
|
||||
pObj = pObj->GetNext() ;
|
||||
}
|
||||
|
||||
return pGdbGroup ;
|
||||
@@ -107,15 +108,22 @@ GdbGroup::Save( std::ostream& osOut) const
|
||||
osOut << GetKey() << endl ;
|
||||
// identificativi
|
||||
osOut << m_nId << "@" << GetParentId() << endl ;
|
||||
// dati del riferimento
|
||||
m_gfrFrame.Save( osOut) ;
|
||||
|
||||
// lancio il salvataggio dei figli
|
||||
const GdbNode* pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
if ( ! pGdbNode->Save( osOut))
|
||||
// attributi
|
||||
if ( ! GdbObj::SaveAttribs( osOut))
|
||||
bOk = false ;
|
||||
|
||||
// dati del riferimento
|
||||
osOut << "G" << endl ;
|
||||
if ( ! m_gfrFrame.Save( osOut))
|
||||
bOk = false ;
|
||||
|
||||
// salvataggio dei figli
|
||||
const GdbObj* pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
if ( ! pGdbObj->Save( osOut))
|
||||
bOk = false ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -143,6 +151,24 @@ GdbGroup::Load( const string& sType, Scanner& TheScanner, int& nParentId)
|
||||
// assegno l'Id del padre
|
||||
if ( ! FromString( vsParams[1], nParentId))
|
||||
return false ;
|
||||
|
||||
// leggo la prossima linea
|
||||
if ( ! TheScanner.GetLine( sLine))
|
||||
return false ;
|
||||
|
||||
// eventuali attributi
|
||||
if ( sLine == "A") {
|
||||
if ( ! GdbObj::LoadAttribs( TheScanner))
|
||||
return false ;
|
||||
// leggo la prossima linea
|
||||
if ( ! TheScanner.GetLine( sLine))
|
||||
return false ;
|
||||
}
|
||||
|
||||
// verifico inizio dati geometrici
|
||||
if ( sLine != "G")
|
||||
return false ;
|
||||
|
||||
// leggo i dati del riferimento
|
||||
m_gfrFrame.Load( TheScanner) ;
|
||||
|
||||
@@ -154,13 +180,13 @@ bool
|
||||
GdbGroup::GetLocalBBox( BBox3d& b3Loc) const
|
||||
{
|
||||
b3Loc.Reset() ;
|
||||
const GdbNode* pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
const GdbObj* pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
BBox3d b3B ;
|
||||
// voglio il box come appare nel frame del gruppo, quindi passo frame identità
|
||||
if ( pGdbNode->GetBBox( GLOB_FRM, b3B))
|
||||
if ( pGdbObj->GetBBox( GLOB_FRM, b3B))
|
||||
b3Loc.Add( b3B) ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -171,12 +197,12 @@ GdbGroup::GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const
|
||||
{
|
||||
Frame3d frCurr = m_gfrFrame.m_frF * frRef ;
|
||||
b3Ref.Reset() ;
|
||||
const GdbNode* pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
const GdbObj* pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
BBox3d b3B ;
|
||||
if ( pGdbNode->GetBBox( frCurr, b3B))
|
||||
if ( pGdbObj->GetBBox( frCurr, b3B))
|
||||
b3Ref.Add( b3B) ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -199,20 +225,20 @@ GdbGroup::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, dou
|
||||
bool
|
||||
GdbGroup::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
|
||||
{
|
||||
GdbNode* pGdbNode ;
|
||||
GdbObj* pGdbObj ;
|
||||
|
||||
|
||||
// parziale scalatura del riferimento (non può essere completa)
|
||||
Frame3d frFrameS = m_gfrFrame.m_frF ;
|
||||
frFrameS.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
|
||||
|
||||
// porto i nodi nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
// porto gli oggetti nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
Frame3d frTrasf = m_gfrFrame.m_frF ;
|
||||
frTrasf.ToLoc( frFrameS) ;
|
||||
pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
pGdbNode->ToGlob( frTrasf) ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
pGdbObj->ToGlob( frTrasf) ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
// assegno il nuovo riferimento
|
||||
@@ -224,11 +250,11 @@ GdbGroup::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dC
|
||||
|
||||
// ciclo sui nodi
|
||||
bool bOk = true ;
|
||||
pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
if ( ! pGdbNode->Scale( frRefLoc, dCoeffX, dCoeffY, dCoeffZ))
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
if ( ! pGdbObj->Scale( frRefLoc, dCoeffX, dCoeffY, dCoeffZ))
|
||||
bOk = false ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -238,7 +264,7 @@ GdbGroup::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dC
|
||||
bool
|
||||
GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
{
|
||||
GdbNode* pGdbNode ;
|
||||
GdbObj* pGdbObj ;
|
||||
|
||||
|
||||
// parziale mirror del riferimento (non può essere completa)
|
||||
@@ -248,10 +274,10 @@ GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
// porto i nodi nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
Frame3d frTrasf = m_gfrFrame.m_frF ;
|
||||
frTrasf.ToLoc( frFrameS) ;
|
||||
pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
pGdbNode->ToGlob( frTrasf) ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
pGdbObj->ToGlob( frTrasf) ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
// assegno il nuovo riferimento
|
||||
@@ -265,11 +291,11 @@ GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
|
||||
// ciclo sui nodi
|
||||
bool bOk = true ;
|
||||
pGdbNode = GetFirstNode() ;
|
||||
while ( pGdbNode != nullptr) {
|
||||
if ( ! pGdbNode->Mirror( ptOnLoc, vtNormLoc))
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
if ( ! pGdbObj->Mirror( ptOnLoc, vtNormLoc))
|
||||
bOk = false ;
|
||||
pGdbNode = pGdbNode->GetNext() ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -279,13 +305,11 @@ GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
bool
|
||||
GdbGroup::GetGlobFrame( Frame3d& frGlob) const
|
||||
{
|
||||
const GdbGroup* pParent ;
|
||||
|
||||
|
||||
// assegno il proprio frame
|
||||
frGlob = m_gfrFrame.m_frF ;
|
||||
|
||||
// mentre ci sono padri
|
||||
const GdbGroup* pParent ;
|
||||
pParent = GetParent() ;
|
||||
while ( pParent != nullptr) {
|
||||
// porto il riferimento corrente sopra il padre
|
||||
@@ -296,4 +320,3 @@ GdbGroup::GetGlobFrame( Frame3d& frGlob) const
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user