From 16e134cadf8fc52517f5091bb5e08fd5f54b7b4b Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 22 Feb 2016 07:30:51 +0000 Subject: [PATCH] EgtGeomKernel 1.6n7 : - aggiunte a CurveComposite AddJoint, ModifyJoint, RemoveJoint - aggiunta a PolyLine Flatten. --- CurveComposite.cpp | 116 +++++++++++++++++++++- CurveComposite.h | 234 +++++++++++++++++++++++---------------------- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes PolyLine.cpp | 36 +++++++ 4 files changed, 270 insertions(+), 116 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 4f3ca43..8b67775 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1498,7 +1498,6 @@ CurveComposite::ModifyStart( const Point3d& ptNewStart) // verifico lo stato if ( m_nStatus != OK) return false ; - // recupero la prima curva if ( m_CrvSmplS.empty()) return false ; @@ -1534,6 +1533,121 @@ CurveComposite::ModifyEnd( const Point3d& ptNewEnd) return true ; } +//---------------------------------------------------------------------------- +bool +CurveComposite::AddJoint( double dU) +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + // recupero la curva in cui cade il parametro + int nSCrv ; + double dLocU ; + if ( ! GetIndSCurveAndLocPar( dU, FROM_MINUS, nSCrv, dLocU)) + return false ; + ICurve* pCurve = m_CrvSmplS[ nSCrv] ; + // creo due copie della curva + PtrOwner pCrv1( pCurve->Clone()) ; + PtrOwner pCrv2( pCurve->Clone()) ; + if ( IsNull( pCrv1) || IsNull( pCrv2)) + return false ; + // della prima curva tengo la parte dall'inizio al parametro, della seconda la rimanente + // ( se non riesco a trimmare, la nuova giunzione coincide con una già esistente, esco con successo) + if ( ! pCrv1->TrimEndAtParam( dLocU) || ! pCrv2->TrimStartAtParam( dLocU)) + return true ; + // elimino la curva originale + delete pCurve ; + // devo ora inserire le due curve al posto di quella originale + m_CrvSmplS.insert( m_CrvSmplS.begin() + nSCrv, Release(pCrv1)) ; + m_CrvSmplS[ nSCrv+1] = Release( pCrv2) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint) +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + // numero di curve + int nCrvCount = GetCurveCount() ; + // recupero il puntatore alla curva precedente (se esiste) + ICurve* pPrevCrv = nullptr ; + if ( nU > 0 && nU <= nCrvCount) + pPrevCrv = m_CrvSmplS[ nU - 1] ; + else if ( nU == 0 && IsClosed()) + pPrevCrv = m_CrvSmplS[ nCrvCount - 1] ; + // recupero il puntatore alla curva successiva (se esiste) + ICurve* pNextCrv = nullptr ; + if ( nU >= 0 && nU < nCrvCount) + pNextCrv = m_CrvSmplS[ nU] ; + else if ( nU == nCrvCount && IsClosed()) + pNextCrv = m_CrvSmplS[ 0] ; + // se non esiste curva precedente o curva successiva, errore + if ( pPrevCrv == nullptr || pNextCrv == nullptr) + return false ; + // modifico il punto finale dell'entità precedente + if ( ! pPrevCrv->ModifyEnd( ptNewJoint)) + return false ; + // modifico il punto iniziale dell'entità successiva + if ( ! pNextCrv->ModifyStart( ptNewJoint)) { + // c'è stato errore, ripristino punto finale dell'entità precedente + Point3d ptJ ; + pNextCrv->GetStartPoint( ptJ) ; + pPrevCrv->ModifyEnd( ptJ) ; + return false ; + } + + // imposto ricalcolo della grafica + m_OGrMgr.Reset() ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +CurveComposite::RemoveJoint( int nU) +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + // numero di curve + int nCrvCount = GetCurveCount() ; + // devono esserci almeno 2 curve se composita aperta e almeno 3 se chiusa + if ( nCrvCount < 2 || ( nCrvCount < 3 && IsClosed())) + return false ; + // recupero l'indice della curva precedente (se esiste) + int nPrevCrv = - 1 ; + if ( nU > 0 && nU <= nCrvCount) + nPrevCrv = nU - 1 ; + else if ( nU == 0 && IsClosed()) + nPrevCrv = nCrvCount - 1 ; + // recupero l'indice della curva successiva (se esiste) + int nNextCrv = - 1 ; + if ( nU >= 0 && nU < nCrvCount) + nNextCrv = nU ; + else if ( nU == nCrvCount && IsClosed()) + nNextCrv = 0 ; + // se non esiste curva precedente o curva successiva, errore + if ( nPrevCrv == - 1 || nNextCrv == - 1) + return false ; + // recupero punto finale della curva successiva + Point3d ptEnd ; + m_CrvSmplS[ nNextCrv]->GetEndPoint( ptEnd) ; + // modifico punto finale della curva precedente + if ( ! m_CrvSmplS[ nPrevCrv]->ModifyEnd( ptEnd)) + return false ; + // rimuovo la curva successiva + m_CrvSmplS.erase( m_CrvSmplS.begin()+nNextCrv) ; + + // imposto ricalcolo della grafica + m_OGrMgr.Reset() ; + + return true ; +} + //---------------------------------------------------------------------------- bool CurveComposite::TrimStartAtParam( double dUTrim) diff --git a/CurveComposite.h b/CurveComposite.h index 9782b42..367ff03 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -24,125 +24,129 @@ 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, bool bMM = true, 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 ; } + ~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) override + { m_nTempProp = nProp ; } + int GetTempProp( void) override + { return m_nTempProp ; } public : // ICurve - virtual bool IsSimple( void) const { return false ; } - virtual bool IsClosed( void) const ; - 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 ; - virtual bool GetEndDir( Vector3d& vtDir) const ; - 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 GetParamAtPoint( const Point3d& ptP, double& dPar, double dTol = EPS_SMALL) const ; - virtual bool GetLengthAtPoint( const Point3d& ptP, double& dLen, double dTol = EPS_SMALL) const ; - virtual bool GetNearestExtremityToPoint( const Point3d& ptP, bool& bStart) const - { return ::GetNearestExtremityToPoint( ptP, *this, bStart) ; } - virtual bool GetAreaXY( double& dArea) const - { return CurveGetAreaXY( *this, dArea) ; } - virtual bool GetArea( Plane3d& plPlane, double& dArea) const - { return CurveGetArea( *this, plPlane, dArea) ; } - virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const ; - virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ; - virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, 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) ; + bool IsSimple( void) const override + { return false ; } + bool IsClosed( void) const override ; + 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 + { 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 - 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 Close( void) ; - 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 GetCurveCount( void) const - { return int( m_CrvSmplS.size()) ; } - 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) ; - virtual bool MergeCurves( double dLinTol, double dAngTolDeg) ; + 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 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 AddJoint( double dU) override ; + bool ModifyJoint( int nU, const Point3d& ptNewJoint) override ; + bool RemoveJoint( int nU) override ; + bool ArcsToBezierCurves( void) override ; + bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) override ; + bool MergeCurves( double dLinTol, double dAngTolDeg) override ; public : // IGeoObjRW virtual int GetNgeId( void) const ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 1ac80917c40cb12dc19c41a2d590591830c96bf0..55474c7816e46f0b925b826f858ebd8b737143bc 100644 GIT binary patch delta 110 zcmX>WeJpyzA2vqw&G-4vGfl1&(wY2&Q;pGlvZAo=W*@FeEMOU1X1ItOWeJpyzA2vpl&G-4vGfl1&(wY2&Q;pGNvZAo=W*@FeEMOU1X1ItOfirst, currP->first)) { + // elimino il punto corrente + currP = m_lUPoints.erase( currP) ; + // il precedente rimane inalterato + } + // altrimenti da tenere + else { + // avanzo la coppia di uno step + precP = currP ; + ++ currP ; + } + } + return true ; +} \ No newline at end of file