EgtExecutor 1.6h3 :
- rettangoli sempre disegnati CCW - aggiunta creazione di Regioni rettangolo, stadium e disco - correzioni a ExeSplitCurveAtSel - aggiunta ExeProjectCurveOnPlane - aggiunte funzioni per normale a regione piana e numero di chunk - sostituzione di Num o Nbr con Count.
This commit is contained in:
+68
-15
@@ -26,6 +26,7 @@
|
||||
#include "/EgtDev/Include/EGkIntersCurves.h"
|
||||
#include "/EgtDev/Include/EGkDistPointCurve.h"
|
||||
#include "/EgtDev/Include/EGkCurveLocal.h"
|
||||
#include "/EgtDev/Include/EgkCurveAux.h"
|
||||
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
|
||||
#include "/EgtDev/Include/EGkExtTExt.h"
|
||||
#include "/EgtDev/Include/EGkGdbIterator.h"
|
||||
@@ -713,17 +714,16 @@ ExeSplitCurveAtSelfInters( int nId, int* pnCount)
|
||||
// calcolo il vettore delle lunghezze di ogni parte di curva
|
||||
double dLen ;
|
||||
bOk = bOk && pCurve->GetLength( dLen) ;
|
||||
DBLVECTOR vPartLen ;
|
||||
double dLenPrev = 0 ;
|
||||
DBLVECTOR vLen ;
|
||||
for ( const auto& dU : vU) {
|
||||
double dULen, dPartLen ;
|
||||
double dULen ;
|
||||
bOk = bOk && pCurve->GetLengthAtParam( dU, dULen) ;
|
||||
dPartLen = dULen - dLenPrev ;
|
||||
// le curve prima e dopo devono avere una lunghezza significativa
|
||||
if ( dPartLen > EPS_SMALL && dLen - dULen > EPS_SMALL) {
|
||||
vPartLen.push_back( dPartLen) ;
|
||||
dLenPrev = dULen ;
|
||||
}
|
||||
vLen.push_back( dULen) ;
|
||||
}
|
||||
// se ultima parte molto piccola, la elimino
|
||||
if ( bOk && ! vU.empty() && ( dLen - vLen.back()) < 2 * EPS_SMALL) {
|
||||
vU.pop_back() ;
|
||||
vLen.pop_back() ;
|
||||
}
|
||||
// recupero un intervallo di id contigui per tutte le parti
|
||||
int nFirstId = pGeomDB->GetNewId() ;
|
||||
@@ -731,19 +731,28 @@ ExeSplitCurveAtSelfInters( int nId, int* pnCount)
|
||||
int nCurrId = nFirstId ;
|
||||
// eseguo la divisione
|
||||
int nCount = 1 ;
|
||||
for ( auto& dPartLen : vPartLen) {
|
||||
double dUPrev = 0 ;
|
||||
double dLenPrev = 0 ;
|
||||
for ( int i = 0 ; i < int( vU.size()) ; ++ i) {
|
||||
// se lunghezza della curva risulta piccola, salto
|
||||
if ( ( vLen[i] - dLenPrev) < 2 * EPS_SMALL)
|
||||
continue ;
|
||||
// copio la curva
|
||||
int nCopyId = pGeomDB->Copy( nCurrId, GDB_ID_NULL, nCurrId, GDB_AFTER) ;
|
||||
ICurve* pCopyCrv = GetCurve( pGeomDB->GetGeoObj( nCopyId)) ;
|
||||
bOk = bOk && ( pCopyCrv != nullptr) ;
|
||||
++ nCount ;
|
||||
// tengo la prima parte dell'originale e la seconda parte della copia
|
||||
bOk = bOk && pCurve->TrimEndAtLen( dPartLen) ;
|
||||
bOk = bOk && pCopyCrv->TrimStartAtLen( dPartLen) ;
|
||||
// trimmo l'originale
|
||||
bOk = bOk && pCurve->TrimStartEndAtParam( dUPrev, vU[i]) ;
|
||||
// la copia diventa il nuovo corrente
|
||||
nCurrId = nCopyId ;
|
||||
pCurve = pCopyCrv ;
|
||||
dUPrev = vU[i] ;
|
||||
dLenPrev = vLen[i] ;
|
||||
}
|
||||
// se fatta almeno una suddivisione, trimmo l'ultima parte
|
||||
if ( dUPrev > EPS_PARAM)
|
||||
bOk = bOk && pCurve->TrimStartAtParam( dUPrev) ;
|
||||
nFirstId = ( bOk ? nFirstId : GDB_ID_NULL) ;
|
||||
ExeSetModified() ;
|
||||
// se richiesto, salvo il comando Lua equivalente
|
||||
@@ -973,6 +982,7 @@ ExeApproxCurve( int nId, int nApprType, double dLinTol)
|
||||
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) ;
|
||||
@@ -984,9 +994,8 @@ ExeApproxCurve( int nId, int nApprType, double dLinTol)
|
||||
}
|
||||
else { // con bi-archi
|
||||
PolyArc PA ;
|
||||
bOk = bOk && pCurve->ApproxWithArcsEx( dLinTol, ANG_TOL_MAX_DEG, LIN_FEA_LEN_STD, PA) && pCC->FromPolyArc( PA) ;
|
||||
bOk = bOk && pCurve->ApproxWithArcsEx( dLinTol, ANG_TOL_STD_DEG, LIN_FEA_LEN_STD, PA) && pCC->FromPolyArc( PA) ;
|
||||
// merge di archi identici di biarchi
|
||||
const double ANG_TOL_STD_DEG = 15 ;
|
||||
bOk = bOk && pCC->MergeCurves( 0.5 * dLinTol, ANG_TOL_STD_DEG) ;
|
||||
}
|
||||
// copio estrusione e spessore
|
||||
@@ -1010,3 +1019,47 @@ ExeApproxCurve( int nId, int nApprType, double dLinTol)
|
||||
// restituisco risultato
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
bool
|
||||
ExeProjectCurveOnPlane( int nId, const Point3d& ptOn, const Vector3d& vtN, 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 locale
|
||||
Frame3d frLoc ;
|
||||
bOk = bOk && pGeomDB->GetGlobFrame( nId, frLoc) ;
|
||||
// porto in locale il punto e la normale del piano
|
||||
Point3d ptOnL = GetPointLocal( pGeomDB, ptOn, nRefType, frLoc) ;
|
||||
Vector3d vtNL = GetVectorLocal( pGeomDB, vtN, nRefType, frLoc) ;
|
||||
// calcolo il piano di proiezione
|
||||
Plane3d plPlane ;
|
||||
bOk = bOk && SetPlane( ptOnL, vtNL, plPlane) ;
|
||||
// eseguo la proiezione
|
||||
PtrOwner<ICurve> pProCrv( bOk ? ProjectCurveOnPlane( *pCurve, plPlane) : nullptr) ;
|
||||
bOk = bOk && ! IsNull( pProCrv) ;
|
||||
// copio estrusione e spessore
|
||||
Vector3d vtExtr ;
|
||||
if ( bOk && pCurve->GetExtrusion( vtExtr))
|
||||
pProCrv->SetExtrusion( vtExtr) ;
|
||||
double dThick ;
|
||||
if ( bOk && pCurve->GetThickness( dThick))
|
||||
pProCrv->SetThickness(dThick) ;
|
||||
// sostituisco la vecchia curva con la nuova
|
||||
bOk = bOk && pGeomDB->ReplaceGeoObj( nId, Release( pProCrv)) ;
|
||||
ExeSetModified() ;
|
||||
// se richiesto, salvo il comando Lua equivalente
|
||||
if ( IsCmdLog()) {
|
||||
string sLua = "EgtProjectCurveOnPlane(" + ToString( nId) + ",{" +
|
||||
ToString( ptOn) + "},{" +
|
||||
ToString( vtN) + "}," +
|
||||
RefTypeToString( nRefType) + ")" +
|
||||
" -- Ok=" + ToString( bOk) ;
|
||||
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
||||
}
|
||||
// restituisco risultato
|
||||
return bOk ;
|
||||
}
|
||||
Reference in New Issue
Block a user