diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index 0221ab9..06759a7 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -1546,6 +1546,9 @@ MyCreateCurveCompo( int nParentId, const INTVECTOR& vIds, bool bErase) IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) nParentId = AdjustId( nParentId) ; + // verifico vettore Id non vuoto + if ( vIds.empty()) + return GDB_ID_NULL ; // creo la curva composita PtrOwner pCrvCompo( CreateCurveComposite()) ; if ( IsNull( pCrvCompo)) @@ -1558,10 +1561,8 @@ MyCreateCurveCompo( int nParentId, const INTVECTOR& vIds, bool bErase) Vector3d vtExtr = CalcExtrusion( pGeomDB, nParentId, RTY_GRID) ; double dThick = 0 ; // esecuzione - INTVECTOR::const_iterator Iter ; - for ( Iter = vIds.begin() ; Iter != vIds.end() ; ++Iter) { + for ( auto nIdCrv : vIds) { // recupero la curva - int nIdCrv = *Iter ; const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nIdCrv)) ; if ( pCrv == nullptr) return GDB_ID_NULL ; @@ -1594,12 +1595,18 @@ MyCreateCurveCompo( int nParentId, const INTVECTOR& vIds, bool bErase) // inserisco la curva composita nel DB int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pCrvCompo)) ; ExeSetModified() ; - // se ok e richiesto, cancello le curve originali + // se ok e richiesta cancellazione curve originali if ( nId != GDB_ID_NULL && bErase) { - for ( Iter = vIds.begin() ; Iter != vIds.end() ; ++Iter) { - if ( ! pGeomDB->Erase( *Iter)) - return GDB_ID_NULL ; + // cancello le curve originali e determino Id minimo + int nMinId = INT_MAX ; + for ( auto nIdCrv : vIds) { + pGeomDB->Erase( nIdCrv) ; + if ( nIdCrv < nMinId) + nMinId = nIdCrv ; } + // assegno alla curva composita l'Id minimo appena trovato + if ( pGeomDB->ChangeId( nId, nMinId)) + nId = nMinId ; } // restituisco l'identificativo della nuova entitą return nId ; @@ -1639,9 +1646,11 @@ MyCreateCurveCompoByChain( int nParentId, const INTVECTOR& vIds, double dToler = 10 * EPS_SMALL ; ChainCurves chainC ; chainC.Init( bAllowInvert, dToler, int( vIds.size())) ; + INTVECTOR vMyIds ; for ( size_t i = 0 ; i < vIds.size() ; ++ i) { int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; while ( nId != GDB_ID_NULL) { + vMyIds.emplace_back( nId) ; // recupero la curva e il suo riferimento ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCrv == nullptr) @@ -1748,14 +1757,37 @@ MyCreateCurveCompoByChain( int nParentId, const INTVECTOR& vIds, if ( ! bErase) pGeomDB->SetInfo( nNewId, "ORIG", vOrig) ; } - // se richiesto e ok, cancello le curve originali - if ( bErase && nFirstId != GDB_ID_NULL) { - for ( size_t i = 0 ; i < vIds.size() ; ++ i) { - int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; - while ( nId != GDB_ID_NULL) { - pGeomDB->Erase( nId) ; - // passo al successivo - nId = (( vIds[i] != GDB_ID_SEL) ? GDB_ID_NULL : pGeomDB->GetFirstSelectedObj()) ; + // se ok e richiesta cancellazione curve originali + if ( nFirstId != GDB_ID_NULL && bErase) { + // cancello le curve originali e determino Id minimo + int nMinId = INT_MAX ; + for ( auto nId : vMyIds) { + pGeomDB->Erase( nId) ; + if ( nId < nMinId) + nMinId = nId ; + } + // se una sola curva composita risultante + if ( nCount == 1) { + // assegno alla curva composita l'Id minimo appena trovato + if ( pGeomDB->ChangeId( nFirstId, nMinId)) + nFirstId = nMinId ; + } + // altrimenti, con pił curve devo trovare un intervallo adeguato di Id consecutivi minimi + else { + // verifico intervallo Id minimi + bool bOk = true ; + for ( int i = 0 ; i < nCount ; ++ i) { + if ( pGeomDB->ExistsObj( nMinId + i)) { + bOk = false ; + break ; + } + } + // se intervallo trovato, li assegno + if ( bOk) { + for ( int i = 0 ; i < nCount ; ++ i) { + pGeomDB->ChangeId( nFirstId + i, nMinId + i) ; + } + nFirstId = nMinId ; } } } diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index 2987f80..8860e87 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -1206,9 +1206,12 @@ ExeCreateSurfTmByTriangles( int nParentId, const INTVECTOR& vIds, bool bErase) StmFromTriangleSoup StmFts ; bOk = bOk && StmFts.Start() ; // Recupero tutti i triangoli delle superfici sorgenti e li inserisco nella nuova - for ( size_t i = 0 ; i < vIds.size() ; ++ i) { + INTVECTOR vMyIds ; + for ( size_t i = 0 ; bOk && i < vIds.size() ; ++ i) { int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; while ( nId != GDB_ID_NULL) { + // salvo Id nel mio elenco + vMyIds.emplace_back( nId) ; // recupero la superficie sorgente const ISurfTriMesh* pStmS = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; bOk = bOk && ( pStmS != nullptr) ; @@ -1237,14 +1240,16 @@ ExeCreateSurfTmByTriangles( int nParentId, const INTVECTOR& vIds, bool bErase) int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pStm)) : GDB_ID_NULL) ; // se richiesto, cancello le superfici originali if ( nNewId != GDB_ID_NULL && bErase) { - for ( size_t i = 0 ; i < vIds.size() ; ++ i) { - int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; - while ( nId != GDB_ID_NULL) { - pGeomDB->Erase( nId) ; - // passo al successivo - nId = (( vIds[i] != GDB_ID_SEL) ? GDB_ID_NULL : pGeomDB->GetFirstSelectedObj()) ; - } + // cancello le superfici originali e determino Id minimo + int nMinId = INT_MAX ; + for ( auto nId : vMyIds) { + pGeomDB->Erase( nId) ; + if ( nId < nMinId) + nMinId = nId ; } + // assegno alla superficie composita l'Id minimo appena trovato + if ( pGeomDB->ChangeId( nNewId, nMinId)) + nNewId = nMinId ; } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente @@ -1276,9 +1281,12 @@ ExeCreateSurfTmBySewing( int nParentId, const INTVECTOR& vIds, bool bErase) bOk = bOk && ! IsNull( pStm) ; // esecuzione bool bFirst = true ; + INTVECTOR vMyIds ; for ( size_t i = 0 ; bOk && i < vIds.size() ; ++ i) { int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; while ( nId != GDB_ID_NULL) { + // salvo Id nel mio elenco + vMyIds.emplace_back( nId) ; // recupero la superficie da cucire const ISurfTriMesh* pStmS = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; bOk = bOk && ( pStmS != nullptr) ; @@ -1306,14 +1314,16 @@ ExeCreateSurfTmBySewing( int nParentId, const INTVECTOR& vIds, bool bErase) int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pStm)) : GDB_ID_NULL) ; // se richiesto, cancello le superfici originali if ( nNewId != GDB_ID_NULL && bErase) { - for ( size_t i = 0 ; i < vIds.size() ; ++ i) { - int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; - while ( nId != GDB_ID_NULL) { - pGeomDB->Erase( nId) ; - // passo al successivo - nId = (( vIds[i] != GDB_ID_SEL) ? GDB_ID_NULL : pGeomDB->GetFirstSelectedObj()) ; - } + // cancello le superfici originali e determino Id minimo + int nMinId = INT_MAX ; + for ( auto nId : vMyIds) { + pGeomDB->Erase( nId) ; + if ( nId < nMinId) + nMinId = nId ; } + // assegno alla superficie composita l'Id minimo appena trovato + if ( pGeomDB->ChangeId( nNewId, nMinId)) + nNewId = nMinId ; } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente diff --git a/EXE_GdbModifyCurve.cpp b/EXE_GdbModifyCurve.cpp index ca5c357..cc4fee9 100644 --- a/EXE_GdbModifyCurve.cpp +++ b/EXE_GdbModifyCurve.cpp @@ -1318,6 +1318,62 @@ ExeCloseCurveCompo( int nId) return bOk ; } +//------------------------------------------------------------------------------- +bool +MyAddCurveCompoCurve( int nId, int nAddCrvId, bool bEraseOrig) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva composita + ICurveComposite* pCompo = GetCurveComposite( pGeomDB->GetGeoObj( nId)) ; + if ( pCompo == nullptr) + return false ; + // recupero il riferimento locale + Frame3d frLoc ; + if ( ! pGeomDB->GetGlobFrame( nId, frLoc)) + return false ; + // recupero la curva + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nAddCrvId)) ; + if ( pCrv == nullptr) + return false ; + // recupero il riferimento della curva + Frame3d frSou ; + if ( ! pGeomDB->GetGlobFrame( nAddCrvId, frSou)) + return false ; + // creo una copia della curva + PtrOwner pCopCrv( pCrv->Clone()) ; + if ( IsNull( pCopCrv)) + return false ; + // se i riferimenti sono diversi, eseguo la trasformazione + if ( ! AreSameFrame( frSou, frLoc)) + pCopCrv->LocToLoc( frSou, frLoc) ; + // aggiungo alla composita + if ( ! pCompo->AddCurve( Release( pCopCrv))) + return false ; + // se richiesto, cancello la curva originale + if ( bEraseOrig) + pGeomDB->Erase( nAddCrvId) ; + return true ; +} + +//------------------------------------------------------------------------------- +bool +ExeAddCurveCompoCurve( int nId, int nAddCrvId, bool bEraseOrig) +{ + // eseguo + bool bOk = MyAddCurveCompoCurve( nId, nAddCrvId, bEraseOrig) ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtAddCurveCompoCurve(" + IdToString( nId) + "," + + IdToString( nAddCrvId) + "," + + ( bEraseOrig ? "true" : "false") + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco l'identificativo della nuova entitą + return bOk ; +} + //------------------------------------------------------------------------------- bool ExeAddCurveCompoLine( int nId, const Point3d& ptP, int nRefType) diff --git a/LUA_GdbModifyCurve.cpp b/LUA_GdbModifyCurve.cpp index 6c15cfc..3a9488d 100644 --- a/LUA_GdbModifyCurve.cpp +++ b/LUA_GdbModifyCurve.cpp @@ -487,7 +487,7 @@ LuaSplitCurveAtSelfInters( lua_State* L) static int LuaGetCurveLinearConvexHullXY( lua_State* L) { - // 1 o 2 o 3 parametri : Id, [dLinTol [, nRefType]] + // 1 o 2 o 3 parametri : nId [, dLinTol [, nRefType]] int nId ; LuaCheckParam( L, 1, nId) double dLinTol = LIN_TOL_STD ; @@ -495,7 +495,7 @@ LuaGetCurveLinearConvexHullXY( lua_State* L) int nRefType = RTY_DEFAULT ; LuaGetParam( L, 3, nRefType) ; LuaClearStack( L) ; - // calcolo il convex hull nel piano XY del riferimento indicato + // calcolo il convex hull della curva nel piano XY del riferimento indicato int nNewId = ExeGetCurveLinearConvexHullXY( nId, dLinTol, nRefType) ; if ( nNewId != GDB_ID_NULL) LuaSetParam( L, nNewId) ; @@ -562,6 +562,24 @@ LuaCloseCurveCompo( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaAddCurveCompoCurve( lua_State* L) +{ + // 2 o 3 parametri : Id, AddCrvId [, bEraseOrig] + int nId ; + LuaCheckParam( L, 1, nId) + int nAddCrvId ; + LuaCheckParam( L, 2, nAddCrvId) + bool bEraseOrig = true ; + LuaGetParam( L, 3, bEraseOrig) ; + LuaClearStack( L) ; + // aggiungo la curva in coda alla curva composita + bool bOk = ExeAddCurveCompoCurve( nId, nAddCrvId, bEraseOrig) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaAddCurveCompoLine( lua_State* L) @@ -796,6 +814,7 @@ LuaInstallGdbModifyCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtModifyArcToExplementary", LuaModifyArcToExplementary) ; bOk = bOk && luaMgr.RegisterFunction( "EgtModifyArcByFlip", LuaModifyArcByFlip) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCloseCurveCompo", LuaCloseCurveCompo) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtAddCurveCompoCurve", LuaAddCurveCompoCurve) ; bOk = bOk && luaMgr.RegisterFunction( "EgtAddCurveCompoLine", LuaAddCurveCompoLine) ; bOk = bOk && luaMgr.RegisterFunction( "EgtAddCurveCompoArcTg", LuaAddCurveCompoArcTg) ; bOk = bOk && luaMgr.RegisterFunction( "EgtAddCurveCompoArc2P", LuaAddCurveCompoArc2P) ;