SphericBandEdit.cpp
Upload User: kairuinn
Upload Date: 2009-02-07
Package Size: 2922k
Code Size: 14k
Category:

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "SphericBandEdit.h"
  3. #include "..//resource.h"
  4. #include <math.h>
  5. CSphericBandEditCommand::CSphericBandEditCommand(sgCSphericBand* edSb, IApplicationInterface* appI):
  6. m_editable_sb(edSb)
  7. , m_app(appI)
  8. , m_was_started(false)
  9. , m_matr(NULL)
  10. ,m_other_params_dlg(NULL)
  11. , m_rad(0.0)
  12. , m_cur_coef(0.0)
  13. , m_number_panel(NULL)
  14. , m_scenar(-1)
  15. {
  16. ASSERT(edSb);
  17. ASSERT(m_app);
  18. m_base_pnt.x = m_base_pnt.y = m_base_pnt.z = 0.0;
  19. m_dir.x = m_dir.y = 0.0;
  20. m_dir.z = 1.0;
  21. }
  22. CSphericBandEditCommand::~CSphericBandEditCommand()
  23. {
  24. m_app->GetCommandPanel()->RemoveAllDialogs();
  25. m_app->GetViewPort()->InvalidateViewPort();
  26. if(m_matr)
  27. delete m_matr;
  28. }
  29. bool    CSphericBandEditCommand::PreTranslateMessage(MSG* pMsg)
  30. {
  31. /*if (pMsg->message==WM_KEYUP||
  32. pMsg->message==WM_CHAR)
  33. return false;*/
  34. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  35. pMsg->message==WM_CHAR)
  36. {
  37. if (pMsg->wParam==VK_RETURN)
  38. {
  39. OnEnter();
  40. return true;
  41. }
  42. if (pMsg->wParam==VK_ESCAPE)
  43. {
  44. m_app->StopCommander();
  45. return true;
  46. }
  47. if (m_number_panel)
  48. {
  49. m_number_panel->GetWindow()->SendMessage(pMsg->message,
  50. pMsg->wParam,
  51. pMsg->lParam);
  52. }
  53. if (m_other_params_dlg)
  54. {
  55. m_other_params_dlg->SendMessage(pMsg->message,
  56. pMsg->wParam,
  57. pMsg->lParam);
  58. return false;
  59. }
  60. if (pMsg->message==WM_KEYDOWN)
  61. return false;
  62. else 
  63. return true;
  64. }
  65. else
  66. {
  67. if (pMsg->hwnd == m_app->GetViewPort()->GetWindow()->m_hWnd)
  68. {
  69. switch(pMsg->message) 
  70. {
  71. case WM_MOUSEMOVE:
  72. MouseMove(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  73. return true;
  74. case WM_LBUTTONUP:
  75. LeftClick(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  76. return true;
  77. default:
  78. return false;
  79. }
  80. }
  81. }
  82. return false;
  83. }
  84. void  CSphericBandEditCommand::Start()
  85. {
  86. ASSERT(m_editable_sb);
  87. m_base_pnt.x = m_base_pnt.y = m_base_pnt.z = 0.0;
  88. m_dir.x = m_dir.y = 0.0;
  89. m_dir.z = 1.0;
  90. if(m_matr)
  91. delete m_matr;
  92. m_matr = new sgCMatrix(m_editable_sb->GetWorldMatrixData());
  93. m_matr->Transparent();
  94. m_base_pnt.x = m_base_pnt.y = m_base_pnt.z = 0.0;
  95. m_dir.x = m_dir.y = 0.0;
  96. m_dir.z = 1.0;
  97. m_matr->ApplyMatrixToPoint(m_base_pnt);
  98. SG_POINT ppp;
  99. ppp.x = ppp.y = ppp.z = 0.0;
  100. m_matr->ApplyMatrixToVector(ppp,m_dir);
  101. m_editable_sb->GetGeometry(m_sp_b_geo);
  102. SWITCH_RESOURCE
  103. m_app->GetCommandPanel()->RemoveAllDialogs();
  104. CString lab;
  105. lab.LoadString(IDS_REDACTION);
  106. m_app->StartCommander(lab);
  107. switch(m_scenar) 
  108. {
  109. case 0:
  110. lab.LoadString(IDS_NEW_RADIUS);
  111. m_number_panel = reinterpret_cast<IGetNumberPanel*>(m_app->
  112. GetCommandPanel()->
  113. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,lab,false));
  114. m_number_panel->SetNumber(m_sp_b_geo.Radius);
  115. lab.LoadString(IDS_ENTER_NEW_RAD);
  116. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,lab);
  117. break;
  118. case 1:
  119. lab.LoadString(IDS_CHANGE_F_COEF);
  120. m_number_panel = reinterpret_cast<IGetNumberPanel*>(m_app->
  121. GetCommandPanel()->
  122. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,lab,false));
  123. m_number_panel->SetNumber(m_sp_b_geo.BeginCoef);
  124. lab.LoadString(IDS_SP_B_ENTER_NEW_COEF);
  125. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,lab);
  126. break;
  127. case 2:
  128. lab.LoadString(IDS_CHANGE_S_COEF);
  129. m_number_panel = reinterpret_cast<IGetNumberPanel*>(m_app->
  130. GetCommandPanel()->
  131. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,lab,false));
  132. m_number_panel->SetNumber(m_sp_b_geo.EndCoef);
  133. lab.LoadString(IDS_SP_B_ENTER_NEW_COEF);
  134. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,lab);
  135. break;
  136. default:
  137. break;
  138. }
  139. m_app->GetCommandPanel()->SetActiveRadio(0);
  140. m_app->GetViewPort()->SetEditableObject(m_editable_sb);
  141. m_was_started = true;
  142. }
  143. void  CSphericBandEditCommand::MouseMove(unsigned int nFlags,int pX,int pY)
  144. {
  145. if (!m_was_started)
  146. return;
  147. switch(m_scenar) {
  148. case 0:
  149. {
  150. double plD;
  151. SG_VECTOR PlNorm;
  152. m_app->GetViewPort()->GetViewPortNormal(PlNorm);
  153. sgSpaceMath::PlaneFromNormalAndPoint(m_base_pnt,PlNorm,plD);
  154. if (m_app->GetViewPort()->ProjectScreenPointOnPlane(pX,pY,PlNorm,plD,m_cur_pnt))
  155. {
  156. m_rad = m_app->ApplyPrecision(
  157. sgSpaceMath::PointsDistance(m_base_pnt,m_cur_pnt)
  158. );
  159. }
  160. else
  161. m_rad = 0.0;
  162. m_rad = m_app->ApplyPrecision(m_rad);
  163. ASSERT(m_number_panel);
  164. m_number_panel->SetNumber(m_rad);
  165. m_app->GetViewPort()->InvalidateViewPort();
  166. }
  167. break;
  168. case 1:
  169. case 2:
  170. {
  171. ASSERT(m_number_panel);
  172. SG_POINT proj;
  173. if (!m_app->GetViewPort()->ProjectScreenPointOnLine(pX,pY,m_base_pnt,m_dir,proj))
  174. {
  175. m_cur_coef = 0.0;
  176. m_number_panel->SetNumber(m_cur_coef);
  177. break;
  178. }
  179. char sig = (((proj.x-m_base_pnt.x)*m_dir.x+
  180. (proj.y-m_base_pnt.y)*m_dir.y+
  181. (proj.z-m_base_pnt.z)*m_dir.z)>0)?1:-1;
  182. m_cur_coef = sgSpaceMath::PointsDistance(m_base_pnt,proj)*sig/m_sp_b_geo.Radius;
  183. if (m_cur_coef>1.0) m_cur_coef = 1.0;
  184. if (m_cur_coef<-1.0) m_cur_coef = -1.0;
  185. m_number_panel->SetNumber(m_cur_coef);
  186. m_app->GetViewPort()->InvalidateViewPort();
  187. }
  188. break;
  189. default:
  190. break;
  191. }
  192. }
  193. void  CSphericBandEditCommand::LeftClick(unsigned int nFlags,int pX,int pY)
  194. {
  195. if (!m_was_started)
  196. return;
  197. SWITCH_RESOURCE
  198. ASSERT(m_editable_sb);
  199. switch(m_scenar) {
  200. case 0:
  201. {
  202. if (fabs(m_rad)<0.0001)
  203. {
  204. m_message.LoadString(IDS_ERROR_ZERO_RAD);
  205. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  206. m_message);
  207. return;
  208. }
  209. sgCSphericBand* spb = NULL;
  210. spb = sgCreateSphericBand(m_rad,m_sp_b_geo.BeginCoef,m_sp_b_geo.EndCoef,
  211. m_sp_b_geo.MeridiansCount);
  212. if (!spb)
  213. return;
  214. spb->InitTempMatrix()->Multiply(*m_matr);
  215. spb->ApplyTempMatrix();
  216. spb->DestroyTempMatrix();
  217. sgGetScene()->StartUndoGroup();
  218. sgGetScene()->DetachObject(m_editable_sb);
  219. sgGetScene()->AttachObject(spb);
  220. sgGetScene()->EndUndoGroup();
  221. m_app->CopyAttributes(*spb,*m_editable_sb);
  222. m_app->GetViewPort()->InvalidateViewPort();
  223. }
  224. break;
  225. case 1:
  226. case 2:
  227. {
  228. bool condis = false;
  229. if (m_scenar==1)
  230. condis = (fabs(m_cur_coef-m_sp_b_geo.EndCoef)<0.0001);
  231. else
  232. condis = (fabs(m_cur_coef-m_sp_b_geo.BeginCoef)<0.0001);
  233. if (condis)
  234. {
  235. m_message.LoadString(IDS_COEF_IS_EQ);
  236. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  237. m_message);
  238. return;
  239. }
  240. if (m_scenar==1)
  241. {
  242. if (m_cur_coef>=m_sp_b_geo.EndCoef)
  243. {
  244. double ttt = m_cur_coef;
  245. m_cur_coef = m_sp_b_geo.EndCoef;
  246. m_sp_b_geo.EndCoef = ttt;
  247. }
  248. }
  249. else
  250. {
  251. if (m_cur_coef<=m_sp_b_geo.BeginCoef)
  252. {
  253. double ttt = m_cur_coef;
  254. m_cur_coef = m_sp_b_geo.BeginCoef;
  255. m_sp_b_geo.BeginCoef = ttt;
  256. }
  257. }
  258. sgCSphericBand* spb = NULL;
  259. if (m_scenar==1)
  260. spb = sgCreateSphericBand(m_sp_b_geo.Radius,m_cur_coef,m_sp_b_geo.EndCoef,
  261. m_sp_b_geo.MeridiansCount);
  262. else
  263. spb = sgCreateSphericBand(m_sp_b_geo.Radius,m_sp_b_geo.BeginCoef,m_cur_coef,
  264. m_sp_b_geo.MeridiansCount);
  265. if (!spb)
  266. return;
  267. spb->InitTempMatrix()->Multiply(*m_matr);
  268. spb->ApplyTempMatrix();
  269. spb->DestroyTempMatrix();
  270. sgGetScene()->StartUndoGroup();
  271. sgGetScene()->DetachObject(m_editable_sb);
  272. sgGetScene()->AttachObject(spb);
  273. sgGetScene()->EndUndoGroup();
  274. m_app->CopyAttributes(*spb,*m_editable_sb);
  275. m_app->GetViewPort()->InvalidateViewPort();
  276. }
  277. break;
  278. default:
  279. break;
  280. }
  281. m_app->StopCommander();
  282. }
  283. void  CSphericBandEditCommand::Draw()
  284. {
  285. if (!m_was_started)
  286. return;
  287. switch(m_scenar) {
  288. case 0:
  289. {
  290. float pC[3];
  291. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  292. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  293. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(m_matr);
  294. m_app->GetViewPort()->GetPainter()->DrawSphericBand(m_rad,m_sp_b_geo.BeginCoef,
  295. m_sp_b_geo.EndCoef);
  296. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(NULL);
  297. }
  298. break;
  299. case 1:
  300. {
  301. float pC[3];
  302. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  303. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  304. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(m_matr);
  305. m_app->GetViewPort()->GetPainter()->DrawSphericBand(m_sp_b_geo.Radius,m_cur_coef,
  306. m_sp_b_geo.EndCoef);
  307. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(NULL);
  308. }
  309. break;
  310. case 2:
  311. {
  312. float pC[3];
  313. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  314. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  315. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(m_matr);
  316. m_app->GetViewPort()->GetPainter()->DrawSphericBand(m_sp_b_geo.Radius,m_sp_b_geo.BeginCoef,
  317. m_cur_coef);
  318. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(NULL);
  319. }
  320. break;
  321. default:
  322. break;
  323. }
  324. }
  325. void  CSphericBandEditCommand::OnEnter()
  326. {
  327. if (!m_was_started)
  328. return;
  329. SWITCH_RESOURCE
  330. ASSERT(m_editable_sb);
  331. switch(m_scenar) {
  332. case 0:
  333. {
  334. m_rad = m_number_panel->GetNumber();
  335. if (fabs(m_rad)<0.0001)
  336. {
  337. m_message.LoadString(IDS_ERROR_ZERO_RAD);
  338. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  339. m_message);
  340. return;
  341. }
  342. else
  343. if (m_rad<-0.0001)
  344. {
  345. m_message.LoadString(IDS_ERROR_RAD_MUST_BE_POSIT);
  346. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  347. m_message);
  348. return;
  349. }
  350. sgCSphericBand* spb = NULL;
  351. spb = sgCreateSphericBand(m_rad,m_sp_b_geo.BeginCoef,m_sp_b_geo.EndCoef,
  352. m_sp_b_geo.MeridiansCount);
  353. if (!spb)
  354. return;
  355. spb->InitTempMatrix()->Multiply(*m_matr);
  356. spb->ApplyTempMatrix();
  357. spb->DestroyTempMatrix();
  358. sgGetScene()->StartUndoGroup();
  359. sgGetScene()->DetachObject(m_editable_sb);
  360. sgGetScene()->AttachObject(spb);
  361. sgGetScene()->EndUndoGroup();
  362. m_app->CopyAttributes(*spb,*m_editable_sb);
  363. m_app->GetViewPort()->InvalidateViewPort();
  364. }
  365. break;
  366. case 1:
  367. case 2:
  368. {
  369. bool condis = false;
  370. m_cur_coef = m_number_panel->GetNumber();
  371. if (fabs(m_cur_coef)>1.000)
  372. {
  373. m_message.LoadString(IDS_ERROR_COEF_RANGE);
  374. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  375. m_message);
  376. return;
  377. }
  378. if (m_scenar==1)
  379. condis = (fabs(m_cur_coef-m_sp_b_geo.EndCoef)<0.0001);
  380. else
  381. condis = (fabs(m_cur_coef-m_sp_b_geo.BeginCoef)<0.0001);
  382. if (condis)
  383. {
  384. m_message.LoadString(IDS_COEF_IS_EQ);
  385. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  386. m_message);
  387. return;
  388. }
  389. if (m_scenar==1)
  390. {
  391. if (m_cur_coef>=m_sp_b_geo.EndCoef)
  392. {
  393. double ttt = m_cur_coef;
  394. m_cur_coef = m_sp_b_geo.EndCoef;
  395. m_sp_b_geo.EndCoef = ttt;
  396. }
  397. }
  398. else
  399. {
  400. if (m_cur_coef<=m_sp_b_geo.BeginCoef)
  401. {
  402. double ttt = m_cur_coef;
  403. m_cur_coef = m_sp_b_geo.BeginCoef;
  404. m_sp_b_geo.BeginCoef = ttt;
  405. }
  406. }
  407. sgCSphericBand* spb = NULL;
  408. if (m_scenar==1)
  409. spb = sgCreateSphericBand(m_sp_b_geo.Radius,m_cur_coef,m_sp_b_geo.EndCoef,
  410. m_sp_b_geo.MeridiansCount);
  411. else
  412. spb = sgCreateSphericBand(m_sp_b_geo.Radius,m_sp_b_geo.BeginCoef,m_cur_coef,
  413. m_sp_b_geo.MeridiansCount);
  414. if (!spb)
  415. return;
  416. spb->InitTempMatrix()->Multiply(*m_matr);
  417. spb->ApplyTempMatrix();
  418. spb->DestroyTempMatrix();
  419. sgGetScene()->StartUndoGroup();
  420. sgGetScene()->DetachObject(m_editable_sb);
  421. sgGetScene()->AttachObject(spb);
  422. sgGetScene()->EndUndoGroup();
  423. m_app->CopyAttributes(*spb,*m_editable_sb);
  424. m_app->GetViewPort()->InvalidateViewPort();
  425. }
  426. break;
  427. default:
  428. break;
  429. }
  430. m_app->StopCommander();
  431. }
  432. unsigned int  CSphericBandEditCommand::GetItemsCount()
  433. {
  434. return 4;
  435. }
  436. void         CSphericBandEditCommand::GetItem(unsigned int itemID, CString& itSrt)
  437. {
  438. SWITCH_RESOURCE
  439. switch(itemID) {
  440. case 0:
  441. itSrt.LoadString(IDS_CHANGE_SPH_RAD);
  442. break;
  443. case 1:
  444. itSrt.LoadString(IDS_CHANGE_F_COEF);
  445. break;
  446. case 2:
  447. itSrt.LoadString(IDS_CHANGE_S_COEF);
  448. break;
  449. case 3:
  450. itSrt.LoadString(IDS_OTHER_PARAMS);
  451. break;
  452. default:
  453. ASSERT(0);
  454. }
  455. }
  456. void     CSphericBandEditCommand::GetItemState(unsigned int itemID, 
  457. bool& enbl, bool& checked)
  458. {
  459. enbl = true;
  460. if (!m_was_started)
  461. {
  462. checked = false;
  463. }
  464. else
  465. {
  466. if (itemID==m_scenar-1)
  467. checked = true;
  468. else
  469. checked = false;
  470. }
  471. }
  472. HBITMAP     CSphericBandEditCommand::GetItemBitmap(unsigned int)
  473. {
  474. return NULL;
  475. }
  476. void         CSphericBandEditCommand::Run(unsigned int itemID)
  477. {
  478. if (itemID==3)
  479. {
  480. SWITCH_RESOURCE
  481. CMeridiansDlg dlg;
  482. m_other_params_dlg = &dlg;
  483. ASSERT(m_editable_sb);
  484. dlg.SetDlgType(CMeridiansDlg::SPH_BAND_PARAMS);
  485. m_editable_sb->GetGeometry(m_sp_b_geo);
  486. dlg.SetParams(m_sp_b_geo.MeridiansCount);
  487. if (dlg.DoModal()==IDOK)
  488. {
  489. m_other_params_dlg = NULL;
  490. int mC;
  491. dlg.GetParams(mC);
  492. sgCMatrix spM(m_editable_sb->GetWorldMatrixData());
  493. spM.Transparent();
  494. sgCSphericBand* spb = 
  495. sgCreateSphericBand(m_sp_b_geo.Radius,
  496. m_sp_b_geo.BeginCoef,m_sp_b_geo.EndCoef,mC);
  497. spb->InitTempMatrix()->Multiply(spM);
  498. spb->ApplyTempMatrix();
  499. spb->DestroyTempMatrix();
  500. sgGetScene()->StartUndoGroup();
  501. sgGetScene()->DetachObject(m_editable_sb);
  502. sgGetScene()->AttachObject(spb);
  503. sgGetScene()->EndUndoGroup();
  504. m_app->CopyAttributes(*spb,*m_editable_sb);
  505. m_app->GetViewPort()->InvalidateViewPort();
  506. }
  507. m_app->StopCommander();
  508. return;
  509. }
  510. else
  511. {
  512. m_scenar = itemID;
  513. Start();
  514. }
  515. }