EgtExecutor :

- aggiunte funzioni per l'approssimaizone di curve di bezier
- aggiunta la possibilità di scegliere il grado nella conversione da curva generica a curva di bezier.
This commit is contained in:
Daniele Bariletti
2024-08-26 16:52:12 +02:00
parent e463ba5500
commit ea83cb985d
6 changed files with 226 additions and 7 deletions
+3 -2
View File
@@ -2637,7 +2637,7 @@ MyCreateCurveBezierForm( int nParentId, int nCrvId)
//-------------------------------------------------------------------------------
int
ExeCreateCurveBezierForm( int nParentId, int nCrvId)
ExeCreateCurveBezierForm( int nParentId, int nCrvId, int nDeg)
{
// eseguo
int nId = MyCreateCurveBezierForm( nParentId, nCrvId) ;
@@ -2645,7 +2645,8 @@ ExeCreateCurveBezierForm( int nParentId, int nCrvId)
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtCurveBezierForm(" + IdToString( nParentId) + "," +
IdToString( nCrvId) + "," +
IdToString( nCrvId) + "," +
ToString( nDeg) + ")"
" -- Id=" + ToString( nId) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
+1 -1
View File
@@ -1,4 +1,4 @@
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// EgalTech 2014-2015
//----------------------------------------------------------------------------
// File : EXE_GdbCreateSurf.cpp Data : 04.05.15 Versione : 1.6e1
+1 -1
View File
@@ -745,7 +745,7 @@ ExeShowCurveBezierControlPoints( int nCrvId, int nDestGrpId, int* pnCount)
VERIFY_GEOMDB( pGeomDB, false)
// recupero la curva di bezier
IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nCrvId) ;
if ( pGeoObj->GetType() != CRV_BEZIER)
if ( pGeoObj->GetType() != CRV_BEZIER && pGeoObj->GetType() != CRV_COMPO)
return GDB_ID_NULL ;
// recupero il riferimento della curva
Frame3d frCrv ;
+181
View File
@@ -2990,5 +2990,186 @@ ExeCurveBezierDecreaseDegree( int nCrvId, double dTol)
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
ExeCurveBezierApproxToNonRat( int nCrvId, double dTol)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// recupero la curva
const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ;
if ( pCrv == nullptr)
return false ;
//// recupero il riferimento della curva
//Frame3d frCrv ;
//if ( ! pGeomDB->GetGlobFrame( nCrvId, frCrv))
// return GDB_ID_NULL ;
// controllo che il tipo sia giusto
if( pCrv->GetType() != CRV_BEZIER) {
if( pCrv->GetType() != CRV_COMPO)
return false ;
else {
const ICurveComposite* pCC = GetCurveComposite( pCrv) ;
for ( int i = 0 ; i < pCC->GetCurveCount() ; ++i) {
const ICurve* pSubCrv = pCC->GetCurve( i) ;
if( pSubCrv->GetType() != CRV_BEZIER)
return false ;
}
}
}
bool bOk = true ;
if( pCrv->GetType() == CRV_BEZIER) {
const ICurveBezier* pCrvBez = GetCurveBezier( pCrv) ;
if( ! pCrvBez->IsRational())
return true ;
// approssimo la curva con una corrispettiva non razionale
PtrOwner<ICurveBezier> pCrvBezierNew ( pCrvBez->Clone()) ;
bOk = bOk && pCrvBezierNew->MakeNonRational( dTol) ;
PtrOwner<ICurve> pCrvNew ;
if ( ! bOk) {
pCrvNew.Set( ApproxBezierWithCubics( pCrvBezierNew, dTol)) ;
bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ;
}
else
pCrvNew.Set( Release( pCrvBezierNew)) ;
bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ;
Vector3d vtExtr ;
if ( bOk && pCrv->GetExtrusion( vtExtr))
pCrvNew->SetExtrusion( vtExtr) ;
double dThick = 0 ;
if ( bOk && pCrv->GetThickness( dThick))
pCrvNew->SetThickness(dThick) ;
// sostituisco la vecchia curva con la nuova
bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCrvNew)) ;
}
else {
const ICurveComposite* pCC = GetCurveComposite( pCrv) ;
PtrOwner<ICurveComposite> pCCNew( CreateCurveComposite()) ;
for( int i = 0 ; i < pCC->GetCurveCount() ; ++i) {
const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( i)) ;
if( ! pCrvBez->IsRational()) {
continue ;
}
// approssimo la curva con una corrispettiva non razionale
PtrOwner<ICurveBezier> pCrvBezierNew ( pCrvBez->Clone()) ;
bOk = bOk && pCrvBezierNew->MakeNonRational( dTol) ;
PtrOwner<ICurve> pCrvNew ;
if ( ! bOk) {
pCrvNew.Set( ApproxBezierWithCubics( pCrvBezierNew, dTol)) ;
bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ;
}
else
pCrvNew.Set( Release( pCrvBezierNew)) ;
bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ;
Vector3d vtExtr ;
if ( bOk && pCrv->GetExtrusion( vtExtr))
pCrvNew->SetExtrusion( vtExtr) ;
double dThick = 0 ;
if ( bOk && pCrv->GetThickness( dThick))
pCrvNew->SetThickness(dThick) ;
if( bOk)
pCCNew->AddCurve( Release(pCrvNew)) ;
else
break ;
}
// sostituisco la vecchia curva con la nuova
bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCCNew)) ;
}
ExeSetModified() ;
if ( IsCmdLog()) {
string sLua = "EgtCurveBezierApproxToNonRat(" + ToString( nCrvId) + ", "
+ ToString( dTol) + ")"
" -- Ok=" + ToString( bOk) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
ExeCurveBezierApproxWithCubicBeziers( int nCrvId, double dTol)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// recupero la curva
const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ;
if ( pCrv == nullptr)
return false ;
// controllo che il tipo sia giusto
if( pCrv->GetType() != CRV_BEZIER) {
if( pCrv->GetType() != CRV_COMPO)
return false ;
else {
const ICurveComposite* pCC = GetCurveComposite( pCrv) ;
for ( int i = 0 ; i < pCC->GetCurveCount() ; ++i) {
const ICurve* pSubCrv = pCC->GetCurve( i) ;
if( pSubCrv->GetType() != CRV_BEZIER)
return false ;
}
}
}
// converto in bezier cubiche
bool bOk = true ;
if( pCrv->GetType() == CRV_BEZIER) {
const ICurveBezier* pCrvBez = GetCurveBezier( pCrv) ;
// approssimo la curva con una serie di bezier
PtrOwner<ICurve> pCrvBezierNew ( ApproxBezierWithCubics( pCrvBez, dTol)) ;
bOk = bOk && ! IsNull( pCrvBezierNew) && pCrvBezierNew->IsValid() ;
Vector3d vtExtr ;
if ( bOk && pCrv->GetExtrusion( vtExtr))
pCrvBezierNew->SetExtrusion( vtExtr) ;
double dThick = 0 ;
if ( bOk && pCrv->GetThickness( dThick))
pCrvBezierNew->SetThickness(dThick) ;
// sostituisco la vecchia curva con la nuova
bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCrvBezierNew)) ;
}
else {
const ICurveComposite* pCC = GetCurveComposite( pCrv) ;
PtrOwner<ICurveComposite> pCCNew( CreateCurveComposite()) ;
for( int i = 0 ; i < pCC->GetCurveCount() ; ++i) {
const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( i)) ;
if( ! pCrvBez->IsRational()) {
continue ;
}
// approssimo la curva con una serie di bezier
PtrOwner<ICurve> pCrvBezierNew ( ApproxBezierWithCubics( pCrvBez, dTol)) ;
bOk = bOk && ! IsNull( pCrvBezierNew) && pCrvBezierNew->IsValid() ;
Vector3d vtExtr ;
if ( bOk && pCrv->GetExtrusion( vtExtr))
pCrvBezierNew->SetExtrusion( vtExtr) ;
double dThick = 0 ;
if ( bOk && pCrv->GetThickness( dThick))
pCrvBezierNew->SetThickness(dThick) ;
if( bOk)
pCCNew->AddCurve( Release(pCrvBezierNew)) ;
else
break ;
}
// sostituisco la vecchia curva con la nuova
bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCCNew)) ;
}
ExeSetModified() ;
if ( IsCmdLog()) {
string sLua = "EgtCurveBezierApproxWithCubicBeziers(" + ToString( nCrvId) + ", "
+ ToString( dTol) + ")"
" -- Ok=" + ToString( bOk) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
return bOk ;
}
+4 -3
View File
@@ -1095,14 +1095,15 @@ LuaCreateCirclesAlongCurve( lua_State* L)
static int
LuaCreateCurveBezierForm( lua_State* L)
{
// 2 parametri : ParentId, nCrvId
// 2 o 3 parametri : ParentId, nCrvId [, nDeg]
int nParentId ;
LuaCheckParam( L, 1, nParentId)
int nCrvId ;
LuaCheckParam( L, 2, nCrvId)
int nDeg = 3 ;
LuaGetParam( L, 3, nDeg) ;
// creo la versione bezier della curva
int nId = ExeCreateCurveBezierForm( nParentId, nCrvId) ;
int nId = ExeCreateCurveBezierForm( nParentId, nCrvId, nDeg) ;
// restituisco il risultato
if ( nId != GDB_ID_NULL)
LuaSetParam( L, nId) ;
+36
View File
@@ -1195,6 +1195,40 @@ LuaCurveBezierDecreaseDegree( lua_State* L)
return 1 ;
}
//----------------------------------------------------------------------------
static int
LuaCurveBezierApproxToNonRat( lua_State* L)
{
// 1 o 2 parametri : CrvId [, dTol]
int nId ;
LuaCheckParam( L, 1, nId)
double dTol = 10 * EPS_SMALL ;
LuaGetParam( L, 2, dTol) ;
LuaClearStack( L) ;
// eseguo
bool bOk = ExeCurveBezierApproxToNonRat( nId, dTol) ;
LuaSetParam( L, bOk) ;
return 1 ;
}
//----------------------------------------------------------------------------
static int
LuaCurveBezierApproxWithCubicBeziers( lua_State* L)
{
// 1 o 2 parametri : CrvId [, dTol]
int nId ;
LuaCheckParam( L, 1, nId)
double dTol = 10 * EPS_SMALL ;
LuaGetParam( L, 2, dTol) ;
LuaClearStack( L) ;
// eseguo
bool bOk = ExeCurveBezierApproxWithCubicBeziers( nId, dTol) ;
LuaSetParam( L, bOk) ;
return 1 ;
}
//-------------------------------------------------------------------------------
bool
LuaInstallGdbModifyCurve( LuaMgr& luaMgr)
@@ -1261,5 +1295,7 @@ LuaInstallGdbModifyCurve( LuaMgr& luaMgr)
bOk = bOk && luaMgr.RegisterFunction( "EgtProjectCurveOnSurfBzExt", LuaProjectCurveOnSurfBzExt) ;
bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierIncreaseDeg", LuaCurveBezierIncreaseDegree) ;
bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierDecreaseDeg", LuaCurveBezierDecreaseDegree) ;
bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierApproxToNonRat", LuaCurveBezierApproxToNonRat) ;
bOk = bOk && luaMgr.RegisterFunction( "EgtApproxBezierWithCubics", LuaCurveBezierApproxWithCubicBeziers) ;
return bOk ;
}