EgtGeomKernel 2.3h2 :
- OffsetCurve ora gestisce anche il caso di curve piane con estrusione inclinata fino a 60gradi dalla normale del piano (l'offest si basa su un ellisse).
This commit is contained in:
Binary file not shown.
+39
-13
@@ -70,16 +70,23 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
Reset() ;
|
||||
// verifico che la curva esista e sia piana
|
||||
Plane3d plPlane ;
|
||||
if ( pCrv == nullptr || ! pCrv->IsFlat( plPlane))
|
||||
if ( pCrv == nullptr || ! pCrv->IsFlat( plPlane, false, 10 * EPS_SMALL))
|
||||
return false ;
|
||||
// se esiste estrusione, verifico sia perpendicolare al piano della curva
|
||||
// recupero o assegno estrusione
|
||||
Vector3d vtExtr ;
|
||||
if ( pCrv->GetExtrusion( vtExtr) && ! vtExtr.IsSmall()) {
|
||||
if ( ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), vtExtr))
|
||||
return false ;
|
||||
}
|
||||
else
|
||||
if ( ! pCrv->GetExtrusion( vtExtr) || vtExtr.IsSmall()) {
|
||||
vtExtr = plPlane.GetVersN() ;
|
||||
if ( vtExtr.IsZminus())
|
||||
vtExtr.Invert() ;
|
||||
}
|
||||
// recupero normale al piano della curva
|
||||
Vector3d vtNorm = plPlane.GetVersN() ;
|
||||
if ( vtNorm * vtExtr < 0)
|
||||
vtNorm.Invert() ;
|
||||
// verifico che estrusione non sia troppo vicina al piano della curva (almeno 30 gradi di angolazione)
|
||||
double dExtrOnN = vtExtr * vtNorm ;
|
||||
if ( dExtrOnN < 0.5)
|
||||
return false ;
|
||||
// recupero spessore
|
||||
double dThick ;
|
||||
pCrv->GetThickness( dThick) ;
|
||||
@@ -102,6 +109,9 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
// determino se necessario cambiare riferimento ( dal vettore estrusione)
|
||||
bool bNeedRef = ( ! vtExtr.IsZplus()) ;
|
||||
|
||||
// determino se necessario effettuare scalatura
|
||||
bool bNeedScale = ( abs( dExtrOnN) < cos( 0.1 * DEGTORAD)) ;
|
||||
|
||||
// creo una copia della curva
|
||||
CurveComposite ccCopy ;
|
||||
if ( ! ccCopy.CopyFrom( pCrv))
|
||||
@@ -109,13 +119,23 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
ccCopy.SetExtrusion( vtExtr) ;
|
||||
|
||||
// se necessario cambio il riferimento
|
||||
Frame3d frExtr ;
|
||||
if ( bNeedRef) {
|
||||
Frame3d frCopy ;
|
||||
if ( bNeedScale) {
|
||||
// calcolo il riferimento con vtNorm come asse Z e componente di vtExtr perpendicolare a vtNorm come asse X
|
||||
if ( ! frCopy.Set( ORIG, vtNorm, vtExtr - dExtrOnN * vtNorm))
|
||||
return false ;
|
||||
ccCopy.SetExtrusion( vtNorm) ;
|
||||
// esprimo la curva in questo riferimento
|
||||
ccCopy.ToLoc( frCopy) ;
|
||||
// scalo lungo l'asse X locale
|
||||
ccCopy.Scale( GLOB_FRM, dExtrOnN, 1, 1) ;
|
||||
}
|
||||
else if ( bNeedRef) {
|
||||
// calcolo il riferimento OCS con VtExtr come asse Z
|
||||
if ( ! frExtr.Set( ORIG, vtExtr))
|
||||
if ( ! frCopy.Set( ORIG, vtExtr))
|
||||
return false ;
|
||||
// esprimo la curva in questo riferimento
|
||||
ccCopy.ToLoc( frExtr) ;
|
||||
ccCopy.ToLoc( frCopy) ;
|
||||
}
|
||||
|
||||
// verifico che la curva sia fatta solo da rette e archi che giacciono nel piano XY (VtExtr è ora Z+)
|
||||
@@ -601,9 +621,15 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
}
|
||||
|
||||
// riporto il risultato nel riferimento originale
|
||||
if ( bNeedRef) {
|
||||
if ( bNeedScale) {
|
||||
for ( auto pCrv : m_CrvLst) {
|
||||
pCrv->Scale( GLOB_FRM, 1 / dExtrOnN, 1, 1) ;
|
||||
pCrv->ToGlob( frCopy) ;
|
||||
}
|
||||
}
|
||||
else if ( bNeedRef) {
|
||||
for ( auto pCrv : m_CrvLst)
|
||||
pCrv->ToGlob( frExtr) ;
|
||||
pCrv->ToGlob( frCopy) ;
|
||||
}
|
||||
|
||||
// assegno estrusione e spessore come curva originale
|
||||
|
||||
Reference in New Issue
Block a user