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
+38
View File
@@ -196,6 +196,44 @@ Frame3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, doub
return true ;
}
//----------------------------------------------------------------------------
bool
Frame3d::PartialScale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
{
const double AXIS_LEN = 100 ;
// verifico validità del frame
if ( GetType() == ERR || frRef.GetType() == ERR)
return false ;
// scalatura dell'origine
Point3d ptOrigS = m_ptOrig ;
ptOrigS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
// calcolo trasformazione del versore Z
Point3d ptDirZS = m_ptOrig + AXIS_LEN * m_vtVersZ ;
ptDirZS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Vector3d vtVersZS = ptDirZS - ptOrigS ;
vtVersZS.Normalize() ;
// se il versore Z non cambia, basta applicare l'origine scalata
if ( AreSameVectorExact( m_vtVersZ, vtVersZS)) {
m_ptOrig = ptOrigS ;
return true ;
}
// altrimenti, devo scalare anche i versori X e Y
Point3d ptDirXS = m_ptOrig + AXIS_LEN * m_vtVersX ;
ptDirXS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Point3d ptDirYS = m_ptOrig + AXIS_LEN * m_vtVersY ;
ptDirYS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Frame3d frRefS ;
if ( frRefS.Set( ptOrigS, ptDirXS, ptDirYS)) {
*this = frRefS ;
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
bool
Frame3d::Invert( void)
+32 -6
View File
@@ -755,12 +755,38 @@ GdbExecutor::GetPointWParam( const std::string& sParam, Point3d& ptP, double& dW
bool
GdbExecutor::GetFrameParam( const std::string& sParam, Frame3d& frF)
{
// deve essere nome di frame già nel DB
const IGeoFrame3d* pFr ;
if ( ( pFr = GetGeoFrame3d( m_pGDB->GetGeoObj( GetIdParam( sParam)))) == nullptr)
return false ;
frF = pFr->GetFrame() ;
return true ;
// se insieme di punto origine e tre versori
if ( sParam[0] == '(') {
Point3d ptOrig ;
Vector3d vtX ;
Vector3d vtY ;
Vector3d vtZ ;
string sTmp ;
STRVECTOR vsParams ;
STRVECTOR::iterator Iter ;
// elimino primo e ultimo carattere
sTmp = sParam.substr( 1, sParam.size()-2) ;
// divido in parti
Tokenize( sTmp, ",", "(", ")", vsParams) ;
// verifico siano 4 parti e le converto
if ( vsParams.size() != 4)
return false ;
if ( GetPointParam( vsParams[0], ptOrig) &&
GetVectorParam( vsParams[1], vtX) &&
GetVectorParam( vsParams[2], vtY) &&
GetVectorParam( vsParams[3], vtZ))
return frF.Set( ptOrig, vtX, vtY, vtZ) ;
else
return false ;
}
// altrimenti nome di frame già nel DB
else {
const IGeoFrame3d* pFr ;
if ( ( pFr = GetGeoFrame3d( m_pGDB->GetGeoObj( GetIdParam( sParam)))) == nullptr)
return false ;
frF = pFr->GetFrame() ;
return true ;
}
}
//----------------------------------------------------------------------------
+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))
+4
View File
@@ -37,6 +37,10 @@ class GdbGroup : public GdbNode
{ double dAngRad = dAngDeg * DEGTORAD ;
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
virtual bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
virtual bool ToGlob( const Frame3d& frRef)
{ return m_gfrFrame.m_frF.ToGlob( frRef) ; }
virtual bool ToLoc( const Frame3d& frRef)
{ return m_gfrFrame.m_frF.ToLoc( frRef) ; }
public :
GdbGroup( void) ;
+2
View File
@@ -37,6 +37,8 @@ class GdbNode
virtual bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngRad) = 0 ;
virtual bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) = 0 ;
//virtual bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) = 0 ;
virtual bool ToGlob( const Frame3d& frRef) = 0 ;
virtual bool ToLoc( const Frame3d& frRef) = 0 ;
public :
GdbNode( void) ;
+20
View File
@@ -184,3 +184,23 @@ GdbObj::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoe
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbObj::ToGlob( const Frame3d& frRef)
{
if ( m_pGeoObj != nullptr)
return m_pGeoObj->ToGlob( frRef) ;
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbObj::ToLoc( const Frame3d& frRef)
{
if ( m_pGeoObj != nullptr)
return m_pGeoObj->ToLoc( frRef) ;
else
return false ;
}
+2
View File
@@ -34,6 +34,8 @@ class GdbObj : public GdbNode
{ double dAngRad = dAngDeg * DEGTORAD ;
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
virtual bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
virtual bool ToGlob( const Frame3d& frRef) ;
virtual bool ToLoc( const Frame3d& frRef) ;
public :
GdbObj( void) ;