EgtGeomKernel 1.4l1 : Aggiunto Trim di curve a lunghezza e parametro.

This commit is contained in:
Dario Sassi
2013-12-16 09:37:57 +00:00
parent fb0ca2906f
commit 7de56883b3
15 changed files with 814 additions and 29 deletions
+102
View File
@@ -106,6 +106,8 @@ GdbExecutor::Execute( const string& sCmd1, const string& sCmd2, const STRVECTOR&
return ExecuteScale( vsParams) ;
else if ( sCmd1 == "MIRROR")
return ExecuteMirror( vsParams) ;
else if ( sCmd1 == "TRIMCURVE" || sCmd1 == "TRC")
return ExecuteTrimCurve( sCmd2, vsParams) ;
else if ( sCmd1 == "LOAD")
return ExecuteLoad( vsParams) ;
else if ( sCmd1 == "SAVE")
@@ -426,6 +428,45 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
}
// curva di Bezier equivalente ad un arco
else if ( sCmd2 == "ARC" || sCmd2 == "A") {
Point3d ptCen ;
Vector3d vtN ;
double dRad ;
Vector3d vtS ;
double dAngCenDeg ;
double dDeltaZ ;
// 8 parametri
if ( vsParams.size() != 8)
return false ;
// centro
if ( ! GetPointParam( vsParams[2], ptCen))
return false ;
// versore ortogonale al piano della circonferenza
if ( ! GetVectorParam( vsParams[3], vtN))
return false ;
// raggio
if ( ! FromString( vsParams[4], dRad))
return false ;
// versore iniziale
if ( ! GetVectorParam( vsParams[5], vtS))
return false ;
// angolo al centro
if ( ! FromString( vsParams[6], dAngCenDeg))
return false ;
// deltaZ
if ( ! FromString( vsParams[7], dDeltaZ))
return false ;
// imposto l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
if ( ! pCrvArc->Set( ptCen, vtN, dRad, vtS, dAngCenDeg, dDeltaZ))
return false ;
// ne deduco la curva di Bezier
if ( ! pCrvBez->SetFromArc( *pCrvArc))
return false ;
}
// altrimenti errore
else
return false ;
@@ -798,6 +839,67 @@ GdbExecutor::ExecuteMirror( const STRVECTOR& vsParams)
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteTrimCurve( const std::string& sCmd2, const STRVECTOR& vsParams)
{
enum SeLp { SL, EL, SP, EP} ;
SeLp StEnLenPar ;
double dPar ;
STRVECTOR vsNames ;
STRVECTOR::iterator Iter ;
ICurve* pCurve ;
// 2 parametri ( Nome, parametro)
if ( vsParams.size() != 2)
return false ;
// recupero lista nomi
if ( ! GetNamesParam( vsParams[0], vsNames))
return false ;
// recupero i dati di inizio
if ( ! FromString( vsParams[1], dPar))
return false ;
// determino il tipo di trim
if ( sCmd2 == "STARTLEN" || sCmd2 == "SL")
StEnLenPar = SL ;
else if ( sCmd2 == "ENDLEN" || sCmd2 == "EL")
StEnLenPar = EL ;
else if ( sCmd2 == "STARTPAR" || sCmd2 == "SP")
StEnLenPar = SP ;
else if ( sCmd2 == "ENDPAR" || sCmd2 == "EP")
StEnLenPar = EP ;
else
return false ;
// esecuzione trim
for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
if ( ( pCurve = GetCurve( m_pGDB->GetGeoObj( GetIdParam( *Iter)))) != nullptr) {
switch ( StEnLenPar) {
case SL :
if ( ! pCurve->TrimStartAtLen( dPar))
return false ;
break ;
case EL :
if ( ! pCurve->TrimEndAtLen( dPar))
return false ;
break ;
case SP :
if ( ! pCurve->TrimStartAtParam( dPar))
return false ;
break ;
case EP :
if ( ! pCurve->TrimEndAtParam( dPar))
return false ;
break ;
}
}
else
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteLoad( const STRVECTOR& vsParams)