www.pudn.com > 3DEDITOR.rar > DLGPROPERTIES.CPP
// DlgProperties.cpp : implementation file
//
#include "stdafx.h"
#include "3DEditor.h"
#include "3DEditorDoc.h"
#include "3DEditorView.h"
#include "DlgProperties.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DlgProperties dialog
DlgProperties::DlgProperties(CWnd* pParent /*=NULL*/)
: CDialog(DlgProperties::IDD, pParent)
{
//{{AFX_DATA_INIT(DlgProperties)
//}}AFX_DATA_INIT
}
void DlgProperties::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DlgProperties)
DDX_Control(pDX, IDC_ELEM, m_elem);
DDX_Control(pDX, IDC_DETAIL, m_detail);
DDX_Control(pDX, IDC_VERT, m_vert);
DDX_Control(pDX, IDC_FACES, m_faces);
DDX_Control(pDX, IDC_OBJ, m_obj);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DlgProperties, CDialog)
//{{AFX_MSG_MAP(DlgProperties)
ON_CBN_SELCHANGE(IDC_OBJ, OnSelchangeObj)
ON_EN_KILLFOCUS(IDC_FACES, OnKillfocusFaces)
ON_WM_CLOSE()
ON_CBN_SELCHANGE(IDC_ELEM, OnSelchangeElem)
ON_EN_KILLFOCUS(IDC_VERT, OnKillfocusVert)
ON_BN_CLICKED(IDC_CROP, OnCrop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DlgProperties message handlers
BOOL DlgProperties::OnInitDialog()
{
CDialog::OnInitDialog();
winpos1.left=-1;
winpos1.top=-1;
CString s;
s.LoadString(IDS_ALLOBJ);
m_obj.AddString(s);
object *o=doc->obj0;
while( o )
{
m_obj.AddString(o->name);
o=o->next;
}
m_obj.SetCurSel(0);
slideron=1;
OnSelchangeObj();
if (winpos1.left!=-1)
SetWindowPos(0,winpos1.left,winpos1.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
return TRUE;
}
void DlgProperties::OnSelchangeObj()
{
int s=m_obj.GetCurSel();
char str[256];
m_obj.GetLBText(s,str);
int nv=0,nf=0;
doc->ncoef=0;
doc->cur_ncoef=-1;
object *o=doc->obj0;
while( o )
{
if (!strcmp(str,o->name))
{
nv=o->nrv;
nf=o->nrf;
break;
}
nv+=o->nrv;
nf+=o->nrf;
doc->ncoef+=o->ncoef;
doc->cur_ncoef+=o->cur_ncoef+1;
o=o->next;
}
obj=o;
if (o)
{
doc->selobj=o;
doc->selface=-1;
m_vert.EnableWindow(1);
m_faces.EnableWindow(1);
m_elem.ResetContent();
CString s;
s.LoadString(IDS_ALLELEM);
m_elem.AddString(s);
int e;
s.LoadString(IDS_ELEM_N);
for( e=0;enelem;e++ )
{
sprintf(str,s,e+1);
m_elem.AddString(str);
}
m_elem.SetCurSel(0);
sel=-1;
slideron=0;
m_elem.EnableWindow(1);
m_detail.EnableWindow(obj->ncoef>0);
m_detail.SetRange(0,obj->ncoef?obj->ncoef:1);
m_detail.SetPos(obj->cur_ncoef+1);
m_detail.ClearSel(1);
slideron=1;
}
else
{
doc->selobj=0;
doc->selface=-1;
m_vert.EnableWindow(1);
m_faces.EnableWindow(1);
m_elem.ResetContent();
m_elem.EnableWindow(0);
slideron=0;
doc->nv=nv;
doc->nf=nf;
m_detail.EnableWindow(doc->ncoef>0);
m_detail.SetRange(0,doc->ncoef?doc->ncoef:1);
m_detail.SetPos(doc->cur_ncoef+1);
m_detail.ClearSel(1);
slideron=1;
}
sprintf(str,"%i",nv);
m_vert.SetWindowText(str);
sprintf(str,"%i",nf);
m_faces.SetWindowText(str);
InvalidateDoc(0);
}
void DlgProperties::InvalidateDoc(int inv_oc)
{
doc->UpdateAllViews(0);
if (doc->dlgmap)
doc->dlgmap->Invalidate(0);
if (inv_oc && doc->oc)
{
delete doc->oc;
doc->oc=0;
}
}
BOOL DlgProperties::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
char str[256];
NMHDR *nm=(NMHDR *)lParam;
if (wParam==IDC_DETAIL)
if (slideron)
if (obj)
{
if (sel!=-1)
{
int pos = m_detail.GetPos()-1;
if (obj->elem[sel].cur_ncoef!=pos)
{
doc->SetModifiedFlag();
int d = pos - obj->elem[sel].cur_ncoef;
if (d>0)
while(obj->elem[sel].cur_ncoefAddCoef(sel);
else while(obj->elem[sel].cur_ncoef>pos)
obj->DelCoef(sel);
sprintf(str,"%i",obj->elem[sel].nrf);
m_faces.SetWindowText(str);
sprintf(str,"%i",obj->elem[sel].nrv);
m_vert.SetWindowText(str);
}
}
else
{
int pos = m_detail.GetPos()-1;
if (obj->cur_ncoef!=pos)
{
doc->SetModifiedFlag();
int d = pos - obj->cur_ncoef;
if (d>0)
while(obj->cur_ncoefAddCoef();
else while(obj->cur_ncoef>pos)
obj->DelCoef();
sprintf(str,"%i",obj->nrv);
m_vert.SetWindowText(str);
sprintf(str,"%i",obj->nrf);
m_faces.SetWindowText(str);
}
}
InvalidateDoc(1);
}
else
{
int pos = m_detail.GetPos()-1;
if (doc->cur_ncoef!=pos)
{
doc->SetModifiedFlag();
int d = pos - doc->cur_ncoef;
if (d>0)
while(doc->cur_ncoefAddCoef();
doc->nf++;
doc->nf++;
doc->nv++;
doc->cur_ncoef++;
}
else while(doc->cur_ncoef>pos)
{
doc->DelCoef();
doc->nf--;
doc->nf--;
doc->nv--;
doc->cur_ncoef--;
}
sprintf(str,"%i",doc->nv);
m_vert.SetWindowText(str);
sprintf(str,"%i",doc->nf);
m_faces.SetWindowText(str);
}
InvalidateDoc(1);
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
void DlgProperties::OnKillfocusVert()
{
char str[256];
if (m_faces.m_hWnd==0)
return ;
int tmp=GetDlgItemInt(IDC_VERT);
if (obj)
if (sel==-1)
{
if (tmp!=obj->nrv)
doc->SetModifiedFlag();
if (tmp>obj->nrv)
while( obj->nrvAddCoef()==0)
break;
else;
else
while( obj->nrv>tmp )
if (obj->DelCoef()==0)
break;
sprintf(str,"%i",obj->nrv);
m_vert.SetWindowText(str);
sprintf(str,"%i",obj->nrf);
m_faces.SetWindowText(str);
m_detail.SetPos(obj->cur_ncoef+1);
}
else
{
if (tmp!=obj->elem[sel].nrv)
doc->SetModifiedFlag();
if (tmp>obj->elem[sel].nrv)
while( obj->elem[sel].nrvAddCoef(sel)==0)
break;
else;
else
while( obj->elem[sel].nrv>tmp )
if (obj->DelCoef(sel)==0)
break;
sprintf(str,"%i",obj->elem[sel].nrv);
m_vert.SetWindowText(str);
sprintf(str,"%i",obj->elem[sel].nrf);
m_faces.SetWindowText(str);
m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
}
else
{
if (tmp!=doc->nv)
doc->SetModifiedFlag();
if (tmp>doc->nv)
while( doc->nvAddCoef()==0)
break;
else { doc->nv++; doc->nf++; doc->nf++; doc->cur_ncoef++; }
else
while( doc->nv>tmp )
if (doc->DelCoef()==0)
break;
else { doc->nv--; doc->nf--; doc->nf--; doc->cur_ncoef--; }
sprintf(str,"%i",doc->nv);
m_vert.SetWindowText(str);
sprintf(str,"%i",doc->nf);
m_faces.SetWindowText(str);
m_detail.SetPos(doc->cur_ncoef+1);
}
InvalidateDoc(1);
}
void DlgProperties::OnKillfocusFaces()
{
char str[256];
if (m_vert.m_hWnd==0)
return ;
int tmp=GetDlgItemInt(IDC_FACES);
if (obj)
if (sel==-1)
{
if (tmp!=obj->nrf)
doc->SetModifiedFlag();
if (tmp>obj->nrf)
while( obj->nrfAddCoef()==0)
break;
else ;
else
while( obj->nrf>tmp )
if (obj->DelCoef()==0)
break;
sprintf(str,"%i",obj->nrv);
m_vert.SetWindowText(str);
sprintf(str,"%i",obj->nrf);
m_faces.SetWindowText(str);
m_detail.SetPos(obj->cur_ncoef+1);
}
else
{
if (tmp!=obj->elem[sel].nrf)
doc->SetModifiedFlag();
if (tmp>obj->elem[sel].nrf)
while( obj->elem[sel].nrfAddCoef(sel)==0)
break;
else ;
else
while( obj->elem[sel].nrf>tmp )
if (obj->DelCoef(sel)==0)
break;
sprintf(str,"%i",obj->elem[sel].nrf);
m_faces.SetWindowText(str);
sprintf(str,"%i",obj->elem[sel].nrv);
m_vert.SetWindowText(str);
m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
}
else
{
if (tmp!=doc->nf)
doc->SetModifiedFlag();
if (tmp>doc->nf)
while( doc->nfAddCoef()==0)
break;
else { doc->nv++; doc->nf++; doc->nf++; doc->cur_ncoef++; }
else
while( doc->nf>tmp )
if (doc->DelCoef()==0)
break;
else { doc->nv--; doc->nf--; doc->nf--; doc->cur_ncoef--; }
sprintf(str,"%i",doc->nv);
m_vert.SetWindowText(str);
sprintf(str,"%i",doc->nf);
m_faces.SetWindowText(str);
m_detail.SetPos(doc->cur_ncoef+1);
}
InvalidateDoc(1);
}
void DlgProperties::Close()
{
OnClose();
}
void DlgProperties::OnClose()
{
GetWindowRect(&winpos1);
doc->selobj=0;
doc->selface=-1;
InvalidateDoc(0);
CDialog **d=&doc->dlgprop;
delete doc->dlgprop;
*d=0;
}
void DlgProperties::OnOK()
{
}
void DlgProperties::OnCancel()
{
}
void DlgProperties::OnSelchangeElem()
{
char str[256];
sel=m_elem.GetCurSel()-1;
doc->selface=sel;
if (obj)
if (sel>=0)
{
sprintf(str,"%i",obj->elem[sel].nrv);
m_vert.SetWindowText(str);
sprintf(str,"%i",obj->elem[sel].nrf);
m_faces.SetWindowText(str);
slideron=0;
m_detail.EnableWindow(obj->elem[sel].ncoef>0);
m_detail.SetRange(0,obj->elem[sel].ncoef?obj->elem[sel].ncoef:1,1);
m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
m_detail.ClearSel(1);
slideron=1;
m_vert.EnableWindow(1);
m_faces.EnableWindow(1);
InvalidateDoc(0);
}
else OnSelchangeObj();
}
void DlgProperties::CropElement(object *o,int e)
{
if (o->elem[e].cur_ncoef==o->elem[e].ncoef-1)
return;
doc->SetModifiedFlag();
if (o->elem[e].cur_coef==0)
{
o->ncoef-=o->elem[e].ncoef;
doc->ncoef-=o->elem[e].ncoef;
delete o->elem[e].coef;
o->elem[e].coef=0;
o->elem[e].ncoef=0;
}
else
{
delete o->elem[e].cur_coef->next;
o->elem[e].cur_coef->next=0;
o->ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
doc->ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
o->elem[e].ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
}
}
void DlgProperties::OnCrop()
{
if (obj)
if (sel>=0)
{
CropElement(obj,sel);
OnSelchangeElem();
}
else
{
int e;
for( e=0;enelem;e++ )
CropElement(obj,e);
slideron=0;
m_detail.EnableWindow(obj->ncoef>0);
m_detail.SetRange(0,obj->ncoef?obj->ncoef:1);
m_detail.SetPos(obj->cur_ncoef+1);
m_detail.ClearSel(1);
slideron=1;
}
else
{
object *o=doc->obj0;
while(o)
{
int e;
for( e=0;enelem;e++ )
CropElement(o,e);
o=o->next;
}
slideron=0;
m_detail.EnableWindow(doc->ncoef>0);
m_detail.SetRange(0,doc->ncoef?doc->ncoef:1);
m_detail.SetPos(doc->cur_ncoef+1);
m_detail.ClearSel(1);
slideron=1;
}
}
void DlgProperties::step_slider(int i)
{
int p=m_detail.GetPos( );
int m=m_detail.GetRangeMax( );
int n=p+i*m/20;
if (n<0)
n=0;
if (n>m)
n=m;
if (n!=p)
m_detail.SetPos(n);
}