238 lines
7.7 KiB
C++
238 lines
7.7 KiB
C++
// dlgcaract.cpp : implementation file
|
|
//
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
|
|
#include "stdafx.h"
|
|
#include "ACP_Base.h"
|
|
#include "incITF.h"
|
|
|
|
#include "dlgcarac.hpp"
|
|
|
|
#undef CPA_WANTS_IMPORT
|
|
#undef CPA_EXPORT
|
|
#define CPA_WANTS_EXPORT
|
|
#include "OGD.h"
|
|
#undef CPA_WANTS_EXPORT
|
|
#define CPA_WANTS_IMPORT
|
|
|
|
#include "3Dinterf.hpp"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
extern char *g_szElementTypeName[];
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#define C_iBorderSize 5
|
|
|
|
#define M_CtrlList() ((CListCtrl*) GetDlgItem(IDC_LIST_ELEMENTS))
|
|
#define M_GetClientRect( pWnd, poRect ) (pWnd) -> GetWindowRect( poRect );ScreenToClient( poRect )
|
|
#define M_GetClientRectId( Id, poRect ) M_GetClientRect( GetDlgItem( Id ), poRect )
|
|
#define M_SetClientRect( pWnd, poRect ) (pWnd) -> MoveWindow( poRect )
|
|
#define M_SetClientRectId( Id, poRect ) M_SetClientRect( GetDlgItem( Id ), poRect )
|
|
#define M_GetElementType(_szName,_Type) for( (_Type) = 0 ; strcmpi(g_szElementTypeName[_Type],"END") && strcmpi(g_szElementTypeName[_Type],_szName) ; (_Type)++);
|
|
|
|
#define M_ForEachElement( oList, oElement, Pos )\
|
|
for( oElement = (oList) . GetHeadElement( Pos ) ; \
|
|
oElement ; \
|
|
oElement = (oList) . GetNextElement( Pos ) )
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgCaract dialog
|
|
IMPLEMENT_DYNCREATE(CDlgCaract,CFormView)
|
|
|
|
CDlgCaract::CDlgCaract(CWnd* pParent /*=NULL*/)
|
|
:CFormView(CDlgCaract::IDD)
|
|
{
|
|
m_p_oParentDLL = NULL;
|
|
m_bFirstInit = TRUE;
|
|
m_p_oCurrentObject = NULL;
|
|
m_p_oSuperObject = NULL;
|
|
}
|
|
|
|
|
|
void CDlgCaract::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CFormView::DoDataExchange(pDX);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDlgCaract, CFormView)
|
|
//{{AFX_MSG_MAP(CDlgCaract)
|
|
ON_WM_SIZE()
|
|
ON_NOTIFY( LVN_ITEMCHANGED , IDC_LIST_ELEMENTS, OnChangeList )
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgCaract message handlers
|
|
|
|
void CDlgCaract::fn_vUpdateInfo(CPA_SuperObject *_p_oSprObj, Geometry3D *_p_oObject)
|
|
{
|
|
if( m_bFirstInit )
|
|
{
|
|
m_bFirstInit = FALSE;
|
|
fn_vInitList();
|
|
}
|
|
|
|
if(_p_oObject && (m_p_oCurrentObject != _p_oObject))
|
|
{
|
|
ACP_tdxHandleOfObject p_tdstGeom = _p_oObject -> GetStruct();
|
|
|
|
m_Data_cName.Format("%s",_p_oObject->GetName());
|
|
m_Data_lNbPoints = (long)GEO_xGetGeometricObjectNumberOfPoints(p_tdstGeom);
|
|
m_Data_lNbEdges = (long)GEO_xGetGeometricObjectNumberOfEdges(p_tdstGeom);
|
|
m_Data_lNbBdV = (long)GEO_xGetGeometricObjectNumberOfParallelBox(p_tdstGeom);
|
|
m_Data_lNbElements = (long)GEO_xGetGeometricObjectNumberOfElements(p_tdstGeom);
|
|
|
|
// elements
|
|
fn_vUpdateList( _p_oObject );
|
|
}
|
|
else if( ! _p_oObject )
|
|
{
|
|
m_Data_cName = "No Object";
|
|
fn_vUpdateList( NULL );
|
|
}
|
|
m_p_oSuperObject = _p_oSprObj;
|
|
m_p_oCurrentObject = _p_oObject;
|
|
//
|
|
fn_vShowValue( IDC_STATIC_NBPOINTS, m_Data_lNbPoints );
|
|
fn_vShowValue( IDC_STATIC_NBEDGES, m_Data_lNbEdges );
|
|
fn_vShowValue( IDC_STATIC_NBBDV, m_Data_lNbBdV );
|
|
fn_vShowValue( IDC_ELEMENTS, m_Data_lNbElements );
|
|
|
|
if(GetDlgItem(IDC_EDIT_NAME))
|
|
GetDlgItem(IDC_EDIT_NAME)->SetWindowText( m_Data_cName );
|
|
GetDlgItem(IDC_EDIT_NAME)->EnableWindow(m_p_oCurrentObject != NULL);
|
|
//
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CDlgCaract::fn_vShowValue(int _nID, long _lValue)
|
|
{
|
|
CString oCst;
|
|
CWnd *p_oWnd = GetDlgItem(_nID) ;
|
|
if(p_oWnd)
|
|
{
|
|
oCst.Format("%ld",_lValue);
|
|
p_oWnd->SetWindowText(oCst);
|
|
}
|
|
}
|
|
|
|
void CDlgCaract::fn_vInitList()
|
|
{
|
|
int iTaille = M_CtrlList()->GetStringWidth("m");
|
|
CString csNum;
|
|
|
|
M_CtrlList()->InsertColumn(0,"Element",LVCFMT_LEFT,iTaille*15);
|
|
M_CtrlList()->InsertColumn(1,"Type",LVCFMT_CENTER,iTaille*4);
|
|
M_CtrlList()->InsertColumn(2,"Size",LVCFMT_RIGHT,iTaille*4);
|
|
M_CtrlList()->InsertColumn(3,"BdV",LVCFMT_RIGHT,iTaille*4);
|
|
}
|
|
|
|
void CDlgCaract::fn_vUpdateList(Geometry3D *_p_oObject)
|
|
{
|
|
M_CtrlList()->DeleteAllItems();
|
|
|
|
if( _p_oObject )
|
|
{
|
|
long iInd;
|
|
POSITION xPos;
|
|
SectionElement *p_oElementSection;
|
|
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
iInd = 0;
|
|
M_ForEachElement( _p_oObject -> m_oListOfElementSections, p_oElementSection, xPos )
|
|
{
|
|
ACP_tdxHandleOfObject p_tdstGeom = _p_oObject -> GetStruct();
|
|
ACP_tdxIndex xElementType;
|
|
char *p_cElement, *p_cName;
|
|
CString oCst;
|
|
|
|
strcpy( szShortSectionName, (const char*)p_oElementSection -> GetReferencedSectionName() );
|
|
p_cElement = strstr( szShortSectionName, "Element" ) + strlen("Element");
|
|
p_cName = strchr( p_cElement, ':' );
|
|
*p_cName++ = 0;
|
|
M_GetElementType( p_cElement , xElementType );
|
|
M_CtrlList()->InsertItem(iInd, p_cName,0);
|
|
switch(xElementType)
|
|
{
|
|
case GEO_C_xElementIndexedTriangles: M_CtrlList()->SetItemText( iInd, 1, "ITr" ); break;
|
|
case GEO_C_xElementFaceMapDescriptors: M_CtrlList()->SetItemText( iInd, 1, "FMD" ); break;
|
|
case GEO_C_xElementSprites: M_CtrlList()->SetItemText( iInd, 1, "Spr" ); break;
|
|
case GEO_C_xElementTMeshes: M_CtrlList()->SetItemText( iInd, 1, "TMs" ); break;
|
|
case GEO_C_xElementPoints: M_CtrlList()->SetItemText( iInd, 1, "Pts" ); break;
|
|
case GEO_C_xElementLines: M_CtrlList()->SetItemText( iInd, 1, "Lin" ); break;
|
|
case GEO_C_xElementSpheres: M_CtrlList()->SetItemText( iInd, 1, "Sph" ); break;
|
|
case GEO_C_xElementAlignedBoxes: M_CtrlList()->SetItemText( iInd, 1, "Box" ); break;
|
|
case GEO_C_xElementAltimap: M_CtrlList()->SetItemText( iInd, 1, "Atm" ); break;
|
|
}
|
|
oCst.Format("%d",_p_oObject->fn_xGetNbIndexedElements(iInd));
|
|
M_CtrlList()->SetItemText(iInd,2,oCst);
|
|
if( GEO_xGetParallelBoxIndexOfElement( p_tdstGeom, iInd ) != GEO_C_xNoParallelBox )
|
|
oCst.Format("%d",GEO_xGetParallelBoxIndexOfElement( p_tdstGeom, iInd ));
|
|
else
|
|
oCst = " ";
|
|
|
|
M_CtrlList()->SetItemText(iInd,3,oCst);
|
|
|
|
iInd++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgCaract::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
if(GetDlgItem(IDC_EDIT_NAME))
|
|
{
|
|
CRect oRectDlg, oRectList, oRectBorder, oRectName;
|
|
|
|
M_GetClientRect( this, &oRectDlg );
|
|
M_GetClientRectId( IDC_LIST_ELEMENTS, &oRectList );
|
|
M_GetClientRectId( IDC_STATIC_BORDER, &oRectBorder );
|
|
M_GetClientRectId( IDC_EDIT_NAME, &oRectName );
|
|
|
|
// recompute pos
|
|
oRectBorder . left = oRectList . left = oRectDlg . left + C_iBorderSize;
|
|
oRectBorder . right = oRectList . right = oRectDlg . right - C_iBorderSize;
|
|
oRectList . bottom = max( oRectList . top + 20 , oRectDlg . bottom - C_iBorderSize );
|
|
|
|
oRectName . left = oRectBorder . left + C_iBorderSize;
|
|
oRectName . right = oRectBorder . right - C_iBorderSize;
|
|
|
|
// set pos
|
|
M_SetClientRectId( IDC_LIST_ELEMENTS, &oRectList );
|
|
M_SetClientRectId( IDC_STATIC_BORDER, &oRectBorder );
|
|
M_SetClientRectId( IDC_EDIT_NAME, &oRectName );
|
|
}
|
|
}
|
|
|
|
void CDlgCaract::OnChangeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_LISTVIEW* pnmv = (NM_LISTVIEW *)pNMHDR;
|
|
|
|
if( (pnmv->uOldState & LVIS_SELECTED) && !(pnmv->uNewState & LVIS_SELECTED) )
|
|
{
|
|
// unselect
|
|
m_p_oParentDLL -> mfn_vShowOrHideElement( FALSE );
|
|
}
|
|
else if( pnmv->uNewState & LVIS_SELECTED )
|
|
{
|
|
// select
|
|
m_p_oParentDLL -> mfn_vShowOrHideElement( TRUE, m_p_oSuperObject, m_p_oCurrentObject, pnmv -> iItem );
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
#endif //ACTIVE_EDITOR
|
|
|