diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 21b9b2c..3e87ed3 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -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 ; } diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 0921432..cbced92 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/GeomDB.cpp b/GeomDB.cpp index b1ca54d..b81abdb 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -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 ; diff --git a/IntersCrvCompoCrvCompo.cpp b/IntersCrvCompoCrvCompo.cpp index d29d744..1556d65 100644 --- a/IntersCrvCompoCrvCompo.cpp +++ b/IntersCrvCompoCrvCompo.cpp @@ -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