Files
EgtGeomKernel/CurveArc.h
T
Dario Sassi 6c14e51ef6 EgtGeomKernel 1.6c2 :
- aggiunte funzioni per circonferenze e archi tangenti.
2015-03-16 07:38:43 +00:00

210 lines
12 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : CurveArc.h Data : 22.11.13 Versione : 1.3a1
// Contenuto : Dichiarazione della classe CurveArc.
//
//
//
// Modifiche : 16.04.13 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "ObjGraphicsMgr.h"
#include "CurveAux.h"
#include "DllMain.h"
#include "GeoObjRW.h"
#include "/EgtDev/Include/EGkCurveArc.h"
//----------------------------------------------------------------------------
class CurveArc : public ICurveArc, public IGeoObjRW
{
public : // IGeoObj
virtual ~CurveArc( void) ;
virtual CurveArc* 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 true ; }
virtual bool IsClosed( void) const
{ return ::IsClosed( *this) ; }
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 ;
virtual bool GetCentroid( Point3d& ptCen) const ;
virtual bool GetStartDir( Vector3d& vtDir) const
{ return GetDir( 0, vtDir) ; }
virtual bool GetEndDir( Vector3d& vtDir) const
{ return GetDir( 1, vtDir) ; }
virtual bool GetMidDir( Vector3d& vtDir) const
{ return GetDir( 0.5, vtDir) ; }
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
{ dStart = 0 ; dEnd = 1 ; return ( m_nStatus == OK) ; }
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 = 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 : // ICurveArc
virtual bool CopyFrom( const IGeoObj* pGObjSrc) ;
virtual bool Set( const Point3d& ptCen, const Vector3d& vtN, double dRad,
const Vector3d& vtS, double dAngCenDeg, double dDeltaN) ;
virtual bool Set( const Point3d& ptCen, const Vector3d& vtN, double dRad) ;
virtual bool SetXY( const Point3d& ptCen, double dRad, double dAngIniDeg, double dAngCenDeg, double dDeltaZ) ;
virtual bool SetXY( const Point3d& ptCen, double dRad) ;
virtual bool Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d& ptEnd, bool bCirc = false) ;
virtual bool Set2PNB( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN, double dBulge) ;
virtual bool Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStartDeg) ;
virtual bool Set2PVN( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtDirS, const Vector3d& vtN) ;
virtual bool Set2PRS( const Point3d& ptStart, const Point3d& ptEnd, double dRad, bool bCCW = true) ;
virtual bool Set2PNRS( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN, double dRad, bool bCCW = true) ;
virtual bool SetC2P( const Point3d& ptCen, const Point3d& ptStart, const Point3d& ptNearEnd) ;
virtual bool SetC2PN( const Point3d& ptCen, const Point3d& ptStart, const Point3d& ptNearEnd, const Vector3d& vtN) ;
virtual bool IsFlat( double dToler = EPS_SMALL) const
{ return ( fabs( m_dDeltaN) < dToler) ; }
virtual bool IsACircle( void) const
{ return ( IsFlat() && IsClosed()) ; }
virtual bool IsInPlaneXY( void) const
{ return ( m_VtN.IsZplus()) ; }
virtual bool IsInPlanePerpExtr( void) const
{ return ( ( m_VtExtr.IsSmall() && m_VtN.IsZplus()) ||
AreSameVectorApprox( m_VtExtr, m_VtN)) ; }
virtual const Point3d& GetCenter( void) const
{ return m_PtCen ; }
virtual const Vector3d& GetNormVersor( void) const
{ return m_VtN ; }
virtual const Vector3d& GetStartVersor( void) const
{ return m_VtS ; }
virtual double GetRadius( void) const
{ return m_dRad ; }
virtual double GetAngCenter( void) const
{ return m_dAngCenDeg ; }
virtual double GetDeltaN( void) const
{ return m_dDeltaN ; }
virtual bool IsPointInSector( const Point3d& ptP) const ;
virtual bool CalcPointAngle( const Point3d& ptP, double& dAngDeg) const ;
virtual bool CalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos) const ;
virtual bool InvertN( void) ;
virtual bool ChangeRadius( double dNewRadius) ;
virtual bool ChangeDeltaN( double dNewDeltaN) ;
virtual bool ExtendedOffset( double dDist, int nType = OFF_FILLET) ;
virtual bool ToAdditional( void) ;
virtual bool Flip( void) ;
public : // IGeoObjRW
virtual int GetNgeId( void) const ;
virtual bool Save( NgeWriter& ngeOut) const ;
virtual bool Load( NgeReader& ngeIn) ;
public :
CurveArc( void) ;
CurveArc( const CurveArc& caSrc)
{ if ( ! CopyFrom( caSrc))
LOG_ERROR( GetEGkLogger(), "CurveArc : copy constructor error")}
CurveArc& operator =( const CurveArc& caSrc)
{ if ( ! CopyFrom( caSrc))
LOG_ERROR( GetEGkLogger(), "CurveArc : copy error")
return *this ; }
private :
bool CopyFrom( const CurveArc& caSrc) ;
bool Validate( void) ;
bool GetDir( double dU, Vector3d& vtDir) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
private :
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
Status m_nStatus ; // stato
Point3d m_PtCen ; // punto centro
Vector3d m_VtN ; // versore normale al piano dell'arco
Vector3d m_VtS ; // versore al punto iniziale
double m_dRad ; // raggio
double m_dAngCenDeg ; // angolo al centro in gradi (positivo se antiorario visto da VtN)
double m_dDeltaN ; // variazione di quota lungo VtN della fine rispetto all'inizio
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
int m_nTempProp ; // proprietà temporanea
} ;
//-----------------------------------------------------------------------------
inline CurveArc* CreateBasicCurveArc( void)
{ return (static_cast<CurveArc*>( CreateGeoObj( CRV_ARC))) ; }
inline CurveArc* CloneBasicCurveArc( const IGeoObj* pGObj)
{ if ( pGObj == nullptr || pGObj->GetType() != CRV_ARC)
return nullptr ;
return (static_cast<CurveArc*>(pGObj->Clone())) ; }
inline const CurveArc* GetBasicCurveArc( const IGeoObj* pGObj)
{ return (dynamic_cast<const CurveArc*>(pGObj)) ; }
inline CurveArc* GetBasicCurveArc( IGeoObj* pGObj)
{ return (dynamic_cast<CurveArc*>(pGObj)) ; }