From 78ad75254576bfb8058d7442999108231e84e9a9 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 14 Oct 2025 16:29:59 +0200 Subject: [PATCH] EgtExecutor : - aggiornamento funzioni per restituire loop di una surf bezier. --- EXE_GdbCreateCurve.cpp | 4 +--- EXE_GdbCreateSurf.cpp | 21 +++++++++++---------- EXE_GdbGetSurf.cpp | 4 +++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index a92f16c..31af62e 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -2067,9 +2067,7 @@ ExeCreateCurveCompoByInterpolation( int nParentId, const PolyLine& PL, int nType // oggetto interpolatore CurveByInterp crvByInterp ; Point3d ptP ; - for ( bool bFound = PL.GetFirstPoint( ptP) ; - bFound ; - bFound = PL.GetNextPoint( ptP)) + for ( bool bFound = PL.GetFirstPoint( ptP) ; bFound ; bFound = PL.GetNextPoint( ptP)) crvByInterp.AddPoint( ptP) ; PtrOwner pCrvCompo( crvByInterp.GetCurve( nMethod, nCrvType)) ; bOk = bOk && ! IsNull( pCrvCompo) ; diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index 4e8fe44..3af6883 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -2514,29 +2514,30 @@ ExeCreateSurfBzByRevolve( int nParentId, int nCrvId, bbox3dSurf.Add( ptCtrl) ; } // recupero i loop - ICRVCOMPOPOVECTOR vCCLoop ; - pSbz->GetLoops( vCCLoop, true) ; + ICRVCOMPOPOVECTOR vCCLoop(2) ; + vCCLoop[0].Set(pSbz->GetSingleEdge3D( true, 1)) ; + vCCLoop[1].Set(pSbz->GetSingleEdge3D( true, 3)) ; // controllo se i loop trovati sono validi bool bValidLoop1 = false ; bool bValidLoop3 = false ; - if( ! IsNull(vCCLoop[1]) && vCCLoop[1]->IsValid()) + if( ! IsNull(vCCLoop[0]) && vCCLoop[0]->IsValid()) bValidLoop1 = true ; - if( ! IsNull(vCCLoop[3]) && vCCLoop[3]->IsValid()) + if( ! IsNull(vCCLoop[1]) && vCCLoop[1]->IsValid()) bValidLoop3 = true ; - if( ! IsNull(vCCLoop[1]) && ! vCCLoop[1]->IsValid() && ! bStartOnAx) + if( ! IsNull(vCCLoop[0]) && ! vCCLoop[0]->IsValid() && ! bStartOnAx) return GDB_ID_NULL ; - if( ! IsNull(vCCLoop[3]) && ! vCCLoop[3]->IsValid() && ! bEndOnAx) + if( ! IsNull(vCCLoop[1]) && ! vCCLoop[1]->IsValid() && ! bEndOnAx) return GDB_ID_NULL ; // il getLoops per superfici non trimmate restituisce 1 elemento per ogni lato dello spazio parametrico. // in questo caso la superficie è chiusa lungo il parametro V, quindi i lati 0 e 2 saranno null. double dAngTolDeg = 5 ; PolyLine plEdge1 ; if( bValidLoop1) - vCCLoop[1]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge1) ; + vCCLoop[0]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge1) ; PolyLine plEdge3 ; if( bValidLoop3) - vCCLoop[3]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge3) ; + vCCLoop[1]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge3) ; // devo distinguere tra il loop superiore e quello inferiore Point3d ptCen ; @@ -2546,7 +2547,7 @@ ExeCreateSurfBzByRevolve( int nParentId, int nCrvId, bOk = bOk && plEdge1.IsClosedAndFlat( plPlane, dArea, 50 * EPS_SMALL) ; vtN = plPlane.GetVersN() ; // vedo come questa normale è orientata rispetto alla bbox della superficie - vCCLoop[1]->GetCentroid( ptCen) ; + vCCLoop[0]->GetCentroid( ptCen) ; ptCen += vtN ; if ( bbox3dSurf.Encloses( ptCen)) plEdge1.Invert() ; @@ -2555,7 +2556,7 @@ ExeCreateSurfBzByRevolve( int nParentId, int nCrvId, bOk = bOk && plEdge3.IsClosedAndFlat( plPlane, dArea, 50 * EPS_SMALL) ; vtN = plPlane.GetVersN() ; // vedo come questa normale è orientata rispetto alla bbox della superficie - vCCLoop[3]->GetCentroid( ptCen) ; + vCCLoop[1]->GetCentroid( ptCen) ; ptCen += vtN ; if ( bbox3dSurf.Encloses( ptCen)) plEdge3.Invert() ; diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index 3fc2408..05c4f99 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -1741,6 +1741,8 @@ ExeExtractSurfBezierLoops( int nId, int nDestGrpId, int* pnCount) // recupero la superficie di Bezier const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nId)) ; bool bOk = ( pSbz != nullptr) ; + if( ! bOk) + return GDB_ID_NULL ; // recupero il riferimento della superficie Frame3d frSurf ; bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; @@ -1751,7 +1753,7 @@ ExeExtractSurfBezierLoops( int nId, int nDestGrpId, int* pnCount) int nFirstId = GDB_ID_NULL ; int nCount = 0 ; ICRVCOMPOPOVECTOR vCC ; - pSbz->GetLoops( vCC , true) ; + pSbz->GetLoops( vCC, true) ; for ( int i = 0 ; i < int( vCC.size()) ; ++i) { if ( IsNull( vCC[i]) || ! vCC[i]->IsValid()) continue ;