EgtGeomKernel 1.5g4 :
- aggiunto calcolo Biarchi da condizioni tipo Hermite - aggiunta AngleInSpan - migliorata gestione riferimento di gruppi - corrette trasformazioni GeoVector3d per punto base.
This commit is contained in:
+40
-75
@@ -71,7 +71,7 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const
|
||||
IdMgr.UpdateMaxId( nId) ;
|
||||
|
||||
// copio dati gruppo
|
||||
pGdbGroup->m_gfrFrame = m_gfrFrame ;
|
||||
pGdbGroup->m_frF = m_frF ;
|
||||
|
||||
// clono gli oggetti figli
|
||||
const GdbObj* pObj = GetFirstObj() ;
|
||||
@@ -123,7 +123,7 @@ GdbGroup::Save( NgeWriter& ngeOut) const
|
||||
if ( ! ngeOut.WriteInt( GDB_ID_NULL, nullptr, true))
|
||||
return false ;
|
||||
// frame
|
||||
if ( ! m_gfrFrame.Save( ngeOut))
|
||||
if ( ! ngeOut.WriteFrame( m_frF, ";", true))
|
||||
return false ;
|
||||
|
||||
// salvataggio dei figli
|
||||
@@ -171,7 +171,7 @@ GdbGroup::Load( int nNgeId, NgeReader& ngeIn, int& nParentId)
|
||||
return false ;
|
||||
|
||||
// leggo i dati del riferimento
|
||||
return m_gfrFrame.Load( ngeIn) ;
|
||||
return ngeIn.ReadFrame( m_frF, ";", true) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -233,7 +233,7 @@ GdbGroup::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag, int nLev) con
|
||||
return true ;
|
||||
}
|
||||
// ciclo sui figli
|
||||
Frame3d frCurr = m_gfrFrame.GetFrame() * frRef ;
|
||||
Frame3d frCurr = m_frF * frRef ;
|
||||
const GdbObj* pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
BBox3d b3B ;
|
||||
@@ -244,54 +244,33 @@ GdbGroup::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag, int nLev) con
|
||||
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 Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
|
||||
{
|
||||
GdbObj* pGdbObj ;
|
||||
|
||||
|
||||
// parziale scalatura del riferimento (non può essere completa)
|
||||
Frame3d frFrameS = m_gfrFrame.GetFrame() ;
|
||||
frFrameS.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
|
||||
Frame3d frTrasf = m_frF ;
|
||||
m_frF.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
|
||||
|
||||
// porto gli oggetti nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
Frame3d frTrasf = m_gfrFrame.GetFrame() ;
|
||||
frTrasf.ToLoc( frFrameS) ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
frTrasf.ToLoc( m_frF) ;
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
pGdbObj->ToGlob( frTrasf) ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
// assegno il nuovo riferimento
|
||||
m_gfrFrame.Set( frFrameS) ;
|
||||
|
||||
// porto il riferimento di scalatura nel riferimento del gruppo
|
||||
// porto il riferimento di scalatura nel nuovo riferimento del gruppo
|
||||
Frame3d frRefLoc = frRef ;
|
||||
frRefLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
frRefLoc.ToLoc( m_frF) ;
|
||||
|
||||
// ciclo sugli oggetti
|
||||
bool bOk = true ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
if ( ! pGdbObj->Scale( frRefLoc, dCoeffX, dCoeffY, dCoeffZ))
|
||||
bOk = false ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -301,38 +280,31 @@ GdbGroup::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dC
|
||||
bool
|
||||
GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
{
|
||||
GdbObj* pGdbObj ;
|
||||
|
||||
|
||||
// parziale mirror del riferimento (non può essere completa)
|
||||
Frame3d frFrameS = m_gfrFrame.GetFrame() ;
|
||||
frFrameS.PseudoMirror( ptOn, vtNorm) ;
|
||||
Frame3d frTrasf = m_frF ;
|
||||
m_frF.PseudoMirror( ptOn, vtNorm) ;
|
||||
|
||||
// porto i nodi nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
Frame3d frTrasf = m_gfrFrame.GetFrame() ;
|
||||
frTrasf.ToLoc( frFrameS) ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
frTrasf.ToLoc( m_frF) ;
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
pGdbObj->ToGlob( frTrasf) ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
// assegno il nuovo riferimento
|
||||
m_gfrFrame.Set( frFrameS) ;
|
||||
|
||||
// porto i dati del piano di mirror nel riferimento del gruppo
|
||||
Point3d ptOnLoc = ptOn ;
|
||||
ptOnLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
ptOnLoc.ToLoc( m_frF) ;
|
||||
Vector3d vtNormLoc = vtNorm ;
|
||||
vtNormLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
vtNormLoc.ToLoc( m_frF) ;
|
||||
|
||||
// ciclo sugli oggetti
|
||||
bool bOk = true ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
if ( ! pGdbObj->Mirror( ptOnLoc, vtNormLoc))
|
||||
bOk = false ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -342,40 +314,33 @@ GdbGroup::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
bool
|
||||
GdbGroup::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff)
|
||||
{
|
||||
GdbObj* pGdbObj ;
|
||||
|
||||
|
||||
// parziale scorrimento del riferimento (non può essere completa)
|
||||
Frame3d frFrameS = m_gfrFrame.GetFrame() ;
|
||||
frFrameS.PseudoShear( ptOn, vtNorm, vtDir, dCoeff) ;
|
||||
Frame3d frTrasf = m_frF ;
|
||||
m_frF.PseudoShear( ptOn, vtNorm, vtDir, dCoeff) ;
|
||||
|
||||
// porto gli oggetti nel nuovo riferimento, senza modificarne la geometria in globale
|
||||
Frame3d frTrasf = m_gfrFrame.GetFrame() ;
|
||||
frTrasf.ToLoc( frFrameS) ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
frTrasf.ToLoc( m_frF) ;
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
pGdbObj->ToGlob( frTrasf) ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
// assegno il nuovo riferimento
|
||||
m_gfrFrame.Set( frFrameS) ;
|
||||
|
||||
// porto i dati di scorrimento nel riferimento del gruppo
|
||||
Point3d ptOnLoc = ptOn ;
|
||||
ptOnLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
ptOnLoc.ToLoc( m_frF) ;
|
||||
Vector3d vtNormLoc = vtNorm ;
|
||||
vtNormLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
vtNormLoc.ToLoc( m_frF) ;
|
||||
Vector3d vtDirLoc = vtDir ;
|
||||
vtDirLoc.ToLoc( m_gfrFrame.GetFrame()) ;
|
||||
vtDirLoc.ToLoc( m_frF) ;
|
||||
|
||||
// ciclo sugli oggetti
|
||||
bool bOk = true ;
|
||||
pGdbObj = GetFirstObj() ;
|
||||
while ( pGdbObj != nullptr) {
|
||||
for ( GdbObj* pGdbObj = GetFirstObj() ;
|
||||
pGdbObj != nullptr ;
|
||||
pGdbObj = pGdbObj->GetNext()) {
|
||||
if ( ! pGdbObj->Shear( ptOnLoc, vtNormLoc, vtDirLoc, dCoeff))
|
||||
bOk = false ;
|
||||
pGdbObj = pGdbObj->GetNext() ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
@@ -407,14 +372,14 @@ bool
|
||||
GdbGroup::GetGlobFrame( Frame3d& frGlob) const
|
||||
{
|
||||
// assegno il proprio frame
|
||||
frGlob = m_gfrFrame.GetFrame() ;
|
||||
frGlob = m_frF ;
|
||||
|
||||
// mentre ci sono padri
|
||||
const GdbGroup* pParent ;
|
||||
pParent = GetParent() ;
|
||||
while ( pParent != nullptr) {
|
||||
// porto il riferimento corrente sopra il padre
|
||||
frGlob.ToGlob( pParent->m_gfrFrame.GetFrame()) ;
|
||||
frGlob.ToGlob( pParent->GetFrame()) ;
|
||||
// passo al successivo
|
||||
pParent = pParent->GetParent() ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user