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:
+50
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user