63fb9a638b
- a SimpleOffset di Curve aggiunto parametro opzionale dMaxAngExt (angolo esterno oltre il quale estendi diventa smussa) con default 90deg.
248 lines
14 KiB
C++
248 lines
14 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 Voronoi ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
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, int nPropInd = 0) override
|
|
{ if ( nPropInd >= 0 && nPropInd < 2)
|
|
m_nTempProp[nPropInd] = nProp ; }
|
|
int GetTempProp( int nPropInd = 0) const override
|
|
{ return (( nPropInd >= 0 && nPropInd < 2) ? m_nTempProp[nPropInd] : 0) ; }
|
|
void SetTempParam( double dParam, int nParamInd = 0) override
|
|
{ if ( nParamInd >= 0 && nParamInd < 2)
|
|
m_dTempParam[nParamInd] = dParam ; }
|
|
double GetTempParam( int nParamInd = 0) const override
|
|
{ return (( nParamInd >= 0 && nParamInd < 2) ? m_dTempParam[nParamInd] : 0.0) ; }
|
|
|
|
public : // ICurve
|
|
bool IsSimple( void) const override
|
|
{ return true ; }
|
|
bool IsClosed( void) const override
|
|
{ return ::IsClosed( *this) ; }
|
|
bool IsFlat( Plane3d& plPlane, bool bUseExtrusion = true, 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, double dMaxAngExt = ANG_RIGHT) 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 IsPlane( double dToler = EPS_SMALL) const override
|
|
{ return ( abs( m_dDeltaN) < dToler) ; }
|
|
bool IsACircle( void) const override
|
|
{ return ( IsPlane() && 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 override
|
|
{ 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) override
|
|
{ return MyExtendedOffset( dDist, false) ; }
|
|
bool ToExplementary( void) override ;
|
|
bool Flip( void) override ;
|
|
|
|
public : // IGeoObjRW
|
|
int GetNgeId( void) const override ;
|
|
bool Save( NgeWriter& ngeOut) const override ;
|
|
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
|
|
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
|
|
bool Load( NgeReader& ngeIn) override ;
|
|
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
|
|
|
|
public :
|
|
CurveArc( void) ;
|
|
CurveArc( const CurveArc& caSrc) : m_pVoronoiObj( nullptr)
|
|
{ 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) ;
|
|
bool MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, double dLinTol) const ;
|
|
Voronoi* GetVoronoiObject( void) const ;
|
|
void ResetVoronoiObject( void) const ;
|
|
|
|
private :
|
|
bool CopyFrom( const CurveArc& caSrc) ;
|
|
bool Validate( void) ;
|
|
bool GetDir( double dU, Vector3d& vtDir) const ;
|
|
bool CalcVoronoiObject( void) 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[2] ; // vettore proprietà temporanee
|
|
double m_dTempParam[2] ; // vettore parametri temporanei
|
|
mutable Voronoi* m_pVoronoiObj ; // Voronoi
|
|
} ;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
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)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != CRV_ARC)
|
|
return nullptr ;
|
|
return ( static_cast<const CurveArc*>( pGObj)) ; }
|
|
inline CurveArc* GetBasicCurveArc( IGeoObj* pGObj)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != CRV_ARC)
|
|
return nullptr ;
|
|
return ( static_cast<CurveArc*>( pGObj)) ; }
|