EgtGeomKernel 1.5a8 : sistemata scalatura non uniforme di archi (sono trasformati in curve di Bezier singole o composite).
Aggiunte costanti geometriche locali.
This commit is contained in:
+116
-53
@@ -458,7 +458,7 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
bool bErase = false ;
|
||||
int nIdArc = ID_ERROR ;
|
||||
|
||||
// curva di Bezier intera (non razionale)
|
||||
// curva di Bezier intera (polinomiale)
|
||||
if ( sCmd2 == "INTEG" || sCmd2 == "I") {
|
||||
int i ;
|
||||
int nDeg ;
|
||||
@@ -501,37 +501,35 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// curva di Bezier equivalente ad un arco
|
||||
else if ( sCmd2 == "ARC" || sCmd2 == "A") {
|
||||
// ricavata da un arco
|
||||
if ( vsParams.size() == 3 || vsParams.size() == 4) {
|
||||
// recupero flag cancellazione arco
|
||||
if ( vsParams.size() == 4)
|
||||
bErase = ( vsParams[3] != "0") ;
|
||||
// recupero l'arco
|
||||
nIdArc = GetIdParam( vsParams[2]) ;
|
||||
const ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( nIdArc)) ;
|
||||
if ( pCrvArc == nullptr)
|
||||
return false ;
|
||||
// ne deduco la curva di Bezier
|
||||
if ( ! pCrvBez->FromArc( *pCrvArc))
|
||||
return false ;
|
||||
// recupero il riferimento dell'arco
|
||||
Frame3d frSou ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdArc, frSou))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// porto la curva di Bezier dal riferimento dell'arco a quello di inserimento
|
||||
if ( ! AreSameFrame( frSou, frDest)) {
|
||||
pCrvBez->ToGlob( frSou) ;
|
||||
pCrvBez->ToLoc( frDest) ;
|
||||
}
|
||||
// curva di Bezier ricavata da un arco
|
||||
else if ( sCmd2 == "FROMARC" || sCmd2 == "A") {
|
||||
// 3 o 4 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 3 : bErase = false ; break ;
|
||||
case 4 : bErase = ( vsParams[3] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
else
|
||||
// recupero l'arco
|
||||
nIdArc = GetIdParam( vsParams[2]) ;
|
||||
const ICurveArc* pCrvArc = GetCurveArc( m_pGDB->GetGeoObj( nIdArc)) ;
|
||||
if ( pCrvArc == nullptr)
|
||||
return false ;
|
||||
// ne deduco la curva di Bezier
|
||||
if ( ! pCrvBez->FromArc( *pCrvArc))
|
||||
return false ;
|
||||
// recupero il riferimento dell'arco
|
||||
Frame3d frSou ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdArc, frSou))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// porto la curva di Bezier dal riferimento dell'arco a quello di inserimento
|
||||
if ( ! AreSameFrame( frSou, frDest)) {
|
||||
pCrvBez->ToGlob( frSou) ;
|
||||
pCrvBez->ToLoc( frDest) ;
|
||||
}
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
@@ -553,15 +551,17 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
bool
|
||||
GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
{
|
||||
// creo la curva composita
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
if ( ! IsValid( pCrvCompo))
|
||||
return false ;
|
||||
// per eventuale cancellazione curve di origine
|
||||
bool bErase ;
|
||||
STRVECTOR vsNames ;
|
||||
STRVECTOR::iterator Iter ;
|
||||
|
||||
// curva composita generica
|
||||
if ( sCmd2 == "MAKE" || sCmd2 == "") {
|
||||
bool bErase ;
|
||||
STRVECTOR vsNames ;
|
||||
STRVECTOR::iterator Iter ;
|
||||
const ICurve* pCrv ;
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
if ( ! IsValid( pCrvCompo))
|
||||
return false ;
|
||||
// 3 o 4 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 3 : bErase = false ; break ;
|
||||
@@ -571,32 +571,95 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
// recupero lista nomi
|
||||
if ( ! GetNamesParam( vsParams[2], vsNames))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// esecuzione
|
||||
for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
|
||||
// recupero la curva
|
||||
pCrv = GetCurve( m_pGDB->GetGeoObj( GetIdParam( *Iter))) ;
|
||||
int nIdCrv = GetIdParam( *Iter) ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
if ( pCrv == nullptr)
|
||||
return false ;
|
||||
// aggiungo questa curva
|
||||
if ( ! pCrvCompo->AddCurve( *pCrv))
|
||||
// recupero il riferimento della curva
|
||||
Frame3d frSou ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdCrv, frSou))
|
||||
return false ;
|
||||
}
|
||||
// inserisco la curva composita nel DB
|
||||
if ( AddGeoObj( vsParams[0], vsParams[1], Release( pCrvCompo))) {
|
||||
// se richiesto, cancello le curve originali
|
||||
if ( bErase) {
|
||||
for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
|
||||
if ( ! m_pGDB->Erase( GetIdParam(*Iter)))
|
||||
return false ;
|
||||
}
|
||||
// se i riferimenti sono uguali
|
||||
if ( AreSameFrame( frSou, frDest)) {
|
||||
// aggiungo direttamente questa curva
|
||||
if ( ! pCrvCompo->AddCurve( *pCrv))
|
||||
return false ;
|
||||
}
|
||||
// altrimenti devo prima trasformare la curva
|
||||
else {
|
||||
// creo una copia della curva (da buttare alla fine)
|
||||
PtrOwner<ICurve> pModCrv( GetCurve( pCrv->Clone())) ;
|
||||
if ( ! IsValid( pModCrv))
|
||||
return false ;
|
||||
// eseguo la trasformazione
|
||||
pModCrv->ToGlob( frSou) ;
|
||||
pModCrv->ToLoc( frDest) ;
|
||||
// aggiungo la curva modificata
|
||||
if ( ! pCrvCompo->AddCurve( *pModCrv))
|
||||
return false ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
// da split di curva semplice
|
||||
else if ( sCmd2 == "FROMSPLIT" || sCmd2 == "S") {
|
||||
// 4 o 5 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 4 : bErase = false ; break ;
|
||||
case 5 : bErase = ( vsParams[4] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
// salvo nome curva originale per eventuale cancellazione
|
||||
vsNames.push_back( vsParams[2]) ;
|
||||
// recupero la curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
if ( pCrv == nullptr)
|
||||
return false ;
|
||||
// recupero il numero delle parti in cui spezzare
|
||||
int nParts ;
|
||||
if ( ! FromString( vsParams[3], nParts))
|
||||
return false ;
|
||||
// ne deduco la curva composita
|
||||
if ( ! pCrvCompo->FromSplit( *pCrv, nParts))
|
||||
return false ;
|
||||
// recupero il riferimento della curva
|
||||
Frame3d frSou ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdCrv, frSou))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// porto la curva composita dal riferimento della sorgente a quello di inserimento
|
||||
if ( ! AreSameFrame( frSou, frDest)) {
|
||||
pCrvCompo->ToGlob( frSou) ;
|
||||
pCrvCompo->ToLoc( frDest) ;
|
||||
}
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
|
||||
return false ;
|
||||
// inserisco la curva composita nel DB
|
||||
if ( AddGeoObj( vsParams[0], vsParams[1], Release( pCrvCompo))) {
|
||||
// se richiesto, cancello le curve originali
|
||||
if ( bErase) {
|
||||
for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
|
||||
if ( ! m_pGDB->Erase( GetIdParam(*Iter)))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user