EgtGraphics 1.5j7 :

- aggiunta Scene::GetGridSnapPointZ.
This commit is contained in:
Dario Sassi
2014-11-05 17:01:36 +00:00
parent 0c8735f612
commit a8d269ecf2
4 changed files with 38 additions and 9 deletions
+35 -6
View File
@@ -31,7 +31,7 @@ Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Poi
{
// se Snap Sketch o Grid, devo trovare il punto sulla griglia
if ( nSnap == SP_SKETCH || nSnap == SP_GRID)
return GetGridSnapPoint( nSnap, ptWin, ptSel) ;
return GetGridSnapPoint( ( nSnap == SP_SKETCH), ptWin, ptSel) ;
// altrimenti devo trovare il punto dall'entità inquadrata
else
return GetSelectedSnapPoint( nSnap, ptWin, nW, nH, ptSel) ;
@@ -39,7 +39,7 @@ Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Poi
//----------------------------------------------------------------------------
bool
Scene::GetGridSnapPoint( int nSnap, const Point3d& ptWin, Point3d& ptSel)
Scene::GetGridSnapPoint( bool bSketch, const Point3d& ptWin, Point3d& ptSel)
{
// calcolo un punto e la direzione della linea di mira
Point3d ptLine ;
@@ -57,7 +57,7 @@ Scene::GetGridSnapPoint( int nSnap, const Point3d& ptWin, Point3d& ptSel)
// porto il punto sul piano di griglia
ptSel.ToLoc( m_frGrid) ;
// se punto grid, devo arrotondare al nodo di griglia più vicino
if ( nSnap == SP_GRID) {
if ( ! bSketch) {
ptSel.x = floor( ptSel.x / m_dSnapStep + 0.5) * m_dSnapStep ;
ptSel.y = floor( ptSel.y / m_dSnapStep + 0.5) * m_dSnapStep ;
}
@@ -68,13 +68,42 @@ Scene::GetGridSnapPoint( int nSnap, const Point3d& ptWin, Point3d& ptSel)
return true ;
}
//----------------------------------------------------------------------------
bool
Scene::GetGridSnapPointZ( bool bSketch, const Point3d& ptWin, const Point3d& ptGrid, Point3d& ptSel)
{
// calcolo un punto e la direzione della linea di mira
Point3d ptLine ;
if ( ! UnProject( ptWin, ptLine))
return false ;
Vector3d vtLine = - m_vtDirCamera ;
// piano di elevazione :
// per il punto di griglia, contenente la perp. alla griglia e più perp. possibile alla direzione di mira
Vector3d vtNorm = vtLine - ( vtLine * m_frGrid.VersZ()) * m_frGrid.VersZ() ;
if ( ! vtNorm.Normalize())
return false ;
// determino l'intersezione della linea di mira con il piano di elevazione
double dDenom = vtLine * vtNorm ;
if ( fabs( dDenom) < COS_ORTO_ANG_SMALL)
return false ;
double dU = ( ( ptGrid - ptLine) * vtNorm) / dDenom ;
Point3d ptNear = ptLine + dU * vtLine ;
// proietto il punto sulla linea di elevazione
double dDeltaZ = ( ptNear - ptGrid) * m_frGrid.VersZ() ;
if ( ! bSketch)
dDeltaZ = floor( dDeltaZ / m_dSnapStep + 0.5) * m_dSnapStep ;
ptSel = ptGrid + dDeltaZ * m_frGrid.VersZ() ;
return true ;
}
//----------------------------------------------------------------------------
bool
Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel)
{
// se Snap Sketch o Grid, devo trovare il punto sulla griglia
if ( nSnap == SP_SKETCH || nSnap == SP_GRID)
return GetGridSnapPoint( nSnap, ptWin, ptSel) ;
// verifico siano state selezionate delle entità
int nSel ;
Select( ptWin, nW, nH, nSel) ;