//---------------------------------------------------------------------------- // EgalTech 2014-2020 //---------------------------------------------------------------------------- // File : EGkChainCurves.h Data : 07.10.20 Versione : 2.2j1 // Contenuto : Dichiarazione funzione per concatenamento curve. // // // // Modifiche : 20.07.14 DS Creazione modulo. // 10.09.19 DS Aggiunto m_vPtFork (vettore punti di fork). // 07.10.20 Ds A Init aggiunto parametro dCellDim. // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkPointGrid3d.h" #include "/EgtDev/Include/EGkGeoCollection.h" class IGeomDB ; //----------------------- Macro per import/export ---------------------------- #undef EGK_EXPORT #if defined( I_AM_EGK) // da definirsi solo nella DLL #define EGK_EXPORT __declspec( dllexport) #else #define EGK_EXPORT __declspec( dllimport) #endif //----------------------------------------------------------------------------- class ChainCurves { public : EGK_EXPORT ChainCurves( void) : m_bAllowInvert( false), m_dToler( EPS_SMALL), m_bIsFork( false) {} public : //! Inizializza il concatenamento EGK_EXPORT bool Init( bool bAllowInvert, double dToler, int nCrvNbrHint, double dCellDim = 10) ; //! Aggiunge una curva tra quelle disponibili per il concatenamento EGK_EXPORT bool AddCurve( int nId, const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd) ; //! Concatenazione automatica nei due sensi dall'entità più vicina al punto passato EGK_EXPORT bool GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECTOR& vIds) ; //! Concatenazione in avanti da punto e direzione passati, con possibilità di arresto su biforcazione EGK_EXPORT bool GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptStop, bool bHaltOnFork, INTVECTOR& vIds, bool& bStopped) ; //! \brief Concatenazione all'indietro da punto e direzione passati, con possibilità di arresto su biforcazione. //! Anche l'ordine delle entità restituite è rovesciato EGK_EXPORT bool GetReverseChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptStop, bool bHaltOnFork, INTVECTOR& vIds, bool& bStopped) ; //! Restituisce flag di arresto su biforcazione EGK_EXPORT bool IsFork( void) { return m_bIsFork ; } //! Restituisce il vettore con gli Id delle entità tra cui scegliere sulla biforcazione EGK_EXPORT bool GetForkIds( INTVECTOR& vForkIds) ; private : struct CrvData { int nId ; Point3d ptStart ; Vector3d vtStart ; Point3d ptEnd ; Vector3d vtEnd ; CrvData( void) : nId( 0), ptStart(), vtStart(), ptEnd(), vtEnd() {} CrvData( int nI, const Point3d& ptS, const Vector3d& vtS, const Point3d& ptE, const Vector3d& vtE) : nId( nI), ptStart( ptS), vtStart( vtS), ptEnd( ptE), vtEnd( vtE) {} } ; typedef std::vector CRVDATAVECTOR ; struct ForkData { Point3d ptFork ; INTVECTOR vnFork ; ForkData( void) : ptFork(), vnFork() {} ForkData( const Point3d& ptP, const INTVECTOR& vF) : ptFork( ptP), vnFork( vF) {} } ; typedef std::vector FORKDATAVECTOR ; typedef FORKDATAVECTOR::iterator FDV_CONST_ITER ; private : bool AddToChain( int nId, bool bEquiv, INTVECTOR& vIds) ; bool RemoveEntityFromGrid( int nInd) ; bool ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int& nStart) ; bool ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vNext, bool bHaltOnFork, int& nNext) ; bool ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bHaltOnFork, int& nPrev) ; FDV_CONST_ITER GetForkPoint( const Point3d& ptP) ; private : bool m_bAllowInvert ; double m_dToler ; INTUNORDSET m_sCrvId ; CRVDATAVECTOR m_vCrvData ; PointGrid3d m_PointGrid ; bool m_bFromNear ; FORKDATAVECTOR m_vForkData ; bool m_bIsFork ; INTVECTOR m_vFork ; } ;