1b85e111dc
- aggiunto calcolo baricentro di Curve - migliorata gestione richiesta nuovo Id - aggiunta intersezione linea-piano e linea-triangolo - corretto errore in PointGrid3d con 1 solo punto (non faceva alcunchè) - aggiunte funzioni di accesso a dati di SurfTM.
199 lines
11 KiB
C++
199 lines
11 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2013-2013
|
|
//----------------------------------------------------------------------------
|
|
// File : CurveComposite.h Data : 23.11.13 Versione : 1.3a1
|
|
// Contenuto : Dichiarazione della classe Curva composita.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 16.04.13 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "ObjGraphicsMgr.h"
|
|
#include "CurveAux.h"
|
|
#include "DllMain.h"
|
|
#include "GeoObjRW.h"
|
|
#include "/EgtDev/Include/EGkCurveComposite.h"
|
|
#include "/EgtDev/Include/EgtLogger.h"
|
|
#include <deque>
|
|
|
|
//----------------------------------------------------------------------------
|
|
class CurveComposite : public ICurveComposite, public IGeoObjRW
|
|
{
|
|
public : // IGeoObj
|
|
virtual ~CurveComposite( void) ;
|
|
virtual CurveComposite* Clone( void) const ;
|
|
virtual GeoObjType GetType( void) const ;
|
|
virtual bool IsValid( void) const
|
|
{ return ( m_nStatus == OK) ; }
|
|
virtual const std::string& GetTitle( void) const ;
|
|
virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ;
|
|
virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const ;
|
|
virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const ;
|
|
virtual bool Translate( const Vector3d& vtMove) ;
|
|
virtual bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
|
|
{ double dAngRad = dAngDeg * DEGTORAD ;
|
|
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
|
|
virtual bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) ;
|
|
virtual bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
|
|
virtual bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) ;
|
|
virtual bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff) ;
|
|
virtual bool ToGlob( const Frame3d& frRef) ;
|
|
virtual bool ToLoc( const Frame3d& frRef) ;
|
|
virtual bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) ;
|
|
virtual void SetObjGraphics( IObjGraphics* pOGr)
|
|
{ m_OGrMgr.SetObjGraphics( pOGr) ; }
|
|
virtual IObjGraphics* GetObjGraphics( void)
|
|
{ return m_OGrMgr.GetObjGraphics() ; }
|
|
virtual const IObjGraphics* GetObjGraphics( void) const
|
|
{ return m_OGrMgr.GetObjGraphics() ; }
|
|
virtual void SetTempProp( int nProp)
|
|
{ m_nTempProp = nProp ; }
|
|
virtual int GetTempProp( void)
|
|
{ return m_nTempProp ; }
|
|
|
|
public : // ICurve
|
|
virtual bool IsSimple( void) const { return false ; }
|
|
virtual bool IsClosed( void) const
|
|
{ return ( m_nStatus == OK && m_bClosed) ; }
|
|
virtual bool IsFlat( Plane3d& plPlane, double dToler = EPS_SMALL) const ;
|
|
virtual bool GetStartPoint( Point3d& ptStart) const ;
|
|
virtual bool GetEndPoint( Point3d& ptEnd) const ;
|
|
virtual bool GetMidPoint( Point3d& ptMid) const ;
|
|
virtual bool GetCenterPoint( Point3d& ptCen) const
|
|
{ return GetMidPoint( ptCen) ; }
|
|
virtual bool GetCentroid( Point3d& ptCen) const ;
|
|
virtual bool GetStartDir( Vector3d& vtDir) const
|
|
{ return ::GetTang( *this, 0, FROM_PLUS, vtDir) ; }
|
|
virtual bool GetEndDir( Vector3d& vtDir) const
|
|
{ return ::GetTang( *this, m_nCounter, FROM_MINUS, vtDir) ; }
|
|
virtual bool GetMidDir( Vector3d& vtDir) const ;
|
|
virtual bool GetExtrusion( Vector3d& vtExtr) const
|
|
{ vtExtr = m_VtExtr ; return ( m_nStatus == OK) ; }
|
|
virtual bool GetThickness( double& dThick) const
|
|
{ dThick = m_dThick ; return ( m_nStatus == OK) ; }
|
|
virtual bool GetDomain( double& dStart, double& dEnd) const ;
|
|
virtual bool IsValidParam( double dPar, Side nSide) const
|
|
{ return ::IsValidParam( *this, dPar, nSide) ; }
|
|
virtual bool IsStartParam( double dPar) const
|
|
{ return ::IsStartParam( *this, dPar) ; }
|
|
virtual bool IsEndParam( double dPar) const
|
|
{ return ::IsEndParam( *this, dPar) ; }
|
|
virtual bool GetLength( double& dLen) const ;
|
|
virtual bool GetLengthAtParam( double dU, double& dLen) const ;
|
|
virtual bool GetParamAtLength( double dLen, double& dU) const ;
|
|
virtual bool GetPointD1D2( double dU, Side nS, Point3d& ptPos,
|
|
Vector3d* pvtDer1 = nullptr, Vector3d* pvtDer2 = nullptr) const ;
|
|
virtual bool GetPointTang( double dU, Side nS, Point3d& ptPos, Vector3d& vtTang) const
|
|
{ return ::GetPointTang( *this, dU, nS, ptPos, vtTang) ; }
|
|
virtual bool GetPointDiffGeom( double dU, Side nS, CrvPointDiffGeom& oDiffG) const
|
|
{ oDiffG.nFlag = ( IsParamAtJoint( dU) ? CrvPointDiffGeom::TO_VERIFY : CrvPointDiffGeom::STD) ;
|
|
return ::GetPointDiffGeom( *this, dU, nS, oDiffG) ; }
|
|
virtual bool IsPointOn( const Point3d& ptP, double dTol = EPS_SMALL) const ;
|
|
virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, PolyLine& PL) const ;
|
|
virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ;
|
|
virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const ;
|
|
virtual bool Invert( void) ;
|
|
virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) ;
|
|
virtual bool ModifyStart( const Point3d& ptNewStart) ;
|
|
virtual bool ModifyEnd( const Point3d& ptNewEnd) ;
|
|
virtual bool SetExtrusion( const Vector3d& vtExtr)
|
|
{ m_VtExtr = vtExtr ; m_VtExtr.Normalize() ; m_OGrMgr.Reset() ; return true ; }
|
|
virtual bool SetThickness( double dThick)
|
|
{ m_dThick = dThick ; m_OGrMgr.Reset() ; return true ; }
|
|
virtual bool TrimStartAtParam( double dUTrim) ;
|
|
virtual bool TrimEndAtParam( double dUTrim) ;
|
|
virtual bool TrimStartEndAtParam( double dUStartTrim, double dUEndTrim) ;
|
|
virtual bool TrimStartAtLen( double dLenTrim) ;
|
|
virtual bool TrimEndAtLen( double dLenTrim) ;
|
|
virtual bool ExtendStartByLen( double dLenExt) ;
|
|
virtual bool ExtendEndByLen( double dLenExt) ;
|
|
|
|
public : // ICurveComposite
|
|
virtual bool CopyFrom( const IGeoObj* pGObjSrc) ;
|
|
virtual bool Clear( void) ;
|
|
virtual bool AddCurve( const ICurve& cCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ;
|
|
virtual bool AddCurve( ICurve* pCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ;
|
|
virtual bool FromSplit( const ICurve& cCrv, int nParts) ;
|
|
virtual bool FromPolyLine( const PolyLine& PL) ;
|
|
virtual bool FromPolyArc( const PolyArc& PA) ;
|
|
virtual bool PolygonCenterCorner( int nSides, const Point3d& ptCen, const Point3d& ptCorner, const Vector3d& vtN) ;
|
|
virtual bool PolygonCenterMidSide( int nSides, const Point3d& ptCen, const Point3d& ptMidSide, const Vector3d& vtN) ;
|
|
virtual bool PolygonSide( int nSides, const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN) ;
|
|
virtual int GetCurveNumber( void) const
|
|
{ return m_nCounter ; }
|
|
virtual const ICurve* GetCurve( int nCrv) const ;
|
|
virtual const ICurve* GetFirstCurve( void) const ;
|
|
virtual const ICurve* GetNextCurve( void) const ;
|
|
virtual const ICurve* GetLastCurve( void) const ;
|
|
virtual const ICurve* GetPrevCurve( void) const ;
|
|
virtual bool IsParamAtJoint( double dU) const ;
|
|
virtual ICurve* RemoveFirstOrLastCurve( bool bLast = true) ;
|
|
virtual bool ChangeStartPoint( double dU) ;
|
|
virtual bool ArcsToBezierCurves( void) ;
|
|
virtual bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) ;
|
|
|
|
public : // IGeoObjRW
|
|
virtual int GetNgeId( void) const ;
|
|
virtual bool Save( NgeWriter& ngeOut) const ;
|
|
virtual bool Load( NgeReader& ngeIn) ;
|
|
|
|
public :
|
|
CurveComposite( void) ;
|
|
CurveComposite( const CurveComposite& ccSrc)
|
|
{ if ( ! CopyFrom( ccSrc))
|
|
LOG_ERROR( GetEGkLogger(), "CurveComposite : copy constructor error") }
|
|
CurveComposite& operator =( const CurveComposite& ccSrc)
|
|
{ if ( ! CopyFrom( ccSrc))
|
|
LOG_ERROR( GetEGkLogger(), "CurveComposite : copy error")
|
|
return *this ; }
|
|
bool RelocateFrom( CurveComposite& ccSrc) ;
|
|
|
|
private :
|
|
bool CopyFrom( const CurveComposite& ccSrc) ;
|
|
bool Validate( void) ;
|
|
bool ValidateMoveStart( void) ;
|
|
bool ValidateMoveEnd( void) ;
|
|
bool AddCurveByRelocate( CurveComposite& ccSrc, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ;
|
|
bool AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ;
|
|
bool GetIndSCurveAndLocPar( double dU, Side nS, int& nSCrv, double& dLocU) const ;
|
|
bool SimpleOffsetXY( double dDist, int nType = OFF_FILLET) ;
|
|
|
|
private :
|
|
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
|
|
|
|
private :
|
|
typedef std::deque<ICurve*> PCRVSMPL_DEQUE ;
|
|
typedef PCRVSMPL_DEQUE::iterator PCSD_ITER ;
|
|
typedef PCRVSMPL_DEQUE::const_iterator PCSD_CONST_ITER ;
|
|
|
|
private :
|
|
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
|
|
Status m_nStatus ; // stato
|
|
int m_nCounter ; // contatore del numero di curve
|
|
PCRVSMPL_DEQUE m_CrvSmplS ; // deque di curve semplici
|
|
Point3d m_PtStart ; // punto iniziale
|
|
Point3d m_PtEnd ; // punto finale
|
|
bool m_bClosed ; // flag per indicare che la curva è chiusa
|
|
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
|
|
double m_dThick ; // spessore
|
|
int m_nTempProp ; // proprietà temporanea
|
|
mutable PCSD_CONST_ITER m_Iter ; // iteratore
|
|
} ;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
inline CurveComposite* CreateBasicCurveComposite( void)
|
|
{ return (static_cast<CurveComposite*>( CreateGeoObj( CRV_COMPO))) ; }
|
|
inline CurveComposite* CloneBasicCurveComposite( const IGeoObj* pGObj)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != CRV_COMPO)
|
|
return nullptr ;
|
|
return (static_cast<CurveComposite*>(pGObj->Clone())) ; }
|
|
inline const CurveComposite* GetBasicCurveComposite( const IGeoObj* pGObj)
|
|
{ return (dynamic_cast<const CurveComposite*>(pGObj)) ; }
|
|
inline CurveComposite* GetBasicCurveComposite( IGeoObj* pGObj)
|
|
{ return (dynamic_cast<CurveComposite*>(pGObj)) ; }
|