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:
Dario Sassi
2014-01-23 14:51:47 +00:00
parent 72350a0688
commit b50b676249
13 changed files with 403 additions and 116 deletions
+116 -53
View File
@@ -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 ;
}
//----------------------------------------------------------------------------