EgtGeomKernel 1.5g1 :
- alle curve aggiunto il metodo CopyParamRange (per curve chiuse ammatte range che passano dal punto di chiusura) - trasformato il metodo Copy di tutti gli oggetti geometrici in CopyFrom - a TSC aggiunte funzioni CopyCurveByParamRange e SplitCurveByClass - migliorata gestione intersezioni sovrapposte - aggiunta classificazione parti di curva (IN,OUT,ONP,ONM) da intersezioni con altra curva chiusa.
This commit is contained in:
+80
-6
@@ -438,7 +438,7 @@ CurveComposite::Clone( void) const
|
||||
// alloco oggetto
|
||||
CurveComposite* pCrv = new(nothrow) CurveComposite ;
|
||||
if ( pCrv != nullptr) {
|
||||
if ( ! pCrv->Copy( *this)) {
|
||||
if ( ! pCrv->CopyFrom( *this)) {
|
||||
delete pCrv ;
|
||||
return nullptr ;
|
||||
}
|
||||
@@ -449,17 +449,25 @@ CurveComposite::Clone( void) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveComposite::Copy( const IGeoObj* pGObjSrc)
|
||||
CurveComposite::CopyFrom( const IGeoObj* pGObjSrc)
|
||||
{
|
||||
// se sorgente è una curva composita
|
||||
const CurveComposite* pCC = dynamic_cast<const CurveComposite*>( pGObjSrc) ;
|
||||
if ( pCC == nullptr)
|
||||
return false ;
|
||||
return Copy( *pCC) ;
|
||||
if ( pCC != nullptr)
|
||||
return CopyFrom( *pCC) ;
|
||||
// se sorgente è un'altro tipo di curva
|
||||
const ICurve* pCrv = dynamic_cast<const ICurve*>( pGObjSrc) ;
|
||||
if ( pCrv != nullptr) {
|
||||
Clear() ;
|
||||
return AddCurve( *pCrv) ;
|
||||
}
|
||||
// altrimenti errroe
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveComposite::Copy( const CurveComposite& ccSrc)
|
||||
CurveComposite::CopyFrom( const CurveComposite& ccSrc)
|
||||
{
|
||||
if ( &ccSrc == this)
|
||||
return true ;
|
||||
@@ -972,6 +980,48 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, PolyLine& PL
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
ICurve*
|
||||
CurveComposite::CopyParamRange( double dUStart, double dUEnd) const
|
||||
{
|
||||
// i parametri start ed end devono essere compresi nel dominio parametrico della curva
|
||||
if ( dUStart < - EPS_PARAM || dUStart > m_nCounter + EPS_PARAM ||
|
||||
dUEnd < - EPS_PARAM || dUEnd > m_nCounter + EPS_PARAM)
|
||||
return nullptr ;
|
||||
// se il parametro start supera quello di end
|
||||
if ( dUStart > dUEnd - EPS_PARAM) {
|
||||
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
|
||||
if ( ! m_bClosed)
|
||||
return nullptr ;
|
||||
// se curva chiusa, il trim si avvolge attorno al punto di giunzione
|
||||
else
|
||||
// incremento il parametro finale della dimensione del dominio parametrico originale della curva
|
||||
dUEnd += m_nCounter ;
|
||||
}
|
||||
// determino gli indici della prima e dell'ultima curva da copiare
|
||||
int nIdStart = static_cast<int>( floor( dUStart)) ;
|
||||
int nIdEnd = static_cast<int>( ceil( dUEnd)) ;
|
||||
// creo la curva composita copia
|
||||
PtrOwner<CurveComposite> pCopy( new CurveComposite()) ;
|
||||
if ( ! ::IsValid( pCopy))
|
||||
return nullptr ;
|
||||
// eseguo la copia delle sole curve semplici necessarie
|
||||
for ( int i = nIdStart ; i < nIdEnd ; ++ i) {
|
||||
// quando supero il numero di curve nella composita originale riparto dall'inizio
|
||||
int j = i % m_nCounter ;
|
||||
// accodo la curva alla copia
|
||||
if ( ! pCopy->AddCurve( *(m_CrvSmplS[j])))
|
||||
return nullptr ;
|
||||
}
|
||||
// aggiorno i parametri di trim, tenendo conto delle curve semplici saltate all'inizio
|
||||
dUStart -= nIdStart ;
|
||||
dUEnd -= nIdStart ;
|
||||
// eseguo il trim della copia
|
||||
if ( ! pCopy->TrimStartEndAtParam( dUStart, dUEnd))
|
||||
return nullptr ;
|
||||
return ( ::Release( pCopy)) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveComposite::Invert( void)
|
||||
@@ -1108,9 +1158,33 @@ CurveComposite::TrimEndAtParam( double dUTrim)
|
||||
bool
|
||||
CurveComposite::TrimStartEndAtParam( double dUStartTrim, double dUEndTrim)
|
||||
{
|
||||
// i parametri start ed end devono essere compresi nel dominio parametrico della curva
|
||||
if ( dUStartTrim < - EPS_PARAM || dUStartTrim > m_nCounter + EPS_PARAM ||
|
||||
dUEndTrim < - EPS_PARAM || dUEndTrim > m_nCounter + EPS_PARAM)
|
||||
return false ;
|
||||
// verifico che i trim non cancellino interamente la curva
|
||||
if ( dUStartTrim > dUEndTrim - EPS_PARAM)
|
||||
return false ;
|
||||
#if 0
|
||||
// se il parametro start supera quello di end
|
||||
if ( dUStartTrim > dUEndTrim - EPS_PARAM) {
|
||||
// se curva aperta, il trim la cancella completamente quindi errore
|
||||
if ( ! m_bClosed)
|
||||
return false ;
|
||||
// se curva chiusa, il trim interessa il punto di giunzione
|
||||
else {
|
||||
// calcolo il minimo numero di curve da accodare per coprire il range esteso
|
||||
int nNumCrv = static_cast<int>( ceil( dUEndTrim)) ;
|
||||
// incremento il parametro finale della dimensione del dominio parametrico originale della curva
|
||||
dUEndTrim += m_nCounter ;
|
||||
// eseguo accodamento delle curve
|
||||
for ( int i = 0 ; i < nNumCrv ; ++ i) {
|
||||
if ( ! AddCurve( *(m_CrvSmplS[i])))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// per parametro start : determino la curva di appartenenza e il valore locale del parametro
|
||||
int nCs ;
|
||||
double dUcs ;
|
||||
|
||||
Reference in New Issue
Block a user