DLGPROPERTIES.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 11k
Category:

OpenCV

Development Platform:

Visual C++

  1. // DlgProperties.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "3DEditor.h"
  5. #include "3DEditorDoc.h"
  6. #include "3DEditorView.h"
  7. #include "DlgProperties.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // DlgProperties dialog
  15. DlgProperties::DlgProperties(CWnd* pParent /*=NULL*/)
  16. : CDialog(DlgProperties::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(DlgProperties)
  19. //}}AFX_DATA_INIT
  20. }
  21. void DlgProperties::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(DlgProperties)
  25. DDX_Control(pDX, IDC_ELEM, m_elem);
  26. DDX_Control(pDX, IDC_DETAIL, m_detail);
  27. DDX_Control(pDX, IDC_VERT, m_vert);
  28. DDX_Control(pDX, IDC_FACES, m_faces);
  29. DDX_Control(pDX, IDC_OBJ, m_obj);
  30. //}}AFX_DATA_MAP
  31. }
  32. BEGIN_MESSAGE_MAP(DlgProperties, CDialog)
  33. //{{AFX_MSG_MAP(DlgProperties)
  34. ON_CBN_SELCHANGE(IDC_OBJ, OnSelchangeObj)
  35. ON_EN_KILLFOCUS(IDC_FACES, OnKillfocusFaces)
  36. ON_WM_CLOSE()
  37. ON_CBN_SELCHANGE(IDC_ELEM, OnSelchangeElem)
  38. ON_EN_KILLFOCUS(IDC_VERT, OnKillfocusVert)
  39. ON_BN_CLICKED(IDC_CROP, OnCrop)
  40. //}}AFX_MSG_MAP
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // DlgProperties message handlers
  44. BOOL DlgProperties::OnInitDialog() 
  45. {
  46. CDialog::OnInitDialog();
  47. winpos1.left=-1;
  48. winpos1.top=-1;
  49. CString s;
  50. s.LoadString(IDS_ALLOBJ);
  51. m_obj.AddString(s);
  52. object *o=doc->obj0;
  53. while( o )
  54. {
  55. m_obj.AddString(o->name);
  56. o=o->next;
  57. }
  58. m_obj.SetCurSel(0);
  59. slideron=1;
  60. OnSelchangeObj();
  61. if (winpos1.left!=-1)
  62. SetWindowPos(0,winpos1.left,winpos1.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
  63. return TRUE;  
  64. }
  65. void DlgProperties::OnSelchangeObj() 
  66. {
  67. int s=m_obj.GetCurSel();
  68. char str[256];
  69. m_obj.GetLBText(s,str);
  70. int nv=0,nf=0;
  71. doc->ncoef=0;
  72. doc->cur_ncoef=-1;
  73. object *o=doc->obj0;
  74. while( o )
  75. {
  76. if (!strcmp(str,o->name))
  77. {
  78. nv=o->nrv;
  79. nf=o->nrf;
  80. break;
  81. }
  82. nv+=o->nrv;
  83. nf+=o->nrf;
  84. doc->ncoef+=o->ncoef;
  85. doc->cur_ncoef+=o->cur_ncoef+1;
  86. o=o->next;
  87. }
  88. obj=o;
  89. if (o)
  90. {
  91. doc->selobj=o;
  92. doc->selface=-1;
  93. m_vert.EnableWindow(1);
  94. m_faces.EnableWindow(1);
  95. m_elem.ResetContent();
  96. CString s;
  97. s.LoadString(IDS_ALLELEM);
  98. m_elem.AddString(s);
  99. int e;
  100. s.LoadString(IDS_ELEM_N);
  101. for( e=0;e<o->nelem;e++ )
  102. {
  103. sprintf(str,s,e+1);
  104. m_elem.AddString(str);
  105. }
  106. m_elem.SetCurSel(0);
  107. sel=-1;
  108. slideron=0;
  109. m_elem.EnableWindow(1);
  110. m_detail.EnableWindow(obj->ncoef>0);
  111. m_detail.SetRange(0,obj->ncoef?obj->ncoef:1);
  112. m_detail.SetPos(obj->cur_ncoef+1);
  113. m_detail.ClearSel(1);
  114. slideron=1;
  115. }
  116. else 
  117. {
  118. doc->selobj=0;
  119. doc->selface=-1;
  120. m_vert.EnableWindow(1);
  121. m_faces.EnableWindow(1);
  122. m_elem.ResetContent();
  123. m_elem.EnableWindow(0);
  124. slideron=0;
  125. doc->nv=nv;
  126. doc->nf=nf;
  127. m_detail.EnableWindow(doc->ncoef>0);
  128. m_detail.SetRange(0,doc->ncoef?doc->ncoef:1);
  129. m_detail.SetPos(doc->cur_ncoef+1);
  130. m_detail.ClearSel(1);
  131. slideron=1;
  132. }
  133. sprintf(str,"%i",nv);
  134. m_vert.SetWindowText(str);
  135. sprintf(str,"%i",nf);
  136. m_faces.SetWindowText(str);
  137. InvalidateDoc(0);
  138. }
  139. void DlgProperties::InvalidateDoc(int inv_oc)
  140. {
  141. doc->UpdateAllViews(0);
  142. if (doc->dlgmap)
  143. doc->dlgmap->Invalidate(0);
  144. if (inv_oc && doc->oc)
  145. {
  146. delete doc->oc;
  147. doc->oc=0;
  148. }
  149. }
  150. BOOL DlgProperties::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
  151. {
  152. char str[256];
  153. NMHDR *nm=(NMHDR *)lParam;
  154. if (wParam==IDC_DETAIL)
  155. if (slideron)
  156. if (obj)
  157. {
  158. if (sel!=-1)
  159. {
  160. int pos = m_detail.GetPos()-1;
  161. if (obj->elem[sel].cur_ncoef!=pos)
  162. {
  163. doc->SetModifiedFlag();
  164. int d = pos - obj->elem[sel].cur_ncoef;
  165. if (d>0)
  166. while(obj->elem[sel].cur_ncoef<pos)
  167. obj->AddCoef(sel);
  168. else while(obj->elem[sel].cur_ncoef>pos)
  169. obj->DelCoef(sel);
  170. sprintf(str,"%i",obj->elem[sel].nrf);
  171. m_faces.SetWindowText(str);
  172. sprintf(str,"%i",obj->elem[sel].nrv);
  173. m_vert.SetWindowText(str);
  174. }
  175. }
  176. else
  177. {
  178. int pos = m_detail.GetPos()-1;
  179. if (obj->cur_ncoef!=pos)
  180. {
  181. doc->SetModifiedFlag();
  182. int d = pos - obj->cur_ncoef;
  183. if (d>0)
  184. while(obj->cur_ncoef<pos)
  185. obj->AddCoef();
  186. else while(obj->cur_ncoef>pos)
  187. obj->DelCoef();
  188. sprintf(str,"%i",obj->nrv);
  189. m_vert.SetWindowText(str);
  190. sprintf(str,"%i",obj->nrf);
  191. m_faces.SetWindowText(str);
  192. }
  193. }
  194. InvalidateDoc(1);
  195. }
  196. else 
  197. {
  198. int pos = m_detail.GetPos()-1;
  199. if (doc->cur_ncoef!=pos)
  200. {
  201. doc->SetModifiedFlag();
  202. int d = pos - doc->cur_ncoef;
  203. if (d>0)
  204. while(doc->cur_ncoef<pos)
  205. {
  206. doc->AddCoef();
  207. doc->nf++;
  208. doc->nf++;
  209. doc->nv++;
  210. doc->cur_ncoef++;
  211. }
  212. else while(doc->cur_ncoef>pos)
  213. {
  214. doc->DelCoef();
  215. doc->nf--;
  216. doc->nf--;
  217. doc->nv--;
  218. doc->cur_ncoef--;
  219. }
  220. sprintf(str,"%i",doc->nv);
  221. m_vert.SetWindowText(str);
  222. sprintf(str,"%i",doc->nf);
  223. m_faces.SetWindowText(str);
  224. }
  225. InvalidateDoc(1);
  226. }
  227. return CDialog::OnNotify(wParam, lParam, pResult);
  228. }
  229. void DlgProperties::OnKillfocusVert() 
  230. {
  231. char str[256];
  232. if (m_faces.m_hWnd==0)
  233. return ;
  234. int tmp=GetDlgItemInt(IDC_VERT);
  235. if (obj)
  236. if (sel==-1)
  237. {
  238. if (tmp!=obj->nrv)
  239. doc->SetModifiedFlag();
  240. if (tmp>obj->nrv)
  241. while( obj->nrv<tmp )
  242. if (obj->AddCoef()==0)
  243. break;
  244. else;
  245. else
  246. while( obj->nrv>tmp )
  247. if (obj->DelCoef()==0)
  248. break;
  249. sprintf(str,"%i",obj->nrv);
  250. m_vert.SetWindowText(str);
  251. sprintf(str,"%i",obj->nrf);
  252. m_faces.SetWindowText(str);
  253. m_detail.SetPos(obj->cur_ncoef+1);
  254. }
  255. else 
  256. {
  257. if (tmp!=obj->elem[sel].nrv)
  258. doc->SetModifiedFlag();
  259. if (tmp>obj->elem[sel].nrv)
  260. while( obj->elem[sel].nrv<tmp )
  261. if (obj->AddCoef(sel)==0)
  262. break;
  263. else;
  264. else
  265. while( obj->elem[sel].nrv>tmp )
  266. if (obj->DelCoef(sel)==0)
  267. break;
  268. sprintf(str,"%i",obj->elem[sel].nrv);
  269. m_vert.SetWindowText(str);
  270. sprintf(str,"%i",obj->elem[sel].nrf);
  271. m_faces.SetWindowText(str);
  272. m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
  273. }
  274. else
  275. {
  276. if (tmp!=doc->nv)
  277. doc->SetModifiedFlag();
  278. if (tmp>doc->nv)
  279. while( doc->nv<tmp )
  280. if (doc->AddCoef()==0)
  281. break;
  282. else { doc->nv++; doc->nf++; doc->nf++; doc->cur_ncoef++; }
  283. else
  284. while( doc->nv>tmp )
  285. if (doc->DelCoef()==0)
  286. break;
  287. else { doc->nv--; doc->nf--; doc->nf--; doc->cur_ncoef--; }
  288. sprintf(str,"%i",doc->nv);
  289. m_vert.SetWindowText(str);
  290. sprintf(str,"%i",doc->nf);
  291. m_faces.SetWindowText(str);
  292. m_detail.SetPos(doc->cur_ncoef+1);
  293. }
  294. InvalidateDoc(1);
  295. }
  296. void DlgProperties::OnKillfocusFaces() 
  297. {
  298. char str[256];
  299. if (m_vert.m_hWnd==0)
  300. return ;
  301. int tmp=GetDlgItemInt(IDC_FACES);
  302. if (obj)
  303. if (sel==-1)
  304. {
  305. if (tmp!=obj->nrf)
  306. doc->SetModifiedFlag();
  307. if (tmp>obj->nrf)
  308. while( obj->nrf<tmp )
  309. if (obj->AddCoef()==0)
  310. break;
  311. else ;
  312. else
  313. while( obj->nrf>tmp )
  314. if (obj->DelCoef()==0)
  315. break;
  316. sprintf(str,"%i",obj->nrv);
  317. m_vert.SetWindowText(str);
  318. sprintf(str,"%i",obj->nrf);
  319. m_faces.SetWindowText(str);
  320. m_detail.SetPos(obj->cur_ncoef+1);
  321. }
  322. else
  323. {
  324. if (tmp!=obj->elem[sel].nrf)
  325. doc->SetModifiedFlag();
  326. if (tmp>obj->elem[sel].nrf)
  327. while( obj->elem[sel].nrf<tmp )
  328. if (obj->AddCoef(sel)==0)
  329. break;
  330. else ;
  331. else
  332. while( obj->elem[sel].nrf>tmp )
  333. if (obj->DelCoef(sel)==0)
  334. break;
  335. sprintf(str,"%i",obj->elem[sel].nrf);
  336. m_faces.SetWindowText(str);
  337. sprintf(str,"%i",obj->elem[sel].nrv);
  338. m_vert.SetWindowText(str);
  339. m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
  340. }
  341. else
  342. {
  343. if (tmp!=doc->nf)
  344. doc->SetModifiedFlag();
  345. if (tmp>doc->nf)
  346. while( doc->nf<tmp )
  347. if (doc->AddCoef()==0)
  348. break;
  349. else { doc->nv++; doc->nf++; doc->nf++; doc->cur_ncoef++; }
  350. else
  351. while( doc->nf>tmp )
  352. if (doc->DelCoef()==0)
  353. break;
  354. else { doc->nv--; doc->nf--; doc->nf--; doc->cur_ncoef--; }
  355. sprintf(str,"%i",doc->nv);
  356. m_vert.SetWindowText(str);
  357. sprintf(str,"%i",doc->nf);
  358. m_faces.SetWindowText(str);
  359. m_detail.SetPos(doc->cur_ncoef+1);
  360. }
  361. InvalidateDoc(1);
  362. }
  363. void DlgProperties::Close()
  364. {
  365. OnClose();
  366. }
  367. void DlgProperties::OnClose() 
  368. {
  369. GetWindowRect(&winpos1);
  370. doc->selobj=0;
  371. doc->selface=-1;
  372. InvalidateDoc(0);
  373. CDialog **d=&doc->dlgprop;
  374. delete doc->dlgprop;
  375. *d=0;
  376. }
  377. void DlgProperties::OnOK() 
  378. {
  379. }
  380. void DlgProperties::OnCancel() 
  381. {
  382. }
  383. void DlgProperties::OnSelchangeElem() 
  384. char str[256];
  385. sel=m_elem.GetCurSel()-1;
  386. doc->selface=sel;
  387. if (obj)
  388. if (sel>=0)
  389. {
  390. sprintf(str,"%i",obj->elem[sel].nrv);
  391. m_vert.SetWindowText(str);
  392. sprintf(str,"%i",obj->elem[sel].nrf);
  393. m_faces.SetWindowText(str);
  394. slideron=0;
  395. m_detail.EnableWindow(obj->elem[sel].ncoef>0);
  396. m_detail.SetRange(0,obj->elem[sel].ncoef?obj->elem[sel].ncoef:1,1);
  397. m_detail.SetPos(obj->elem[sel].cur_ncoef+1);
  398. m_detail.ClearSel(1);
  399.   slideron=1;
  400. m_vert.EnableWindow(1);
  401. m_faces.EnableWindow(1);
  402. InvalidateDoc(0);
  403. }
  404. else OnSelchangeObj();
  405. }
  406. void DlgProperties::CropElement(object *o,int e)
  407. {
  408. if (o->elem[e].cur_ncoef==o->elem[e].ncoef-1)
  409. return;
  410. doc->SetModifiedFlag();
  411. if (o->elem[e].cur_coef==0)
  412. {
  413. o->ncoef-=o->elem[e].ncoef;
  414. doc->ncoef-=o->elem[e].ncoef;
  415. delete o->elem[e].coef;
  416. o->elem[e].coef=0;
  417. o->elem[e].ncoef=0;
  418. }
  419. else 
  420. {
  421. delete o->elem[e].cur_coef->next;
  422. o->elem[e].cur_coef->next=0;
  423. o->ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
  424. doc->ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
  425. o->elem[e].ncoef-=o->elem[e].ncoef-o->elem[e].cur_ncoef-1;
  426. }
  427. }
  428. void DlgProperties::OnCrop() 
  429. {
  430. if (obj)
  431. if (sel>=0)
  432. {
  433. CropElement(obj,sel);
  434. OnSelchangeElem();
  435. }
  436. else 
  437. {
  438. int e;
  439. for( e=0;e<obj->nelem;e++ )
  440. CropElement(obj,e);
  441. slideron=0;
  442. m_detail.EnableWindow(obj->ncoef>0);
  443. m_detail.SetRange(0,obj->ncoef?obj->ncoef:1);
  444. m_detail.SetPos(obj->cur_ncoef+1);
  445. m_detail.ClearSel(1);
  446. slideron=1;
  447. }
  448. else 
  449. {
  450. object *o=doc->obj0;
  451. while(o)
  452. {
  453. int e;
  454. for( e=0;e<o->nelem;e++ )
  455. CropElement(o,e);
  456. o=o->next;
  457. }
  458. slideron=0;
  459. m_detail.EnableWindow(doc->ncoef>0);
  460. m_detail.SetRange(0,doc->ncoef?doc->ncoef:1);
  461. m_detail.SetPos(doc->cur_ncoef+1);
  462. m_detail.ClearSel(1);
  463. slideron=1;
  464. }
  465. }
  466. void DlgProperties::step_slider(int i) 
  467. {
  468. int p=m_detail.GetPos( );
  469. int m=m_detail.GetRangeMax( );
  470. int n=p+i*m/20;
  471. if (n<0)
  472. n=0;
  473. if (n>m)
  474. n=m;
  475. if (n!=p)
  476. m_detail.SetPos(n);
  477. }