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 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+25
-15
@@ -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
|
||||
|
||||
@@ -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<ICurve> 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)
|
||||
|
||||
+21
-2
@@ -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) ;
|
||||
|
||||
Reference in New Issue
Block a user