diff --git a/EgtGraphics.rc b/EgtGraphics.rc
index bc12164..ff7b49b 100644
Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ
diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj
index 547432f..d3ef789 100644
--- a/EgtGraphics.vcxproj
+++ b/EgtGraphics.vcxproj
@@ -154,6 +154,7 @@ copy $(TargetPath) \EgtProg\DllD64
StreamingSIMDExtensions2
+ true
Windows
diff --git a/Scene.h b/Scene.h
index eee6aa8..0096d45 100644
--- a/Scene.h
+++ b/Scene.h
@@ -123,6 +123,13 @@ class Scene : public IEGrScene
// Snap
virtual bool GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel) ;
virtual bool GetGridSnapPointZ( bool bSketch, const Point3d& ptWin, const Point3d& ptGrid, Point3d& ptSel) ;
+ virtual int GetLastSnapId( void)
+ { return m_nLastSnapId ; }
+ virtual bool GetLastSnapDir( Vector3d& vtDir)
+ { if ( ! m_bLastSnapDirOk)
+ return false ;
+ vtDir = m_vtLastSnapDir ;
+ return true ; }
public :
// Basic
@@ -199,6 +206,10 @@ class Scene : public IEGrScene
static const int DIM_SEL_BUF = 32768 ;
SelRec m_nSelBuff[DIM_SEL_BUF] ; // buffer per selezione con OpenGL
+ int m_nLastSnapId ; // Id dell'entitą generatrice dell'ultimo punto snap
+ bool m_bLastSnapDirOk ; // flag validitą direzione associata a ultimo punto snap
+ Vector3d m_vtLastSnapDir ; // direzione associata a ultimo punto snap
+
IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
Color m_colDef ; // colore di default
Color m_colMark ; // colore per marcatura
diff --git a/SceneBasic.cpp b/SceneBasic.cpp
index ea08b69..de16007 100644
--- a/SceneBasic.cpp
+++ b/SceneBasic.cpp
@@ -60,6 +60,9 @@ Scene::Scene( void)
m_bSelect = false ;
m_Unsel.reserve( 50) ;
m_nSelCurr = - 1 ;
+ // Snap Punti
+ m_nLastSnapId = GDB_ID_NULL ;
+ m_bLastSnapDirOk = false ;
// GeomData
m_pGeomDB = nullptr ;
m_colDef.Set( 0, 0, 0) ;
diff --git a/SceneGeom.cpp b/SceneGeom.cpp
index 3895c9e..1e74769 100644
--- a/SceneGeom.cpp
+++ b/SceneGeom.cpp
@@ -34,6 +34,7 @@ using namespace std ;
//------------------------------ Local functions -----------------------------
static ObjEGrGraphics* CreateObjEGrGraphics( bool bNewWay) ;
+static bool CalcCurveTailMark( const PolyLine& plCrv, PolyLine& plMark) ;
static bool CalcCurveTipArrow( const PolyLine& plCrv, PolyLine& plArr) ;
static bool CalcConnectingLines( const PolyLine& plCrv, const Vector3d& vtTh, bool bDense, PNTVECTOR& vPnt) ;
@@ -237,10 +238,10 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, MdStMk siObj)
pGraphics->Clear() ;
pGraphics->AddColor( cCol) ;
pGraphics->AddPolyLine( PL) ;
- // eventuali segni ausiliari (frecce,...)
- //Point3d ptStart ;
- //if ( PL.GetFirstPoint( ptStart))
- // pGraphics->AddPoint( ptStart, true) ;
+ // eventuali segni ausiliari (mark, frecce, ...)
+ PolyLine PLM ;
+ if ( CalcCurveTailMark( PL, PLM))
+ pGraphics->AddPolyLine( PLM, true) ;
PolyLine PLA ;
if ( CalcCurveTipArrow( PL, PLA))
pGraphics->AddPolyLine( PLA, true) ;
@@ -384,6 +385,60 @@ CreateObjEGrGraphics( bool bNewWay)
return ( new ObjOldGraphics) ;
}
+//----------------------------------------------------------------------------
+static bool
+CalcCurveTailMark( const PolyLine& plCrv, PolyLine& plMark)
+{
+ // pulisco la polilinea per il segno
+ plMark.Clear() ;
+ // verifico effettiva esistenza della polilinea approssimante la curva
+ if ( plCrv.GetLineNbr() < 1)
+ return false ;
+ // dimensioni limite traverso
+ const double MAX_LEN_TR = 6 ;
+ const double MIN_LEN_TR = 0.1 ;
+ // recupero dati primo tratto della curva
+ Point3d ptTail, ptP ;
+ if ( ! plCrv.GetFirstLine( ptTail, ptP))
+ return false ;
+ Vector3d vtDir = ptP - ptTail ;
+ double dLen = vtDir.Len() ;
+ if ( dLen < EPS_SMALL)
+ return false ;
+ vtDir /= dLen ;
+ // se molto piccolo, cerco di allungarmi senza deviare troppo
+ while ( dLen < MAX_LEN_TR) {
+ Point3d ptP1, ptP2 ;
+ if ( ! plCrv.GetNextLine( ptP1, ptP2))
+ break ;
+ Vector3d vtNxDir = ptP2 - ptP1 ;
+ vtNxDir.Normalize() ;
+ if ( ( vtDir * vtNxDir) > cos( 30 * DEGTORAD)) {
+ vtDir = ptP1 - ptTail ;
+ dLen = vtDir.Len() ;
+ vtDir /= dLen ;
+ }
+ else
+ break ;
+ }
+ // calcolo dimensioni traverso
+ double dLenTr = dLen ;
+ if ( dLenTr > MAX_LEN_TR)
+ dLenTr = MAX_LEN_TR ;
+ else if ( dLenTr < MIN_LEN_TR)
+ dLenTr = MIN_LEN_TR ;
+ // disegno traverso
+ Frame3d frF ;
+ frF.Set( ptTail, vtDir) ;
+ Point3d ptP1 = ORIG + Vector3d( 0.5 * dLenTr, 0, 0) ;
+ ptP1.ToGlob( frF) ;
+ plMark.AddUPoint( 0, ptP1) ;
+ Point3d ptP2 = ORIG - Vector3d( 0.5 * dLenTr, 0, 0) ;
+ ptP2.ToGlob( frF) ;
+ plMark.AddUPoint( 1, ptP2) ;
+ return true ;
+}
+
//----------------------------------------------------------------------------
static bool
CalcCurveTipArrow( const PolyLine& plCrv, PolyLine& plArr)
@@ -394,7 +449,7 @@ CalcCurveTipArrow( const PolyLine& plCrv, PolyLine& plArr)
if ( plCrv.GetLineNbr() < 1)
return false ;
// dimensioni freccia limite
- const double MAX_LEN_ARR = 3 ;
+ const double MAX_LEN_ARR = 10.0 ;
const double MIN_LEN_ARR = 0.1 ;
// recupero dati ultimo tratto della curva
Point3d ptTip, ptP ;
diff --git a/SceneSnap.cpp b/SceneSnap.cpp
index 54d6fcf..b9e3326 100644
--- a/SceneSnap.cpp
+++ b/SceneSnap.cpp
@@ -31,6 +31,9 @@ using namespace std ;
bool
Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel)
{
+ // reset dati associati a ultimo punto snap
+ m_nLastSnapId = GDB_ID_NULL ;
+ m_bLastSnapDirOk = false ;
// se Snap Sketch o Grid, devo trovare il punto sulla griglia
if ( nSnap == SP_SKETCH || nSnap == SP_GRID)
return GetGridSnapPoint( ( nSnap == SP_SKETCH), ptWin, ptSel) ;
@@ -139,6 +142,8 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = false ;
}
}
// se vettore
@@ -151,6 +156,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pGV->GetVector() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
// se frame
@@ -163,12 +172,24 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = false ;
}
}
// se curva
else if ( ( pGObj->GetType() & GEO_CURVE) != 0) {
// recupero la curva
const ICurve* pCrv = GetCurve( m_pGeomDB->GetGeoObj( nIds[i])) ;
+ // recupero eventuale spessore di estrusione
+ bool bExtr = false ;
+ double dTh ;
+ Vector3d vtExtr ;
+ if ( pCrv->GetExtrusion( vtExtr) && ! vtExtr.IsSmall() &&
+ pCrv->GetThickness( dTh) && fabs( dTh) > EPS_SMALL) {
+ vtExtr *= dTh ;
+ vtExtr.ToGlob( frEnt) ;
+ bExtr = true ;
+ }
// recupero il punto
Point3d ptP ;
switch ( nSnap) {
@@ -179,6 +200,24 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetStartDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ m_vtLastSnapDir.Invert() ;
+ }
+ // eventuale verifica dell'estruso
+ if ( bExtr) {
+ ptP += vtExtr ;
+ if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
+ bFound = true ;
+ ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetStartDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ m_vtLastSnapDir.Invert() ;
+ }
}
}
// punto finale
@@ -187,6 +226,22 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetEndDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ }
+ // eventuale verifica dell'estruso
+ if ( bExtr) {
+ ptP += vtExtr ;
+ if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
+ bFound = true ;
+ ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetEndDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ }
}
}
break ;
@@ -196,6 +251,22 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetMidDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ }
+ // eventuale verifica dell'estruso
+ if ( bExtr) {
+ ptP += vtExtr ;
+ if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
+ bFound = true ;
+ ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ pCrv->GetMidDir( m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ }
}
}
break ;
@@ -205,6 +276,18 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = false ;
+ }
+ // eventuale verifica dell'estruso
+ if ( bExtr) {
+ ptP += vtExtr ;
+ if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
+ bFound = true ;
+ ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = false ;
+ }
}
}
break ;
@@ -217,16 +300,45 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
// lo porto nel frame della curva
ptRef.ToLoc( frEnt) ;
// determino il punto pił vicino della curva a questo
- int nFlag ;
+ MinDistPCInfo mdInfo ;
DistPointCurve dstPtCurve( ptRef, *pCrv) ;
- if ( dstPtCurve.GetMinDistPoint( 0, ptP, nFlag)) {
+ if ( dstPtCurve.GetMinDistInfo( 0, mdInfo)) {
+ ptP = mdInfo.ptQ ;
ptP.ToGlob( frEnt) ;
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ Point3d ptTmp ;
+ pCrv->GetPointTang( mdInfo.dPar, ICurve::FROM_MINUS, ptTmp, m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
- } break ;
+ // eventuale verifica dell'estruso
+ if ( bExtr) {
+ Vector3d vtTemp = - vtExtr ;
+ vtTemp.ToLoc( frEnt) ;
+ // determino il punto pił vicino della curva a questo
+ MinDistPCInfo mdInfo ;
+ DistPointCurve dstPtCurve( ptRef, *pCrv) ;
+ if ( dstPtCurve.GetMinDistInfo( 0, mdInfo)) {
+ ptP = mdInfo.ptQ ;
+ ptP.ToGlob( frEnt) ;
+ ptP += vtExtr ;
+ if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
+ bFound = true ;
+ ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ Point3d ptTmp ;
+ pCrv->GetPointTang( mdInfo.dPar, ICurve::FROM_MINUS, ptTmp, m_vtLastSnapDir) ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
+ }
+ }
+ }
+ }
+ break ;
}
}
// se testo
@@ -243,6 +355,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pTxt->GetDirVersor() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
// punto sopra iniziale
@@ -251,6 +367,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pTxt->GetDirVersor() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
// punto finale
@@ -259,6 +379,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pTxt->GetDirVersor() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
// punto sopra finale
@@ -267,6 +391,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pTxt->GetDirVersor() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
break ;
@@ -277,6 +405,10 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = true ;
+ m_vtLastSnapDir = pTxt->GetDirVersor() ;
+ m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
break ;
@@ -287,6 +419,8 @@ Scene::GetSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Po
if ( VerifySnapPoint( ptP, ptWin, dMinSqDist)) {
bFound = true ;
ptSel = ptP ;
+ m_nLastSnapId = nIds[i] ;
+ m_bLastSnapDirOk = false ;
}
}
break ;