diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 5621b1a..d46de25 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1760,6 +1760,10 @@ SurfBezier::IncreaseUV( double& dUV, double dxy, bool bUOrV, double* dUVCopy, bo bool SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& vpCC, const Plane3d* pPlCut) const { + // se necessario calcolo i poli + if ( m_vbPole.empty()) + CalcPoles() ; + // do per scontato che la compo sia una spezzata, visto che arriva dall'intersezione tra un piano e una trimesh // creo la chain dei punti che sto riportando nel parametrico ChainCurves chainC ; @@ -2649,6 +2653,10 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in bool SurfBezier::UnprojectPoint( const Point3d& pt3D, Point3d& ptParam, const Point3d& ptIPrev, bool* bThroughEdge, const Plane3d* pPlCut) const { + // se necessario calcolo i poli + if ( m_vbPole.empty()) + CalcPoles() ; + // dato il punto pt3D sulla superficie di Bezier si cercano le coordinate parametriche ( ptParam) , iterativamente con Newton // trovato un primo candidato ptParam, ne calcolo l'immagine sulla superficie ( ptBez) e ne calcolo la distanza con il punto pt3D // ripeto cercando di avvicinarmi il più possibile @@ -2762,7 +2770,7 @@ SurfBezier::UnprojectPoint( const Point3d& pt3D, Point3d& ptParam, const Point3d //---------------------------------------------------------------------------- bool -SurfBezier::CalcPoles( void) +SurfBezier::CalcPoles( void) const { if ( m_vbPole.size() != 0) return true ; @@ -2809,6 +2817,10 @@ SurfBezier::CalcPoles( void) bool SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) const { + // se necessario calcolo i poli + if ( m_vbPole.empty()) + CalcPoles() ; + // se nEdge non è definito ( == -1) allora restituisco tutti gli edge in ordine // se bOpenOrAll è true allora restituisco solo gli edge aperti e che non sono di polo if ( m_pSTM == nullptr) @@ -3307,25 +3319,29 @@ SurfBezier::CreateByFlatContour( const PolyLine& PL) int nDegU = 1, nDegV = 1, nSpanU = 1, nSpanV = 1 ; bool bRat = false ; Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; - // i punti di controllo sono i quattro vertici della bbox ( che è piana) - Point3d ptBL = bboxContour.GetMin() ; - Point3d ptTR = bboxContour.GetMax() ; + // i punti di controllo sono i quattro vertici della bbox proiettata sul piano della polyline + double dPlus = 1 ; + bboxContour.Expand( dPlus) ; + Point3d ptBL = ProjectPointOnPlane(bboxContour.GetMin(), plPlane) ; + Point3d ptTR = ProjectPointOnPlane(bboxContour.GetMax(), plPlane) ; SetControlPoint( 0, ptBL) ; SetControlPoint( 1, Point3d( ptTR.x, ptBL.y)) ; SetControlPoint( 2, Point3d( ptBL.x, ptTR.y)) ; SetControlPoint( 3, ptTR) ; - // calcolo il corrispondente parametrico del contorno PtrOwner pCCContour( CreateCurveComposite()) ; if ( IsNull( pCCContour)) return false ; pCCContour->FromPolyLine( PL) ; + ICRVCOMPOPVECTOR vpCCParam ; + UnprojectCurveFromStm( pCCContour, vpCCParam, &plPlane) ; // calcolo gli eventuali poli, necessari per poter chiamare le funzioni di unproject CalcPoles() ; ICRVCOMPOPOVECTOR vCCOpen ; ICRVCOMPOPOVECTOR vCCClosed ; - AddCurveCompoToCuts( pCCContour, vCCOpen, vCCClosed) ; + for( int i = 0 ; i < int( vpCCParam.size()) ; ++i ) + AddCurveCompoToCuts( vpCCParam[i], vCCOpen, vCCClosed) ; // creo la regione di trim dai loop di trim PtrOwner pSfrTrim( CreateTrimRegionFromCuts( vCCOpen, vCCClosed)) ; if ( IsNull( pSfrTrim) || ! pSfrTrim->IsValid()) diff --git a/SurfBezier.h b/SurfBezier.h index 9693ef3..6d8d63b 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -135,7 +135,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW bool IncreaseUV( Point3d& ptUV, Vector3d vtH , Point3d* ptUVCopy, bool bModifyOrig) const override ; // funzione che restituisce gli edge della superficie o in forma di linea spezzata o in forma di curva di Bezier // se la superficie è trimmata restituisce i loop dello spazio parametrico in forma di linee spezzate - bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge = -1) const override ; + bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge = -1) const override ; // se la superficie non è trimmata restituisce un vettore di 4 elementi. Se la superficie è chiusa lungo un parametro i lati algi estremi di quel parametro saranno null. bool IsPlanar( void) const override ; bool CreateByFlatContour( const PolyLine& PL) override ; bool CreateByRegion( const POLYLINEVECTOR& vPL) override ; @@ -200,7 +200,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const ; bool UpdateEdgesFromTree( Tree& tr) const ; // funzione che calcola se gli edge sono collassati in poli - bool CalcPoles( void) ; + bool CalcPoles( void) const ; bool FindMatchByParam( const PolyLine& pl0, const PolyLine& pl1, INTVECTOR& vMatch, int& nLong) const ; bool ParametrizeByLen( const ICurveComposite* pCurve0, const ICurveComposite* pCurve1, DBLVECTOR& vParam0, DBLVECTOR& vParam1) const ;