EgtGraphics 2.7a2 :
- aggiunta vista prospettica con due modalità di zoom ( standard e dolly).
This commit is contained in:
+80
-56
@@ -48,7 +48,7 @@ Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Poi
|
||||
// reset dati associati a ultimo punto snap
|
||||
m_nLastSnapId = GDB_ID_NULL ;
|
||||
m_bLastSnapDirOk = false ;
|
||||
// verifico validità GDB
|
||||
// verifico validità GDB
|
||||
if ( m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// se Snap Sketch o Grid, devo trovare il punto sulla griglia
|
||||
@@ -58,14 +58,14 @@ Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Poi
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
// se Snap Intersection, devo trovare l'intersezione tra due entità inquadrate
|
||||
// se Snap Intersection, devo trovare l'intersezione tra due entità inquadrate
|
||||
else if ( nSnap == SP_INTERS) {
|
||||
if ( FindSelectedIntersectionPoint( ptWin, nW, nH)) {
|
||||
ptSel = m_ptLastSnapPnt ;
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
// altrimenti devo trovare il punto dall'entità inquadrata
|
||||
// altrimenti devo trovare il punto dall'entità inquadrata
|
||||
else {
|
||||
if ( FindSelectedSnapPoint( nSnap, ptWin, nW, nH)) {
|
||||
ptSel = m_ptLastSnapPnt ;
|
||||
@@ -88,9 +88,17 @@ Scene::GetGridSnapPointZ( bool bSketch, const Point3d& ptWin, const Point3d& ptG
|
||||
if ( ! UnProject( ptWin, ptLine))
|
||||
return false ;
|
||||
Vector3d vtLine = - m_vtDirCamera ;
|
||||
if ( ! m_bOrthographic) {
|
||||
// nella vista prospettica la direzione di mira è data dalla linea che coingiunge le proiezioni di ptWin sui piani near e far
|
||||
Point3d ptLine2 ;
|
||||
if ( ! UnProject( Point3d( ptWin.x, ptWin.y, 1), ptLine2))
|
||||
return false ;
|
||||
vtLine = ptLine - ptLine2 ;
|
||||
vtLine.Normalize() ;
|
||||
}
|
||||
|
||||
// piano di elevazione :
|
||||
// per il punto di griglia, contenente la perp. alla griglia e più perp. possibile alla direzione di mira
|
||||
// per il punto di griglia, contenente la perp. alla griglia e più perp. possibile alla direzione di mira
|
||||
Vector3d vtNorm = vtLine - ( vtLine * frGrid.VersZ()) * frGrid.VersZ() ;
|
||||
if ( ! vtNorm.Normalize())
|
||||
return false ;
|
||||
@@ -123,6 +131,14 @@ Scene::FindGridSnapPoint( bool bSketch, const Point3d& ptWin)
|
||||
if ( ! UnProject( ptWin, ptLine))
|
||||
return false ;
|
||||
Vector3d vtLine = - m_vtDirCamera ;
|
||||
if ( ! m_bOrthographic) {
|
||||
// nella vista prospettica la direzione di mira è data dalla linea che coingiunge le proiezioni di ptWin sui piani near e far
|
||||
Point3d ptLine2 ;
|
||||
if ( ! UnProject( Point3d( ptWin.x, ptWin.y, 1), ptLine2))
|
||||
return false ;
|
||||
vtLine = ptLine - ptLine2 ;
|
||||
vtLine.Normalize() ;
|
||||
}
|
||||
|
||||
// determino l'intersezione di questa linea con il piano della griglia
|
||||
double dDenom = vtLine * frGrid.VersZ() ;
|
||||
@@ -133,7 +149,7 @@ Scene::FindGridSnapPoint( bool bSketch, const Point3d& ptWin)
|
||||
|
||||
// porto il punto sul piano di griglia
|
||||
m_ptLastSnapPnt.ToLoc( frGrid) ;
|
||||
// se punto grid, devo arrotondare al nodo di griglia più vicino
|
||||
// se punto grid, devo arrotondare al nodo di griglia più vicino
|
||||
if ( ! bSketch) {
|
||||
m_ptLastSnapPnt.x = floor( m_ptLastSnapPnt.x / m_dSnapStep + 0.5) * m_dSnapStep ;
|
||||
m_ptLastSnapPnt.y = floor( m_ptLastSnapPnt.y / m_dSnapStep + 0.5) * m_dSnapStep ;
|
||||
@@ -150,9 +166,9 @@ bool
|
||||
Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
{
|
||||
// --- l'intersezione viene calcolata nel piano della griglia ---
|
||||
// salvo eventuale ultima entità precedentemente selezionata
|
||||
// salvo eventuale ultima entità precedentemente selezionata
|
||||
int nPrevSel = GetFirstSelectedObj() ;
|
||||
// verifico siano state selezionate delle entità
|
||||
// verifico siano state selezionate delle entità
|
||||
int nSel ;
|
||||
Select( ptWin, nW, nH, nSel) ;
|
||||
if ( nSel <= 0)
|
||||
@@ -164,7 +180,7 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
double dWinZ = 0 ;
|
||||
int nCrvNum = 0 ;
|
||||
for ( int nObjId = GetFirstSelectedObj() ; nObjId != GDB_ID_NULL && nCrvNum < 2 ; nObjId = GetNextSelectedObj()) {
|
||||
// se non è entità geometrica
|
||||
// se non è entità geometrica
|
||||
const IGeoObj* pGObj ;
|
||||
if ( ( pGObj = m_pGeomDB->GetGeoObj( nObjId)) == nullptr)
|
||||
continue ;
|
||||
@@ -180,11 +196,11 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
// se nessuna curva, esco
|
||||
if ( nCrvNum == 0)
|
||||
return false ;
|
||||
// se una sola curva, può essere auto intersezione
|
||||
// se una sola curva, può essere auto intersezione
|
||||
if ( nCrvNum == 1) {
|
||||
// recupero il riferimento di griglia
|
||||
Frame3d frGrid = GetGridFrame() ;
|
||||
// se il riferimento della curva è diverso da quello della griglia, devo trasformarla
|
||||
// se il riferimento della curva è diverso da quello della griglia, devo trasformarla
|
||||
PtrOwner<ICurve> pcrvTrans0 ;
|
||||
if ( ! AreSameFrame( frEnt[0], frGrid)) {
|
||||
pcrvTrans0.Set( pCrv[0]->Clone()) ;
|
||||
@@ -199,7 +215,7 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
if ( ! UnProject( ptWinZ, ptNear))
|
||||
ptNear = ORIG ;
|
||||
ptNear.ToLoc( frGrid) ;
|
||||
// calcolo il punto di intersezione sulla prima curva più vicino al punto di riferimento
|
||||
// calcolo il punto di intersezione sulla prima curva più vicino al punto di riferimento
|
||||
SelfIntersCurve sintC( *pCrv[0]) ;
|
||||
if ( ! sintC.GetIntersPointNearTo( ptNear, m_ptLastSnapPnt))
|
||||
return false ;
|
||||
@@ -211,7 +227,7 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
// altrimenti due curve, procedo normalmente
|
||||
// recupero il riferimento di griglia
|
||||
Frame3d frGrid = GetGridFrame() ;
|
||||
// se il riferimento della prima curva è diverso da quello della griglia, devo trasformarla
|
||||
// se il riferimento della prima curva è diverso da quello della griglia, devo trasformarla
|
||||
PtrOwner<ICurve> pcrvTrans0 ;
|
||||
if ( ! AreSameFrame( frEnt[0], frGrid)) {
|
||||
pcrvTrans0.Set( pCrv[0]->Clone()) ;
|
||||
@@ -220,7 +236,7 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
pcrvTrans0->LocToLoc( frEnt[0], frGrid) ;
|
||||
pCrv[0] = pcrvTrans0 ;
|
||||
}
|
||||
// se il riferimento della seconda curva è diverso da quello della griglia, devo trasformarla
|
||||
// se il riferimento della seconda curva è diverso da quello della griglia, devo trasformarla
|
||||
PtrOwner<ICurve> pcrvTrans1 ;
|
||||
if ( ! AreSameFrame( frEnt[1], frGrid)) {
|
||||
pcrvTrans1.Set( pCrv[1]->Clone()) ;
|
||||
@@ -235,7 +251,7 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
if ( ! UnProject( ptWinZ, ptNear))
|
||||
ptNear = ORIG ;
|
||||
ptNear.ToLoc( frGrid) ;
|
||||
// calcolo il punto di intersezione sulla prima curva più vicino al punto di riferimento
|
||||
// calcolo il punto di intersezione sulla prima curva più vicino al punto di riferimento
|
||||
IntersCurveCurve intCC( *pCrv[0], *pCrv[1], true) ;
|
||||
if ( ! intCC.GetIntersPointNearTo( ( nPrevSel == nIds[1] ? 1 : 0), ptNear, m_ptLastSnapPnt))
|
||||
return false ;
|
||||
@@ -249,20 +265,20 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH)
|
||||
bool
|
||||
Scene::FindSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH)
|
||||
{
|
||||
// seleziono e verifico siano state selezionate delle entità
|
||||
// seleziono e verifico siano state selezionate delle entità
|
||||
int nSel ;
|
||||
Select( ptWin, nW, nH, nSel) ;
|
||||
if ( nSel <= 0)
|
||||
return false ;
|
||||
// cerco il punto notevole più vicino alla selezione tra le entità selezionate
|
||||
// cerco il punto notevole più vicino alla selezione tra le entità selezionate
|
||||
bool bFound = false ;
|
||||
double dMinSqDist = INFINITO * INFINITO ;
|
||||
for ( int nId = GetFirstSelectedObj() ; nId != GDB_ID_NULL ; nId = GetNextSelectedObj()) {
|
||||
// se non è entità geometrica
|
||||
// se non è entità geometrica
|
||||
const IGeoObj* pGObj ;
|
||||
if ( ( pGObj = m_pGeomDB->GetGeoObj( nId)) == nullptr)
|
||||
continue ;
|
||||
// recupero riferimento dell'entità
|
||||
// recupero riferimento dell'entità
|
||||
Frame3d frEnt ;
|
||||
if ( ! m_pGeomDB->GetGlobFrame( nId, frEnt))
|
||||
continue ;
|
||||
@@ -478,7 +494,7 @@ Scene::FindCurveSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame
|
||||
UnProject( ptWinZ, ptRef) ;
|
||||
// lo porto nel frame della curva
|
||||
ptRef.ToLoc( frEnt) ;
|
||||
// determino il punto più vicino della curva a questo
|
||||
// determino il punto più vicino della curva a questo
|
||||
MinDistPCInfo mdInfo ;
|
||||
DistPointCurve dstPtCurve( ptRef, *pCrv) ;
|
||||
if ( dstPtCurve.GetMinDistInfo( 0, mdInfo)) {
|
||||
@@ -505,7 +521,7 @@ Scene::FindCurveSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame
|
||||
bool
|
||||
Scene::VerifySnapPoint( const Point3d& ptP, const Point3d& ptWin, double& dMinSqDist) const
|
||||
{
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
|
||||
// punto di riferimento nello spazio geometrico 3d
|
||||
Point3d ptRef ;
|
||||
@@ -513,7 +529,7 @@ Scene::VerifySnapPoint( const Point3d& ptP, const Point3d& ptWin, double& dMinSq
|
||||
return false ;
|
||||
// recupero la direzione di mira
|
||||
Vector3d vtDir = - m_vtDirCamera ;
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto dato
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto dato
|
||||
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptP, ptCfr) ;
|
||||
@@ -553,10 +569,10 @@ Scene::AdjustForCurveExtr( const Point3d& ptWin, const Frame3d& frEnt, const ICu
|
||||
double dExtrSqDist = INFINITO ;
|
||||
DistPointCurve dstPtECurve( ptRef - vtExtr, *pCrv) ;
|
||||
dstPtECurve.GetSqDist( dExtrSqDist) ;
|
||||
// se più vicino a base non devo modificare il punto
|
||||
// se più vicino a base non devo modificare il punto
|
||||
if ( dBaseSqDist <= dExtrSqDist)
|
||||
return false ;
|
||||
// più vicino ad estrusione, quindi la aggiungo
|
||||
// più vicino ad estrusione, quindi la aggiungo
|
||||
ptP += vtExtr ;
|
||||
return true ;
|
||||
}
|
||||
@@ -574,7 +590,7 @@ Scene::FindCurveCompoSnapPoint( int nSnap, const Point3d& ptWin, int nId, const
|
||||
return false ;
|
||||
// porto il punto nel riferimento della curva
|
||||
ptRef.ToLoc( frEnt) ;
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
if ( nSnap == SP_CENTROID) {
|
||||
Point3d ptP ;
|
||||
bool bFound = false ;
|
||||
@@ -591,11 +607,11 @@ Scene::FindCurveCompoSnapPoint( int nSnap, const Point3d& ptWin, int nId, const
|
||||
return bFound ;
|
||||
}
|
||||
// altrimenti opero sulle curve componenti elementari
|
||||
// determino la curva elementare più vicina al punto di riferimento
|
||||
// determino la curva elementare più vicina al punto di riferimento
|
||||
int nCrv = - 1 ;
|
||||
double dPar ;
|
||||
int nFlag ;
|
||||
// cerco il punto della curva più vicino, dal suo parametro deduco la curva elementare
|
||||
// cerco il punto della curva più vicino, dal suo parametro deduco la curva elementare
|
||||
if ( DistPointCurve( ptRef, *pCrvCompo).GetParamAtMinDistPoint( 0, dPar, nFlag))
|
||||
nCrv = static_cast<int>( dPar) ;
|
||||
// lavoro sulla curva elementare
|
||||
@@ -625,7 +641,7 @@ bool
|
||||
Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,
|
||||
const ISurfTriMesh* pStm, double& dMinSqDist)
|
||||
{
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
|
||||
// punto di riferimento nello spazio geometrico 3d
|
||||
Point3d ptRef ;
|
||||
@@ -651,12 +667,12 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
Color cCol ;
|
||||
bool bAlpha = ( m_pGeomDB->GetCalcMaterial( nId, cCol) && cCol.GetIntAlpha() <= ALPHA_LIM) ;
|
||||
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
if ( nSnap == SP_CENTROID) {
|
||||
Point3d ptP ;
|
||||
bool bFound = false ;
|
||||
if ( pStm->GetCentroid( ptP)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptP, ptCfr) ;
|
||||
@@ -668,7 +684,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
m_bLastSnapDirOk = false ;
|
||||
}
|
||||
}
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
|
||||
dMinSqDist = 0 ;
|
||||
return bFound ;
|
||||
@@ -678,7 +694,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
ILSIVECTOR vInfo ;
|
||||
if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo))
|
||||
return false ;
|
||||
// se non trovato alcunchè, cerco le linee che partono dagli angoli e dai punti medi dei lati del rettangolo di mira
|
||||
// se non trovato alcunchè, cerco le linee che partono dagli angoli e dai punti medi dei lati del rettangolo di mira
|
||||
VCT3DVECTOR vVtWind = { {0.51, 0.51, 0}, {0, 0.51, 0}, {-0.51, 0.51, 0}, {-0.51, 0, 0},
|
||||
{-0.51, -0.51, 0}, {0, -0.51, 0}, {0.51, -0.51, 0}, {0.51, 0, 0},
|
||||
{0.25, 0.51, 0}, {-0.25, 0.51, 0}, {-0.51, 0.25, 0}, {-0.51, -0.25, 0},
|
||||
@@ -709,12 +725,12 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// punto di intersezione
|
||||
Point3d ptInt = vInfo[i].ptI ;
|
||||
// punto finale più vicino
|
||||
// punto finale più vicino
|
||||
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
|
||||
Point3d ptEnd ;
|
||||
Vector3d vtN ;
|
||||
if ( pStm->GetFacetNearestEndPoint( nF, ptInt, ptEnd, vtN)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
Point3d ptCfr = ptRef + (( ptEnd - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptEnd, ptCfr) ;
|
||||
@@ -737,12 +753,12 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// punto di intersezione
|
||||
Point3d ptInt = vInfo[i].ptI ;
|
||||
// punto medio più vicino
|
||||
// punto medio più vicino
|
||||
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
|
||||
Point3d ptMid ;
|
||||
Vector3d vtN ;
|
||||
if ( pStm->GetFacetNearestMidPoint( nF, ptInt, ptMid, vtN)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto medio
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto medio
|
||||
Point3d ptCfr = ptRef + (( ptMid - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptMid, ptCfr) ;
|
||||
@@ -763,12 +779,12 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
|
||||
int nTtot = (( bAlpha || m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// centro più vicino
|
||||
// centro più vicino
|
||||
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
|
||||
Point3d ptCen ;
|
||||
Vector3d vtN ;
|
||||
if ( pStm->GetFacetCenter( nF, ptCen, vtN)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
Point3d ptCfr = ptRef + (( ptCen - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptCen, ptCfr) ;
|
||||
@@ -789,7 +805,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
case SP_PERP :
|
||||
case SP_MINDIST :
|
||||
// considero solo il primo triangolo intersecato
|
||||
// la distanza è nulla e la confronto con il minimo
|
||||
// la distanza è nulla e la confronto con il minimo
|
||||
if ( 0 < dMinSqDist) {
|
||||
bFound = true ;
|
||||
dMinSqDist = 0 ;
|
||||
@@ -815,7 +831,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
break ;
|
||||
}
|
||||
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
|
||||
dMinSqDist = 0 ;
|
||||
|
||||
@@ -827,7 +843,7 @@ bool
|
||||
Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,
|
||||
const ISurfFlatRegion* pSfr, double& dMinSqDist)
|
||||
{
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
|
||||
// punto di riferimento nello spazio geometrico 3d
|
||||
Point3d ptRef ;
|
||||
@@ -844,11 +860,11 @@ Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
|
||||
// elaborazione a seconda del tipo di snap
|
||||
bool bFound = false ;
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
if ( nSnap == SP_CENTROID) {
|
||||
Point3d ptP ;
|
||||
if ( pSfr->GetCentroid( ptP)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptP, ptCfr) ;
|
||||
@@ -861,12 +877,12 @@ Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
}
|
||||
}
|
||||
}
|
||||
// se richiesto il centro (è il centroide del chunk più vicino)
|
||||
// se richiesto il centro (è il centroide del chunk più vicino)
|
||||
else if ( nSnap == SP_CENTER) {
|
||||
Point3d ptP ;
|
||||
for ( int i = 0 ; i < pSfr->GetChunkCount() ; ++ i) {
|
||||
if ( pSfr->GetChunkCentroid( i, ptP)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptP, ptCfr) ;
|
||||
@@ -917,7 +933,7 @@ Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
|
||||
}
|
||||
}
|
||||
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
|
||||
dMinSqDist = 0 ;
|
||||
|
||||
@@ -929,7 +945,7 @@ bool
|
||||
Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,
|
||||
const IVolZmap* pVzm, double& dMinSqDist)
|
||||
{
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
|
||||
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
|
||||
// punto di riferimento nello spazio geometrico 3d
|
||||
Point3d ptRef ;
|
||||
@@ -954,13 +970,13 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
Color cCol ;
|
||||
bool bAlpha = ( m_pGeomDB->GetCalcMaterial( nId, cCol) && cCol.GetIntAlpha() <= ALPHA_LIM) ;
|
||||
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
// se richiesto il centro di gravità (baricentro, centroide)
|
||||
if ( nSnap == SP_CENTROID) {
|
||||
Point3d ptP ;
|
||||
bool bFound = false ;
|
||||
BBox3d b3Loc ;
|
||||
if ( pVzm->GetLocalBBox( b3Loc) && b3Loc.GetCenter( ptP)) {
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
|
||||
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptP, ptCfr) ;
|
||||
@@ -972,7 +988,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
m_bLastSnapDirOk = false ;
|
||||
}
|
||||
}
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
|
||||
dMinSqDist = 0 ;
|
||||
return bFound ;
|
||||
@@ -982,7 +998,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
ILZIVECTOR vInfo ;
|
||||
if ( ! IntersLineVolZmap( ptMir, vtDir, *pVzm, vInfo))
|
||||
return false ;
|
||||
// se non trovato alcunchè, cerco le linee che partono dagli angoli del rettangolo di mira
|
||||
// se non trovato alcunchè, cerco le linee che partono dagli angoli del rettangolo di mira
|
||||
Vector3d vtWinD( -1, -1, 0) ;
|
||||
for ( int i = 0 ; i < 4 && vInfo.size() == 0 ; ++ i) {
|
||||
// determino punto su vertice del rettangolo di selezione
|
||||
@@ -1011,7 +1027,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// triangolo
|
||||
Triangle3d& trTria = vInfo[i].trTria ;
|
||||
// recupero il vertice del triangolo più vicino alla linea di mira
|
||||
// recupero il vertice del triangolo più vicino alla linea di mira
|
||||
int nVert ; double dSqDist ;
|
||||
if ( GetTriaVertexNearestToLine( trTria, ptRef, vtDir, nVert, dSqDist) && dSqDist < dMinSqDist) {
|
||||
bFound = true ;
|
||||
@@ -1031,7 +1047,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// triangolo
|
||||
Triangle3d& trTria = vInfo[i].trTria ;
|
||||
// recupero il punto medio del lato del triangolo più vicino alla linea di mira
|
||||
// recupero il punto medio del lato del triangolo più vicino alla linea di mira
|
||||
Point3d ptMid ; double dSqDist ;
|
||||
if ( GetTriaMidEdgeNearestToLine( trTria, ptRef, vtDir, ptMid, dSqDist) && dSqDist < dMinSqDist) {
|
||||
bFound = true ;
|
||||
@@ -1051,9 +1067,9 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
for ( int i = 0 ; i < nTtot ; ++ i) {
|
||||
// triangolo
|
||||
Triangle3d& trTria = vInfo[i].trTria ;
|
||||
// centro più vicino
|
||||
// centro più vicino
|
||||
Point3d ptCen = trTria.GetCentroid() ;
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
|
||||
Point3d ptCfr = ptRef + (( ptCen - ptRef) * vtDir) * vtDir ;
|
||||
// determino la distanza e la confronto con il minimo
|
||||
double dSqDist = SqDist( ptCen, ptCfr) ;
|
||||
@@ -1073,7 +1089,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
case SP_PERP :
|
||||
case SP_MINDIST :
|
||||
// considero solo il primo triangolo intersecato
|
||||
// la distanza è nulla e la confronto con il minimo
|
||||
// la distanza è nulla e la confronto con il minimo
|
||||
if ( 0 < dMinSqDist) {
|
||||
bFound = true ;
|
||||
dMinSqDist = 0 ;
|
||||
@@ -1087,7 +1103,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
|
||||
break ;
|
||||
}
|
||||
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
|
||||
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
|
||||
dMinSqDist = 0 ;
|
||||
|
||||
@@ -1275,6 +1291,14 @@ Scene::GetPlaneSnapPoint( const Point3d& ptWin, const Plane3d& plPlane, Point3d&
|
||||
if ( ! UnProject( ptWin, ptLine))
|
||||
return false ;
|
||||
Vector3d vtLine = - m_vtDirCamera ;
|
||||
if ( ! m_bOrthographic) {
|
||||
// nella vista prospettica la direzione di mira è data dalla linea che coingiunge le proiezioni di ptWin sui piani near e far
|
||||
Point3d ptLine2 ;
|
||||
if ( ! UnProject( Point3d( ptWin.x, ptWin.y, 1), ptLine2))
|
||||
return false ;
|
||||
vtLine = ptLine - ptLine2 ;
|
||||
vtLine.Normalize() ;
|
||||
}
|
||||
|
||||
// determino l'intersezione di questa linea con il piano
|
||||
double dDenom = vtLine * plPlane.GetVersN() ;
|
||||
|
||||
Reference in New Issue
Block a user