diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index e17bcc5..3e636fb 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -2664,120 +2664,3 @@ ExeCreateSurfBzSwept( int nParentId, int nSectId, int nGuideId, const Vector3d& // restituisco l'identificativo della nuova entità return nNewId ; } - -//------------------------------------------------------------------------------- -int -ExeCreateSurfBzSwept( int nParentId, int nSectId, int nGuideId, const Vector3d& vtAx, - bool bCapEnds, double dLinTol, int nRefType) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - nParentId = AdjustId( nParentId) ; - bool bOk = true ; - // recupero il riferimento locale - Frame3d frLoc ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nParentId, frLoc) ; - // recupero le curve in locale - CurveLocal CrvSect( pGeomDB, nSectId, frLoc) ; - CurveLocal CrvGuide( pGeomDB, nGuideId, frLoc) ; - // porto in locale vettore asse - Vector3d vtAxL = GetVectorLocal( pGeomDB, vtAx, nRefType, frLoc) ; - - PolyLine plGuide ; - double dAngTolDeg = 15 ; - CrvGuide->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plGuide) ; - Plane3d plPlane ; - bool bFlatGuide = plGuide.IsFlat( plPlane) ; - // calcolo la superficie - PtrOwner pSbz( CreateSurfBezier()) ; - if( bFlatGuide) - pSbz.Set( bOk ? GetSurfBezierSweptInPlane( CrvSect, CrvGuide, vtAxL, bCapEnds, dLinTol) : nullptr ) ; - else - pSbz.Set( bOk ? GetSurfBezierSwept3d( CrvSect, CrvGuide, vtAxL, bCapEnds, dLinTol) : nullptr ) ; - - // se richiesto il capping verifico che la superficie abbia il gisto orientamento - bool bOrientedAsGuide = false ; - ICRVCOMPOPOVECTOR vCCLoop ; - if( bCapEnds) { - // controlo se il vettore di start della guida è orientato come la normale della curva o no - Vector3d vtStart ; CrvGuide->GetStartDir( vtStart) ; - Plane3d plPlane ; - double dArea ; - double dOrthoGuide = 0 ; - // verifico che la curva sia chiusa e piatta - PolyLine PL ; - CrvSect->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, PL) ; - if ( PL.IsClosedAndFlat(plPlane, dArea, dLinTol)) { - dOrthoGuide = plPlane.GetVersN() * vtStart ; - // controllo che ci sia una componente dell'estrusione perpendicolare al piano della curva - if( abs( dOrthoGuide) < EPS_SMALL) - return GDB_ID_NULL ; - // recupero i loop - pSbz->GetLoops( vCCLoop, true) ; - // se necessario inverto la superficie - if( dOrthoGuide > EPS_SMALL) - bOrientedAsGuide = true ; - else - pSbz->Invert() ; - } - else - bCapEnds = false ; - } - - - - // inserisco la superficie nel DB - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSbz)) : GDB_ID_NULL) ; - - // se richiesto aggiungo anche i cap - if ( bCapEnds) { - // controllo se i loop trovati sono validi - bool bValidLoop0 = false ; - bool bValidLoop2 = false ; - if( ! IsNull(vCCLoop[0]) && vCCLoop[0]->IsValid()) - bValidLoop0 = true ; - if( ! IsNull(vCCLoop[2]) && vCCLoop[2]->IsValid()) - bValidLoop2 = true ; - - if( ! IsNull(vCCLoop[0]) && ! vCCLoop[0]->IsValid()) - return GDB_ID_NULL ; - if( ! IsNull(vCCLoop[2]) && ! vCCLoop[2]->IsValid()) - 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 1 e 3 saranno null. - double dAngTolDeg = 5 ; - PolyLine plEdge0 ; - if( bValidLoop0) - vCCLoop[0]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge0) ; - PolyLine plEdge2 ; - if( bValidLoop2) - vCCLoop[2]->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plEdge2) ; - - PtrOwner pSrfBezStart( CreateSurfBezier()) ; - pSrfBezStart->CreateByFlatContour( plEdge2) ; - // se necessario inverto - if( bOrientedAsGuide) // edge 2, che è la prima riga della matrice dei punti di controllo è orientato nello stesso verso della curva di sezione - pSrfBezStart->Invert() ; - // aggiungo al database - pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSrfBezStart)) ; - PtrOwner pSrfBezEnd( CreateSurfBezier()) ; - pSrfBezEnd->CreateByFlatContour( plEdge0) ; - // se necessario inverto - if( bOrientedAsGuide) // edge 0, che è l'ultima riga della matrice dei punti di controllo è orientato in verso opposto alla curva di sezione - pSrfBezEnd->Invert() ; - // aggiungo al database - pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSrfBezEnd)) ; - } - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtSurfbzByScrewing(" + IdToString( nParentId) + "," + - IdToString( nSectId) + "," + - IdToString( nGuideId) + "," + - ToString( dLinTol) + ")" + - " -- Id=" + ToString( nNewId) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - // restituisco l'identificativo della nuova entità - return nNewId ; -}