EgtGraphics 1.5k3 :

- insieme con punto snap si prende la direzione e l'id dell'oggetto generatore
- si marca anche l'inizio delle curve, quando richiesto.
This commit is contained in:
Dario Sassi
2014-11-21 17:45:13 +00:00
parent 829205a886
commit d5fff587aa
6 changed files with 212 additions and 8 deletions
+60 -5
View File
@@ -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 ;