EgtGeomKernel : migliorata scalatura non uniforme, con conservazione del piano XY dei riferimenti di gruppo.

This commit is contained in:
Dario Sassi
2014-01-20 10:57:14 +00:00
parent 4ebb43bf1e
commit b2c6866eff
7 changed files with 115 additions and 15 deletions
+17 -9
View File
@@ -199,23 +199,31 @@ GdbGroup::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, dou
bool
GdbGroup::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
{
bool bOk ;
bool bUniform ;
Frame3d frRefLoc ;
GdbNode* pGdbNode ;
// non è possibile scalare il riferimento, devo agire sui nodi sottostanti
// parziale scalatura del riferimento (non può essere completa)
Frame3d frFrameS = m_gfrFrame.m_frF ;
frFrameS.PartialScale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
// determino se la scalatura è uniforme
bUniform = fabs( dCoeffX - dCoeffY) < EPS_SMALL && fabs( dCoeffX - dCoeffZ) < EPS_SMALL ;
// 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() ;
}
// basta portare il riferimento di scalatura nel riferimento del gruppo
frRefLoc = frRef ;
// assegno il nuovo riferimento
m_gfrFrame.m_frF = frFrameS ;
// porto il riferimento di scalatura nel riferimento del gruppo
Frame3d frRefLoc = frRef ;
frRefLoc.ToLoc( m_gfrFrame.m_frF) ;
// ciclo sui nodi
bOk = true ;
bool bOk = true ;
pGdbNode = GetFirstNode() ;
while ( pGdbNode != nullptr) {
if ( ! pGdbNode->Scale( frRefLoc, dCoeffX, dCoeffY, dCoeffZ))