EgtGraphics 1.5j2 :
- migliorie a snap point da selezione.
This commit is contained in:
+160
-52
@@ -15,9 +15,12 @@
|
||||
#include "stdafx.h"
|
||||
#include "Scene.h"
|
||||
#include "/EgtDev/Include/EGkGeomDB.h"
|
||||
#include "/EgtDev/Include/EgkGeoPoint3d.h"
|
||||
#include "/EgtDev/Include/EgkGeoVector3d.h"
|
||||
#include "/EgtDev/Include/EGkFrame3d.h"
|
||||
#include "/EgtDev/Include/EGkCurve.h"
|
||||
#include "/EgtDev/Include/EGkDistPointCurve.h"
|
||||
#include "/EgtDev/Include/EGkExtText.h"
|
||||
|
||||
|
||||
using namespace std ;
|
||||
@@ -38,71 +41,176 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
|
||||
bool bFound = false ;
|
||||
double dMinSqDist = INFINITO * INFINITO ;
|
||||
for ( size_t i = 0 ; i < nIds.size() ; ++ i) {
|
||||
// recupero geometria e frame dell'entità
|
||||
const ICurve* pCrv = GetCurve( m_pGeomDB->GetGeoObj( nIds[i])) ;
|
||||
if ( pCrv == nullptr)
|
||||
// se non è entità geometrica
|
||||
const IGeoObj* pGObj ;
|
||||
if ( ( pGObj = m_pGeomDB->GetGeoObj( nIds[i])) == nullptr)
|
||||
continue ;
|
||||
// recupero riferimento dell'entità
|
||||
Frame3d frEnt ;
|
||||
if ( ! m_pGeomDB->GetGlobFrame( nIds[i], frEnt))
|
||||
continue ;
|
||||
// recupero il punto
|
||||
Point3d ptP ;
|
||||
switch ( nSnap) {
|
||||
case SP_END :
|
||||
// punto iniziale
|
||||
if ( pCrv->GetStartPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
// se punto
|
||||
if ( pGObj->GetType() == GEO_PNT3D) {
|
||||
// recupero il geo-punto
|
||||
const IGeoPoint3d* pGP = GetGeoPoint3d( pGObj) ;
|
||||
// recupero il punto
|
||||
Point3d ptP = pGP->GetPoint() ;
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
// punto finale
|
||||
if ( pCrv->GetEndPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
// se vettore
|
||||
else if ( pGObj->GetType() == GEO_VECT3D) {
|
||||
// recupero il geo-vettore
|
||||
const IGeoVector3d* pGV = GetGeoVector3d( pGObj) ;
|
||||
// recupero il punto
|
||||
Point3d ptP = pGV->GetBase() ;
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
break ;
|
||||
case SP_MID :
|
||||
if ( pCrv->GetMidPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
// se frame
|
||||
else if ( pGObj->GetType() == GEO_FRAME3D) {
|
||||
// recupero il geo-frame
|
||||
const IGeoFrame3d* pGF = GetGeoFrame3d( pGObj) ;
|
||||
// recupero il punto
|
||||
Point3d ptP = pGF->GetFrame().Orig() ;
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
break ;
|
||||
case SP_CENTER :
|
||||
if ( pCrv->GetCenterPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_NEAR :
|
||||
{ // il punto di riferimento deriva da XY su viewport e Z da selezione
|
||||
Point3d ptRefWin( ptWin.x, ptWin.y, GetSelectedObjWinZ( int( i))) ;
|
||||
Point3d ptRef ;
|
||||
// lo porto da spazio grafico a spazio geometrico globale
|
||||
UnProject( ptRefWin, ptRef) ;
|
||||
// lo porto nel frame della curva
|
||||
ptRef.ToLoc( frEnt) ;
|
||||
// determino il punto più vicino della curva a questo
|
||||
int nFlag ;
|
||||
DistPointCurve dstPtCurve( ptRef, *pCrv) ;
|
||||
if ( dstPtCurve.GetMinDistPoint( 0, ptP, nFlag)) {
|
||||
}
|
||||
// se curva
|
||||
else if ( ( pGObj->GetType() & GEO_CURVE) != 0) {
|
||||
// recupero la curva
|
||||
const ICurve* pCrv = GetCurve( m_pGeomDB->GetGeoObj( nIds[i])) ;
|
||||
// recupero il punto
|
||||
Point3d ptP ;
|
||||
switch ( nSnap) {
|
||||
case SP_END :
|
||||
// punto iniziale
|
||||
if ( pCrv->GetStartPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
} break ;
|
||||
// punto finale
|
||||
if ( pCrv->GetEndPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_MID :
|
||||
if ( pCrv->GetMidPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_CENTER :
|
||||
if ( pCrv->GetCenterPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_NEAR :
|
||||
{ // il punto di riferimento deriva da XY su viewport e Z da selezione
|
||||
Point3d ptRefWin( ptWin.x, ptWin.y, GetSelectedObjWinZ( int( i))) ;
|
||||
Point3d ptRef ;
|
||||
// lo porto da spazio grafico a spazio geometrico globale
|
||||
UnProject( ptRefWin, ptRef) ;
|
||||
// lo porto nel frame della curva
|
||||
ptRef.ToLoc( frEnt) ;
|
||||
// determino il punto più vicino della curva a questo
|
||||
int nFlag ;
|
||||
DistPointCurve dstPtCurve( ptRef, *pCrv) ;
|
||||
if ( dstPtCurve.GetMinDistPoint( 0, ptP, nFlag)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
} break ;
|
||||
}
|
||||
}
|
||||
// se testo
|
||||
else if ( pGObj->GetType() == EXT_TEXT) {
|
||||
// recupero il testo
|
||||
const IExtText* pTxt = GetExtText( pGObj) ;
|
||||
// recupero il punto
|
||||
Point3d ptP ;
|
||||
switch ( nSnap) {
|
||||
case SP_END :
|
||||
// punto iniziale
|
||||
if ( pTxt->GetStartPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
// punto sopra iniziale
|
||||
if ( pTxt->GetOverStartPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
// punto finale
|
||||
if ( pTxt->GetEndPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
// punto sopra finale
|
||||
if ( pTxt->GetOverEndPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_MID :
|
||||
// punto medio
|
||||
if ( pTxt->GetMidPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case SP_CENTER :
|
||||
// centro
|
||||
if ( pTxt->GetCenterPoint( ptP)) {
|
||||
ptP.ToGlob( frEnt) ;
|
||||
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
|
||||
bFound = true ;
|
||||
ptSel = ptP ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
return bFound ;
|
||||
|
||||
Reference in New Issue
Block a user