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:
Dario Sassi
2015-08-18 07:38:26 +00:00
parent 064fb60719
commit 106af42cc1
18 changed files with 691 additions and 218 deletions
+68 -15
View File
@@ -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 ;
}