EgtGeomKernel 1.5h4 :
- uso set di istruzioni SSE2 - miglioramenti generali ad ApproxWithArcs - estensione uso di PolyLine e PolyArc - a TSC aggiunta funzione CurveCompo.FromCurveApproximation.
This commit is contained in:
+180
-3
@@ -19,6 +19,8 @@
|
||||
//----------------------------------------------------------------------------
|
||||
PolyArc::PolyArc( void)
|
||||
{
|
||||
m_vtExtr = Z_AX ;
|
||||
m_nRejected = 0 ;
|
||||
m_nCount = 0 ;
|
||||
m_iter = m_lUPointBs.end() ;
|
||||
}
|
||||
@@ -32,16 +34,33 @@ PolyArc::~PolyArc( void)
|
||||
bool
|
||||
PolyArc::Clear( void)
|
||||
{
|
||||
m_vtExtr = Z_AX ;
|
||||
m_nRejected = 0 ;
|
||||
m_nCount = 0 ;
|
||||
m_lUPointBs.clear() ;
|
||||
m_iter = m_lUPointBs.end() ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::SetExtrusion( const Vector3d& vtExtr)
|
||||
{
|
||||
if ( vtExtr.IsSmall())
|
||||
return false ;
|
||||
m_vtExtr = vtExtr ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::AddUPoint( double dPar, const Point3d& ptP, double dBulge)
|
||||
{
|
||||
// se il punto è uguale al precedente (ignoro parametro e bulge), non lo inserisco ma ok
|
||||
if ( m_nCount > 0 && AreSamePointApprox( ptP, m_lUPointBs.back().ptP)) {
|
||||
++ m_nRejected ;
|
||||
return true ;
|
||||
}
|
||||
try {
|
||||
m_lUPointBs.push_back( UPointB( dPar, ptP, dBulge)) ;
|
||||
}
|
||||
@@ -54,6 +73,32 @@ PolyArc::AddUPoint( double dPar, const Point3d& ptP, double dBulge)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::Close( void)
|
||||
{
|
||||
// ci devono essere almeno 2 punti
|
||||
if ( m_lUPointBs.size() < 2)
|
||||
return false ;
|
||||
// verifico non sia già chiuso
|
||||
if ( AreSamePointApprox( m_lUPointBs.front().ptP, m_lUPointBs.back().ptP))
|
||||
return false ;
|
||||
// aggiungo un punto uguale al primo in coda
|
||||
return AddUPoint( m_lUPointBs.front().dU, m_lUPointBs.front().ptP, m_lUPointBs.front().dB) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::ModifyLastBulge( double dBulge)
|
||||
{
|
||||
// verifico esistano dei punti
|
||||
if ( m_lUPointBs.empty())
|
||||
return false ;
|
||||
// eseguo la modifica
|
||||
m_lUPointBs.back().dB = dBulge ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::EraseFirstUPoint( void)
|
||||
@@ -91,10 +136,83 @@ PolyArc::AddOffsetToU( double dOffset)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::SetElevation( double dZ)
|
||||
{
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.z = dZ ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::AddElevation( double dZ)
|
||||
{
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.z += dZ ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::Translate( const Vector3d& vtMove)
|
||||
{
|
||||
// il vettore estrusione non subisce modifiche
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.Translate( vtMove) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
|
||||
{
|
||||
m_vtExtr.Rotate( vtAx, dCosAng, dSinAng) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::Scale( const Frame3d& frRef, double dCoeff)
|
||||
{
|
||||
m_vtExtr.Scale( frRef, dCoeff, dCoeff, dCoeff) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.Scale( frRef, dCoeff, dCoeff, dCoeff) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
{
|
||||
m_vtExtr.Mirror( vtNorm) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter) {
|
||||
iter->ptP.Mirror( ptOn, vtNorm) ;
|
||||
iter->dB *= - 1 ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::ToGlob( const Frame3d& frRef)
|
||||
{
|
||||
m_vtExtr.ToGlob( frRef) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.ToGlob( frRef) ;
|
||||
@@ -106,6 +224,7 @@ PolyArc::ToGlob( const Frame3d& frRef)
|
||||
bool
|
||||
PolyArc::ToLoc( const Frame3d& frRef)
|
||||
{
|
||||
m_vtExtr.ToLoc( frRef) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.ToLoc( frRef) ;
|
||||
@@ -117,6 +236,7 @@ PolyArc::ToLoc( const Frame3d& frRef)
|
||||
bool
|
||||
PolyArc::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
|
||||
{
|
||||
m_vtExtr.LocToLoc( frOri, frDest) ;
|
||||
UPNTBLIST::iterator iter ;
|
||||
for ( iter = m_lUPointBs.begin() ; iter != m_lUPointBs.end() ; ++ iter)
|
||||
iter->ptP.LocToLoc( frOri, frDest) ;
|
||||
@@ -137,12 +257,15 @@ PolyArc::Splice( PolyArc& PA)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::GetFirstUPoint( double* pdPar, Point3d* pptP, double* pdBulge) const
|
||||
PolyArc::GetFirstUPoint( double* pdPar, Point3d* pptP, double* pdBulge, bool bNotLast) const
|
||||
{
|
||||
// cerco il primo punto
|
||||
m_iter = m_lUPointBs.begin() ;
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
|
||||
if ( bNotLast && m_iter == -- ( m_lUPointBs.end()))
|
||||
return false ;
|
||||
// assegno i dati
|
||||
if ( pdPar != nullptr)
|
||||
*pdPar = m_iter->dU ;
|
||||
if ( pptP != nullptr)
|
||||
@@ -157,6 +280,7 @@ PolyArc::GetFirstUPoint( double* pdPar, Point3d* pptP, double* pdBulge) const
|
||||
bool
|
||||
PolyArc::GetNextUPoint( double* pdPar, Point3d* pptP, double* pdBulge, bool bNotLast) const
|
||||
{
|
||||
// cerco il prossimo punto
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
++ m_iter ;
|
||||
@@ -164,7 +288,7 @@ PolyArc::GetNextUPoint( double* pdPar, Point3d* pptP, double* pdBulge, bool bNot
|
||||
return false ;
|
||||
if ( bNotLast && m_iter == -- ( m_lUPointBs.end()))
|
||||
return false ;
|
||||
|
||||
// assegno i dati
|
||||
if ( pdPar != nullptr)
|
||||
*pdPar = m_iter->dU ;
|
||||
if ( pptP != nullptr)
|
||||
@@ -174,3 +298,56 @@ PolyArc::GetNextUPoint( double* pdPar, Point3d* pptP, double* pdBulge, bool bNot
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::GetFirstUArc( double* pdIni, Point3d* pptIni, double* pdFin, Point3d* pptFin, double* pdBulge) const
|
||||
{
|
||||
// parametro e punto iniziali
|
||||
m_iter = m_lUPointBs.begin() ;
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
if ( pdIni != nullptr)
|
||||
*pdIni = m_iter->dU ;
|
||||
if ( pptIni != nullptr)
|
||||
*pptIni = m_iter->ptP ;
|
||||
// bulge dell'arco (è attaccato al punto iniziale)
|
||||
if ( pdBulge != nullptr)
|
||||
*pdBulge = m_iter->dB ;
|
||||
// parametro e punto finali
|
||||
++ m_iter ;
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
if ( pdFin != nullptr)
|
||||
*pdFin = m_iter->dU ;
|
||||
if ( pptFin != nullptr)
|
||||
*pptFin = m_iter->ptP ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyArc::GetNextUArc( double* pdIni, Point3d* pptIni, double* pdFin, Point3d* pptFin, double* pdBulge) const
|
||||
{
|
||||
// parametro e punto iniziali (è il precedente finale)
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
if ( pdIni != nullptr)
|
||||
*pdIni = m_iter->dU ;
|
||||
if ( pptIni != nullptr)
|
||||
*pptIni = m_iter->ptP ;
|
||||
// bulge (è attaccato al punto iniziale)
|
||||
if ( pdBulge != nullptr)
|
||||
*pdBulge = m_iter->dB ;
|
||||
// parametro e punto finali
|
||||
++ m_iter ;
|
||||
if ( m_iter == m_lUPointBs.end())
|
||||
return false ;
|
||||
if ( pdFin != nullptr)
|
||||
*pdFin = m_iter->dU ;
|
||||
if ( pptFin != nullptr)
|
||||
*pptFin = m_iter->ptP ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
Reference in New Issue
Block a user