Files
EgtGeomKernel/GdbGroup.cpp
T
Dario Sassi b4f2770eb8 EgtGeomKernel : Aggiunta prima versione distanza punto-arco.
Migliorie varie nei costruttori.
2014-01-02 07:54:39 +00:00

224 lines
5.8 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : GdbGroup.cpp Data : 28.11.13 Versione : 1.4a2
// Contenuto : Implementazione della classe GdbGroup.
//
//
//
// Modifiche : 28.11.13 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "\EgtDev\Include\EGnStringUtils.h"
#include "GdbGroup.h"
#include "IdManager.h"
using namespace std ;
//----------------------------------------------------------------------------
GdbGroup::GdbGroup( void)
: m_nNodeCount( 0), m_pFirstNode( nullptr), m_pLastNode( nullptr)
{
}
//----------------------------------------------------------------------------
GdbGroup::~GdbGroup( void)
{
Clear() ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Clear( void)
{
GdbNode* pNode ;
// disalloco gli oggetti
pNode = GetFirstNode() ;
while ( pNode != nullptr) {
// lo rimuovo dalla lista
pNode->Remove() ;
// lo disalloco
delete pNode ;
// passo al nuovo primo
pNode = GetFirstNode() ;
}
return true ;
}
//----------------------------------------------------------------------------
GdbGroup*
GdbGroup::Clone( int nId, IdManager& IdMgr) const
{
GdbGroup* pGdbGroup ;
const GdbNode* pNode ;
GdbNode* pNewNode ;
// alloco gruppo Gdb
pGdbGroup = new(nothrow) GdbGroup ;
if ( pGdbGroup == nullptr)
return nullptr ;
// copio dati oggetto Gdb
pGdbGroup->m_nId = nId ;
IdMgr.UpdateMaxId( nId) ;
pGdbGroup->m_gfrFrame = m_gfrFrame ;
// clono i nodi figli
pNode = GetFirstNode() ;
while ( pNode != nullptr) {
// eseguo copia
pNewNode = pNode->Clone( IdMgr.GetNewId(), IdMgr) ;
if ( pNewNode == nullptr) {
delete pGdbGroup ;
return nullptr ;
}
// lo inserisco nella lista dei figli
if ( ! pNewNode->AddTail( pGdbGroup)) {
delete pNewNode ;
delete pGdbGroup ;
return nullptr ;
}
// lo inserisco nella mappa dei nomi
if ( ! IdMgr.AddNode( pNewNode->m_nId, pNewNode))
return nullptr ;
// passo al prossimo nodo
pNode = pNode->GetNext() ;
}
return pGdbGroup ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Save( std::ostream& osOut) const
{
bool bOk = true ;
// tipo entità
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))
bOk = false ;
pGdbNode = pGdbNode->GetNext() ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Load( const string& sType, Scanner& TheScanner, int& nParentId)
{
string sLine ;
STRVECTOR vsParams ;
// leggo la prossima linea
if ( ! TheScanner.GetLine( sLine))
return false ;
// la divido in parametri
Tokenize( sLine, "@", vsParams) ;
// 2 parametri : Id e ParentId
if ( vsParams.size() != 2)
return false ;
// assegno l'identificativo
if ( ! FromString( vsParams[0], m_nId))
return false ;
// assegno l'Id del padre
if ( ! FromString( vsParams[1], nParentId))
return false ;
// leggo i dati del riferimento
m_gfrFrame.Load( TheScanner) ;
return true ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Translate( const Vector3d& vtMove)
{
return m_gfrFrame.Translate( vtMove) ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
{
return m_gfrFrame.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::Scale( const Point3d& ptCen, double dCoeffX, double dCoeffY, double dCoeffZ)
{
bool bOk ;
bool bUniform ;
Point3d ptCenLoc ;
GdbNode* pGdbNode ;
// non è possibile scalare il riferimento, devo agire sui nodi sottostanti
// determino se la scalatura è uniforme
bUniform = fabs( dCoeffX - dCoeffY) < EPS_SMALL && fabs( dCoeffX - dCoeffZ) < EPS_SMALL ;
// se la scalatura è uniforme, basta portare il centro nel riferimento del gruppo
//if ( bUniform) {
ptCenLoc = ptCen ;
ptCenLoc.ToLoc( m_gfrFrame.m_frF) ;
// }
//// altrimenti si deve propagare il riferimento rispetto al centro
// else
// return false ; // !!!!! TODO !!!!!
// ciclo sui nodi
bOk = true ;
pGdbNode = GetFirstNode() ;
while ( pGdbNode != nullptr) {
if ( ! pGdbNode->Scale( ptCenLoc, dCoeffX, dCoeffY, dCoeffZ))
bOk = false ;
pGdbNode = pGdbNode->GetNext() ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
GdbGroup::GetGlobFrame( Frame3d& frGlob)
{
GdbGroup* pParent ;
// assegno il proprio frame
frGlob = m_gfrFrame.m_frF ;
// mentre ci sono padri
pParent = GetParent() ;
while ( pParent != nullptr) {
// porto il riferimento corrente sopra il padre
frGlob.ToGlob( pParent->m_gfrFrame.m_frF) ;
// passo al successivo
pParent = pParent->GetParent() ;
}
return true ;
}