EgtGeomKernel 1.5e4 :

- aggiunte diverse modalità di costruzione e modifica degli archi
- i comandi TSC sono stati ampliati con queste nuove modalità.
This commit is contained in:
Dario Sassi
2014-05-14 07:11:19 +00:00
parent ef75e1d83a
commit 2b0b6800cb
8 changed files with 1012 additions and 299 deletions
+612 -240
View File
@@ -419,269 +419,617 @@ GdbExecutor::ExecuteFrame( const string& sCmd2, const STRVECTOR& vsParams)
bool
GdbExecutor::ExecuteCurveLine( const string& sCmd2, const STRVECTOR& vsParams)
{
// creazione linea da : ptStart, ptEnd
if ( sCmd2 == "" || sCmd2 == "MAKE")
return CurveLineMake( vsParams) ;
// creazione linea da : ptStart, vtDir, dLen
else if ( sCmd2 == "VL" || sCmd2 == "VersorLength")
return CurveLineVersorLength( vsParams) ;
// creazione linea da : ptStart, dDirAngDeg, dLen
else if ( sCmd2 == "DL" || sCmd2 == "DirLength")
return CurveLineDirLength( vsParams) ;
// creazione linea di minima distanza tra punto e curva
else if ( sCmd2 == "MPC" || sCmd2 == "MINPOINTCURVE")
return CurveLineMinPointCurve( vsParams) ;
// altrimenti errore
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveLineMake( const STRVECTOR& vsParams)
{
// 4 parametri : Id, IdParent, ptStart, ptEnd
if ( vsParams.size() != 4)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero punto finale
Point3d ptEnd ;
if ( ! GetPointParam( vsParams[3], frRef, ptEnd))
return false ;
// creo la linea
PtrOwner<ICurveLine> pCrvLine( CreateCurveLine()) ;
if ( ! IsValid( pCrvLine))
return false ;
// creazione linea da : ptStart, ptEnd
if ( sCmd2 == "" || sCmd2 == "MAKE") {
// 4 parametri : Id, IdParent, ptStart, ptEnd
if ( vsParams.size() != 4)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero punto finale
Point3d ptEnd ;
if ( ! GetPointParam( vsParams[3], frRef, ptEnd))
return false ;
// setto la linea
if ( ! pCrvLine->Set( ptStart, ptEnd))
return false ;
}
// creazione linea da : ptStart, vtDir, dLen
else if ( sCmd2 == "VL" || sCmd2 == "VersorLength") {
// 5 parametri : Id, IdParent, ptStart, vtDir, dLen
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero vettore direzione
Vector3d vtDir ;
if ( ! GetVectorParam( vsParams[3], frRef, vtDir))
return false ;
// recupero lunghezza
double dLen ;
if ( ! GetLengthParam( vsParams[4], dLen))
return false ;
// setto la linea
if ( ! pCrvLine->Set( ptStart, vtDir, dLen))
return false ;
}
// creazione linea da : ptStart, dDirAngDeg, dLen
else if ( sCmd2 == "DL" || sCmd2 == "DirLength") {
// 5 parametri : Id, IdParent, ptStart, dAngDeg, dLen
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero direzione in gradi
double dDirAngDeg ;
if ( ! GetDirParam( vsParams[3], frRef, dDirAngDeg))
return false ;
// recupero lunghezza
double dLen ;
if ( ! GetLengthParam( vsParams[4], dLen))
return false ;
// setto la linea
if ( ! pCrvLine->Set( ptStart, dDirAngDeg, dLen))
return false ;
}
// creazione linea di minima distanza tra punto e curva
else if ( sCmd2 == "MPC" || sCmd2 == "MINPOINTCURVE") {
// almeno 4 parametri
if ( vsParams.size() < 4)
return false ;
// recupero il riferimento del gruppo destinazione
Frame3d frPoint ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frPoint))
return false ;
// recupero il punto
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frPoint, ptStart))
return false ;
// recupero l'identificativo della curva
int nId ;
if ( ( nId = GetIdParam( vsParams[3])) == CMD_ID_ERROR)
return false ;
// recupero il riferimento della curva
Frame3d frCurve ;
if ( ! m_pGDB->GetGlobFrame( nId, frCurve))
return false ;
// recupero la curva
const ICurve* pCurve = GetCurve( m_pGDB->GetGeoObj( nId)) ;
if ( pCurve == nullptr)
return false ;
// porto il punto nel riferimento della curva
Point3d ptSloc = ptStart ;
ptSloc.LocToLoc( frPoint, frCurve) ;
// recupero eventuale parametro per discriminare tra più soluzioni
double dNearParam ;
if ( vsParams.size() < 5 || ! FromString( vsParams[4], dNearParam))
dNearParam = 0 ;
// calcolo il punto a minima distanza
int nFlag ;
Point3d ptEnd ;
DistPointCurve dstPtCurve( ptSloc, *pCurve) ;
if ( ! dstPtCurve.GetMinDistPoint( dNearParam, ptEnd, nFlag))
return false ;
// porto il punto finale nel riferimento di creazione
ptEnd.LocToLoc( frCurve, frPoint) ;
// setto la linea
if ( ! pCrvLine->Set( ptStart, ptEnd))
return false ;
}
// altrimenti errore
else
// setto la linea
if ( ! pCrvLine->Set( ptStart, ptEnd))
return false ;
// inserisco la linea nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvLine)) ;
}
return false ;
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveLineVersorLength( const STRVECTOR& vsParams)
{
// 5 parametri : Id, IdParent, ptStart, vtDir, dLen
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero vettore direzione
Vector3d vtDir ;
if ( ! GetVectorParam( vsParams[3], frRef, vtDir))
return false ;
// recupero lunghezza
double dLen ;
if ( ! GetLengthParam( vsParams[4], dLen))
return false ;
// creo la linea
PtrOwner<ICurveLine> pCrvLine( CreateCurveLine()) ;
if ( ! IsValid( pCrvLine))
return false ;
// setto la linea
if ( ! pCrvLine->SetPVL( ptStart, vtDir, dLen))
return false ;
// inserisco la linea nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvLine)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveLineDirLength( const STRVECTOR& vsParams)
{
// 5 parametri : Id, IdParent, ptStart, dAngDeg, dLen
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero punto iniziale
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frRef, ptStart))
return false ;
// recupero direzione in gradi
double dDirAngDeg ;
if ( ! GetDirParam( vsParams[3], frRef, dDirAngDeg))
return false ;
// recupero lunghezza
double dLen ;
if ( ! GetLengthParam( vsParams[4], dLen))
return false ;
// creo la linea
PtrOwner<ICurveLine> pCrvLine( CreateCurveLine()) ;
if ( ! IsValid( pCrvLine))
return false ;
// setto la linea
if ( ! pCrvLine->SetPDL( ptStart, dDirAngDeg, dLen))
return false ;
// inserisco la linea nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvLine)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveLineMinPointCurve( const STRVECTOR& vsParams)
{
// almeno 4 parametri : Id, IdParent, ptP, IdCrv[, NearParam]
if ( vsParams.size() < 4)
return false ;
// recupero il riferimento del gruppo destinazione
Frame3d frPoint ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frPoint))
return false ;
// recupero il punto
Point3d ptStart ;
if ( ! GetPointParam( vsParams[2], frPoint, ptStart))
return false ;
// recupero l'identificativo della curva
int nId ;
if ( ( nId = GetIdParam( vsParams[3])) == CMD_ID_ERROR)
return false ;
// recupero il riferimento della curva
Frame3d frCurve ;
if ( ! m_pGDB->GetGlobFrame( nId, frCurve))
return false ;
// recupero la curva
const ICurve* pCurve = GetCurve( m_pGDB->GetGeoObj( nId)) ;
if ( pCurve == nullptr)
return false ;
// porto il punto nel riferimento della curva
Point3d ptSloc = ptStart ;
ptSloc.LocToLoc( frPoint, frCurve) ;
// recupero eventuale parametro per discriminare tra più soluzioni
double dNearParam ;
if ( vsParams.size() < 5 || ! FromString( vsParams[4], dNearParam))
dNearParam = 0 ;
// calcolo il punto a minima distanza
int nFlag ;
Point3d ptEnd ;
DistPointCurve dstPtCurve( ptSloc, *pCurve) ;
if ( ! dstPtCurve.GetMinDistPoint( dNearParam, ptEnd, nFlag))
return false ;
// porto il punto finale nel riferimento di creazione
ptEnd.LocToLoc( frCurve, frPoint) ;
// creo la linea
PtrOwner<ICurveLine> pCrvLine( CreateCurveLine()) ;
if ( ! IsValid( pCrvLine))
return false ;
// setto la linea
if ( ! pCrvLine->Set( ptStart, ptEnd))
return false ;
// inserisco la linea nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvLine)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteCurveArc( const string& sCmd2, const STRVECTOR& vsParams)
{
// creo arco generico
if ( sCmd2 == "" || sCmd2 == "MAKE")
return CurveArcMake( vsParams) ;
// creo circonferenza
else if ( sCmd2 == "C" || sCmd2 == "CIRCLE")
return CurveArcCircle( vsParams) ;
// creo arco nel piano XY
else if ( sCmd2 == "XY" || sCmd2 == "PLANEXY")
return CurveArcPlaneXY( vsParams) ;
// creo circonferenza nel piano XY
else if ( sCmd2 == "CXY" || sCmd2 == "CIRCLEXY")
return CurveArcCircleXY( vsParams) ;
// creo arco o circonferenza passante per 3 punti
else if ( sCmd2 == "3P" || sCmd2 == "C3P")
return CurveArc3P( vsParams, ( sCmd2 == "C3P")) ;
// creo arco per 2 punti e direzione iniziale
else if ( sCmd2 == "2PDI")
return CurveArc2PDi( vsParams) ;
// creo arco per 2 punti, raggio e senso di rotazione
else if ( sCmd2 == "2PRS")
return CurveArc2PRS( vsParams) ;
// creo arco dato centro, per primo punto e vicino al secondo
else if ( sCmd2 == "C2P")
return CurveArcC2P( vsParams) ;
// inversione della normale
else if ( sCmd2 == "INVN" || sCmd2 == "INVERTNORMAL")
return CurveArcInvertNormal( vsParams) ;
// cambio del raggio
else if ( sCmd2 == "CHR" || sCmd2 == "CHANGERADIUS")
return CurveArcChangeRadius( vsParams) ;
// cambio del deltaN
else if ( sCmd2 == "CHDN" || sCmd2 == "CHANGEDELTAN")
return CurveArcChangeDeltaN( vsParams) ;
// trasformazione nell'arco complementare
else if ( sCmd2 == "TA" || sCmd2 == "TOADDITIONAL")
return CurveArcToAdditional( vsParams) ;
// flip dell'arco
else if ( sCmd2 == "F" || sCmd2 == "FLIP")
return CurveArcFlip( vsParams) ;
// altrimenti errore
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcMake( const STRVECTOR& vsParams)
{
// 8 parametri
if ( vsParams.size() != 8)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// versore ortogonale al piano della circonferenza
Vector3d vtN ;
if ( ! GetVectorParam( vsParams[3], frRef, vtN))
return false ;
// raggio
double dRad ;
if ( ! GetLengthParam( vsParams[4], dRad))
return false ;
// versore iniziale
Vector3d vtS ;
if ( ! GetVectorParam( vsParams[5], frRef, vtS))
return false ;
// angolo al centro
double dAngCenDeg ;
if ( ! FromString( vsParams[6], dAngCenDeg))
return false ;
// deltaZ
double dDeltaZ ;
if ( ! GetLengthParam( vsParams[7], dDeltaZ))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// arco generico
if ( sCmd2 == "" || sCmd2 == "MAKE") {
// 8 parametri
if ( vsParams.size() != 8)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// versore ortogonale al piano della circonferenza
Vector3d vtN ;
if ( ! GetVectorParam( vsParams[3], frRef, vtN))
return false ;
// raggio
double dRad ;
if ( ! FromString( vsParams[4], dRad))
return false ;
// versore iniziale
Vector3d vtS ;
if ( ! GetVectorParam( vsParams[5], frRef, vtS))
return false ;
// angolo al centro
double dAngCenDeg ;
if ( ! FromString( vsParams[6], dAngCenDeg))
return false ;
// deltaZ
double dDeltaZ ;
if ( ! FromString( vsParams[7], dDeltaZ))
return false ;
// setto l'arco
if ( ! pCrvArc->Set( ptCen, vtN, dRad, vtS, dAngCenDeg, dDeltaZ))
return false ;
}
// arco nel piano XY
else if ( sCmd2 == "XY" || sCmd2 == "PLANEXY") {
// 7 parametri
if ( vsParams.size() != 7)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// raggio
double dRad ;
if ( ! FromString( vsParams[3], dRad))
return false ;
// angolo iniziale
double dAngIniDeg ;
if ( ! FromString( vsParams[4], dAngIniDeg))
return false ;
// angolo al centro
double dAngCenDeg ;
if ( ! FromString( vsParams[5], dAngCenDeg))
return false ;
// deltaZ
double dDeltaZ ;
if ( ! FromString( vsParams[6], dDeltaZ))
return false ;
// setto l'arco
if ( ! pCrvArc->Set( ptCen, dRad, dAngIniDeg, dAngCenDeg, dDeltaZ))
return false ;
}
// circonferenza
else if ( sCmd2 == "C" || sCmd2 == "CIRCLE") {
// 5 parametri
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// versore ortogonale al piano della circonferenza
Vector3d vtN ;
if ( ! GetVectorParam( vsParams[3], frRef, vtN))
return false ;
// raggio
double dRad ;
if ( ! FromString( vsParams[4], dRad))
return false ;
// setto l'arco
if ( ! pCrvArc->Set( ptCen, vtN, dRad))
return false ;
}
// circonferenza nel piano XY
else if ( sCmd2 == "CXY" || sCmd2 == "CIRCLEXY") {
// 4 parametri
if ( vsParams.size() != 4)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// raggio
double dRad ;
if ( ! FromString( vsParams[3], dRad))
return false ;
// setto l'arco
if ( ! pCrvArc->Set( ptCen, dRad))
return false ;
}
// altrimenti errore
else
// setto l'arco
if ( ! pCrvArc->Set( ptCen, vtN, dRad, vtS, dAngCenDeg, dDeltaZ))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcPlaneXY( const STRVECTOR& vsParams)
{
// 7 parametri
if ( vsParams.size() != 7)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// raggio
double dRad ;
if ( ! GetLengthParam( vsParams[3], dRad))
return false ;
// angolo iniziale
double dAngIniDeg ;
if ( ! GetDirParam( vsParams[4], frRef, dAngIniDeg))
return false ;
// angolo al centro
double dAngCenDeg ;
if ( ! FromString( vsParams[5], dAngCenDeg))
return false ;
// deltaZ
double dDeltaZ ;
if ( ! GetLengthParam( vsParams[6], dDeltaZ))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->SetXY( ptCen, dRad, dAngIniDeg, dAngCenDeg, dDeltaZ))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcCircle( const STRVECTOR& vsParams)
{
// 5 parametri
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// versore ortogonale al piano della circonferenza
Vector3d vtN ;
if ( ! GetVectorParam( vsParams[3], frRef, vtN))
return false ;
// raggio
double dRad ;
if ( ! GetLengthParam( vsParams[4], dRad))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->Set( ptCen, vtN, dRad))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcCircleXY( const STRVECTOR& vsParams)
{
// 4 parametri
if ( vsParams.size() != 4)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// raggio
double dRad ;
if ( ! GetLengthParam( vsParams[3], dRad))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->SetXY( ptCen, dRad))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArc3P( const STRVECTOR& vsParams, bool bCirc)
{
// 5 parametri : Id, ParentId, ptP0, ptP1, ptP2
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// primo punto
Point3d ptP0 ;
if ( ! GetPointParam( vsParams[2], frRef, ptP0))
return false ;
// secondo punto
Point3d ptP1 ;
if ( ! GetPointParam( vsParams[3], frRef, ptP1))
return false ;
// terzo punto
Point3d ptP2 ;
if ( ! GetPointParam( vsParams[4], frRef, ptP2))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->Set3P( ptP0, ptP1, ptP2, bCirc))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArc2PDi( const STRVECTOR& vsParams)
{
// 5 parametri : Id, ParentId, ptPi, ptPf, dDiri
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// punto iniziale
Point3d ptPi ;
if ( ! GetPointParam( vsParams[2], frRef, ptPi))
return false ;
// punto finale
Point3d ptPf ;
if ( ! GetPointParam( vsParams[3], frRef, ptPf))
return false ;
// direzione iniziale
double dDirI ;
if ( ! GetDirParam( vsParams[4], frRef, dDirI))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->Set2PD( ptPi, ptPf, dDirI))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArc2PRS( const STRVECTOR& vsParams)
{
// 5 o 6 parametri : Id, ParentId, ptPi, ptPf, dRad[, CCW/CW]
if ( vsParams.size() != 5 && vsParams.size() != 6)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// punto iniziale
Point3d ptPi ;
if ( ! GetPointParam( vsParams[2], frRef, ptPi))
return false ;
// punto finale
Point3d ptPf ;
if ( ! GetPointParam( vsParams[3], frRef, ptPf))
return false ;
// raggio
double dRad ;
if ( ! GetLengthParam( vsParams[4], dRad))
return false ;
// senso di rotazione
bool bCCW = true ;
if ( vsParams.size() >= 6 && vsParams[5] == "CW")
bCCW = false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->Set2PRS( ptPi, ptPf, dRad, bCCW))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcC2P( const STRVECTOR& vsParams)
{
// 5 parametri : Id, ParentId, ptCen, ptPi, ptNearPf
if ( vsParams.size() != 5)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// centro
Point3d ptCen ;
if ( ! GetPointParam( vsParams[2], frRef, ptCen))
return false ;
// punto iniziale
Point3d ptPi ;
if ( ! GetPointParam( vsParams[3], frRef, ptPi))
return false ;
// punto vicino al finale (direzione da centro esatta)
Point3d ptNearPf ;
if ( ! GetPointParam( vsParams[4], frRef, ptNearPf))
return false ;
// creo l'arco
PtrOwner<ICurveArc> pCrvArc( CreateCurveArc()) ;
if ( ! IsValid( pCrvArc))
return false ;
// setto l'arco
if ( ! pCrvArc->SetC2P( ptCen, ptPi, ptNearPf))
return false ;
// inserisco l'arco nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pCrvArc)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcInvertNormal( const STRVECTOR& vsParams)
{
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
// recupero l'arco
ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pCrvArc == nullptr)
return false ;
// eseguo l'operazione
return pCrvArc->InvertN() ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcChangeRadius( const STRVECTOR& vsParams)
{
// 2 parametrio : Id, dNewRad
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// leggo il nuovo raggio
double dNewRad ;
if ( ! GetLengthParam( vsParams[1], dNewRad))
return false ;
// esecuzione
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero l'arco
ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( *Iter)) ;
if ( pCrvArc == nullptr)
return false ;
// eseguo l'operazione
if ( ! pCrvArc->ChangeRadius( dNewRad))
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcChangeDeltaN( const STRVECTOR& vsParams)
{
// 2 parametro : Id, dNewDeltaN
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// leggo il nuovo delta
double dNewDeltaN ;
if ( ! GetLengthParam( vsParams[1], dNewDeltaN))
return false ;
// esecuzione
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero l'arco
ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( *Iter)) ;
if ( pCrvArc == nullptr)
return false ;
// eseguo l'operazione
if ( ! pCrvArc->ChangeDeltaN( dNewDeltaN))
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcToAdditional( const STRVECTOR& vsParams)
{
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
// recupero l'arco
ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pCrvArc == nullptr)
return false ;
// eseguo l'operazione
return pCrvArc->ToAdditional() ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::CurveArcFlip( const STRVECTOR& vsParams)
{
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
// recupero l'arco
ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pCrvArc == nullptr)
return false ;
// eseguo l'operazione
return pCrvArc->Flip() ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
@@ -1704,6 +2052,30 @@ GdbExecutor::GetLengthParam( const string& sParam, double& dLen)
}
return false ;
}
// se raggio notevole
else if ( sParam[0] == 'R') {
// recupero i parametri associati
STRVECTOR vsParams ;
Tokenize( sParam.substr( 1), ",", vsParams) ;
STRVECTOR::iterator Iter ;
for ( Iter = vsParams.begin() ; Iter != vsParams.end() ; ++Iter)
Trim( (*Iter), " \t\r\n()") ;
// ci deve essere almeno un parametro
if ( vsParams.size() < 1)
return false ;
// recupero l'entità indicata dal primo parametro
const IGeoObj* pGObj ;
if ( ( pGObj = m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) == nullptr)
return false ;
// se arco
if ( pGObj->GetType() == CRV_ARC) {
// recupero l'arco
const ICurveArc* pCrvArc = GetCurveArc( pGObj) ;
dLen = pCrvArc->GetRadius() ;
return true ;
}
return false ;
}
// altrimenti valore numerico
else {
return FromString( sParam, dLen) ;