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); 
}