dedb4f23cf
- migliorata gestione materiale (colore ora caso speciale) - si invalida rappresentazione grafica alla modifica del materiale - spostato comando COUNTER di TSC in EgtGeneral.
257 lines
6.6 KiB
C++
257 lines
6.6 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2013-2013
|
|
//----------------------------------------------------------------------------
|
|
// File : GdbGeo.cpp Data : 24.11.13 Versione : 1.3a1
|
|
// Contenuto : Implementazione della classe GdbGeo oggetto del DB geometrico.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 22.01.13 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "GdbGeo.h"
|
|
#include "GeoObjFactory.h"
|
|
#include "CurveAux.h"
|
|
#include "Attribs.h"
|
|
#include "/EgtDev/Include/EGnStringUtils.h"
|
|
#include <new>
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
GdbGeo::GdbGeo( void)
|
|
{
|
|
m_pGeoObj = nullptr ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
GdbGeo::~GdbGeo( void)
|
|
{
|
|
if ( m_pGeoObj != nullptr)
|
|
delete m_pGeoObj ;
|
|
m_pGeoObj = nullptr ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
GdbGeo*
|
|
GdbGeo::Clone( int nId, IdManager& IdMgr) const
|
|
{
|
|
GdbGeo* pGdbGeo ;
|
|
|
|
|
|
// alloco oggetto Gdb
|
|
pGdbGeo = new(nothrow) GdbGeo ;
|
|
if ( pGdbGeo == nullptr)
|
|
return nullptr ;
|
|
|
|
// copio dati oggetto Gdb
|
|
pGdbGeo->GdbObj::Copy( this) ;
|
|
|
|
// assegno nuovo Id
|
|
pGdbGeo->m_nId = nId ;
|
|
// l'aggiornamento del manager di Id viene fatto all'inserimento nel DB
|
|
|
|
// copio oggetto Geo
|
|
if ( m_pGeoObj != nullptr) {
|
|
pGdbGeo->m_pGeoObj = m_pGeoObj->Clone() ;
|
|
if ( pGdbGeo->m_pGeoObj == nullptr) {
|
|
delete pGdbGeo ;
|
|
return nullptr ;
|
|
}
|
|
}
|
|
|
|
return pGdbGeo ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
GeoObjType
|
|
GdbGeo::GetType( void) const
|
|
{
|
|
// non esiste l'oggetto geometrico
|
|
if ( m_pGeoObj == nullptr)
|
|
return GEO_NONE ;
|
|
|
|
return m_pGeoObj->GetType() ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Save( std::ostream& osOut) const
|
|
{
|
|
bool bOk = true ;
|
|
|
|
// tipo entità
|
|
osOut << m_pGeoObj->GetKey() << endl ;
|
|
// nome
|
|
osOut << m_nId << "@" << GetParentId() << endl ;
|
|
|
|
// attributi
|
|
if ( ! GdbObj::SaveAttribs( osOut))
|
|
bOk = false ;
|
|
|
|
// parametri geometrici
|
|
osOut << "G" << endl ;
|
|
if ( ! m_pGeoObj->Save( osOut))
|
|
bOk = false ;
|
|
|
|
return bOk ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Load( const std::string& sType, Scanner& TheScanner, int& nParentId)
|
|
{
|
|
int nType ;
|
|
string sLine ;
|
|
STRVECTOR vsParams ;
|
|
|
|
|
|
// creo l'oggetto geometrico corrispondente
|
|
nType = GEOOBJ_KEYTOTYPE( sType) ;
|
|
m_pGeoObj = GEOOBJ_CREATE( nType) ;
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
// leggo la prossima linea
|
|
if ( ! TheScanner.GetLine( sLine))
|
|
return false ;
|
|
// la divido in parametri
|
|
Tokenize( sLine, "@", vsParams) ;
|
|
// 2 parametri : Id e ParentId
|
|
if ( vsParams.size() != 2)
|
|
return false ;
|
|
// assegno l'identificativo
|
|
if ( ! FromString( vsParams[0], m_nId))
|
|
return false ;
|
|
// assegno l'Id del padre
|
|
if ( ! FromString( vsParams[1], nParentId))
|
|
return false ;
|
|
|
|
// leggo la prossima linea
|
|
if ( ! TheScanner.GetLine( sLine))
|
|
return false ;
|
|
|
|
// eventuali attributi
|
|
if ( sLine == "A") {
|
|
if ( ! GdbObj::LoadAttribs( TheScanner))
|
|
return false ;
|
|
// leggo la prossima linea
|
|
if ( ! TheScanner.GetLine( sLine))
|
|
return false ;
|
|
}
|
|
|
|
// verifico inizio dati geometrici
|
|
if ( sLine != "G")
|
|
return false ;
|
|
|
|
// parametri geometrici
|
|
return m_pGeoObj->Load( TheScanner) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::GetLocalBBox( BBox3d& b3Loc) const
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->GetLocalBBox( b3Loc) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->GetBBox( frRef, b3Ref) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Translate( const Vector3d& vtMove)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->Translate( vtMove) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
// se arco e scalatura non omogenea
|
|
if ( m_pGeoObj->GetType() == CRV_ARC &&
|
|
(fabs( dCoeffX - dCoeffY) > EPS_SMALL || fabs( dCoeffX - dCoeffZ) > EPS_SMALL)) {
|
|
// trasformo in curva di Bezier (semplice o composta)
|
|
ICurve* pCrvNew ;
|
|
if ( ! ArcToBezierCurve( GetCurve( m_pGeoObj), pCrvNew))
|
|
return false ;
|
|
// elimino l'arco e lo sostituisco con la curva di Bezier
|
|
delete m_pGeoObj ;
|
|
m_pGeoObj = pCrvNew ;
|
|
}
|
|
|
|
// eseguo scalatura
|
|
return m_pGeoObj->Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->Mirror( ptOn, vtNorm) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::ToGlob( const Frame3d& frRef)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->ToGlob( frRef) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::ToLoc( const Frame3d& frRef)
|
|
{
|
|
if ( m_pGeoObj == nullptr)
|
|
return false ;
|
|
|
|
return m_pGeoObj->ToLoc( frRef) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
GdbGeo::OnSetMaterial( void)
|
|
{
|
|
if ( m_pGeoObj->GetObjGraphics() != nullptr)
|
|
m_pGeoObj->GetObjGraphics()->Reset() ;
|
|
|
|
return true ;
|
|
}
|