EgtGeomKernel 2.5g2 :
- approssimazione con archi di curve composite viene fatta nel piano perpendicolare all'estrusione o se questa non definita nel piano medio della curva - trim start/end a parametro di curve composite ora irrobustito.
This commit is contained in:
+5
-10
@@ -26,6 +26,7 @@
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EGkUiUnits.h"
|
||||
#include "/EgtDev/Include/ENkPolynomialRoots.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
#include <new>
|
||||
|
||||
@@ -950,10 +951,7 @@ CurveArc::GetDir( double dU, Vector3d& vtDir) const
|
||||
return false ;
|
||||
|
||||
// il parametro U deve essere compreso tra 0 e 1
|
||||
if ( dU < 0)
|
||||
dU = 0 ;
|
||||
else if ( dU > 1)
|
||||
dU = 1 ;
|
||||
dU = Clamp( dU, 0., 1.) ;
|
||||
|
||||
// versore al punto nel piano della circonferenza (ruoto m_VtS di dU * m_dAngCenDeg attorno a m_VtN)
|
||||
double dAng = dU * m_dAngCenDeg * DEGTORAD ;
|
||||
@@ -975,10 +973,7 @@ CurveArc::GetPointD1D2( double dU, Side nS, Point3d& ptPos, Vector3d* pvtDer1, V
|
||||
return false ;
|
||||
|
||||
// il parametro U deve essere compreso tra 0 e 1
|
||||
if ( dU < 0)
|
||||
dU = 0 ;
|
||||
else if ( dU > 1)
|
||||
dU = 1 ;
|
||||
dU = Clamp( dU, 0., 1.) ;
|
||||
|
||||
// versore al punto nel piano della circonferenza (ruoto m_VtS di dU di m_dAngCenDeg attorno a m_VtN)
|
||||
double dAng = dU * m_dAngCenDeg * DEGTORAD ;
|
||||
@@ -1427,7 +1422,7 @@ bool
|
||||
CurveArc::TrimStartAtParam( double dUTrim)
|
||||
{
|
||||
// riporto i parametri nel loro range
|
||||
dUTrim = ( ( dUTrim < 0) ? 0 : (( dUTrim > 1) ? 1 : dUTrim)) ;
|
||||
dUTrim = Clamp( dUTrim, 0., 1.) ;
|
||||
|
||||
// recupero lunghezza
|
||||
double dLen ;
|
||||
@@ -1443,7 +1438,7 @@ bool
|
||||
CurveArc::TrimEndAtParam( double dUTrim)
|
||||
{
|
||||
// riporto i parametri nel loro range
|
||||
dUTrim = ( ( dUTrim < 0) ? 0 : (( dUTrim > 1) ? 1 : dUTrim)) ;
|
||||
dUTrim = Clamp( dUTrim, 0., 1.) ;
|
||||
|
||||
// recupero lunghezza
|
||||
double dLen ;
|
||||
|
||||
+12
-5
@@ -105,9 +105,18 @@ CurveByApprox::GetArcs( double dLinTol, double dAngTolDeg, double dLinFea, PolyA
|
||||
PolyLine PL ;
|
||||
for ( int j = nPrev ; j <= m_vSplits[i] ; ++ j)
|
||||
PL.AddUPoint( j, m_vPnt[j]) ;
|
||||
// eseguo l'approssimazione con archi
|
||||
if ( ! BiArcOrSplit( 0, PL, dLinTol, dAngTolDeg, PA))
|
||||
// verifico se retta verticale
|
||||
BBox3d b3PL ;
|
||||
if ( ! PL.GetLocalBBox( b3PL))
|
||||
return false ;
|
||||
if ( b3PL.GetDimX() < EPS_SMALL && b3PL.GetDimY() < EPS_SMALL) {
|
||||
PA.AddUPoint( m_vSplits[i], m_vPnt[m_vSplits[i]], 0) ;
|
||||
}
|
||||
// altrimenti eseguo l'approssimazione con archi
|
||||
else {
|
||||
if ( ! BiArcOrSplit( 0, PL, dLinTol, dAngTolDeg, PA))
|
||||
return false ;
|
||||
}
|
||||
// salvo fine come prox inizio
|
||||
nPrev = m_vSplits[i] ;
|
||||
}
|
||||
@@ -456,9 +465,7 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
|
||||
return true ;
|
||||
// costruisco la retta che li unisce
|
||||
PtrOwner<CurveComposite> pCC( CreateBasicCurveComposite()) ;
|
||||
if ( IsNull( pCC))
|
||||
return false ;
|
||||
if ( ! pCC->FromPolyLine( PL))
|
||||
if ( IsNull( pCC) || ! pCC->FromPolyLine( PL))
|
||||
return false ;
|
||||
pCrv.Set( pCC) ;
|
||||
dMaxDist = 0 ;
|
||||
|
||||
+79
-30
@@ -1385,30 +1385,52 @@ CurveComposite::ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA)
|
||||
if ( m_nStatus != OK)
|
||||
return false ;
|
||||
|
||||
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
|
||||
Frame3d frNat ;
|
||||
if ( ! m_VtExtr.IsSmall()) {
|
||||
frNat.Set( ORIG, m_VtExtr) ;
|
||||
}
|
||||
else {
|
||||
Plane3d plPlane ;
|
||||
IsFlat( plPlane, false) ;
|
||||
if ( plPlane.IsValid()) {
|
||||
if ( plPlane.GetVersN().z < -EPS_ZERO)
|
||||
plPlane.Invert() ;
|
||||
frNat.Set( ORIG, plPlane.GetVersN()) ;
|
||||
}
|
||||
}
|
||||
|
||||
// eseguo approssimazione
|
||||
double dStartPar = 0 ;
|
||||
for ( auto& pCrv : m_CrvSmplS) {
|
||||
for ( const auto& pCrv : m_CrvSmplS) {
|
||||
// ne faccio una copia
|
||||
PtrOwner<ICurve> pCrvL( pCrv->Clone()) ;
|
||||
if ( IsNull( pCrvL))
|
||||
return false ;
|
||||
// assegno estrusione e spessore della curva composita
|
||||
pCrv->SetExtrusion( m_VtExtr) ;
|
||||
pCrv->SetThickness( m_dThick) ;
|
||||
pCrvL->SetExtrusion( m_VtExtr) ;
|
||||
pCrvL->SetThickness( m_dThick) ;
|
||||
// la porto nel riferimento naturale
|
||||
pCrvL->ToLoc( frNat) ;
|
||||
// recupero approssimazione per curva semplice
|
||||
PolyArc PASmpl ;
|
||||
if ( ! pCrv->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl))
|
||||
if ( ! pCrvL->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl))
|
||||
return false ;
|
||||
// la accodo opportunamente a quella della curva composita
|
||||
if ( ! PA.Join( PASmpl, dStartPar))
|
||||
return false ;
|
||||
// ripristino estrusione e spessore della curva semplice (annullandoli)
|
||||
pCrv->SetExtrusion( V_NULL) ;
|
||||
pCrv->SetThickness( 0) ;
|
||||
// incremento inizio parametro per prossima curva semplice
|
||||
dStartPar += 1 ;
|
||||
}
|
||||
|
||||
// riporto l'approssimazione nel riferimento della composita
|
||||
PA.ToGlob( frNat) ;
|
||||
|
||||
// assegno estrusione della curva composita
|
||||
PA.SetExtrusion( m_VtExtr) ;
|
||||
|
||||
return true ;
|
||||
// eliminazione dei punti in tolleranza (opportunamente diminuita)
|
||||
return PA.RemoveAlignedPoints( 0.5 * dLinTol) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -1427,16 +1449,37 @@ CurveComposite::ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLin
|
||||
double dMlStartPar = 0 ;
|
||||
CurveByApprox crvByApprox ;
|
||||
|
||||
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
|
||||
Frame3d frNat ;
|
||||
if ( ! m_VtExtr.IsSmall()) {
|
||||
frNat.Set( ORIG, m_VtExtr) ;
|
||||
}
|
||||
else {
|
||||
Plane3d plPlane ;
|
||||
IsFlat( plPlane, false) ;
|
||||
if ( plPlane.IsValid()) {
|
||||
if ( plPlane.GetVersN().z < -EPS_ZERO)
|
||||
plPlane.Invert() ;
|
||||
frNat.Set( ORIG, plPlane.GetVersN()) ;
|
||||
}
|
||||
}
|
||||
|
||||
// eseguo approssimazione
|
||||
double dStartPar = 0 ;
|
||||
for ( auto& pCrv : m_CrvSmplS) {
|
||||
for ( const auto& pCrv : m_CrvSmplS) {
|
||||
// ne faccio una copia
|
||||
PtrOwner<ICurve> pCrvL( pCrv->Clone()) ;
|
||||
if ( IsNull( pCrvL))
|
||||
return false ;
|
||||
// assegno estrusione e spessore della curva composita
|
||||
pCrv->SetExtrusion( m_VtExtr) ;
|
||||
pCrv->SetThickness( m_dThick) ;
|
||||
pCrvL->SetExtrusion( m_VtExtr) ;
|
||||
pCrvL->SetThickness( m_dThick) ;
|
||||
// la porto nel riferimento naturale
|
||||
pCrvL->ToLoc( frNat) ;
|
||||
// se segmento di linea non feature
|
||||
double dLen ;
|
||||
if ( pCrv->GetType() == CRV_LINE && pCrv->GetLength( dLen) && dLen < dLinFea) {
|
||||
CurveLine* pLine = GetBasicCurveLine( pCrv) ;
|
||||
if ( pCrvL->GetType() == CRV_LINE && pCrvL->GetLength( dLen) && dLen < dLinFea) {
|
||||
CurveLine* pLine = GetBasicCurveLine( pCrvL) ;
|
||||
// se inizio di approx multilinea
|
||||
if ( ! bMultiLine) {
|
||||
bMultiLine = true ;
|
||||
@@ -1468,15 +1511,12 @@ CurveComposite::ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLin
|
||||
}
|
||||
// recupero approssimazione per curva semplice
|
||||
PolyArc PASmpl ;
|
||||
if ( ! pCrv->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl))
|
||||
if ( ! pCrvL->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl))
|
||||
return false ;
|
||||
// la accodo opportunamente a quella della curva composita
|
||||
if ( ! PA.Join( PASmpl, dStartPar))
|
||||
return false ;
|
||||
}
|
||||
// ripristino estrusione e spessore della curva semplice (annullandoli)
|
||||
pCrv->SetExtrusion( V_NULL) ;
|
||||
pCrv->SetThickness( 0) ;
|
||||
// incremento inizio parametro per prossima curva semplice
|
||||
dStartPar += 1 ;
|
||||
}
|
||||
@@ -1491,6 +1531,9 @@ CurveComposite::ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLin
|
||||
return false ;
|
||||
}
|
||||
|
||||
// riporto l'approssimazione nel riferimento della composita
|
||||
PA.ToGlob( frNat) ;
|
||||
|
||||
// assegno estrusione della curva composita
|
||||
PA.SetExtrusion( m_VtExtr) ;
|
||||
|
||||
@@ -2112,7 +2155,15 @@ CurveComposite::ModifyCurveToLine( int nCrv)
|
||||
bool
|
||||
CurveComposite::TrimStartAtParam( double dUTrim)
|
||||
{
|
||||
// ciclo sulle diverse curve dall'inizio
|
||||
// verifico validità parametro
|
||||
double dMaxU = double( m_CrvSmplS.size()) ;
|
||||
if ( dUTrim < -EPS_PARAM || dUTrim > dMaxU - EPS_PARAM)
|
||||
return false ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
// ciclo sulle diverse curve dall'inizio
|
||||
double dUToTrim = dUTrim ;
|
||||
for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ;) {
|
||||
// dominio parametrico della curva semplice
|
||||
@@ -2123,17 +2174,13 @@ CurveComposite::TrimStartAtParam( double dUTrim)
|
||||
// se lunghezza ancora da tagliare non nulla
|
||||
if ( dUToTrim > EPS_PARAM) {
|
||||
delete (*Iter) ;
|
||||
Iter ++ ;
|
||||
m_CrvSmplS.pop_front() ;
|
||||
Iter = m_CrvSmplS.erase( Iter) ;
|
||||
}
|
||||
// se lunghezza ancora da tagliare nulla (entro la tolleranza)
|
||||
else if ( dUToTrim > - EPS_PARAM ||
|
||||
! (*Iter)->TrimStartAtParam( 1 + dUToTrim)) {
|
||||
delete (*Iter) ;
|
||||
Iter ++ ;
|
||||
m_CrvSmplS.pop_front() ;
|
||||
if ( m_CrvSmplS.empty())
|
||||
return false ;
|
||||
Iter = m_CrvSmplS.erase( Iter) ;
|
||||
break ;
|
||||
}
|
||||
// altrimenti superata lunghezza ancora da tagliare (taglio già fatto al test sopra)
|
||||
@@ -2142,9 +2189,6 @@ CurveComposite::TrimStartAtParam( double dUTrim)
|
||||
}
|
||||
}
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -2152,6 +2196,14 @@ CurveComposite::TrimStartAtParam( double dUTrim)
|
||||
bool
|
||||
CurveComposite::TrimEndAtParam( double dUTrim)
|
||||
{
|
||||
// verifico validità parametro
|
||||
double dMaxU = double( m_CrvSmplS.size()) ;
|
||||
if ( dUTrim < EPS_PARAM || dUTrim > dMaxU + EPS_PARAM)
|
||||
return false ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
// ciclo sulle diverse curve dalla fine
|
||||
bool bToErase = false ;
|
||||
double dUToTrim = dUTrim ;
|
||||
@@ -2193,9 +2245,6 @@ CurveComposite::TrimEndAtParam( double dUTrim)
|
||||
}
|
||||
}
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+4
-6
@@ -19,6 +19,7 @@
|
||||
#include "NgeWriter.h"
|
||||
#include "NgeReader.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
#include <new>
|
||||
|
||||
@@ -356,10 +357,7 @@ CurveLine::GetPointD1D2( double dU, Side nS, Point3d& ptPos, Vector3d* pvtDer1,
|
||||
return false ;
|
||||
|
||||
// il parametro U deve essere compreso tra 0 e 1
|
||||
if ( dU < 0)
|
||||
dU = 0 ;
|
||||
else if ( dU > 1)
|
||||
dU = 1 ;
|
||||
dU = Clamp( dU, 0., 1.) ;
|
||||
|
||||
// calcolo del punto
|
||||
ptPos = Media( m_PtStart, m_PtEnd, dU) ;
|
||||
@@ -642,7 +640,7 @@ bool
|
||||
CurveLine::TrimStartAtParam( double dUTrim)
|
||||
{
|
||||
// riporto i parametri nel loro range
|
||||
dUTrim = ( ( dUTrim < 0) ? 0 : (( dUTrim > 1) ? 1 : dUTrim)) ;
|
||||
dUTrim = Clamp( dUTrim, 0., 1.) ;
|
||||
|
||||
// recupero lunghezza
|
||||
double dLen ;
|
||||
@@ -658,7 +656,7 @@ bool
|
||||
CurveLine::TrimEndAtParam( double dUTrim)
|
||||
{
|
||||
// riporto i parametri nel loro range
|
||||
dUTrim = ( ( dUTrim < 0) ? 0 : (( dUTrim > 1) ? 1 : dUTrim)) ;
|
||||
dUTrim = Clamp( dUTrim, 0., 1.) ;
|
||||
|
||||
// recupero lunghezza
|
||||
double dLen ;
|
||||
|
||||
Binary file not shown.
+2
-2
@@ -133,7 +133,7 @@ Point3d::ToGlob( const Frame3d& frRef)
|
||||
y = ptT.x * frRef.VersX().y + ptT.y * frRef.VersY().y + ptT.z * frRef.VersZ().y + frRef.Orig().y ;
|
||||
z = ptT.x * frRef.VersX().z + ptT.y * frRef.VersY().z + ptT.z * frRef.VersZ().z + frRef.Orig().z ;
|
||||
}
|
||||
else {
|
||||
else if ( ! frRef.Orig().IsZero()) {
|
||||
x += frRef.Orig().x ;
|
||||
y += frRef.Orig().y ;
|
||||
z += frRef.Orig().z ;
|
||||
@@ -159,7 +159,7 @@ Point3d::ToLoc( const Frame3d& frRef)
|
||||
y = vtT.x * frRef.VersY().x + vtT.y * frRef.VersY().y + vtT.z * frRef.VersY().z ;
|
||||
z = vtT.x * frRef.VersZ().x + vtT.y * frRef.VersZ().y + vtT.z * frRef.VersZ().z ;
|
||||
}
|
||||
else {
|
||||
else if ( ! frRef.Orig().IsZero()) {
|
||||
x -= frRef.Orig().x ;
|
||||
y -= frRef.Orig().y ;
|
||||
z -= frRef.Orig().z ;
|
||||
|
||||
Reference in New Issue
Block a user