diff --git a/CurveComposite.cpp b/CurveComposite.cpp index a384685..8eba98f 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -3763,3 +3763,28 @@ CurveComposite::ResetVoronoiObject() const delete m_pVoronoiObj ; m_pVoronoiObj = nullptr ; } + +//---------------------------------------------------------------------------- +bool +CurveComposite::FromPoint(Point3d& ptStart) +{ + // verifico lo stato + if ( m_nStatus != TO_VERIFY) + return false ; + // assegno il punto e setto lo stato + m_ptStart = ptStart ; + m_nStatus = IS_A_POINT ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +CurveComposite::GetOnlyPoint(Point3d& ptStart) const +{ + // verifico lo stato + if ( m_nStatus != IS_A_POINT) + return false ; + // restituisco il punto + ptStart = m_ptStart ; + return true ; +} diff --git a/CurveComposite.h b/CurveComposite.h index ee458fc..f60baf8 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -150,7 +150,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool IsParamAtJoint( double dU) const override ; ICurve* RemoveFirstOrLastCurve( bool bLast = true) override ; bool ChangeStartPoint( double dU) override ; - bool AddPoint( const Point3d& ptStart) override ; + bool AddPoint( const Point3d& ptStart) override ; // funzione per aggiungere il ptStart prima di usare la funzione AddLine bool AddLine( const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddLineTg( double dLen, bool bEndOrStart = true) override ; bool AddArc2P( const Point3d& ptOther, const Point3d& ptNew, bool bEndOrStart = true) override ; @@ -177,6 +177,8 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool GetCurveTempProp( int nCrv, int& nProp, int nPropInd = 0) const override ; bool SetCurveTempParam( int nCrv, double dParam, int nParamInd = 0) override ; bool GetCurveTempParam( int nCrv, double& dParam, int nParamInd = 0) const override ; + bool FromPoint( Point3d& ptStart) override ; // funzione per settare la curva ad un unico punto + bool GetOnlyPoint( Point3d& ptStart) const override ; // funzione per recuperare l'unico punto da cui è composta la curva ( degenere) public : // IGeoObjRW int GetNgeId( void) const override ; @@ -209,7 +211,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW void ResetVoronoiObject( void) const ; private : - enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ; + enum Status { ERR = 0, OK = 1, TO_VERIFY = 2, IS_A_POINT = 3} ; private : typedef std::deque PCRVSMPL_DEQUE ; diff --git a/SurfBezier.cpp b/SurfBezier.cpp index d368e81..534cb3d 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1448,10 +1448,7 @@ SurfBezier::UpdateEdgesFromTree( Tree& tr) const { POLYLINEMATRIX mPlEdges(4) ; tr.GetEdges3D( mPlEdges) ; - bool bComposed = true ; - //m_mCCEdge.clear() ; for ( int i= 0 ; i < int( mPlEdges.size()); ++i) { - //m_mCCEdge.emplace_back() ; for ( int j = 0 ; j < int ( mPlEdges[i].size()) ; ++j) { m_mCCEdge[i].emplace_back(CreateBasicCurveComposite()) ; PolyLine pl3D ; @@ -1465,17 +1462,9 @@ SurfBezier::UpdateEdgesFromTree( Tree& tr) const pl3D.AddUPoint( nCount, pt3D) ; ++ nCount ; } - if ( ! m_mCCEdge[i].back()->FromPolyLine(pl3D)){ - bComposed = false ; - // qui NON faccio il pop_back dell'elemento aggiunto, anche se rimasto vuoto, perché devo avere corrispondenza per il numero di elementi tra m_mCCEdge e m_mPlEdge - } - } - } - // se degli edge hanno delle curve non valide allora salvo anche le polyline - if ( ! bComposed) { - for ( int i = 0 ; i < int(mPlEdges.size()) ; ++i) { - for ( int j = 0 ; j < int(mPlEdges[i].size()) ; ++j ) { - m_mPlEdge[i].emplace_back( mPlEdges[i][j]) ; + if ( ! m_mCCEdge[i].back()->FromPolyLine(pl3D)) { + Point3d ptStart ; pl3D.GetFirstPoint( ptStart) ; + m_mCCEdge[i].back()->FromPoint( ptStart) ; } } } @@ -1523,12 +1512,9 @@ SurfBezier::GetAuxSurf( void) const BIPNTVECTOR vTrees ; Tree.GetIndependentTrees( vTrees) ; bool bTest = false ; // per debug - //POLYLINEMATRIX mPlEdges(4) ; // resetto il vettore degli edge m_mCCEdge.clear() ; m_mCCEdge = vector(4) ; - //m_mPlEdge.clear() ; - //m_mPlEdge = vector(4) ; for ( int i = 0 ; i < (int) vTrees.size() ; ++ i) { Point3d ptMin = std::get<0>( vTrees[i]) ; Point3d ptMax = std::get<1>( vTrees[i]) ; @@ -1548,7 +1534,6 @@ SurfBezier::GetAuxSurf( void) const m_bClosedU = m_bClosedU || Tree.IsClosedU() ; m_bClosedV = m_bClosedU || Tree.IsClosedV() ; // salvo i bordi in 3d, che servono in caso si voglia trimmare la superficie DOPO aver costruito la trimesh ausiliaria - //Tree.GetEdges3D( mPlEdges) ; UpdateEdgesFromTree( Tree) ; } //// per usare i polygon basic////////////////////// @@ -2235,7 +2220,6 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) pCrv->GetStartPoint( ptStart) ; pCrv->GetStartDir( vtDirS) ; pCrv->GetEndDir( vtDirE) ; - //vtDirS.Rotate( Z_AX, bPos? 90 : -90) ; vtDir = vtDirS + vtDirE ; PtrOwner pCL( CreateCurveLine()) ; pCL->SetPVL( ptStart, vtDir, 1e6) ; @@ -2322,9 +2306,10 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in for ( int c = 0 ; c < 4 ; ++c) { // scorro sui tratti che compongono l'edge for ( int i = 0 ; i < int( m_mCCEdge[c].size()) ; ++i) { - if ( ! m_mCCEdge[c][i]->IsValid() ) { + if ( ! m_mCCEdge[c][i]->IsValid()) { Point3d pt ; - m_mPlEdge[c][i].GetFirstPoint(pt) ; + if ( ! m_mCCEdge[c][i]->GetOnlyPoint(pt)) + return false ; vInters[c] = AreSamePointApprox( pt, ptI) ? 1 : 0 ; nInters += vInters.back() ; } @@ -2397,9 +2382,10 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in for ( int ed = 0 ; ed < 4; ++ed) { // scorro sui tratti che compongono l'edge for ( int i = 0 ; i < int( m_mCCEdge[ed].size()) ; ++i) { - if ( ! m_mCCEdge[ed][i]->IsValid() ) { + if ( ! m_mCCEdge[ed][i]->IsValid()) { Point3d pt ; - m_mPlEdge[ed][i].GetFirstPoint(pt) ; + if ( ! m_mCCEdge[ed][i]->GetOnlyPoint(pt)) + return false ; if ( AreSamePointApprox( pt, vPT[p])) { vOn[p] = ed ; // se un vertice sta su un polo me lo segno @@ -2451,7 +2437,8 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in for ( int i = 0 ; i < int( m_mCCEdge[ed].size()) ; ++i) { if ( ! m_mCCEdge[ed][i]->IsValid()) { Point3d pt ; - m_mPlEdge[ed][i].GetFirstPoint( pt) ; + if ( ! m_mCCEdge[ed][i]->GetOnlyPoint( pt)) + return false ; if ( AreSamePointApprox( pt, vPT[p])) { vOn[p] = ed ; // se un vertice sta su un polo me lo segno @@ -2513,7 +2500,8 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in for( int i = 0 ; int( m_mCCEdge[c].size()) ; ++i) { if ( ! m_mCCEdge[c][i]->IsValid()) { Point3d pt ; - m_mPlEdge[c][i].GetFirstPoint( pt) ; + if ( ! m_mCCEdge[c][i]->GetOnlyPoint( pt)) + return false ; vbOn[p] = vbOn[p] || AreSamePointApprox( pt, vPT[p]) ; } else diff --git a/SurfBezier.h b/SurfBezier.h index 7238f9b..20ae6b3 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -210,9 +210,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW int m_nTempProp[2] ; // vettore proprietà temporanee double m_dTempParam[2] ; // vettore parametri temporanei mutable vector m_mCCEdge ;// vettore dei vettori che contengono le curve compo degli edge della superficie nello spazio 3D - mutable POLYLINEMATRIX m_mPlEdge ; // vettore dei vettori delle polyline degli edge della superficie nello spazio 3D mutable ICRVCOMPOPOVECTOR m_vCCLoop ; // vettore dei loop della superficie trimmata - //mutable POLYLINEVECTOR m_vPlLoop ; // vettore delle polyline dei loop della superficie trimmata } ; //----------------------------------------------------------------------------- diff --git a/Tree.cpp b/Tree.cpp index ad80b37..38b6b62 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -3639,7 +3639,6 @@ Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges) // scorro sui gruppi di polyline che rappresentano i poligoni delle celle lungo un lato for ( int i = 0 ; i < int( mPL.size()) ; ++i) { - //mPLEdges.emplace_back() ; mPLEdges.back().emplace_back() ; int nPtCount = 0 ; // scorro sui poligoni delle celle di un lato