From 03b0f4a6801d9479f624edbef84aa4f53917475a Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 6 Jul 2016 16:04:29 +0000 Subject: [PATCH] EgtExecutor : - nell'ExeOffsetCurveAdv le curve vengono restituite in ordine decrescente di lunghezza - aggiunta ExeClosedCurveClassify. --- EXE_GdbModifyCurve.cpp | 4 ++-- EXE_GeoSnap.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/EXE_GdbModifyCurve.cpp b/EXE_GdbModifyCurve.cpp index c55b35b..37ccf92 100644 --- a/EXE_GdbModifyCurve.cpp +++ b/EXE_GdbModifyCurve.cpp @@ -107,7 +107,7 @@ ExeOffsetCurveAdv( int nId, double dDist, int nType, int* pnCount) // salvo le curve di offset int nCount = 0 ; int nFirstId = GDB_ID_NULL ; - PtrOwner pOffs( OffsCrv.GetCurve()) ; + PtrOwner pOffs( OffsCrv.GetLongerCurve()) ; while ( bOk && ! IsNull( pOffs)) { // inserisco la curva nel DB geometrico int nNewId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_AFTER, Release( pOffs)) ; @@ -119,7 +119,7 @@ ExeOffsetCurveAdv( int nId, double dDist, int nType, int* pnCount) if ( nFirstId == GDB_ID_NULL) nFirstId = nNewId ; // passo alla successiva - pOffs.Set( OffsCrv.GetCurve()) ; + pOffs.Set( OffsCrv.GetLongerCurve()) ; } if ( ! bOk) nCount = - 1 ; diff --git a/EXE_GeoSnap.cpp b/EXE_GeoSnap.cpp index 702ea7b..a022dd9 100644 --- a/EXE_GeoSnap.cpp +++ b/EXE_GeoSnap.cpp @@ -17,6 +17,7 @@ #include "EXE_Macro.h" #include "GeoTools.h" #include "/EgtDev/Include/EXeExecutor.h" +#include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EgkGeoPoint3d.h" #include "/EgtDev/Include/EgkGeoVector3d.h" #include "/EgtDev/Include/EgkCurve.h" @@ -691,6 +692,43 @@ ExeCurveSelfIntersCount( int nId, int* pnCount) return true ; } +//---------------------------------------------------------------------------- +int +ExeClosedCurveClassify( int nId1, int nId2) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, 0) + // recupero la prima curva + const ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nId1)) ; + if ( pCrv1 == nullptr || ! pCrv1->IsClosed()) + return CCREGC_NULL ; + // recupero il riferimento della curva + Frame3d frCrv1 ; + if ( ! pGeomDB->GetGlobFrame( nId1, frCrv1)) + return CCREGC_NULL ; + // recupero la seconda curva + const ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nId2)) ; + if ( pCrv2 == nullptr || ! pCrv2->IsClosed()) + return CCREGC_NULL ; + // recupero il riferimento della curva + Frame3d frCrv2 ; + if ( ! pGeomDB->GetGlobFrame( nId2, frCrv2)) + return CCREGC_NULL ; + // se riferimenti diversi, porto una copia della seconda nel riferimento della prima + const ICurve* pCrv2L = pCrv2 ; + PtrOwner pTmp ; + if ( ! AreSameFrame( frCrv1, frCrv2)) { + pTmp.Set( pCrv2->Clone()) ; + if ( IsNull( pTmp) || ! pTmp->LocToLoc( frCrv2, frCrv1)) + return CCREGC_NULL ; + pCrv2L = pTmp ; + } + + // classifico la prima curva rispetto alla seconda + IntersCurveCurve ccInt( *pCrv1, *pCrv2L) ; + return ccInt.GetRegionCurveClassification() ; +} + //---------------------------------------------------------------------------- bool ExeGetMinDistPointCurve( const Point3d& ptP, int nId, double* pdDist, double* pdU)