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:
@@ -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,4 +1,4 @@
|
||||
//----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2014-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : EXE_GdbCreateSurf.cpp Data : 04.05.15 Versione : 1.6e1
|
||||
|
||||
+1
-1
@@ -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 ;
|
||||
|
||||
@@ -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 ;
|
||||
}
|
||||
@@ -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) ;
|
||||
|
||||
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user