EgtGeomKernel :

- aggiornamento funzioni per recuperare i loop di una surf di bezier.
This commit is contained in:
Daniele Bariletti
2025-10-14 16:30:45 +02:00
parent 942f15b49d
commit 5c287d49bb
2 changed files with 22 additions and 29 deletions
+18 -25
View File
@@ -3333,7 +3333,7 @@ SurfBezier::CalcPoles( void) const
//----------------------------------------------------------------------------
bool
SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) const
SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier) const
{
// se necessario calcolo i poli
if ( m_vbPole.empty())
@@ -3347,30 +3347,23 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con
// se la superficie non è trimmata mi basta recuperare gli edge della superficie
if ( ! m_bTrimmed) {
// se decidessi di non restituire gli edge chiusi e i poli posso discriminare qui
if ( nEdge == -1 ) {
vCC = ICRVCOMPOPOVECTOR(4) ;
if ( ! m_bClosedV ) {
if ( ! m_vbPole[0])
vCC[0].Set( GetSingleEdge3D( bLineOrBezier, 0)) ;
if ( ! m_vbPole[2])
vCC[2].Set( GetSingleEdge3D( bLineOrBezier, 2)) ;
}
if ( ! m_bClosedU ) {
if ( ! m_vbPole[1])
vCC[1].Set( GetSingleEdge3D( bLineOrBezier, 1)) ;
if ( ! m_vbPole[3])
vCC[3].Set( GetSingleEdge3D( bLineOrBezier, 3)) ;
}
//// se li volessi restituire tutti
//vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 0)) ;
//vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 1)) ;
//vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 2)) ;
//vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 3)) ;
}
else {
if ( (((nEdge == 0 || nEdge == 2) && ! m_bClosedV) || ((nEdge == 1 || nEdge == 3) && ! m_bClosedU)) && ! m_vbPole[nEdge])
vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, nEdge)) ;
}
vCC.emplace_back() ;
if ( ! m_bClosedV ) {
if ( ! m_vbPole[0])
vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 0)) ;
}
if ( ! m_bClosedU ) {
if ( ! m_vbPole[1])
vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 1)) ;
}
if ( ! m_bClosedV ) {
if ( ! m_vbPole[2])
vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 2)) ;
}
if ( ! m_bClosedU ) {
if ( ! m_vbPole[3])
vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 3)) ;
}
}
// se la superficie è trimmata devo recuperare i loop dello spazio parametrico
else {
+4 -4
View File
@@ -136,8 +136,10 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
bool IncreaseUV( double& dU, double dx, bool bUOrV, double* dUVCopy = nullptr, bool bModifyOrig = true) const override ;
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 ; // 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.
// restituisce un vettore con i loop della superficie ( più di uno solo se è trimmata con un parametrico con buchi o più di un chunk)
bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier) const override ;
// restituisce il singolo edge della superficie non trimmata
ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const override ;
bool IsPlanar( void) const override ;
bool CreateByFlatContour( const PolyLine& PL) override ;
bool CreateByRegion( const POLYLINEVECTOR& vPL) override ;
@@ -200,8 +202,6 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
// funzione che proietta nello spazio parametrico un trim derivante da un taglio con un piano, categorizzandolo come aperto o chiuso ( nel parametrico)
bool AddCurveCompoToCuts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed, double dToler = EPS_SMALL, const Plane3d* pPlCut = nullptr) const ;
ISurfFlatRegion* CreateTrimRegionFromCuts( ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed) const ;
// restituisce il singolo edge della superficie non trimmata
ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const ;
// funzione che calcola se gli edge sono collassati in poli
bool CalcPoles( void) const ;
bool FindMatchByParam( const PolyLine& pl0, const PolyLine& pl1, INTVECTOR& vMatch, int& nLong) const ;