diff --git a/SelectDlg.cpp b/SelectDlg.cpp new file mode 100644 index 0000000..eb8dcfc --- /dev/null +++ b/SelectDlg.cpp @@ -0,0 +1,177 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2014 +//---------------------------------------------------------------------------- +// File : SelectionDlg.cpp Data : 08.10.14 Versione : 1.5j1 +// Contenuto : Implementazione della classe gestione dialogo selezione. +// +// +// +// Modifiche : 08.10.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "TestEGrUtils.h" +#include "SelectDlg.h" +#include "resource.h" +#include "/EgtDev/Include/EgkGdbConst.h" +#include "/EgtDev/Include/EgkGeomDB.h" +#include "/EgtDev/Include/EGrScene.h" +#include "/EgtDev/Include/EgnStringUtils.h" +#include "/EgtDev/Include/EgnStringConverter.h" +#include "/EgtDev/Include/EgtNumCollection.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +#ifdef _DEBUG + #define new DEBUG_NEW + #undef THIS_FILE + static char THIS_FILE[] = __FILE__; +#endif + +//---------------------------------------------------------------------------- +CSelectDlg::CSelectDlg( IEGrScene* pScene) : CDialog( IDD_SELECT) +{ + m_pScene = pScene ; + m_nCurrId = GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +BOOL +CSelectDlg::OnInitDialog( void) +{ + CDialog::OnInitDialog() ; + + if ( m_pScene == nullptr) { + EndDialog( IDCANCEL) ; + return true ; + } + IGeomDB* pGDB = m_pScene->GetGeomDB() ; + if ( pGDB == nullptr) { + EndDialog( IDCANCEL) ; + return true ; + } + CListBox* pLB = (CListBox*) GetDlgItem( IDC_LIST) ; + if ( pLB == nullptr) { + EndDialog( IDCANCEL) ; + return true ; + } + + // inserisco gli oggetti selezionati + INTVECTOR nIds ; + string sOut ; + m_pScene->GetSelectedObjs( nIds) ; + for ( size_t i = 0 ; i < nIds.size() ; ++ i) { + IGeoObj* pGeo = pGDB->GetGeoObj( nIds[i]) ; + if ( pGeo == nullptr) + continue ; + bool bSel = pGDB->IsSelectedObj( nIds[i]) ; + sOut = pGeo->GetTitle() + ( bSel ? "*" : "") + " (" + ToString( nIds[i]) + ")" ; + int nPos = pLB->AddString( stringtoW( sOut)) ; + if ( nPos != LB_ERR) + pLB->SetItemData( nPos, nIds[i]) ; + } + + // imposto la selezione sul primo oggetto + pLB->SetCurSel( 0) ; + OnLBSelChange() ; + + return TRUE ; +} + +//---------------------------------------------------------------------------- +void +CSelectDlg::OnOK( void) +{ + // imposto chiusura del dialogo + EndDialog( IDOK) ; + // smarco l'oggetto corrente + IGeomDB* pGDB = m_pScene->GetGeomDB() ; + if ( pGDB != nullptr) { + pGDB->ResetMark( m_nCurrId) ; + m_pScene->Draw() ; + } +} + +//---------------------------------------------------------------------------- +void +CSelectDlg::OnCancel( void) +{ + // imposto chiusura del dialogo + EndDialog( IDCANCEL) ; + // smarco l'oggetto corrente + IGeomDB* pGDB = m_pScene->GetGeomDB() ; + if ( pGDB != nullptr) { + pGDB->ResetMark( m_nCurrId) ; + m_pScene->Draw() ; + } + // reset dell'oggetto corrente + m_nCurrId = GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +BEGIN_MESSAGE_MAP( CSelectDlg, CDialog) + ON_LBN_SELCHANGE( IDC_LIST, OnLBSelChange) + ON_LBN_DBLCLK( IDC_LIST, OnLBDblClk) +END_MESSAGE_MAP() + +//---------------------------------------------------------------------------- +void +CSelectDlg::OnLBSelChange( void) +{ + IGeomDB* pGDB = m_pScene->GetGeomDB() ; + if ( pGDB == nullptr) + return ; + CListBox* pLB = (CListBox*) GetDlgItem( IDC_LIST) ; + if ( pLB == nullptr) + return ; + + // smarco l'oggetto corrente + pGDB->ResetMark( m_nCurrId) ; + + // recupero l'Id del nuovo oggetto selezionato + int nSel = pLB->GetCurSel() ; + if ( nSel == LB_ERR) { + m_nCurrId = GDB_ID_NULL ; + m_pScene->Draw() ; + return ; + } + m_nCurrId = int( pLB->GetItemData( nSel)) ; + + // evidenzio il nuovo oggetto selezionato + pGDB->SetMark( m_nCurrId) ; + m_pScene->Draw() ; +} + +//---------------------------------------------------------------------------- +void +CSelectDlg::OnLBDblClk( void) +{ + // imposto chiusura del dialogo + EndDialog( IDOK) ; + + IGeomDB* pGDB = m_pScene->GetGeomDB() ; + if ( pGDB == nullptr) { + m_nCurrId = GDB_ID_NULL ; + return ; + } + CListBox* pLB = (CListBox*) GetDlgItem( IDC_LIST) ; + if ( pLB == nullptr) { + m_nCurrId = GDB_ID_NULL ; + return ; + } + + // smarco l'oggetto corrente + pGDB->ResetMark( m_nCurrId) ; + m_pScene->Draw() ; + + // recupero l'Id del nuovo oggetto selezionato + int nSel = pLB->GetCurSel() ; + if ( nSel == LB_ERR) + m_nCurrId = GDB_ID_NULL ; + else + m_nCurrId = int( pLB->GetItemData( nSel)) ; +} diff --git a/SelectDlg.h b/SelectDlg.h new file mode 100644 index 0000000..f898854 --- /dev/null +++ b/SelectDlg.h @@ -0,0 +1,31 @@ + + +#pragma once + + +class IEGrScene ; + + +//---------------------------------------------------------------------------- +// CSelectDlg dialog used for Select +//---------------------------------------------------------------------------- +class CSelectDlg : public CDialog +{ + public : + CSelectDlg( IEGrScene* pScene) ; + int GetCurrId( void) + { return m_nCurrId ; } + + protected : + virtual BOOL OnInitDialog( void) ; + virtual void OnOK( void) ; + virtual void OnCancel( void) ; + afx_msg void OnLBSelChange( void) ; + afx_msg void OnLBDblClk( void) ; + + private : + IEGrScene* m_pScene ; + int m_nCurrId ; + + DECLARE_MESSAGE_MAP() +} ; diff --git a/TestEGr.rc b/TestEGr.rc index 713ca34..f64ac87 100644 Binary files a/TestEGr.rc and b/TestEGr.rc differ diff --git a/TestEGr.vcxproj b/TestEGr.vcxproj index 8bc5931..fa2eb2d 100644 --- a/TestEGr.vcxproj +++ b/TestEGr.vcxproj @@ -205,11 +205,13 @@ + + @@ -220,6 +222,8 @@ + + @@ -236,6 +240,7 @@ + @@ -245,6 +250,7 @@ + Create Create diff --git a/TestEGr.vcxproj.filters b/TestEGr.vcxproj.filters index 782167e..e95a0b5 100644 --- a/TestEGr.vcxproj.filters +++ b/TestEGr.vcxproj.filters @@ -78,6 +78,18 @@ File di risorse + + File di risorse + + + File di risorse + + + File di risorse + + + File di risorse + @@ -122,6 +134,9 @@ File di intestazione + + File di intestazione + @@ -145,6 +160,9 @@ File di origine + + File di origine + diff --git a/TestEGrDlg.cpp b/TestEGrDlg.cpp index 032bfe4..2c8c715 100644 --- a/TestEGrDlg.cpp +++ b/TestEGrDlg.cpp @@ -137,6 +137,8 @@ BEGIN_MESSAGE_MAP( CTestEGrDlg, CDialog) ON_BN_CLICKED( IDC_EXEC, OnFileExec) ON_CONTROL_RANGE( BN_CLICKED, IDC_WIREFRAME, IDC_SHADING, OnShowMode) ON_BN_CLICKED( IDC_SHOWCURVEDIR, OnShowCurveDir) + ON_BN_CLICKED( IDC_ANALYZE, OnAnalyze) + ON_BN_CLICKED( IDC_GETDIST, OnGetDistance) ON_CONTROL_RANGE( BN_CLICKED, IDC_ZOOM_ALL, IDC_ZOOM_OUT, OnZoom) ON_CONTROL_RANGE( BN_CLICKED, IDC_VIEW_TOP, IDC_VIEW_ISO, OnView) ON_BN_CLICKED( IDC_CLOSE, OnClose) @@ -240,8 +242,11 @@ CTestEGrDlg::OnInitDialog( void) UpdateViewButtons() ; } - // recupero gli attributi del rettangolo per ZoomWin e li imposto + // recupero gli attributi della linea di distanza e del rettangolo per ZoomWin e li imposto if ( m_View.GetScene() != nullptr) { + Color colDstL( 0, 0, 0) ; + GetIniColor( "Scene", "DistLine", colDstL) ; + m_View.GetScene()->SetGeoLineAttribs( colDstL) ; bool bOutline = true ; Color colRect( 0, 0, 0) ; GetIniZoomWinAttrib( "Scene", "ZoomWin", bOutline, colRect) ; @@ -477,6 +482,8 @@ CTestEGrDlg::OnSize( UINT nType, int cx, int cy) MoveDlgItem( IDC_HIDDENLINE, IP_TR, cx, cy) ; MoveDlgItem( IDC_SHADING, IP_TR, cx, cy) ; MoveDlgItem( IDC_SHOWCURVEDIR, IP_TR, cx, cy) ; + MoveDlgItem( IDC_ANALYZE, IP_TR, cx, cy) ; + MoveDlgItem( IDC_GETDIST, IP_TR, cx, cy) ; MoveDlgItem( IDC_ZOOM_ALL, IP_TR, cx, cy) ; MoveDlgItem( IDC_ZOOM_IN, IP_TR, cx, cy) ; MoveDlgItem( IDC_ZOOM_OUT, IP_TR, cx, cy) ; @@ -913,6 +920,20 @@ CTestEGrDlg::OnShowCurveDir( void) m_View.ShowCurveDir( bShow) ; } +//---------------------------------------------------------------------------- +void +CTestEGrDlg::OnAnalyze( void) +{ + m_View.SetAnalyze() ; +} + +//---------------------------------------------------------------------------- +void +CTestEGrDlg::OnGetDistance( void) +{ + m_View.SetGetDistance() ; +} + //---------------------------------------------------------------------------- void CTestEGrDlg::UpdateShowCurveDir( void) diff --git a/TestEGrDlg.h b/TestEGrDlg.h index ca5aa7e..283a9c2 100644 --- a/TestEGrDlg.h +++ b/TestEGrDlg.h @@ -39,6 +39,8 @@ class CTestEGrDlg : public CDialog void UpdateShowModeButtons( void) ; void UpdateShowCurveDir( void) ; void UpdateViewButtons( void) ; + bool SelectIdInTree( int nId) + { return SelectIdInTree( nId, nullptr) ; } protected : virtual BOOL OnInitDialog( void) ; @@ -56,6 +58,8 @@ class CTestEGrDlg : public CDialog afx_msg void OnFileExec( void) ; afx_msg void OnShowMode( UINT nID) ; afx_msg void OnShowCurveDir( void) ; + afx_msg void OnAnalyze( void) ; + afx_msg void OnGetDistance( void) ; afx_msg void OnZoom( UINT nID) ; afx_msg void OnView( UINT nID) ; afx_msg void OnCommand( void) ; @@ -96,7 +100,7 @@ class CTestEGrDlg : public CDialog bool InsertGroupInTree( int nId, HTREEITEM hParent) ; bool InsertGeoObjInTree( int nId, IGeoObj* pGeoObj, HTREEITEM hParent) ; int GetGeoObjImage( int nType) ; - bool SelectIdInTree( int nId, HTREEITEM hParent = nullptr) ; + bool SelectIdInTree( int nId, HTREEITEM hParent) ; int RevertOldIdInTree( void) ; void OutMaterialData( int nId) ; void OutGroupData( int nId) ; diff --git a/TestEGrUtils.cpp b/TestEGrUtils.cpp index c354d26..aea689b 100644 --- a/TestEGrUtils.cpp +++ b/TestEGrUtils.cpp @@ -53,3 +53,10 @@ UpdateButtons( void) ((CTestEGrDlg*)AfxGetMainWnd())->UpdateShowCurveDir() ; ((CTestEGrDlg*)AfxGetMainWnd())->UpdateViewButtons() ; } + +//---------------------------------------------------------------------------- +bool +SelectIdInGeomDbTree( int nId) +{ + return ((CTestEGrDlg*)AfxGetMainWnd())->SelectIdInTree( nId) ; +} diff --git a/TestEGrUtils.h b/TestEGrUtils.h index e46f51f..c605123 100644 --- a/TestEGrUtils.h +++ b/TestEGrUtils.h @@ -20,4 +20,5 @@ void OutInfo( const std::string& sOut, bool bLog = true) ; bool GetSceneInfo( std::string& sInfo) ; bool LineExec( const std::string& sLine) ; void UpdateButtons( void) ; +bool SelectIdInGeomDbTree( int nId) ; diff --git a/TestEGrView.cpp b/TestEGrView.cpp index 50d5c91..f3ea7fa 100644 --- a/TestEGrView.cpp +++ b/TestEGrView.cpp @@ -15,15 +15,22 @@ #include "stdafx.h" #include "TestEGrView.h" #include "TestEGrUtils.h" +#include "SelectDlg.h" #include "resource.h" +#include "/EgtDev/Include/EgkGdbConst.h" +#include "/EgtDev/Include/EgkGeomDB.h" +#include "/EgtDev/Include/EgkCurve.h" +#include "/EgtDev/Include/EgkStringUtils3d.h" +#include "/EgtDev/Include/EGrScene.h" #include "/EgtDev/Include/EgtPerfCounter.h" #include "/EgtDev/Include/EgtILogger.h" -#include "/EgtDev/Include/EgnStringUtils.h" #include "/EgtDev/Include/EgnStringConverter.h" -#include "/EgtDev/Include/EGrScene.h" using namespace std ; +//---------------------------------------------------------------------------- +static const int DIM_SEL = 13 ; + //---------------------------------------------------------------------------- #ifdef _DEBUG #define new DEBUG_NEW @@ -34,10 +41,14 @@ using namespace std ; //---------------------------------------------------------------------------- BEGIN_MESSAGE_MAP( TestEGrView, CWnd) ON_WM_PAINT() + ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONUP() + ON_WM_RBUTTONUP() ON_WM_MBUTTONDOWN() ON_WM_MBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_MOUSEWHEEL() + ON_COMMAND_RANGE( IDM_ENDPOINT, IDM_NEARPOINT, OnSelSnapPoint) END_MESSAGE_MAP() //---------------------------------------------------------------------------- @@ -46,7 +57,10 @@ TestEGrView::TestEGrView( void) m_pDC = nullptr ; m_pScene = nullptr ; m_nStatus = ST_NULL ; + m_nOldStatus = ST_NULL ; m_PrevPoint.SetPoint( 0, 0) ; + m_ptPrev.Set( 0, 0, 0) ; + m_nSnapPoint = SP_END ; } //---------------------------------------------------------------------------- @@ -78,7 +92,7 @@ TestEGrView::Create( CWnd* pParent, int nID) if ( CreateEx( 0, className, L"TestEGrView", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, rectWin, pParent, nID) != 0) { SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE) ; - SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; + SetCursor( AfxGetApp()->LoadCursor( IDC_SELECT)) ; m_pDC = new CClientDC( this) ; m_pScene = CreateEGrScene() ; @@ -275,19 +289,168 @@ TestEGrView::View( UINT nID) RedrawWindow() ; } +//---------------------------------------------------------------------------- +void +TestEGrView::SetAnalyze( void) +{ + m_nStatus = ST_ANALYZE ; +} + +//---------------------------------------------------------------------------- +void +TestEGrView::SetGetDistance( void) +{ + m_pScene->ResetGeoLine() ; + m_pScene->Draw() ; + m_nStatus = ST_GETDIST ; +} + +//---------------------------------------------------------------------------- +void +TestEGrView::OnLButtonDown( UINT nFlags, CPoint point) +{ + if ( m_nStatus == ST_NULL) { + int nSel ; + m_pScene->Select( Point3d( point.x, point.y), DIM_SEL, DIM_SEL, nSel) ; + if ( nSel == 1) { + int nId = m_pScene->GetFirstSelectedObj() ; + if ( m_pScene->GetGeomDB()->IsSelectedObj( nId)) + m_pScene->GetGeomDB()->DeselectObj( nId) ; + else + m_pScene->GetGeomDB()->SelectObj( nId) ; + m_pScene->Draw() ; + } + else if ( nSel > 1) { + CSelectDlg dlgSelect( m_pScene) ; + dlgSelect.DoModal() ; + int nId = dlgSelect.GetCurrId() ; + if ( nId != GDB_ID_NULL) { + if ( m_pScene->GetGeomDB()->IsSelectedObj( nId)) + m_pScene->GetGeomDB()->DeselectObj( nId) ; + else + m_pScene->GetGeomDB()->SelectObj( nId) ; + m_pScene->Draw() ; + } + } + } + else if ( m_nStatus == ST_ANALYZE) { + int nSel = 0 ; + int nId = GDB_ID_NULL ; + m_pScene->Select( Point3d( point.x, point.y), DIM_SEL, DIM_SEL, nSel) ; + if ( nSel == 1) + nId = m_pScene->GetFirstSelectedObj() ; + else if ( nSel > 1) { + CSelectDlg dlgSelect( m_pScene) ; + dlgSelect.DoModal() ; + nId = dlgSelect.GetCurrId() ; + } + if ( nId != GDB_ID_NULL) + SelectIdInGeomDbTree( nId) ; + SetCursor( AfxGetApp()->LoadCursor( IDC_SELECT)) ; + m_nStatus = ST_NULL ; + } + else if ( m_nStatus == ST_GETDIST) { + if ( m_pScene->GetSelectedSnapPoint( m_nSnapPoint, Point3d( point.x, point.y), DIM_SEL, DIM_SEL, m_ptPrev)) { + // salvo il punto di riferimento + Point3d ptWin ; + m_pScene->Project( m_ptPrev, ptWin) ; + m_PrevPoint.SetPoint( int( ptWin.x), int( ptWin.y)) ; + m_nStatus = ST_GETDIST2 ; + } + else { + SetCursor( AfxGetApp()->LoadCursor( IDC_SELECT)) ; + m_nStatus = ST_NULL ; + } + } + else if ( m_nStatus == ST_GETDIST2) { + // recupero il punto selezionato + Point3d ptSel ; + if ( m_pScene->GetSelectedSnapPoint( m_nSnapPoint, Point3d( point.x, point.y), DIM_SEL, DIM_SEL, ptSel)) { + // disegno la linea (coordinate geo globali) + m_pScene->SetGeoLine( m_ptPrev, ptSel) ; + RedrawWindow() ; + // calcolo la distanza e il delta e li visualizzo + double dDist = Dist( ptSel, m_ptPrev) ; + Vector3d vtDiff = ptSel - m_ptPrev ; + string sOut ; + sOut = "Dist=" + ToString( dDist, 4) + + " dX=" + ToString( vtDiff.x, 4) + + " dY=" + ToString( vtDiff.y, 4) + + " dZ=" + ToString( vtDiff.z, 4) ; + AfxMessageBox( stringtoW( sOut), MB_ICONINFORMATION | MB_OK) ; + } + // annullo eventuale linea di misura e lo stato + m_pScene->ResetGeoLine() ; + RedrawWindow() ; + m_nStatus = ST_NULL ; + } +} + +//---------------------------------------------------------------------------- +void +TestEGrView::OnLButtonUp( UINT nFlags, CPoint point) +{ + ; +} + +//---------------------------------------------------------------------------- +void +TestEGrView::OnRButtonUp( UINT nFlags, CPoint point) +{ + // se utile menù punti notevoli proseguo + if ( m_nStatus != ST_GETDIST && m_nStatus != ST_GETDIST2) + return ; + // inserisco menù per punti notevoli + CMenu Menu ; + Menu.CreatePopupMenu() ; + Menu.AppendMenu( MF_STRING, IDM_ENDPOINT, L"EndPoint") ; + Menu.CheckMenuItem( IDM_ENDPOINT, MF_BYCOMMAND | ( m_nSnapPoint == SP_END ? MF_CHECKED : MF_UNCHECKED)) ; + Menu.AppendMenu( MF_STRING, IDM_MIDPOINT, L"MidPoint") ; + Menu.CheckMenuItem( IDM_MIDPOINT, MF_BYCOMMAND | ( m_nSnapPoint == SP_MID ? MF_CHECKED : MF_UNCHECKED)) ; + Menu.AppendMenu( MF_STRING, IDM_CENTERPOINT, L"CenterPoint") ; + Menu.CheckMenuItem( IDM_CENTERPOINT, MF_BYCOMMAND | ( m_nSnapPoint == SP_CENTER ? MF_CHECKED : MF_UNCHECKED)) ; + Menu.AppendMenu( MF_STRING, IDM_NEARPOINT, L"NearPoint") ; + Menu.CheckMenuItem( IDM_NEARPOINT, MF_BYCOMMAND | ( m_nSnapPoint == SP_NEAR ? MF_CHECKED : MF_UNCHECKED)) ; + ClientToScreen( &point) ; + Menu.TrackPopupMenu( TPM_LEFTALIGN, point.x, point.y, this) ; +} + +//---------------------------------------------------------------------------- +void +TestEGrView::OnSelSnapPoint( UINT nID) +{ + switch ( nID) { + case IDM_ENDPOINT : + m_nSnapPoint = SP_END ; + break ; + case IDM_MIDPOINT : + m_nSnapPoint = SP_MID ; + break ; + case IDM_CENTERPOINT : + m_nSnapPoint = SP_CENTER ; + break ; + case IDM_NEARPOINT : + m_nSnapPoint = SP_NEAR ; + break ; + } +} + //---------------------------------------------------------------------------- void TestEGrView::OnMButtonDown( UINT nFlags, CPoint point) { if ( nFlags & MK_SHIFT) { + m_nOldStatus = ( m_nStatus == ST_GETDIST2) ? ST_GETDIST2 : ST_NULL ; m_nStatus = ST_ZOOMWIN ; SetCursor( AfxGetApp()->LoadCursor( IDC_ZOOMWIN)) ; } else if ( nFlags & MK_CONTROL) { + m_nOldStatus = ( m_nStatus == ST_GETDIST2) ? ST_GETDIST2 : ST_NULL ; m_nStatus = ST_ROT ; SetCursor( AfxGetApp()->LoadCursor( IDC_ROTATE)) ; } else { + m_nOldStatus = ( m_nStatus == ST_GETDIST2) ? ST_GETDIST2 : ST_NULL ; m_nStatus = ST_PAN ; SetCursor( AfxGetApp()->LoadCursor( IDC_PAN)) ; } @@ -310,10 +473,15 @@ TestEGrView::OnMButtonUp( UINT nFlags, CPoint point) // aggiorno il disegno RedrawWindow() ; } + // eventuale ripristino vecchio stato + if ( m_nOldStatus == ST_GETDIST2) { + m_nStatus = ST_GETDIST2 ; + SetCursor( AfxGetApp()->LoadCursor( IDC_GETDIST)) ; + } // reset dello stato se non NULL - if ( m_nStatus != ST_NULL) { + else if ( m_nStatus != ST_NULL) { m_nStatus = ST_NULL ; - SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; + SetCursor( AfxGetApp()->LoadCursor( IDC_SELECT)) ; } } @@ -357,9 +525,26 @@ TestEGrView::OnMouseMove( UINT nFlags, CPoint point) // salvo il punto di riferimento m_PrevPoint = point ; } + // se in modalità ANALYZE + else if ( m_nStatus == ST_ANALYZE) { + SetCursor( AfxGetApp()->LoadCursor( IDC_ANALYZE)) ; + } + // se in modalità GETDIST + else if ( m_nStatus == ST_GETDIST) { + SetCursor( AfxGetApp()->LoadCursor( IDC_GETDIST)) ; + } + // se in modalità GETDIST2 + else if ( m_nStatus == ST_GETDIST2) { + SetCursor( AfxGetApp()->LoadCursor( IDC_GETDIST)) ; + Point3d ptP ; + m_pScene->UnProject( Point3d( point.x, point.y, 0.5), ptP) ; + m_pScene->SetGeoLine( m_ptPrev, ptP) ; + // aggiorno il disegno + RedrawWindow() ; + } // altrimenti reset dello stato e cursore standard else { - SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; + SetCursor( AfxGetApp()->LoadCursor( IDC_SELECT)) ; m_nStatus = ST_NULL ; } } @@ -368,8 +553,8 @@ TestEGrView::OnMouseMove( UINT nFlags, CPoint point) BOOL TestEGrView::OnMouseWheel( UINT nFlags, short zDelta, CPoint point) { - // devo essere nello stato NULL - if ( m_nStatus != ST_NULL) + // devo essere nello stato NULL o GETDIST + if ( m_nStatus != ST_NULL && m_nStatus != ST_GETDIST && m_nStatus != ST_GETDIST2) return 0 ; // calcolo coefficiente diff --git a/TestEGrView.h b/TestEGrView.h index 69d5ba1..b99aeb7 100644 --- a/TestEGrView.h +++ b/TestEGrView.h @@ -6,8 +6,6 @@ #include #include -class IGeomDB ; -class ILogger ; class IEGrScene ; //---------------------------------------------------------------------------- @@ -28,11 +26,17 @@ class TestEGrView : public CWnd void ShowCurveDir( bool bShow) ; void Zoom( UINT nID) ; void View( UINT nID) ; + void SetAnalyze( void) ; + void SetGetDistance( void) ; protected : afx_msg void OnPaint( void) ; afx_msg BOOL OnEraseBkgnd( CDC* pDC) { return TRUE ; } + afx_msg void OnLButtonDown( UINT nFlags, CPoint point) ; + afx_msg void OnLButtonUp( UINT nFlags, CPoint point) ; + afx_msg void OnRButtonUp( UINT nFlags, CPoint point) ; + afx_msg void OnSelSnapPoint( UINT nID) ; afx_msg void OnMButtonDown( UINT nFlags, CPoint point) ; afx_msg void OnMButtonUp( UINT nFlags, CPoint point) ; afx_msg void OnMouseMove( UINT nFlags, CPoint point) ; @@ -47,13 +51,16 @@ class TestEGrView : public CWnd void ShowCursorCoordinates( const Point3d& ptWin) ; private : - enum Status { ST_NULL = 0, ST_PAN, ST_ROT, ST_ZOOMWIN} ; + enum Status { ST_NULL = 0, ST_PAN, ST_ROT, ST_ZOOMWIN, ST_ANALYZE, ST_GETDIST, ST_GETDIST2} ; private : CClientDC* m_pDC ; IEGrScene* m_pScene ; Status m_nStatus ; + Status m_nOldStatus ; CPoint m_PrevPoint ; + Point3d m_ptPrev ; + int m_nSnapPoint ; DECLARE_MESSAGE_MAP() } ; diff --git a/res/analyze.cur b/res/analyze.cur new file mode 100644 index 0000000..55f1c4c Binary files /dev/null and b/res/analyze.cur differ diff --git a/res/getdist.cur b/res/getdist.cur new file mode 100644 index 0000000..0898c5c Binary files /dev/null and b/res/getdist.cur differ diff --git a/res/select.cur b/res/select.cur new file mode 100644 index 0000000..eec3c5a Binary files /dev/null and b/res/select.cur differ diff --git a/resource.h b/resource.h index ccfac1c..5fc0b03 100644 Binary files a/resource.h and b/resource.h differ