//---------------------------------------------------------------------------- // EgalTech 2013-2022 //---------------------------------------------------------------------------- // File : CurveComposite.h Data : 24.03.22 Versione : 2.4c2 // Contenuto : Dichiarazione della classe Curva composita. // // // // Modifiche : 16.04.13 DS Creazione modulo. // 24.03.22 DS Aggiunto metodo AddLineTg. // // //---------------------------------------------------------------------------- #pragma once #include "ObjGraphicsMgr.h" #include "CurveAux.h" #include "DllMain.h" #include "GeoObjRW.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include class Voronoi ; //---------------------------------------------------------------------------- class CurveComposite : public ICurveComposite, public IGeoObjRW { public : // IGeoObj ~CurveComposite( void) override ; CurveComposite* 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 false ; } bool IsClosed( void) const override ; 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 { return GetMidPoint( ptCen) ; } bool GetCentroid( Point3d& ptCen) const override ; bool GetStartDir( Vector3d& vtDir) const override ; bool GetEndDir( Vector3d& vtDir) const override ; bool GetMidDir( Vector3d& vtDir) const override ; 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 ; 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 = ( IsParamAtJoint( dU) ? CrvPointDiffGeom::TO_VERIFY : 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 ; 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 : // ICurveComposite bool CopyFrom( const IGeoObj* pGObjSrc) override ; bool Clear( void) override ; bool AddCurve( const ICurve& cCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) override ; bool AddCurve( ICurve* pCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) override ; bool Close( void) override ; bool FromSplit( const ICurve& cCrv, int nParts) override ; bool FromPolyLine( const PolyLine& PL) override ; bool FromPolyArc( const PolyArc& PA) override ; bool PolygonCenterCorner( int nSides, const Point3d& ptCen, const Point3d& ptCorner, const Vector3d& vtN) override ; bool PolygonCenterMidSide( int nSides, const Point3d& ptCen, const Point3d& ptMidSide, const Vector3d& vtN) override ; bool PolygonSide( int nSides, const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtN) override ; int GetCurveCount( void) const override { return ( ( m_nStatus != OK) ? 0 : int( m_CrvSmplS.size())) ; } const ICurve* GetCurve( int nCrv) const override ; const ICurve* GetFirstCurve( void) const override ; const ICurve* GetNextCurve( void) const override ; const ICurve* GetLastCurve( void) const override ; const ICurve* GetPrevCurve( void) const override ; bool IsParamAtJoint( double dU) const override ; ICurve* RemoveFirstOrLastCurve( bool bLast = true) override ; bool ChangeStartPoint( double dU) override ; bool AddPoint( const Point3d& ptStart) override ; // funzione per aggiungere il ptStart prima di usare la funzione AddLine bool AddLine( const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddLineTg( double dLen, bool bEndOrStart = true) override ; bool AddArc2P( const Point3d& ptOther, const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddArcTg( const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddJoint( double dU) override ; bool ModifyJoint( int nU, const Point3d& ptNewJoint) override ; bool RemoveJoint( int nU) override ; bool MoveCurve( int nCrv, const Vector3d& vtMove) override ; bool ModifyCurveToArc( int nCrv, const Point3d& ptMid) override ; bool ModifyCurveToLine( int nCrv) override ; bool ArcsToBezierCurves( void) override ; bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) override ; bool StraightArcsToLines( double dLinTol, double dAngTolDeg) override ; bool MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd = true, bool bNeedSameProp = false) override ; bool RemoveSmallParts( double dLinTol, double dAngTolDeg) override ; bool RemoveSmallDefects( double dLinTol, double dAngTolDeg, bool bAlsoSpikes = false) override ; bool RemoveUndercutOnY( double dLinTol, double dAngTolDeg) override ; bool IsAPoint( void) const override ; bool IsALine( double dLinTol, Point3d& ptStart, Point3d& ptEnd) const override ; bool IsACircle( double dLinTol, Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const override ; bool IsARectangle( double dLinTol, Point3d& ptP, Vector3d& vtL1, Vector3d& vtL2) const override ; bool IsATrapezoid( double dLinTol, Point3d& ptP, Vector3d& vtB1, Vector3d& vtL1, Vector3d& vtB2) const override ; bool SetCurveTempProp( int nCrv, int nProp, int nPropInd = 0) override ; bool GetCurveTempProp( int nCrv, int& nProp, int nPropInd = 0) const override ; bool SetCurveTempParam( int nCrv, double dParam, int nParamInd = 0) override ; bool GetCurveTempParam( int nCrv, double& dParam, int nParamInd = 0) const override ; bool FromPoint( Point3d& ptStart) override ; // funzione per settare la curva ad un unico punto bool GetOnlyPoint( Point3d& ptStart) const override ; // funzione per recuperare l'unico punto da cui è composta la curva ( degenere) 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 : CurveComposite( void) ; CurveComposite( const CurveComposite& ccSrc) : m_pVoronoiObj( nullptr) { 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) ; bool GetApproxLength( double& dLen) const ; Voronoi* GetVoronoiObject( void) const ; void ResetVoronoiObject( void) const ; private : bool CopyFrom( const CurveComposite& ccSrc) ; bool Validate( void) ; bool TestClosure( 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) ; bool IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const ; bool CalcVoronoiObject( void) const ; private : enum Status { ERR = 0, OK = 1, TO_VERIFY = 2, IS_A_POINT = 3} ; private : typedef std::deque PCRVSMPL_DEQUE ; typedef PCRVSMPL_DEQUE::const_iterator PCSD_CONST_ITER ; private : ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto Status m_nStatus ; // stato PCRVSMPL_DEQUE m_CrvSmplS ; // deque di curve semplici Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN) double m_dThick ; // spessore Point3d m_ptStart ; // punto iniziale per composita vuota per Add di linee o archi int m_nTempProp[2] ; // vettore proprietà temporanee double m_dTempParam[2] ; // vettore parametri temporanei mutable Voronoi* m_pVoronoiObj ; // Voronoi mutable PCSD_CONST_ITER m_Iter ; // iteratore } ; //----------------------------------------------------------------------------- inline CurveComposite* CreateBasicCurveComposite( void) { return ( static_cast( CreateGeoObj( CRV_COMPO))) ; } inline CurveComposite* CloneBasicCurveComposite( const IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != CRV_COMPO) return nullptr ; return ( static_cast( pGObj->Clone())) ; } inline const CurveComposite* GetBasicCurveComposite( const IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != CRV_COMPO) return nullptr ; return ( static_cast( pGObj)) ; } inline CurveComposite* GetBasicCurveComposite( IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != CRV_COMPO) return nullptr ; return ( static_cast( pGObj)) ; } inline CurveComposite* ConvertCurveToBasicComposite( IGeoObj* pGObj) { if ( pGObj == nullptr || ( pGObj->GetType() & GEO_CURVE) == 0) { delete pGObj ; return nullptr ; } CurveComposite* pCrvCo = CreateBasicCurveComposite() ; if ( pCrvCo == nullptr) { delete pGObj ; return nullptr ; } ICurve* pCrv = static_cast( pGObj) ; Vector3d vtExtr ; if ( pCrv->GetExtrusion( vtExtr) && ! vtExtr.IsSmall()) pCrvCo->SetExtrusion( vtExtr) ; double dThick ; if ( pCrv->GetThickness( dThick) && abs( dThick) > EPS_SMALL) pCrvCo->SetThickness( dThick) ; for ( int i = 0 ; i < 2 ; ++ i) { int nProp = pCrv->GetTempProp( i) ; if ( nProp != 0) pCrvCo->SetTempProp( nProp, i) ; } for ( int i = 0 ; i < 2 ; ++ i) { double dParam = pCrv->GetTempParam( i) ; if ( abs( dParam) > EPS_SMALL) pCrvCo->SetTempParam( dParam, i) ; } pCrvCo->AddCurve( pCrv) ; return pCrvCo ; }