EgtGeomKernel 1.5e1 :
- in TriMesh migliorato lo smooth delle normali - in TriMesh aggiunta generazione per rivoluzione - migliorati gestione e aggiornamento materiali.
This commit is contained in:
+232
-83
@@ -16,6 +16,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "GdbExecutor.h"
|
||||
#include "GdbIterator.h"
|
||||
#include "GeoConst.h"
|
||||
#include "GeomDB.h"
|
||||
#include "DllMain.h"
|
||||
#include "/EgtDev/Include/EgnStringUtils.h"
|
||||
@@ -589,6 +590,24 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
{
|
||||
// creazione generica
|
||||
if ( sCmd2 == "" || sCmd2 == "MAKE")
|
||||
return CurveCompoMake( vsParams) ;
|
||||
// creazione da split di curva semplice
|
||||
else if ( sCmd2 == "S" || sCmd2 == "FROMSPLIT")
|
||||
return CurveCompoFromSplit( vsParams) ;
|
||||
// modifica per aggiunta di una curva
|
||||
else if ( sCmd2 == "ADD" || sCmd2 == "ADDCURVE")
|
||||
return CurveCompoAddCurve( vsParams) ;
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::CurveCompoMake( const STRVECTOR& vsParams)
|
||||
{
|
||||
// creo la curva composita
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
@@ -599,92 +618,50 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
INTVECTOR vnNames ;
|
||||
INTVECTOR::iterator Iter ;
|
||||
|
||||
// curva composita generica
|
||||
if ( sCmd2 == "" || sCmd2 == "MAKE") {
|
||||
// 3 o 4 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 3 : bErase = false ; break ;
|
||||
case 4 : bErase = ( vsParams[3] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
// recupero lista nomi
|
||||
if ( ! GetNamesParam( vsParams[2], vnNames))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// esecuzione
|
||||
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
|
||||
// recupero la curva
|
||||
int nIdCrv = *Iter ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
if ( pCrv == nullptr)
|
||||
return false ;
|
||||
// recupero il riferimento della curva
|
||||
Frame3d frSou ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdCrv, frSou))
|
||||
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 ;
|
||||
}
|
||||
}
|
||||
// 3 o 4 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 3 : bErase = false ; break ;
|
||||
case 4 : bErase = ( vsParams[3] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
// da split di curva semplice
|
||||
else if ( sCmd2 == "S" || sCmd2 == "FROMSPLIT") {
|
||||
// 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
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
vnNames.push_back( nIdCrv) ;
|
||||
// recupero lista nomi
|
||||
if ( ! GetNamesParam( vsParams[2], vnNames))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// esecuzione
|
||||
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
|
||||
// recupero la curva
|
||||
int nIdCrv = *Iter ;
|
||||
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) ;
|
||||
// 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 ;
|
||||
}
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
|
||||
// inserisco la curva composita nel DB
|
||||
if ( AddGeoObj( vsParams[0], vsParams[1], Release( pCrvCompo))) {
|
||||
@@ -701,6 +678,99 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::CurveCompoFromSplit( const STRVECTOR& vsParams)
|
||||
{
|
||||
// per eventuale cancellazione curva di origine
|
||||
bool bErase ;
|
||||
// 4 o 5 parametri
|
||||
switch ( vsParams.size()) {
|
||||
case 4 : bErase = false ; break ;
|
||||
case 5 : bErase = ( vsParams[4] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
|
||||
// creo la curva composita
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
if ( ! IsValid( pCrvCompo))
|
||||
return false ;
|
||||
|
||||
// salvo nome curva originale per eventuale cancellazione
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
// recupero la curva
|
||||
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) ;
|
||||
}
|
||||
|
||||
// inserisco la curva composita nel DB
|
||||
if ( AddGeoObj( vsParams[0], vsParams[1], Release( pCrvCompo))) {
|
||||
// se richiesto, cancello la curva originale
|
||||
if ( bErase) {
|
||||
if ( ! m_pGDB->Erase( nIdCrv))
|
||||
return false ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::CurveCompoAddCurve( const STRVECTOR& vsParams)
|
||||
{
|
||||
// per eventuale cancellazione curva da accodare
|
||||
bool bErase ;
|
||||
// 2 o 3 parametri ( IdCurveCompo, IdCurveToAdd[, bEraseCurveToAdd])
|
||||
switch ( vsParams.size()) {
|
||||
case 2 : bErase = false ; break ;
|
||||
case 3 : bErase = ( vsParams[2] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
// recupero la curva composita
|
||||
ICurveComposite* pCrvComp = GetCurveComposite( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
|
||||
if ( pCrvComp == nullptr)
|
||||
return false ;
|
||||
// salvo nome curva da accodare per eventuale cancellazione
|
||||
int nIdCrv = GetIdParam( vsParams[1]) ;
|
||||
// recupero la curva
|
||||
const ICurve* pCrvToAdd = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
if ( pCrvToAdd == nullptr)
|
||||
return false ;
|
||||
// eseguo l'accodamento
|
||||
if ( ! pCrvComp->AddCurve( *pCrvToAdd))
|
||||
return false ;
|
||||
// se richiesto, elimino la curva accodata
|
||||
if ( bErase) {
|
||||
if ( ! m_pGDB->Erase( nIdCrv))
|
||||
return false ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
@@ -780,9 +850,13 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
}
|
||||
// se creazione per triangolazione di un contorno chiuso e piano
|
||||
else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
|
||||
// 3 parametri : Id, ParentId, IdCurve
|
||||
if ( vsParams.size() != 3)
|
||||
// 3 o 4 parametri : Id, ParentId, IdCurve[, dLinTol]
|
||||
if ( vsParams.size() != 3 && vsParams.size() != 4)
|
||||
return false ;
|
||||
// recupero la tolleranza lineare
|
||||
double dLinTol = LIN_TOL_STD ;
|
||||
if ( vsParams.size() == 5)
|
||||
FromString( vsParams[3], dLinTol) ;
|
||||
// recupero la curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
@@ -801,7 +875,7 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
// se i riferimenti sono uguali
|
||||
if ( AreSameFrame( frCrv, frDest)) {
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pCrv->ApproxWithLines( 0.01, 15, PL))
|
||||
if ( ! pCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
return false ;
|
||||
}
|
||||
// altrimenti devo prima trasformare la curva
|
||||
@@ -814,7 +888,7 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
pModCrv->ToGlob( frCrv) ;
|
||||
pModCrv->ToLoc( frDest) ;
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pModCrv->ApproxWithLines( 0.01, 15, PL))
|
||||
if ( ! pModCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
return false ;
|
||||
}
|
||||
// creo la superficie
|
||||
@@ -829,9 +903,13 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
}
|
||||
// se creazione per estrusione
|
||||
else if ( sCmd2 == "EXTR" || sCmd2 == "BYEXTRUSION") {
|
||||
// 4 parametri : Id, ParentId, IdCurve, vtExtr
|
||||
if ( vsParams.size() != 4)
|
||||
// 4 o 5 parametri : Id, ParentId, IdCurve, vtExtr[, dLinTol]
|
||||
if ( vsParams.size() != 4 && vsParams.size() != 5)
|
||||
return false ;
|
||||
// recupero la tolleranza lineare
|
||||
double dLinTol = LIN_TOL_STD ;
|
||||
if ( vsParams.size() == 5)
|
||||
FromString( vsParams[4], dLinTol) ;
|
||||
// recupero la curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
@@ -850,7 +928,7 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
// se i riferimenti sono uguali
|
||||
if ( AreSameFrame( frCrv, frDest)) {
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pCrv->ApproxWithLines( 0.01, 15, PL))
|
||||
if ( ! pCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
return false ;
|
||||
}
|
||||
// altrimenti devo prima trasformare la curva
|
||||
@@ -863,7 +941,7 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
pModCrv->ToGlob( frCrv) ;
|
||||
pModCrv->ToLoc( frDest) ;
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pModCrv->ApproxWithLines( 0.01, 15, PL))
|
||||
if ( ! pModCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
return false ;
|
||||
}
|
||||
// recupero il vettore di estrusione
|
||||
@@ -880,6 +958,77 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
}
|
||||
// se creazione per rivoluzione
|
||||
else if ( sCmd2 == "REV" || sCmd2 == "BYREVOLUTION") {
|
||||
// 6 o 7 parametri : Id, ParentId, IdCurve, ptRev, vtRev, dAngRot[, dLinTol]
|
||||
if ( vsParams.size() != 6 && vsParams.size() != 7)
|
||||
return false ;
|
||||
// recupero la tolleranza lineare
|
||||
double dLinTol = LIN_TOL_STD ;
|
||||
if ( vsParams.size() == 7)
|
||||
FromString( vsParams[6], dLinTol) ;
|
||||
// recupero la curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
|
||||
if ( pCrv == nullptr)
|
||||
return false ;
|
||||
// recupero il riferimento della curva
|
||||
Frame3d frCrv ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdCrv, frCrv))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// calcolo la polilinea che approssima la curva
|
||||
PolyLine PL ;
|
||||
// se i riferimenti sono uguali
|
||||
if ( AreSameFrame( frCrv, frDest)) {
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
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( frCrv) ;
|
||||
pModCrv->ToLoc( frDest) ;
|
||||
// ricavo l'approssimazione
|
||||
if ( ! pModCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL))
|
||||
return false ;
|
||||
}
|
||||
// recupero il punto dell'asse di rivoluzione
|
||||
Point3d ptAx ;
|
||||
if ( ! GetPointParam( vsParams[3], ptAx))
|
||||
return false ;
|
||||
// recupero il vettore dell'asse di rivoluzione
|
||||
Vector3d vtAx ;
|
||||
if ( ! GetVectorParam( vsParams[4], vtAx))
|
||||
return false ;
|
||||
// recupero l'angolo di rotazione
|
||||
double dAngRotDeg ;
|
||||
if ( ! FromString( vsParams[5], dAngRotDeg))
|
||||
return false ;
|
||||
// calcolo lo step di rotazione
|
||||
double dMaxRad = 0 ;
|
||||
PL.GetMaxDistanceFromLine( dMaxRad, ptAx, vtAx, 1, false) ;
|
||||
if ( dMaxRad < EPS_SMALL)
|
||||
return false ;
|
||||
double dStepRotDeg = sqrt( 8 * dLinTol / dMaxRad) * RADTODEG ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco la rivoluzione
|
||||
if ( ! pSTM->CreateByRevolution( PL, ptAx, vtAx, dAngRotDeg, dStepRotDeg))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user