EgtGraphics 1.6b7 :

- griglia non più nascosta da oggetti in hiddenline
- corretta visualizzazione superfici trasparenti con riferimenti locali al gruppo
- con selezione oggetti, con il punto si ritorna indice di sotto-oggetto
- aggiunto snap-point di superfici e fatte correzioni in generale.
This commit is contained in:
Dario Sassi
2015-03-11 07:49:00 +00:00
parent 21d509f3da
commit 992f5360b6
12 changed files with 271 additions and 84 deletions
+50 -3
View File
@@ -15,13 +15,16 @@
#include "stdafx.h"
#include "Scene.h"
#include "GraphObjs.h"
#include "ObjEGrGraphics.h"
#include "DllMain.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/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
#include "/EgtDev/Include/EGkGdbConst.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include <algorithm>
@@ -209,12 +212,16 @@ Scene::UnselectableFind( int nId)
/*------------------------------------------------------------------------------------------*/
bool
Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel)
Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel, int& nAux)
{
// recupera il punto di mira proiettato sull'oggetto appena selezionato
// (va eseguito subito dopo la Select da cui si è derivato l'Id)
// è simile a GetSelectedSnapPoint
// verifico parametri di ritorno
if ( &ptSel == nullptr || &nAux == nullptr)
return false ;
// rendo corrente l'entità selezionata
bool bFound = false ;
for ( int nId = GetFirstSelectedObj() ; nId != GDB_ID_NULL ; nId = GetNextSelectedObj()) {
@@ -236,6 +243,8 @@ Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel)
if ( ! m_pGeomDB->GetGlobFrame( nSelId, frEnt))
return false ;
// inizializzo indice ausiliario (Id del sotto-oggetto : curva semplice o triangolo)
nAux = 0 ;
// se punto
if ( pGObj->GetType() == GEO_PNT3D) {
// recupero il geo-punto
@@ -278,8 +287,10 @@ Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel)
if ( dstPtCurve.GetMinDistInfo( 0, mdInfo)) {
Point3d ptP = mdInfo.ptQ ;
ptP.ToGlob( frEnt) ;
if ( VerifySnapPoint( ptP, ptView, dMinSqDist))
if ( VerifySnapPoint( ptP, ptView, dMinSqDist)) {
ptSel = ptP ;
nAux = int( mdInfo.dPar) ;
}
}
// eventuale verifica dell'estruso
double dTh ;
@@ -298,11 +309,47 @@ Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel)
Point3d ptP = mdInfo.ptQ ;
ptP.ToGlob( frEnt) ;
ptP += vtExtr ;
if ( VerifySnapPoint( ptP, ptView, dMinSqDist))
if ( VerifySnapPoint( ptP, ptView, dMinSqDist)) {
ptSel = ptP ;
nAux = int( mdInfo.dPar) ;
}
}
}
}
// se superficie trimesh
else if ( pGObj->GetType() == SRF_TRIMESH) {
// recupero la superficie
const ISurfTriMesh* pStm = GetSurfTriMesh( pGObj) ;
// il punto di riferimento deriva da XY su viewport e Z da selezione
Point3d ptWinZ( ptView.x, ptView.y, GetSelectedObjWinZ()) ;
// lo porto da spazio grafico a spazio geometrico globale
Point3d ptRef ;
UnProject( ptWinZ, ptRef) ;
// lo porto nel frame della curva
ptRef.ToLoc( frEnt) ;
// recupero la direzione di mira e la porto nel riferimento della superficie
Vector3d vtDir = - m_vtDirCamera ;
vtDir.ToLoc( frEnt) ;
// recupero il raggio del box di ingombro
double dBlRad = 1000 ;
const ObjEGrGraphics* pGraphics = GetObjEGrGraphics( pStm) ;
if ( pGraphics != nullptr) {
BBox3d b3Loc ;
if ( pGraphics->GetLocalBBox( b3Loc))
b3Loc.GetRadius( dBlRad) ;
}
// punto davanti all'oggetto lungo il raggio di mira
Point3d ptMir = ptRef - vtDir * 2 * dBlRad ;
double dLenMir = 4 * dBlRad ;
// cerco i triangoli intersecati dalla linea di mira
ILSIVECTOR vInfo ;
if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo) || vInfo.size() == 0)
return false ;
// recupero il primo punto
ptSel = vInfo[0].ptI ;
ptSel.ToGlob( frEnt) ;
nAux = vInfo[0].nT ;
}
// se testo
else if ( pGObj->GetType() == EXT_TEXT) {
// recupero il testo