//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : EGkChainCurves.h Data : 20.07.14 Versione : 1.5g3 // Contenuto : Dichiarazione funzione per concatenamento curve. // // // // Modifiche : 20.07.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkPointGrid3d.h" #include 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) ; //! 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 : typedef std::unordered_set INTUSET ; 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 ; 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 Vector3d& vtCurr, const INTVECTOR& vNext, bool bHaltOnFork, int& nNext) ; bool ChoosePrev( const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bHaltOnFork, int& nPrev) ; private : bool m_bAllowInvert ; double m_dToler ; INTUSET m_sCrvId ; CRVDATAVECTOR m_vCrvData ; PointGrid3d m_PointGrid ; bool m_bIsFork ; INTVECTOR m_vFork ; } ;