//---------------------------------------------------------------------------- // 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 ~CurveArc( void) override ; CurveArc* Clone( void) const override ; GeoObjType GetType( void) const override ; bool IsValid( void) const override { return ( m_nStatus == OK) ; } const std::string& GetTitle( void) const override ; bool Dump( std::string& sOut, bool bMM = true, const char* szNewLine = "\n") const override ; bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ; bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const override ; bool Translate( const Vector3d& vtMove) override ; bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg) override { double dAngRad = dAngDeg * DEGTORAD ; return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; } bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) override ; bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) override ; bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) override ; bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff) override ; bool ToGlob( const Frame3d& frRef) override ; bool ToLoc( const Frame3d& frRef) override ; bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) override ; void SetObjGraphics( IObjGraphics* pOGr) override { m_OGrMgr.SetObjGraphics( pOGr) ; } IObjGraphics* GetObjGraphics( void) override { return m_OGrMgr.GetObjGraphics() ; } const IObjGraphics* GetObjGraphics( void) const override { return m_OGrMgr.GetObjGraphics() ; } void SetTempProp( int nProp) override { m_nTempProp = nProp ; } int GetTempProp( void) override { return m_nTempProp ; } public : // ICurve bool IsSimple( void) const override { return true ; } bool IsClosed( void) const override { return ::IsClosed( *this) ; } bool IsFlat( Plane3d& plPlane, double dToler = EPS_SMALL) const override ; bool GetStartPoint( Point3d& ptStart) const override ; bool GetEndPoint( Point3d& ptEnd) const override ; bool GetMidPoint( Point3d& ptMid) const override ; bool GetCenterPoint( Point3d& ptCen) const override ; bool GetCentroid( Point3d& ptCen) const override ; bool GetStartDir( Vector3d& vtDir) const override { return GetDir( 0, vtDir) ; } bool GetEndDir( Vector3d& vtDir) const override { return GetDir( 1, vtDir) ; } bool GetMidDir( Vector3d& vtDir) const override { return GetDir( 0.5, vtDir) ; } bool GetExtrusion( Vector3d& vtExtr) const override { vtExtr = m_VtExtr ; return ( m_nStatus == OK) ; } bool GetThickness( double& dThick) const override { dThick = m_dThick ; return ( m_nStatus == OK) ; } bool GetDomain( double& dStart, double& dEnd) const override { dStart = 0 ; dEnd = 1 ; return ( m_nStatus == OK) ; } bool IsValidParam( double dPar, Side nSide) const override { return ::IsValidParam( *this, dPar, nSide) ; } bool IsStartParam( double dPar) const override { return ::IsStartParam( *this, dPar) ; } bool IsEndParam( double dPar) const override { return ::IsEndParam( *this, dPar) ; } bool GetLength( double& dLen) const override ; bool GetLengthAtParam( double dU, double& dLen) const override ; bool GetParamAtLength( double dLen, double& dU) const override ; bool GetPointD1D2( double dU, Side nS, Point3d& ptPos, Vector3d* pvtDer1 = nullptr, Vector3d* pvtDer2 = nullptr) const override ; bool GetPointTang( double dU, Side nS, Point3d& ptPos, Vector3d& vtTang) const override { return ::GetPointTang( *this, dU, nS, ptPos, vtTang) ; } bool GetPointDiffGeom( double dU, Side nS, CrvPointDiffGeom& oDiffG) const override { oDiffG.nFlag = CrvPointDiffGeom::STD ; return ::GetPointDiffGeom( *this, dU, nS, oDiffG) ; } bool IsPointOn( const Point3d& ptP, double dTol = EPS_SMALL) const override ; bool GetParamAtPoint( const Point3d& ptP, double& dPar, double dTol = EPS_SMALL) const override ; bool GetLengthAtPoint( const Point3d& ptP, double& dLen, double dTol = EPS_SMALL) const override ; bool GetNearestExtremityToPoint( const Point3d& ptP, bool& bStart) const override { return ::GetNearestExtremityToPoint( ptP, *this, bStart) ; } bool GetAreaXY( double& dArea) const override { return CurveGetAreaXY( *this, dArea) ; } bool GetArea( Plane3d& plPlane, double& dArea) const override { return CurveGetArea( *this, plPlane, dArea) ; } bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const override ; bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const override ; bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const override { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } ICurve* CopyParamRange( double dUStart, double dUEnd) const override ; bool Invert( void) override ; bool SimpleOffset( double dDist, int nType = OFF_FILLET) override ; bool ModifyStart( const Point3d& ptNewStart) override ; bool ModifyEnd( const Point3d& ptNewEnd) override ; bool SetExtrusion( const Vector3d& vtExtr) override { m_VtExtr = vtExtr ; m_VtExtr.Normalize() ; m_OGrMgr.Reset() ; return true ; } bool SetThickness( double dThick) override { m_dThick = dThick ; m_OGrMgr.Reset() ; return true ; } bool TrimStartAtParam( double dUTrim) override ; bool TrimEndAtParam( double dUTrim) override ; bool TrimStartEndAtParam( double dUStartTrim, double dUEndTrim) override ; bool TrimStartAtLen( double dLenTrim) override ; bool TrimEndAtLen( double dLenTrim) override ; bool ExtendStartByLen( double dLenExt) override ; bool ExtendEndByLen( double dLenExt) override ; public : // ICurveArc bool CopyFrom( const IGeoObj* pGObjSrc) override ; bool Set( const Point3d& ptCen, const Vector3d& vtN, double dRad, const Vector3d& vtS, double dAngCenDeg, double dDeltaN) override ; bool Set( const Point3d& ptCen, const Vector3d& vtN, double dRad) override ; bool SetXY( const Point3d& ptCen, double dRad, double dAngIniDeg, double dAngCenDeg, double dDeltaZ) override ; bool SetXY( const Point3d& ptCen, double dRad) override ; bool Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d& ptEnd, bool bCirc = false) override ; bool Set2PNB( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN, double dBulge) override ; bool Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStartDeg) override ; bool Set2PVN( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtDirS, const Vector3d& vtN) override ; bool Set2PRS( const Point3d& ptStart, const Point3d& ptEnd, double dRad, bool bCCW = true) override ; bool Set2PNRS( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN, double dRad, bool bCCW = true) override ; bool SetCPA( const Point3d& ptCen, const Point3d& ptStart, double dAngCenDeg, double dDeltaZ) override ; bool SetCPAN( const Point3d& ptCen, const Point3d& ptStart, double dAngCenDeg, double dDeltaZ, const Vector3d& vtN) override ; bool SetC2P( const Point3d& ptCen, const Point3d& ptStart, const Point3d& ptNearEnd) override ; bool SetC2PN( const Point3d& ptCen, const Point3d& ptStart, const Point3d& ptNearEnd, const Vector3d& vtN) override ; bool IsFlat( double dToler = EPS_SMALL) const override { return ( fabs( m_dDeltaN) < dToler) ; } bool IsACircle( void) const override { return ( IsFlat() && IsClosed()) ; } bool IsInPlaneXY( void) const override { return ( m_VtN.IsZplus()) ; } bool IsInPlanePerpExtr( void) const override { return ( ( m_VtExtr.IsSmall() && m_VtN.IsZplus()) || AreSameVectorApprox( m_VtExtr, m_VtN)) ; } const Point3d& GetCenter( void) const override { return m_PtCen ; } const Vector3d& GetNormVersor( void) const override { return m_VtN ; } const Vector3d& GetStartVersor( void) const { return m_VtS ; } double GetRadius( void) const override { return m_dRad ; } double GetAngCenter( void) const override { return m_dAngCenDeg ; } double GetDeltaN( void) const override { return m_dDeltaN ; } bool IsPointInSector( const Point3d& ptP) const override ; bool CalcPointAngle( const Point3d& ptP, double& dAngDeg) const override ; bool CalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos) const override { return MyCalcPointParamPosiz( ptP, dU, nPos, EPS_SMALL) ; } bool InvertN( void) override ; bool ChangeRadius( double dNewRadius) override ; bool ChangeDeltaN( double dNewDeltaN) override ; bool ChangeAngCenter( double dNewAngCenDeg) override ; bool ChangeStartPoint( double dU) override ; bool ExtendedOffset( double dDist, int nType = OFF_FILLET) override { return MyExtendedOffset( dDist, false, nType) ; } bool ToExplementary( void) override ; bool Flip( void) override ; public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; bool Load( NgeReader& ngeIn) override ; 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 ; } bool MyExtendedOffset( double dDist, bool bAll, int nType = OFF_FILLET) ; bool MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, double dLinTol) const ; 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( CreateGeoObj( CRV_ARC))) ; } inline CurveArc* CloneBasicCurveArc( const IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != CRV_ARC) return nullptr ; return (static_cast(pGObj->Clone())) ; } inline const CurveArc* GetBasicCurveArc( const IGeoObj* pGObj) { return (dynamic_cast(pGObj)) ; } inline CurveArc* GetBasicCurveArc( IGeoObj* pGObj) { return (dynamic_cast(pGObj)) ; }