EgtExecutor 1.6t3 :

- CompoChain prende estrusione di prima curva
- aggiunte Exe e Lua GetCurveLinearConvexHullXY e CurveMinAreaRectangleXY.
This commit is contained in:
Dario Sassi
2016-08-25 15:56:36 +00:00
parent 61f65bfe2a
commit 4de59fbd33
11 changed files with 177 additions and 27 deletions
+56 -6
View File
@@ -14,6 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "EXE.h"
#include "EXE_Const.h"
#include "EXE_Macro.h"
#include "AuxTools.h"
#include "GeoTools.h"
@@ -149,9 +150,6 @@ ExeApproxCurve( int nId, int nApprType, double dLinTol)
ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ;
bool bOk = ( pCurve != nullptr) ;
// eseguo l'approssimazione
const double ANG_TOL_MAX_DEG = 90 ;
const double ANG_TOL_STD_DEG = 15 ;
const double LIN_FEA_LEN_STD = 20 ;
PtrOwner<ICurveComposite> pCC( CreateCurveComposite()) ;
bOk = bOk && ! IsNull( pCC) ;
if ( nApprType == APP_LINES || nApprType == APP_SPECIAL_LINES ||
@@ -162,7 +160,7 @@ ExeApproxCurve( int nId, int nApprType, double dLinTol)
}
else { // con bi-archi
PolyArc PA ;
bOk = bOk && pCurve->ApproxWithArcsEx( dLinTol, ANG_TOL_STD_DEG, LIN_FEA_LEN_STD, PA) && pCC->FromPolyArc( PA) ;
bOk = bOk && pCurve->ApproxWithArcsEx( dLinTol, ANG_TOL_STD_DEG, LIN_FEA_STD, PA) && pCC->FromPolyArc( PA) ;
// merge di archi identici di biarchi
bOk = bOk && pCC->MergeCurves( 0.5 * dLinTol, ANG_TOL_STD_DEG) ;
}
@@ -1018,6 +1016,60 @@ ExeSplitCurveAtSelfInters( int nId, int* pnCount)
return nFirstId ;
}
//----------------------------------------------------------------------------
int
ExeGetCurveLinearConvexHullXY( int nId, double dLinTol, int nRefType)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// recupero la curva
ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ;
bool bOk = ( pCurve != nullptr) ;
// recupero il riferimento della curva
Frame3d frCrv ;
bOk = bOk && pGeomDB->GetGlobFrame( nId, frCrv) ;
// derivo la polilinea di approssimazione della curva entro la tolleranza data
PolyLine PL ;
bOk = bOk && pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, APP_LINES, PL) ;
// eventuale trasformazione per riferimento di espressione
if ( bOk && nRefType == RTY_GLOB)
PL.ToGlob( frCrv) ;
else if ( bOk && nRefType == RTY_GRID)
PL.LocToLoc( frCrv, pGeomDB->GetGridFrame()) ;
// derivo il convex hull lineare di questa
PNTVECTOR vCH ;
bOk = bOk && PL.GetConvexHullXY( vCH) ;
PolyLine PLCH ;
for ( size_t i = 0 ; i < vCH.size() ; ++ i)
PLCH.AddUPoint( double( i), vCH[i]) ;
PLCH.Close() ;
// creo la curva composita
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
bOk = bOk && ! IsNull( pCrvCompo) ;
// inserisco i segmenti che uniscono i punti
bOk = bOk && pCrvCompo->FromPolyLine( PLCH) ;
// assegno il versore estrusione
bOk = bOk && pCrvCompo->SetExtrusion( Z_AX) ;
// eventuale trasformazione per riferimento di espressione
if ( bOk && nRefType == RTY_GLOB)
pCrvCompo->ToLoc( frCrv) ;
else if ( bOk && nRefType == RTY_GRID)
pCrvCompo->LocToLoc( pGeomDB->GetGridFrame(), frCrv) ;
// inserisco la curva composita nel DB
int nNewId = ( bOk ? pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_AFTER, Release( pCrvCompo)) : GDB_ID_NULL) ;
ExeSetModified() ;
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtGetCurveLinearConvexHullXY(" + IdToString( nId) + "," +
ToString( dLinTol) + "," +
RefTypeToString( nRefType) + ")" +
" -- Id=" + ToString( nNewId) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
// restituisco l'identificativo della nuova entità
return nNewId ;
}
//-------------------------------------------------------------------------------
bool
ExeModifyCircleCP( int nId, const Point3d& ptOn, int nRefType)
@@ -1421,7 +1473,6 @@ ExeMergeCurvesInCurveCompo( int nId, double dLinTol, bool bStartEnd)
ICurveComposite* pCompo = GetCurveComposite( pGeomDB->GetGeoObj( nId)) ;
bool bOk = ( pCompo != nullptr) ;
// lancio il merge delle curve componenti
const double ANG_TOL_STD_DEG = 15 ;
bOk = bOk && pCompo->MergeCurves( dLinTol, ANG_TOL_STD_DEG, bStartEnd) ;
ExeSetModified() ;
// se richiesto, salvo il comando Lua equivalente
@@ -1445,7 +1496,6 @@ ExeRemoveCurveCompoUndercutOnY( int nId, double dLinTol)
ICurveComposite* pCompo = GetCurveComposite( pGeomDB->GetGeoObj( nId)) ;
bool bOk = ( pCompo != nullptr) ;
// lancio l'eliminazione delle parti sotto rispetto alla direzione Y+
const double ANG_TOL_STD_DEG = 15 ;
bOk = bOk && pCompo->RemoveUndercutOnY( dLinTol, ANG_TOL_STD_DEG) ;
ExeSetModified() ;
// se richiesto, salvo il comando Lua equivalente