//---------------------------------------------------------------------------- // EgalTech 2013-2014 //---------------------------------------------------------------------------- // File : GeomDbTree.cpp Data : 29.01.14 Versione : 1.5b8 // Contenuto : Metodi del dialogo principale per albero di GeomDB. // // // // Modifiche : 27.02.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "TestEGrDlg.h" #include "resource.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include "/EgtDev/Include/EGnStringConverter.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkGdbIterator.h" #include "/EgtDev/Include/EGkCurveLine.h" using namespace std ; //---------------------------------------------------------------------------- #ifdef _DEBUG #define new DEBUG_NEW #endif //--------------------------- Constants -------------------------------------- // indici icone per Tree enum { ICO_NOGEO = 0, ICO_GROUP, ICO_VECTOR, ICO_POINT, ICO_FRAME, ICO_LINE, ICO_ARC, ICO_CBEZIER, ICO_CCOMPO} ; //---------------------------------------------------------------------------- bool CTestEGrDlg::PrepareTree( void) { // collego l'oggetto al control m_Tree.SubclassDlgItem( IDC_TREE, this) ; // carico le immagini m_pImgList = new CImageList ; if ( m_pImgList == nullptr) return false ; m_pImgList->Create( 16, 16, ILC_COLOR, 10, 4) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_NOGEO)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_GROUP)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_VECTOR)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_POINT)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_FRAME)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_LINE)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_ARC)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_CBEZIER)) ; m_pImgList->Add( AfxGetApp()->LoadIcon( IDI_CCOMPO)) ; m_Tree.SetImageList( m_pImgList, TVSIL_NORMAL) ; return true ; } //---------------------------------------------------------------------------- bool CTestEGrDlg::LoadTree( void) { // svuoto l'albero m_Tree.DeleteAllItems() ; OutData( "") ; // disabilito aggiornamento m_Tree.SetRedraw( FALSE) ; // ciclo su GeomDB InsertGroupOnTree( GDB_ID_ROOT, TVI_ROOT) ; // riabilito aggiornamento m_Tree.SetRedraw( TRUE) ; m_Tree.Invalidate() ; return true ; } //---------------------------------------------------------------------------- bool CTestEGrDlg::InsertGroupOnTree( int nId, HTREEITEM hParent) { // inserisco il gruppo nell'albero (se non è la radice) HTREEITEM hGroup ; if ( nId == GDB_ID_ROOT) hGroup = hParent ; else { string sGroup = "Group " + ToString( nId) ; hGroup = m_Tree.InsertItem( stringtoW( sGroup), ICO_GROUP, ICO_GROUP, hParent) ; if ( hGroup == nullptr || m_Tree.SetItemData( hGroup, nId) == 0) return false ; } // creo un iteratore PtrOwner pIter( CreateGdbIterator()) ; if ( ! ::IsValid( pIter)) return false ; // scandisco il gruppo pIter->SetGDB( m_pGeomDB) ; bool bNext = pIter->GoToFirstInGroup( nId) ; while ( bNext) { // leggo il tipo di nodo int nGdbType = pIter->GetGdbType() ; // se gruppo if ( nGdbType == GDB_GROUP) { // lo inserisco nell'albero if ( ! InsertGroupOnTree( pIter->GetId(), hGroup)) return false ; } // se oggetto geometrico else if ( nGdbType == GDB_GEO) { // lo inserisco nell'albero if ( ! InsertGeoObjOnTree( pIter->GetId(), pIter->GetGeoObj(), hGroup)) return false ; } // passo al successivo bNext = pIter->GoToNext() ; } return true ; } //---------------------------------------------------------------------------- bool CTestEGrDlg::InsertGeoObjOnTree( int nId, IGeoObj* pGeoObj, HTREEITEM hParent) { int nImage ; string sName ; if ( pGeoObj != nullptr) { sName = pGeoObj->GetTitle() + " " + ToString( nId) ; nImage = GetGeoObjImage( pGeoObj->GetType()) ; } else { nImage = ICO_NOGEO ; sName = "Null " + ToString( nId) ; } HTREEITEM hItem = m_Tree.InsertItem( stringtoW( sName), nImage, nImage, hParent) ; return ( hItem != nullptr && m_Tree.SetItemData( hItem, nId) != 0) ; } //---------------------------------------------------------------------------- int CTestEGrDlg::GetGeoObjImage( int nType) { switch ( nType) { case GEO_VECT3D : return ICO_VECTOR ; case GEO_PNT3D : return ICO_POINT ; case GEO_FRAME3D : return ICO_FRAME ; case CRV_LINE : return ICO_LINE ; case CRV_ARC : return ICO_ARC ; case CRV_BEZ : return ICO_CBEZIER ; case CRV_COMPO : return ICO_CCOMPO ; } return ICO_NOGEO ; } //---------------------------------------------------------------------------- void CTestEGrDlg::OnTreeSelChanged( NMHDR* pNMHDR, LRESULT* pResult) { // assegno il risultato *pResult = 0 ; // recupero l'Id dell'oggetto selezionato LPNMTREEVIEW pNMTreeView = reinterpret_cast( pNMHDR) ; HTREEITEM hItem = pNMTreeView->itemNew.hItem ; int nId = GDB_ID_NULL ; if ( hItem != nullptr) nId = int( m_Tree.GetItemData( hItem)) ; // in base al tipo di nodo switch ( m_pGeomDB->GetGdbType( nId)) { case GDB_GROUP : OutGroupData( nId) ; break ; case GDB_GEO : OutGeoObjData( nId) ; break ; } } //---------------------------------------------------------------------------- void CTestEGrDlg::OutGroupData( int nId) { string sOut = "Group " + ToString( nId) + "\r\n" ; // numero di nodi (figli) int nNodes = m_pGeomDB->GetGroupNodes( nId) ; sOut += "Nodes : " + ToString( nNodes) + "\r\n" ; // riferimento in globale Frame3d frGlob ; if ( m_pGeomDB->GetGroupGlobFrame( nId, frGlob)) { sOut += "GlobFrame :\r\n" ; sOut += " O(" + ToString( frGlob.Orig()) + ")\r\n" ; sOut += " X(" + ToString( frGlob.VersX()) + ")\r\n" ; sOut += " Y(" + ToString( frGlob.VersY()) + ")\r\n" ; sOut += " Z(" + ToString( frGlob.VersZ()) + ")\r\n" ; } // ingombro in globale BBox3d b3Glob ; if ( m_pGeomDB->GetGlobalBBox( nId, b3Glob)) { sOut += "GlobBBox :\r\n" ; sOut += " m(" + ToString( b3Glob.GetMin()) + ")\r\n" ; sOut += " M(" + ToString( b3Glob.GetMax()) + ")\r\n" ; } OutData( sOut) ; } //---------------------------------------------------------------------------- void CTestEGrDlg::OutGeoObjData( int nId) { // recupero l'oggetto geometrico const IGeoObj* pGObj ; if ( ( pGObj = m_pGeomDB->GetGeoObj( nId)) == nullptr) return ; string sOut ; // preparo l'intestazione sOut += pGObj->GetTitle() + " " + ToString( nId) + "\r\n" ; //DumpCaptionData( pGObj->GetType(), nId, sOut) ; // preparo i dati pGObj->Dump( sOut, "\r\n") ; // emissione OutData( sOut) ; } //---------------------------------------------------------------------------- void CTestEGrDlg::DumpCaptionData( int nType, int nId, string& sOut) { // a seconda del tipo switch ( nType) { case GEO_VECT3D : sOut += "Vector " ; break ; case GEO_PNT3D : sOut += "Point " ; break ; case GEO_FRAME3D : sOut += "Frame " ; break ; case CRV_LINE : sOut += "Line " ; break ; case CRV_ARC : sOut += "Arc " ; break ; case CRV_BEZ : sOut += "CBezier " ; break ; case CRV_COMPO : sOut += "CComposite " ; break ; default : sOut += "NULL " ; break ; } sOut += ToString( nId) + "\r\n" ; }