EgtExecutor :

- aggiornamento funzioni per restituire loop di una surf bezier.
This commit is contained in:
Daniele Bariletti
2025-10-14 16:29:59 +02:00
parent 0a5fd7262b
commit 78ad752545
3 changed files with 15 additions and 14 deletions
+11 -10
View File
@@ -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() ;