Files
Include/EGkChainCurves.h
Daniele Bariletti 7084ab34c8 Include :
- spostata la funzione GetChainedCurves.
2026-01-21 10:04:38 +01:00

100 lines
4.6 KiB
C++

//----------------------------------------------------------------------------
// 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<CrvData> 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<ForkData> 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 ;
} ;