226 lines
5.8 KiB
C++
226 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, CScan& 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 ;
|
|
}
|
|
|