EgtExecutor :
- nella creazione di curve composite da altre curve si cerca di riutilizzare gli Id delle curve cancellate - lo stesso per le superfici - aggiunte funzioni Exe e Lua AddCurveCompoCurve.
This commit is contained in:
+47
-15
@@ -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<ICurveComposite> 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 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user