EgtGeomKernel 2.3c3 :
- corretta CurveComposite::ModifyJoint per gestire anche estremi di curva aperta - corretta propagazione tipo precedente/successivo in intersezione di curve composite - GeomDB::ChangeId ora se i due Id sono identici non fa alcunché ed esce con successo.
This commit is contained in:
+17
-15
@@ -1759,30 +1759,32 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint)
|
||||
return false ;
|
||||
// numero di curve
|
||||
int nCrvCount = GetCurveCount() ;
|
||||
// verifico l'indice della giunzione
|
||||
if ( nU < 0 || nU > nCrvCount)
|
||||
return false ;
|
||||
// recupero il puntatore alla curva precedente (se esiste)
|
||||
ICurve* pPrevCrv = nullptr ;
|
||||
if ( nU > 0 && nU <= nCrvCount)
|
||||
if ( nU > 0)
|
||||
pPrevCrv = m_CrvSmplS[ nU - 1] ;
|
||||
else if ( nU == 0 && IsClosed())
|
||||
else if ( IsClosed())
|
||||
pPrevCrv = m_CrvSmplS[ nCrvCount - 1] ;
|
||||
// recupero il puntatore alla curva successiva (se esiste)
|
||||
ICurve* pNextCrv = nullptr ;
|
||||
if ( nU >= 0 && nU < nCrvCount)
|
||||
if ( nU < nCrvCount)
|
||||
pNextCrv = m_CrvSmplS[ nU] ;
|
||||
else if ( nU == nCrvCount && IsClosed())
|
||||
else if ( IsClosed())
|
||||
pNextCrv = m_CrvSmplS[ 0] ;
|
||||
// se non esiste curva precedente o curva successiva, errore
|
||||
if ( pPrevCrv == nullptr || pNextCrv == nullptr)
|
||||
// modifico il punto finale dell'eventuale entità precedente
|
||||
if ( pPrevCrv != nullptr && ! pPrevCrv->ModifyEnd( ptNewJoint))
|
||||
return false ;
|
||||
// modifico il punto finale dell'entità precedente
|
||||
if ( ! pPrevCrv->ModifyEnd( ptNewJoint))
|
||||
return false ;
|
||||
// modifico il punto iniziale dell'entità successiva
|
||||
if ( ! pNextCrv->ModifyStart( ptNewJoint)) {
|
||||
// c'è stato errore, ripristino punto finale dell'entità precedente
|
||||
Point3d ptJ ;
|
||||
pNextCrv->GetStartPoint( ptJ) ;
|
||||
pPrevCrv->ModifyEnd( ptJ) ;
|
||||
// modifico il punto iniziale dell'eventuale entità successiva
|
||||
if ( pNextCrv != nullptr && ! pNextCrv->ModifyStart( ptNewJoint)) {
|
||||
// c'è stato errore, ripristino punto finale dell'eventuale entità precedente
|
||||
if ( pPrevCrv != nullptr) {
|
||||
Point3d ptJ ;
|
||||
pNextCrv->GetStartPoint( ptJ) ;
|
||||
pPrevCrv->ModifyEnd( ptJ) ;
|
||||
}
|
||||
return false ;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
@@ -1367,6 +1367,9 @@ GeomDB::GetNewId( void) const
|
||||
bool
|
||||
GeomDB::ChangeId( int nId, int nNewId)
|
||||
{
|
||||
// se Id identici, non faccio alcunché
|
||||
if ( nNewId == nId)
|
||||
return true ;
|
||||
// verifico nuovo Id
|
||||
if ( ExistsObj( nNewId))
|
||||
return false ;
|
||||
|
||||
+16
-16
@@ -474,18 +474,18 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i) {
|
||||
// se il tipo di accostamento per la curva A non è definito
|
||||
if ( m_Info[i].IciA[0].nPrevTy == ICCT_NULL) {
|
||||
if ( i == 0 && ! bCrvAClosed)
|
||||
continue ;
|
||||
int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ;
|
||||
m_Info[i].IciA[0].nPrevTy = ( m_Info[j].bOverlap ? m_Info[j].IciA[1].nNextTy : m_Info[j].IciA[0].nNextTy) ;
|
||||
if ( i > 0 || bCrvAClosed) {
|
||||
int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ;
|
||||
m_Info[i].IciA[0].nPrevTy = ( m_Info[j].bOverlap ? m_Info[j].IciA[1].nNextTy : m_Info[j].IciA[0].nNextTy) ;
|
||||
}
|
||||
}
|
||||
// se il tipo di allontanamento per la curva A non è definito
|
||||
int ki = ( m_Info[i].bOverlap ? 1 : 0) ;
|
||||
if ( m_Info[i].IciA[ki].nNextTy == ICCT_NULL) {
|
||||
if ( i == m_nNumInters - 1 && ! bCrvAClosed)
|
||||
continue ;
|
||||
int j = ( i < m_nNumInters - 1 ? i + 1 : 0) ;
|
||||
m_Info[i].IciA[ki].nNextTy = m_Info[j].IciA[0].nPrevTy ;
|
||||
if ( i < m_nNumInters - 1 || bCrvAClosed) {
|
||||
int j = ( i < m_nNumInters - 1 ? i + 1 : 0) ;
|
||||
m_Info[i].IciA[ki].nNextTy = m_Info[j].IciA[0].nPrevTy ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,17 +494,17 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i) {
|
||||
// se il tipo di accostamento per la curva B non è definito
|
||||
if ( m_Info[i].IciB[0].nPrevTy == ICCT_NULL) {
|
||||
if ( i == 0 && ! bCrvBClosed)
|
||||
continue ;
|
||||
int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ;
|
||||
m_Info[i].IciB[0].nPrevTy = ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq ? m_Info[j].IciB[1].nNextTy : m_Info[j].IciB[0].nNextTy) ;
|
||||
if ( i > 0 || bCrvBClosed) {
|
||||
int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ;
|
||||
m_Info[i].IciB[0].nPrevTy = ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq ? m_Info[j].IciB[1].nNextTy : m_Info[j].IciB[0].nNextTy) ;
|
||||
}
|
||||
}
|
||||
// se il tipo di allontanamento per la curva B non è definito
|
||||
if ( m_Info[i].IciB[0].nNextTy == ICCT_NULL) {
|
||||
if ( i == m_nNumInters - 1 && ! bCrvBClosed)
|
||||
continue ;
|
||||
int j = ( i < m_nNumInters - 1 ? i + 1 : 0) ;
|
||||
m_Info[i].IciB[0].nNextTy = ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq ? m_Info[j].IciB[1].nPrevTy : m_Info[j].IciB[0].nPrevTy) ;
|
||||
if ( i < m_nNumInters - 1 || bCrvBClosed) {
|
||||
int j = ( i < m_nNumInters - 1 ? i + 1 : 0) ;
|
||||
m_Info[i].IciB[0].nNextTy = ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq ? m_Info[j].IciB[1].nPrevTy : m_Info[j].IciB[0].nPrevTy) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// ripristino ordinamento su prima curva
|
||||
|
||||
Reference in New Issue
Block a user