diff --git a/SubtractProjectedFacesOnStmFace.cpp b/SubtractProjectedFacesOnStmFace.cpp index 8d0509a..b459a18 100644 --- a/SubtractProjectedFacesOnStmFace.cpp +++ b/SubtractProjectedFacesOnStmFace.cpp @@ -344,52 +344,51 @@ GetOCCrvsWithProps( const ISurfTriMesh& StmOrig, int nFaceInd, ICRVCOMPOPOVECTOR Vector3d vtN ; if ( ! StmOrig.GetFacetNormal( nFaceInd, vtN)) return false ; - // creo la curva a partire dei loop + // creo la curva a partire dai loop for ( int i = 0 ; i < int( vPL.size()) ; i++) { PtrOwner pCrvCompo( CreateCurveComposite()) ; - pCrvCompo->FromPolyLine( vPL[i]) ; - if ( ! pCrvCompo->IsValid()) + if ( IsNull( pCrvCompo) || ! pCrvCompo->FromPolyLine( vPL[i]) || ! pCrvCompo->IsValid()) return false ; // imposto a 0 tutti i lati della pCrvCompo for ( int u = 0 ; u < pCrvCompo->GetCurveCount() ; ++ u) pCrvCompo->SetCurveTempProp( u, 0, 0) ; - // determino eventuali lati aperti e aggiorno proprietà del contorno - int nInd = 0 ; - double dPar ; - bool bFound = vPL[i].GetFirstU( dPar, true) ; - while ( bFound) { - // recupero il flag - int nFlag = int( dPar) ; - // se non c'è nulla di adiacente, lato aperto - if ( nFlag == SVT_NULL) { + // determino eventuali lati aperti e aggiorno proprietà del contorno + int nInd = 0 ; + double dPar ; + bool bFound = vPL[i].GetFirstU( dPar, true) ; + while ( bFound) { + // recupero il flag + int nFlag = int( dPar) ; + // se non c'è nulla di adiacente, lato aperto + if ( nFlag == SVT_NULL) { + pCrvCompo->SetCurveTempProp( nInd, 1, 0) ; // --> lato aperto + pCrvCompo->SetCurveTempProp( nInd, -1, 1) ; // --> nessuna faccia adiacente + } + // altrimenti verifico se la faccia adiacente forma diedro convesso o concavo + else { + bool bAdjac ; + Point3d ptP1, ptP2 ; + double dAng ; + if ( ! StmOrig.GetFacetsContact( nFaceInd, nFlag, bAdjac, ptP1, ptP2, dAng)) + dAng = - ANG_RIGHT ; + if ( dAng > - EPS_ANG_SMALL) { pCrvCompo->SetCurveTempProp( nInd, 1, 0) ; // --> lato aperto pCrvCompo->SetCurveTempProp( nInd, -1, 1) ; // --> nessuna faccia adiacente } - // altrimenti verifico se la faccia adiacente forma diedro convesso o concavo - else { - bool bAdjac ; - Point3d ptP1, ptP2 ; - double dAng ; - if ( ! StmOrig.GetFacetsContact( nFaceInd, nFlag, bAdjac, ptP1, ptP2, dAng)) - dAng = - ANG_RIGHT ; - if ( dAng > - EPS_ANG_SMALL) { - pCrvCompo->SetCurveTempProp( nInd, 1, 0) ; // --> lato aperto - pCrvCompo->SetCurveTempProp( nInd, -1, 1) ; // --> nessuna faccia adiacente - } - else - // salvo come prop 1 la faccia adiacente - pCrvCompo->SetCurveTempProp( nInd, nFlag, 1) ; // --> il lato chiuso è 0 per default - } - // passo al successivo - ++nInd ; - bFound = vPL[i].GetNextU( dPar, true) ; + else + // salvo come prop 1 la faccia adiacente + pCrvCompo->SetCurveTempProp( nInd, nFlag, 1) ; // --> il lato chiuso è 0 per default } - // assegno l'estrusione dalla normale alla faccia - pCrvCompo->SetExtrusion( vtN) ; - // unisco le eventuali parti allineate ( mantenendo le proprietà) - pCrvCompo->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL, true, true) ; - // aggiorno la superficie con il loop - vCrvsWithTmpProps.emplace_back( Release( pCrvCompo)) ; + // passo al successivo + ++nInd ; + bFound = vPL[i].GetNextU( dPar, true) ; + } + // assegno l'estrusione dalla normale alla faccia + pCrvCompo->SetExtrusion( vtN) ; + // unisco le eventuali parti allineate ( mantenendo le proprietà) + pCrvCompo->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL, true, true) ; + // aggiorno la superficie con il loop + vCrvsWithTmpProps.emplace_back( Release( pCrvCompo)) ; } return true ; }