EgtGeomKernel 1.5k5 :

- sviluppo linee tangenti e perpendicolari a curve.
This commit is contained in:
Dario Sassi
2014-12-01 14:48:44 +00:00
parent 8e0616c889
commit 9347e52d18
13 changed files with 1173 additions and 120 deletions
+27 -28
View File
@@ -26,7 +26,7 @@
#include "/EgtDev/Include/EgkCurveLine.h"
#include "/EgtDev/Include/EgkCurveAux.h"
#include "/EgtDev/Include/EgkLinePntTgCurve.h"
#include "/EgtDev/Include/EgkLineTgTwoArcs.h"
#include "/EgtDev/Include/EgkLineTgTwoCurves.h"
#include "/EgtDev/Include/EgkCurveArc.h"
#include "/EgtDev/Include/EgkArcXxTgArc.h"
#include "/EgtDev/Include/EgkCurveBezier.h"
@@ -761,61 +761,60 @@ GdbExecutor::CurveLinePointTgCurve( const STRVECTOR& vsParams)
bool
GdbExecutor::CurveLineTgTwoArcs( const STRVECTOR& vsParams)
{
// 6 parametri : Id, IdParent, IdArc1, ptNear1, IdArc2, ptNear2
// 6 parametri : Id, IdParent, IdCrv1, ptNear1, IdCrv2, ptNear2
if ( vsParams.size() != 6)
return false ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// recupero l'identificativo del primo arco
// recupero l'identificativo della prima curva
int nId1 ;
if ( ( nId1 = GetIdParam( vsParams[2])) == CMD_ID_ERROR)
return false ;
// recupero il riferimento del primo arco
Frame3d frArc1 ;
if ( ! m_pGDB->GetGlobFrame( nId1, frArc1))
// recupero il riferimento della prima curva
Frame3d frCrv1 ;
if ( ! m_pGDB->GetGlobFrame( nId1, frCrv1))
return false ;
// recupero il primo arco
const ICurveArc* pArc1 = GetCurveArc( m_pGDB->GetGeoObj( nId1)) ;
if ( pArc1 == nullptr)
// recupero la prima curva
const ICurve* pCrv1 = GetCurve( m_pGDB->GetGeoObj( nId1)) ;
if ( pCrv1 == nullptr)
return false ;
// recupero il primo punto vicino e lo porto nel riferimento del primo arco
// recupero il primo punto vicino e lo porto nel riferimento della prima curva
Point3d ptNear1 ;
if ( ! GetPointParam( vsParams[3], frDest, ptNear1))
return false ;
Point3d ptN1loc = ptNear1 ;
ptN1loc.LocToLoc( frDest, frArc1) ;
// recupero l'identificativo del secondo arco
ptN1loc.LocToLoc( frDest, frCrv1) ;
// recupero l'identificativo della seconda curva
int nId2 ;
if ( ( nId2 = GetIdParam( vsParams[4])) == CMD_ID_ERROR)
return false ;
// recupero il riferimento del secondo arco
Frame3d frArc2 ;
if ( ! m_pGDB->GetGlobFrame( nId2, frArc2))
// recupero il riferimento della seconda curva
Frame3d frCrv2 ;
if ( ! m_pGDB->GetGlobFrame( nId2, frCrv2))
return false ;
// recupero il secondo arco
const ICurveArc* pArc2 = GetCurveArc( m_pGDB->GetGeoObj( nId2)) ;
if ( pArc2 == nullptr)
// recupero la seconda curva
const ICurve* pCrv2 = GetCurve( m_pGDB->GetGeoObj( nId2)) ;
if ( pCrv2 == nullptr)
return false ;
// porto il secondo arco nel riferimento del primo
PtrOwner<ICurveArc> pArc2Loc( CreateCurveArc()) ;
if ( IsNull( pArc2Loc))
// porto la seconda curva nel riferimento della prima
PtrOwner<ICurve> pCrv2Loc( pCrv2->Clone()) ;
if ( IsNull( pCrv2Loc))
return false ;
pArc2Loc->CopyFrom( pArc2) ;
pArc2Loc->LocToLoc( frArc2, frArc1) ;
// recupero il secondo punto vicino e lo porto nel riferimento del primo arco
pCrv2Loc->LocToLoc( frCrv2, frCrv1) ;
// recupero il secondo punto vicino e lo porto nel riferimento della prima curva
Point3d ptNear2 ;
if ( ! GetPointParam( vsParams[5], frDest, ptNear2))
return false ;
Point3d ptN2loc = ptNear2 ;
ptN2loc.LocToLoc( frDest, frArc1) ;
// calcolo la retta tangente ai due archi
ICurveLine* pCrvLine = GetLineTgTwoArcs( *pArc1, ptN1loc, *pArc2, ptN2loc) ;
ptN2loc.LocToLoc( frDest, frCrv1) ;
// calcolo la retta tangente alle due curve
ICurveLine* pCrvLine = GetLineTgTwoCurves( *pCrv1, ptN1loc, *pCrv2, ptN2loc) ;
if ( pCrvLine == nullptr)
return false ;
// porto la linea nel riferimento del gruppo destinazione
pCrvLine->LocToLoc( frArc1, frDest) ;
pCrvLine->LocToLoc( frCrv1, frDest) ;
// inserisco la linea nel DB
return AddGeoObj( vsParams[0], vsParams[1], pCrvLine) ;
}