EgtGeomKernel :
- GetSurfBezierRuledGuided.
This commit is contained in:
+2
-3
@@ -735,8 +735,7 @@ GetSurfBezierRuled( const ICurve* pCurve1, const ICurve* pCurve2, int nType, dou
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
ISurfBezier*
|
||||
GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BIPNTVECTOR& vCrv,
|
||||
const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew, double dLinTol)
|
||||
GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BIPNTVECTOR& vCrv, double dLinTol)
|
||||
{
|
||||
// verifica parametri
|
||||
if ( pCurve1 == nullptr || pCurve2 == nullptr)
|
||||
@@ -763,7 +762,7 @@ GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BI
|
||||
|
||||
// creo e setto la superficie trimesh
|
||||
PtrOwner<SurfBezier> pSbz( CreateBasicSurfBezier()) ;
|
||||
if ( IsNull( pSbz) || ! pSbz->CreateByIsoParamSet( pCC1, pCC2, vCrv, vShown, vEdited, vNew))
|
||||
if ( IsNull( pSbz) || ! pSbz->CreateByIsoParamSet( pCC1, pCC2, vCrv))
|
||||
return nullptr ;
|
||||
|
||||
// restituisco la superficie
|
||||
|
||||
+14
-52
@@ -5653,10 +5653,8 @@ struct IsoParam {
|
||||
int nCrv ;
|
||||
double dParam0 ;
|
||||
double dParam1 ;
|
||||
bool bNew ; // new or edited
|
||||
bool bShown ;
|
||||
IsoParam( int _nCrv, double _dParam0, double _dParam1, bool _bNew = false, bool _bShown = false) :
|
||||
nCrv(_nCrv), dParam0( _dParam0), dParam1( _dParam1), bNew( _bNew), bShown( _bShown){ } ;
|
||||
IsoParam( int _nCrv, double _dParam0, double _dParam1) :
|
||||
nCrv(_nCrv), dParam0( _dParam0), dParam1( _dParam1){ } ;
|
||||
bool operator < ( IsoParam& b)
|
||||
{
|
||||
return ( abs(dParam0 - b.dParam0) > EPS_SMALL ? dParam0 < b.dParam0 : dParam1 < b.dParam1) ;
|
||||
@@ -5667,12 +5665,13 @@ typedef vector<IsoParam> ISOPARVECT ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv, const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew)
|
||||
SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv)
|
||||
{
|
||||
// vCrv è il vettore delle isocurve (nel parametro V) di una surf ( creata come rigata) che si vuole modificare ( già ordinato)
|
||||
// vNewCrv è il vettore delle isocurve mostrate durante l'editing, che comprende le curve editate e le curve nuove
|
||||
// vShown indica gli indici delle curve in vCrv che sono mostrate in vCrv
|
||||
// vNewOrEdited indica la coppia di indici (nId1, nId2) (in vCrv, in vNewCrv) per le curve editate e una coppia (-1, nId) per le curve aggiunte
|
||||
// vCrv è il vettore delle isocurve (nel parametro V) che si vogliono forzare per la creazione della rigata tra Curve0 e Curve1
|
||||
|
||||
//controllo che siano entrambe chiuse o entrambe aperte
|
||||
if( pCurve0->IsClosed() ^ pCurve1->IsClosed())
|
||||
return false ;
|
||||
|
||||
// converto in bezier la curva iniziale
|
||||
CurveComposite CrvU0 ; CrvU0.AddCurve( CurveToBezierCurve(pCurve0)) ;
|
||||
@@ -5711,63 +5710,24 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
|
||||
// costruisco il vettore delle nuove curve isoparamtriche per la nuova superficie
|
||||
ISOPARVECT vIso ;
|
||||
int nNewCounter = 0 ;
|
||||
int nShowCounter = 0 ;
|
||||
int nEditCounter = 0 ;
|
||||
for ( int i = 0 ; i < ssize( vCrv) ; ++i) {
|
||||
Point3d ptU0 = vCrv[i].first ;
|
||||
Point3d ptU1 = vCrv[i].second ;
|
||||
double dParam0 ; CrvU0.GetParamAtPoint( ptU0, dParam0) ;
|
||||
double dParam1 ; CrvU1.GetParamAtPoint( ptU1, dParam1) ;
|
||||
if ( nEditCounter < ssize( vEdited) && i == vEdited[nEditCounter]) {
|
||||
vIso.emplace_back( i, dParam0, dParam1, true, true) ;
|
||||
++ nEditCounter ;
|
||||
++ nShowCounter ;
|
||||
}
|
||||
else if ( nNewCounter < ssize( vNew) && i == vNew[nNewCounter]) {
|
||||
vIso.emplace_back( i, dParam0, dParam1, true) ;
|
||||
++ nNewCounter ;
|
||||
}
|
||||
else if ( nShowCounter < ssize( vShown) && i == vShown[nShowCounter]) {
|
||||
vIso.emplace_back( i, dParam0, dParam1, false, true) ;
|
||||
++ nShowCounter ;
|
||||
}
|
||||
else
|
||||
vIso.emplace_back( i, dParam0, dParam1) ;
|
||||
vIso.emplace_back( i, dParam0, dParam1) ;
|
||||
}
|
||||
|
||||
sort( vIso.begin(), vIso.end()) ;
|
||||
|
||||
// scorro vIso per eliminare le isocurve non più necessarie
|
||||
// scorro vIso per verificare che non ci siano curve che si intersecano
|
||||
int c = 0 ;
|
||||
dLastParam0 = vIso[c].dParam0 ;
|
||||
dLastParam1 = vIso[c].dParam1 ;
|
||||
++c ;
|
||||
while ( c < ssize( vIso)) {
|
||||
if ( vIso[c].dParam1 >= dLastParam1 && ! vIso[c].bNew)
|
||||
; // non devo fare nulla
|
||||
else {
|
||||
dLastParam0 = vIso[c].dParam0 ;
|
||||
dLastParam1 = vIso[c].dParam1 ;
|
||||
// cancello tutte le curve avanti e indietro finché incontro una show che non viene intersecata
|
||||
int c_temp = c + 1 ;
|
||||
while ( c_temp < ssize( vIso) && ! ( vIso[c_temp].bShown && vIso[c_temp].dParam0 >= dLastParam0 && vIso[c_temp].dParam1 >= dLastParam1)) {
|
||||
if ( vIso[c_temp].bNew)
|
||||
++c_temp ;
|
||||
else
|
||||
vIso.erase(vIso.begin() + c_temp) ;
|
||||
}
|
||||
c_temp = c - 1 ;
|
||||
while ( c_temp > 0 && ! ( vIso[c_temp].bShown && vIso[c_temp].dParam0 <= dLastParam0 && vIso[c_temp].dParam1 <= dLastParam1)) {
|
||||
if ( vIso[c_temp].bNew)
|
||||
--c_temp ;
|
||||
else {
|
||||
vIso.erase(vIso.begin() + c_temp) ;
|
||||
--c_temp ;
|
||||
--c ;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( vIso[c].dParam0 < dLastParam0 || vIso[c].dParam1 < dLastParam1)
|
||||
return false ;
|
||||
dLastParam0 = vIso[c].dParam0 ;
|
||||
dLastParam1 = vIso[c].dParam1 ;
|
||||
++c ;
|
||||
@@ -5775,6 +5735,8 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
|
||||
dLastParam0 = 0 ;
|
||||
dLastParam1 = 0 ;
|
||||
if( vIso[0].dParam0 > 0 || vIso[0].dParam1 > 1)
|
||||
vPairs.emplace_back( 0, 0) ;
|
||||
for ( int i = 0 ; i < ssize( vIso) ; ++i) {
|
||||
const BIPOINT& pCrv = vCrv[vIso[i].nCrv] ;
|
||||
Point3d ptU0 = pCrv.first ;
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
|
||||
bool CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez, bool bReduceToDeg3) override ;
|
||||
PNTVECTOR GetAllControlPoints( void) const ;
|
||||
bool GetAllPatchesIsocurves( bool bUorV, ICURVEPOVECTOR& vCrv) const ;
|
||||
bool CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv, const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew) ;
|
||||
bool CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv) ;
|
||||
bool RemoveCollapsedSpans() override ;
|
||||
bool SwapParameters() ;
|
||||
|
||||
|
||||
+1
-2
@@ -3855,8 +3855,7 @@ GetTrimmingRuledBezier( const CISURFPVECTOR& vSurf, const ICurve* pCrvEdge1,
|
||||
#endif
|
||||
// Definisco la superficie
|
||||
INTVECTOR vInd( ssize( vSyncPoints)) ; iota( vInd.begin(), vInd.end(), 0) ;
|
||||
pSurfBz.Set( GetSurfBezierRuledGuided( pCompoEdge1, pCompoEdge2, vSyncPoints, vInd,
|
||||
INTVECTOR{}, INTVECTOR{}, dMyLinTol)) ;
|
||||
pSurfBz.Set( GetSurfBezierRuledGuided( pCompoEdge1, pCompoEdge2, vSyncPoints, dMyLinTol)) ;
|
||||
if ( IsNull( pSurfBz) || ! pSurfBz->IsValid()) {
|
||||
LOG_ERROR( GetEGkLogger(), "Error in Trimming : Ruled Bezier with Sync Points invalid") ;
|
||||
return nullptr ;
|
||||
|
||||
Reference in New Issue
Block a user