EgtGeomKernel 1.5e6 :
- aggiunto PointGrid3d (griglia hash per ricerca spaziale veloce di punti) - aggiunti Compacting e Sewing a SurfTriMesh - razionalizzazioni a GdbExecutor.
This commit is contained in:
+309
-166
@@ -1165,18 +1165,15 @@ GdbExecutor::CurveCompoMake( const STRVECTOR& vsParams)
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
if ( ! IsValid( pCrvCompo))
|
||||
return false ;
|
||||
// per eventuale cancellazione curve di origine
|
||||
bool bErase ;
|
||||
INTVECTOR vnNames ;
|
||||
INTVECTOR::iterator Iter ;
|
||||
|
||||
// 3 o 4 parametri
|
||||
bool bErase ;
|
||||
switch ( vsParams.size()) {
|
||||
case 3 : bErase = false ; break ;
|
||||
case 4 : bErase = ( vsParams[3] != "0") ; break ;
|
||||
default : return false ; break ;
|
||||
}
|
||||
// recupero lista nomi
|
||||
INTVECTOR vnNames ;
|
||||
if ( ! GetNamesParam( vsParams[2], vnNames))
|
||||
return false ;
|
||||
// recupero il riferimento del gruppo destinazione
|
||||
@@ -1184,6 +1181,7 @@ GdbExecutor::CurveCompoMake( const STRVECTOR& vsParams)
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// esecuzione
|
||||
INTVECTOR::iterator Iter ;
|
||||
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
|
||||
// recupero la curva
|
||||
int nIdCrv = *Iter ;
|
||||
@@ -1329,185 +1327,31 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
{
|
||||
// se inizio creazione con componenti elementari
|
||||
if ( sCmd2 == "BEGIN") {
|
||||
// 4 parametri (2 opzionali) : Id, ParentId[, numero vertici e numero triangoli]
|
||||
if ( vsParams.size() < 2)
|
||||
return false ;
|
||||
// recupero Id e ParentId
|
||||
m_sId = vsParams[0] ;
|
||||
m_sParentId = vsParams[1] ;
|
||||
// recupero i parametri opzionali
|
||||
int nNumVert = 3 ;
|
||||
if ( vsParams.size() >= 3)
|
||||
FromString( vsParams[2], nNumVert) ;
|
||||
int nNumTria = 1 ;
|
||||
if ( vsParams.size() >= 4)
|
||||
FromString( vsParams[3], nNumTria) ;
|
||||
// creo la superficie
|
||||
ISurfTriMesh* pSTM = CreateSurfTriMesh() ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// la inizializzo
|
||||
if ( ! pSTM->Init( nNumVert, nNumTria))
|
||||
return false ;
|
||||
// salvo il puntatore
|
||||
if ( m_pGeoObj != nullptr)
|
||||
delete m_pGeoObj ;
|
||||
m_pGeoObj = pSTM ;
|
||||
return true ;
|
||||
return SurfTriMeshBegin( vsParams) ;
|
||||
}
|
||||
// se nuovo vertice
|
||||
else if ( sCmd2 == "VERT" || sCmd2 == "ADDVERTEX") {
|
||||
// 1 parametro : punto
|
||||
if ( vsParams.size() != 1)
|
||||
return false ;
|
||||
// recupero il riferimento in cui va inserito
|
||||
Frame3d frRef ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( m_sParentId), frRef))
|
||||
return false ;
|
||||
// recupero il punto
|
||||
Point3d ptP ;
|
||||
if ( ! GetPointParam( vsParams[0], frRef, ptP))
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// aggiungo il vertice
|
||||
return ( pSTM->AddVertex( ptP) != -1) ;
|
||||
return SurfTriMeshAddVertex( vsParams) ;
|
||||
}
|
||||
// se nuovo triangolo
|
||||
else if ( sCmd2 == "TRIA" || sCmd2 == "ADDTRIANGLE") {
|
||||
// 3 parametri : IdV1, IdV2, IdV3
|
||||
if ( vsParams.size() != 3)
|
||||
return false ;
|
||||
// recupero gli indici dei 3 vertici
|
||||
int nIdVert[3] ;
|
||||
if ( ! FromString( vsParams[0], nIdVert[0]) ||
|
||||
! FromString( vsParams[1], nIdVert[1]) ||
|
||||
! FromString( vsParams[2], nIdVert[2]))
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// aggiungo il triangolo definito con gli indici dei 3 vertici
|
||||
return ( pSTM->AddTriangle( nIdVert) != -1) ;
|
||||
return SurfTriMeshAddTriangle( vsParams) ;
|
||||
}
|
||||
// se fine creazione
|
||||
else if ( sCmd2 == "END") {
|
||||
// nessun parametro
|
||||
if ( vsParams.size() != 0)
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// valido la superficie e calcolo le adiacenze
|
||||
if ( ! pSTM->AdjustTopology())
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
m_pGeoObj = nullptr ;
|
||||
bool bOk = AddGeoObj( m_sId, m_sParentId, pSTM) ;
|
||||
m_sId.clear() ;
|
||||
m_sParentId.clear() ;
|
||||
return bOk ;
|
||||
return SurfTriMeshEnd( vsParams) ;
|
||||
}
|
||||
// se creazione per triangolazione di un contorno chiuso e piano
|
||||
else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
|
||||
// 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() == 4)
|
||||
FromString( vsParams[3], dLinTol) ;
|
||||
// recupero l'identificativo della curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
// 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 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco la triangolazione
|
||||
if ( ! pSTM->CreateByFlatContour( PL))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
return SurfTriMeshByContour( vsParams) ;
|
||||
}
|
||||
// se creazione per estrusione
|
||||
else if ( sCmd2 == "EXTR" || sCmd2 == "BYEXTRUSION") {
|
||||
// 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]) ;
|
||||
// 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 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
|
||||
return false ;
|
||||
// recupero il vettore di estrusione
|
||||
Vector3d vtExtr ;
|
||||
if ( ! GetVectorParam( vsParams[3], frDest, vtExtr))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco l'estrusione
|
||||
if ( ! pSTM->CreateByExtrusion( PL, vtExtr))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
return SurfTriMeshByExtrusion( vsParams) ;
|
||||
}
|
||||
// se creazione da 2 percorsi
|
||||
else if ( sCmd2 == "2P" || sCmd2 == "BY2PATHS") {
|
||||
// 4 o 5 parametri : Id, ParentId, IdCurve1, IdCurve2[, 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 il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// recupero l'identificativo della prima curva
|
||||
int nIdCrv1 = GetIdParam( vsParams[2]) ;
|
||||
// calcolo la polilinea che approssima la prima curva
|
||||
PolyLine PL1 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv1, frDest, dLinTol, PL1))
|
||||
return false ;
|
||||
// recupero l'identificativo della seconda curva
|
||||
int nIdCrv2 = GetIdParam( vsParams[3]) ;
|
||||
// calcolo la polilinea che approssima la seconda curva
|
||||
PolyLine PL2 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv2, frDest, dLinTol, PL2))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco la rigata tra le due curve
|
||||
if ( ! pSTM->CreateByTwoCurves( PL1, PL2))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
return SurfTriMeshByTwoPaths( vsParams) ;
|
||||
}
|
||||
// se creazione per rivoluzione
|
||||
else if ( sCmd2 == "REV" || sCmd2 == "BYREVOLUTION") {
|
||||
@@ -1517,10 +1361,225 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
|
||||
else if ( sCmd2 == "SCR" || sCmd2 == "BYSCREWING") {
|
||||
return SurfTriMeshByScrewing( true, vsParams) ;
|
||||
}
|
||||
// imposto angolo limite per mediare normali in un vertice
|
||||
else if ( sCmd2 == "SMA" || sCmd2 == "SMOOTHANG") {
|
||||
return SurfTriMeshChangeSmoothAng( vsParams) ;
|
||||
}
|
||||
// compattazione per unione di vertici con posizioni coincidenti
|
||||
else if ( sCmd2 == "COMP" || sCmd2 == "DOCOMPACTING") {
|
||||
return SurfTriMeshDoCompacting( vsParams) ;
|
||||
}
|
||||
// se unione di due o più superfici per cucitura
|
||||
else if ( sCmd2 == "SEW" || sCmd2 == "DOSEWING") {
|
||||
return SurfTriMeshDoSewing( vsParams) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshBegin( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 4 parametri (2 opzionali) : Id, ParentId[, numero vertici e numero triangoli]
|
||||
if ( vsParams.size() < 2)
|
||||
return false ;
|
||||
// recupero Id e ParentId
|
||||
m_sId = vsParams[0] ;
|
||||
m_sParentId = vsParams[1] ;
|
||||
// recupero i parametri opzionali
|
||||
int nNumVert = 3 ;
|
||||
if ( vsParams.size() >= 3)
|
||||
FromString( vsParams[2], nNumVert) ;
|
||||
int nNumTria = 1 ;
|
||||
if ( vsParams.size() >= 4)
|
||||
FromString( vsParams[3], nNumTria) ;
|
||||
// creo la superficie
|
||||
ISurfTriMesh* pSTM = CreateSurfTriMesh() ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// la inizializzo
|
||||
if ( ! pSTM->Init( nNumVert, nNumTria))
|
||||
return false ;
|
||||
// salvo il puntatore
|
||||
if ( m_pGeoObj != nullptr)
|
||||
delete m_pGeoObj ;
|
||||
m_pGeoObj = pSTM ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshAddVertex( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 1 parametro : punto
|
||||
if ( vsParams.size() != 1)
|
||||
return false ;
|
||||
// recupero il riferimento in cui va inserito
|
||||
Frame3d frRef ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( m_sParentId), frRef))
|
||||
return false ;
|
||||
// recupero il punto
|
||||
Point3d ptP ;
|
||||
if ( ! GetPointParam( vsParams[0], frRef, ptP))
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// aggiungo il vertice
|
||||
return ( pSTM->AddVertex( ptP) != -1) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshAddTriangle( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 3 parametri : IdV1, IdV2, IdV3
|
||||
if ( vsParams.size() != 3)
|
||||
return false ;
|
||||
// recupero gli indici dei 3 vertici
|
||||
int nIdVert[3] ;
|
||||
if ( ! FromString( vsParams[0], nIdVert[0]) ||
|
||||
! FromString( vsParams[1], nIdVert[1]) ||
|
||||
! FromString( vsParams[2], nIdVert[2]))
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// aggiungo il triangolo definito con gli indici dei 3 vertici
|
||||
return ( pSTM->AddTriangle( nIdVert) != -1) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshEnd( const STRVECTOR& vsParams)
|
||||
{
|
||||
// nessun parametro
|
||||
if ( vsParams.size() != 0)
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
|
||||
if ( pSTM == nullptr)
|
||||
return false ;
|
||||
// valido la superficie e calcolo le adiacenze
|
||||
if ( ! pSTM->AdjustTopology())
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
m_pGeoObj = nullptr ;
|
||||
bool bOk = AddGeoObj( m_sId, m_sParentId, pSTM) ;
|
||||
m_sId.clear() ;
|
||||
m_sParentId.clear() ;
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshByContour( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 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() == 4)
|
||||
FromString( vsParams[3], dLinTol) ;
|
||||
// recupero l'identificativo della curva
|
||||
int nIdCrv = GetIdParam( vsParams[2]) ;
|
||||
// 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 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco la triangolazione
|
||||
if ( ! pSTM->CreateByFlatContour( PL))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshByExtrusion( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 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]) ;
|
||||
// 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 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
|
||||
return false ;
|
||||
// recupero il vettore di estrusione
|
||||
Vector3d vtExtr ;
|
||||
if ( ! GetVectorParam( vsParams[3], frDest, vtExtr))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco l'estrusione
|
||||
if ( ! pSTM->CreateByExtrusion( PL, vtExtr))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshByTwoPaths( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 4 o 5 parametri : Id, ParentId, IdCurve1, IdCurve2[, 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 il riferimento del gruppo destinazione
|
||||
Frame3d frDest ;
|
||||
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
|
||||
return false ;
|
||||
// recupero l'identificativo della prima curva
|
||||
int nIdCrv1 = GetIdParam( vsParams[2]) ;
|
||||
// calcolo la polilinea che approssima la prima curva
|
||||
PolyLine PL1 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv1, frDest, dLinTol, PL1))
|
||||
return false ;
|
||||
// recupero l'identificativo della seconda curva
|
||||
int nIdCrv2 = GetIdParam( vsParams[3]) ;
|
||||
// calcolo la polilinea che approssima la seconda curva
|
||||
PolyLine PL2 ;
|
||||
if ( ! GetPolylineFromCurve( nIdCrv2, frDest, dLinTol, PL2))
|
||||
return false ;
|
||||
// creo la superficie
|
||||
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
|
||||
if ( ! IsValid( pSTM))
|
||||
return false ;
|
||||
// costruisco la rigata tra le due curve
|
||||
if ( ! pSTM->CreateByTwoCurves( PL1, PL2))
|
||||
return false ;
|
||||
// inserisco la superficie trimesh nel DB
|
||||
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshByScrewing( bool bMove, const STRVECTOR& vsParams)
|
||||
@@ -1624,6 +1683,90 @@ GdbExecutor::GetPolylineFromCurve( int nId, const Frame3d& frDest, double dLinTo
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshChangeSmoothAng( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 2 parametri : Id, dSmoothAngDeg
|
||||
if ( vsParams.size() != 2)
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
|
||||
if ( pStm == nullptr)
|
||||
return false ;
|
||||
// recupero il valore dell'angolo
|
||||
double dSmoothAng ;
|
||||
if ( ! FromString( vsParams[1], dSmoothAng))
|
||||
return false ;
|
||||
// imposto l'angolo
|
||||
pStm->SetSmoothAngle( dSmoothAng) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshDoCompacting( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 1 parametro : Id
|
||||
if ( vsParams.size() != 1)
|
||||
return false ;
|
||||
// recupero la superficie
|
||||
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
|
||||
if ( pStm == nullptr)
|
||||
return false ;
|
||||
// eseguo la compattazione
|
||||
return pStm->DoCompacting() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::SurfTriMeshDoSewing( const STRVECTOR& vsParams)
|
||||
{
|
||||
// 2 o 3 parametri : Id, IdOther[, bErase]
|
||||
if ( vsParams.size() != 2 && vsParams.size() != 3)
|
||||
return false ;
|
||||
// eventuale flag per cancellazione delle superfici cucite alla prima
|
||||
bool bErase = false ;
|
||||
if ( vsParams.size() >= 3 && vsParams[2] != "0")
|
||||
bErase = true ;
|
||||
// recupero la prima superficie
|
||||
int nIdStm = GetIdParam( vsParams[0]) ;
|
||||
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdStm)) ;
|
||||
if ( pStm == nullptr)
|
||||
return false ;
|
||||
// ne recupero il riferimento
|
||||
Frame3d frStm ;
|
||||
if ( ! m_pGDB->GetGlobFrame( nIdStm, frStm))
|
||||
return false ;
|
||||
// recupero lista nomi delle altre superfici
|
||||
INTVECTOR vnNames ;
|
||||
if ( ! GetNamesParam( vsParams[1], vnNames))
|
||||
return false ;
|
||||
// esecuzione
|
||||
INTVECTOR::iterator Iter ;
|
||||
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
|
||||
// recupero la superficie da cucire
|
||||
const ISurfTriMesh* pStmS = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
|
||||
if ( pStmS == nullptr)
|
||||
return false ;
|
||||
// recupero il riferimento
|
||||
Frame3d frStmS ;
|
||||
if ( ! m_pGDB->GetGlobFrame( *Iter, frStmS))
|
||||
return false ;
|
||||
// lo esprimo rispetto a quello della prima superficie
|
||||
frStmS.ToLoc( frStm) ;
|
||||
// eseguo la cucitura
|
||||
if ( ! pStm->DoSewing( *pStmS, frStm))
|
||||
return false ;
|
||||
}
|
||||
// se richiesto, cancello le superfici cucite alla prima
|
||||
if ( bErase) {
|
||||
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter)
|
||||
m_pGDB->Erase( *Iter) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GdbExecutor::AddGeoObj( const string& sId, const string& sIdParent, IGeoObj* pGeoObj)
|
||||
|
||||
Reference in New Issue
Block a user