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:
Dario Sassi
2018-12-28 19:31:45 +00:00
parent da88af65ed
commit 1c9e4ab44a
4 changed files with 149 additions and 32 deletions
+47 -15
View File
@@ -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
View File
@@ -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
+56
View File
@@ -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
View File
@@ -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) ;