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 ;