Files
TestEGr/GeomDBTree.cpp
T
Dario Sassi f199634089 TestEGr 1.5b8 :
- aggiunto albero struttura progetto.
2014-02-28 21:42:38 +00:00

266 lines
7.9 KiB
C++

//----------------------------------------------------------------------------
// 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<IGdbIterator> 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<LPNMTREEVIEW>( 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" ;
}