EgtGraphics 1.6l5 :

- aggiunta gestione snap point a SurfFlatRegion.
This commit is contained in:
Dario Sassi
2016-01-05 11:28:30 +00:00
parent 056dcee5a3
commit cae0f2fc91
3 changed files with 108 additions and 0 deletions
+105
View File
@@ -24,6 +24,7 @@
#include "/EgtDev/Include/EGkCurveComposite.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EgkIntersCurves.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
@@ -328,6 +329,14 @@ Scene::FindSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH)
if ( FindSurfTMSnapPoint( nSnap, ptWin, nId, frEnt, pStm, dMinSqDist))
bFound = true ;
}
// se superficie flat region
else if ( pGObj->GetType() == SRF_FLATRGN) {
// recupero la superficie
const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGObj) ;
// verifico i punti notevoli della regione
if ( FindSurfFRSnapPoint( nSnap, ptWin, nId, frEnt, pSfr, dMinSqDist))
bFound = true ;
}
// se testo
else if ( pGObj->GetType() == EXT_TEXT) {
// recupero il testo
@@ -768,6 +777,102 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
return bFound ;
}
//----------------------------------------------------------------------------
bool
Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,
const ISurfFlatRegion* pSfr, double& dMinSqDist)
{
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
// punto di riferimento nello spazio geometrico 3d
Point3d ptRef ;
if ( ! UnProject( ptWinZ, ptRef))
return false ;
// porto il punto nel riferimento della superficie
ptRef.ToLoc( frEnt) ;
// recupero la direzione di mira e la porto nel riferimento della superficie
Vector3d vtDir = - m_vtDirCamera ;
vtDir.ToLoc( frEnt) ;
// determino se oggetto trasparente
Color cCol ;
bool bAlpha = ( m_pGeomDB->GetCalcMaterial( nId, cCol) && cCol.GetIntAlpha() <= ALPHA_LIM) ;
// se richiesto il centro di gravità (baricentro, centroide)
if ( nSnap == SP_CENTROID) {
Point3d ptP ;
bool bFound = false ;
if ( pSfr->GetCentroid( ptP)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptP, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = false ;
}
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
dMinSqDist = 0 ;
return bFound ;
}
// se richiesto il centro (è il centroide del chunk più vicino)
else if ( nSnap == SP_CENTER) {
Point3d ptP ;
bool bFound = false ;
for ( int i = 0 ; i < pSfr->GetChunkCount() ; ++ i) {
if ( pSfr->GetChunkCentroid( i, ptP)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptP, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = false ;
}
}
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
dMinSqDist = 0 ;
return bFound ;
}
// cerco sui contorni della regione
bool bFound = false ;
for ( int i = 0 ; i < pSfr->GetChunkCount() ; ++ i) {
for ( int j = 0 ; j < pSfr->GetLoopCount( i) ; ++ j) {
ICurve* pCrv = pSfr->GetLoop( i, j) ;
if ( pCrv == nullptr)
return false ;
if ( pCrv->GetType() == CRV_COMPO) {
ICurveComposite* pCrvCompo = GetCurveComposite( pCrv) ;
if ( FindCurveCompoSnapPoint( nSnap, ptWin, nId, frEnt, pCrvCompo, dMinSqDist))
bFound = true ;
}
else {
if ( FindCurveSnapPoint( nSnap, ptWin, nId, frEnt, pCrv, dMinSqDist))
bFound = true ;
}
}
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
dMinSqDist = 0 ;
return bFound ;
}
//----------------------------------------------------------------------------
bool
Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,