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

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "LineEdit.h"
  3. #include "..//resource.h"
  4. #include <math.h>
  5. LineEditCommand::LineEditCommand(sgCLine* el, IApplicationInterface* appI):
  6. m_editable_line(el)
  7. , m_app(appI)
  8. ,m_sel_point_panel(NULL)
  9. , m_get_point_panel(NULL)
  10. , m_choise_pnt(0)
  11. , m_step(0)
  12. , m_was_started(false)
  13. {
  14. ASSERT(el);
  15. ASSERT(m_app);
  16. SWITCH_RESOURCE
  17. m_bitmap = new CBitmap;
  18. m_bitmap->LoadBitmap(IDB_LINE_EDIT);
  19. }
  20. LineEditCommand::~LineEditCommand()
  21. {
  22. m_app->GetCommandPanel()->RemoveAllDialogs();
  23. if (m_bitmap)
  24. {
  25. if (m_bitmap->m_hObject)
  26. m_bitmap->DeleteObject();
  27. delete m_bitmap;
  28. }
  29. m_app->GetViewPort()->InvalidateViewPort();
  30. }
  31. void     LineEditCommand::SendCommanderMessage(ICommander::COMMANDER_MESSAGE mes, 
  32.    void* params) 
  33. {
  34. if (mes==ICommander::CM_SWITCH_ROLLUP_DIALOG)
  35. {
  36. ASSERT(params!=NULL);
  37. int   newActiveDlg = *(reinterpret_cast<int*>(params));
  38. ASSERT(newActiveDlg<=1);
  39. m_step = (unsigned int)newActiveDlg;
  40. if (newActiveDlg==0)
  41. {
  42. SWITCH_RESOURCE
  43. m_app->GetCommandPanel()->EnableRadio(1,false);
  44. m_message.LoadString(IDS_CHOISE_LINE_PNT);
  45. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  46. }
  47. m_app->GetViewPort()->InvalidateViewPort();
  48. return;
  49. }
  50. if (mes==ICommander::CM_UPDATE_COMMAND_PANEL)
  51. {
  52. ASSERT(params==NULL);
  53. if (m_step==0)
  54. {
  55. m_choise_pnt = m_sel_point_panel->GetCurrentPoint();
  56. m_app->GetViewPort()->InvalidateViewPort();
  57. }
  58. }
  59. }
  60. bool    LineEditCommand::PreTranslateMessage(MSG* pMsg)
  61. {
  62. /*if (pMsg->message==WM_KEYUP||
  63. pMsg->message==WM_CHAR)
  64. return false;*/
  65. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  66. pMsg->message==WM_CHAR)
  67. {
  68. if (pMsg->wParam==VK_RETURN)
  69. {
  70. OnEnter();
  71. return true;
  72. }
  73. if (pMsg->wParam==VK_ESCAPE)
  74. {
  75. m_app->StopCommander();
  76. return true;
  77. }
  78. switch(m_step) 
  79. {
  80. case 0:
  81. if (m_sel_point_panel)
  82. {
  83. m_sel_point_panel->GetWindow()->SendMessage(pMsg->message,
  84. pMsg->wParam,
  85. pMsg->lParam);
  86. }
  87. break;
  88. case 1:
  89. if (m_get_point_panel)
  90. {
  91. m_get_point_panel->GetWindow()->SendMessage(pMsg->message,
  92. pMsg->wParam,
  93. pMsg->lParam);
  94. }
  95. break;
  96. default:
  97. break;
  98. }
  99. if (pMsg->message==WM_KEYDOWN)
  100. return false;
  101. else 
  102. return true;
  103. }
  104. else
  105. {
  106. if (pMsg->hwnd == m_app->GetViewPort()->GetWindow()->m_hWnd)
  107. {
  108. switch(pMsg->message) 
  109. {
  110. case WM_MOUSEMOVE:
  111. MouseMove(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  112. return true;
  113. case WM_LBUTTONUP:
  114. LeftClick(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  115. return true;
  116. default:
  117. return false;
  118. }
  119. }
  120. }
  121. return false;
  122. }
  123. void  LineEditCommand::Start()
  124. {
  125. ASSERT(m_editable_line);
  126. SWITCH_RESOURCE
  127. CString lab;
  128. lab.LoadString(IDS_REDACTION);
  129. m_app->StartCommander(lab);
  130. NewPanels();
  131. m_app->GetViewPort()->SetEditableObject(m_editable_line);
  132. m_was_started = true;
  133. }
  134. void   LineEditCommand::NewPanels()
  135. {
  136. SWITCH_RESOURCE
  137. CString lab;
  138. lab.LoadString(IDS_TOOLTIP_ZERO);
  139. m_app->GetCommandPanel()->RemoveAllDialogs();
  140. m_sel_point_panel = 
  141. reinterpret_cast<ISelectPointPanel*>(m_app->GetCommandPanel()->
  142. AddDialog(IBaseInterfaceOfGetDialogs::SELECT_POINT_DLG,
  143. lab,true));
  144. const SG_LINE* sgL = m_editable_line->GetGeometry();
  145. m_sel_point_panel->AddPoint(sgL->p1.x,sgL->p1.y,sgL->p1.z);
  146. m_sel_point_panel->AddPoint(sgL->p2.x,sgL->p2.y,sgL->p2.z);
  147. lab.LoadString(IDS_NEW_COORDINATES);
  148. m_get_point_panel = 
  149. reinterpret_cast<IGetPointPanel*>(m_app->GetCommandPanel()->
  150. AddDialog(IBaseInterfaceOfGetDialogs::GET_POINT_DLG,
  151. lab,true));
  152. m_app->GetCommandPanel()->SetActiveRadio(0);
  153. lab.LoadString(IDS_CHOISE_LINE_PNT);
  154. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,lab);
  155. m_step=0;
  156. m_choise_pnt =0;
  157. }
  158. void  LineEditCommand::MouseMove(unsigned int nFlags,int pX,int pY)
  159. {
  160. if (!m_was_started)
  161. return;
  162. SWITCH_RESOURCE
  163. if (m_step==0)
  164. {
  165. ASSERT(m_sel_point_panel);
  166. ASSERT(m_editable_line);
  167. const SG_LINE* lineGeo = m_editable_line->GetGeometry();
  168. double    winX1,winY1,winZ1;
  169. double    winX2,winY2,winZ2;
  170. m_app->GetViewPort()->ProjectWorldPoint(lineGeo->p1,winX1,winY1,winZ1);
  171. m_app->GetViewPort()->ProjectWorldPoint(lineGeo->p2,winX2,winY2,winZ2);
  172. double d1;
  173. d1 = sqrt((winX1-pX)*(winX1-pX)+(winY1-pY)*(winY1-pY));
  174. double d2;
  175. d2 = sqrt((winX2-pX)*(winX2-pX)+(winY2-pY)*(winY2-pY));
  176. if (d1<d2)
  177. {
  178. if (m_sel_point_panel)
  179. m_sel_point_panel->SetCurrentPoint(0);
  180. m_choise_pnt = 0;
  181. }
  182. else
  183. {
  184. if (m_sel_point_panel)
  185. m_sel_point_panel->SetCurrentPoint(1);
  186. m_choise_pnt = 1;
  187. }
  188. }
  189. else
  190. {
  191. ASSERT(m_get_point_panel);
  192. IViewPort::GET_SNAP_IN in_arg;
  193. in_arg.scrX = pX;
  194. in_arg.scrY = pY;
  195. in_arg.snapType = SNAP_SYSTEM;
  196. in_arg.XFix = m_get_point_panel->IsXFixed();
  197. in_arg.YFix = m_get_point_panel->IsYFixed();
  198. in_arg.ZFix = m_get_point_panel->IsZFixed();
  199. double tmpFl[3];
  200. m_get_point_panel->GetPoint(tmpFl[0],tmpFl[1],tmpFl[2]);
  201. in_arg.FixPoint.x = tmpFl[0];
  202. in_arg.FixPoint.y = tmpFl[1];
  203. in_arg.FixPoint.z = tmpFl[2];
  204. IViewPort::GET_SNAP_OUT out_arg;
  205. m_app->GetViewPort()->GetWorldPointAfterSnap(in_arg,out_arg);
  206. m_cur_pnt = out_arg.result_point;
  207. m_get_point_panel->SetPoint(m_cur_pnt.x,m_cur_pnt.y,m_cur_pnt.z);
  208. }
  209. m_app->GetViewPort()->InvalidateViewPort();
  210. }
  211. void  LineEditCommand::LeftClick(unsigned int nFlags,int pX,int pY)
  212. {
  213. if (!m_was_started)
  214. return;
  215. SWITCH_RESOURCE
  216. if (m_step==0)
  217. {
  218. m_step++;
  219. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  220. m_message.LoadString(IDS_ENTER_NEW_COORDS);
  221. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,
  222. m_message);
  223. }
  224. else
  225. {
  226. SG_LINE lnG;
  227. switch(m_choise_pnt) 
  228. {
  229. case 0:
  230. lnG.p1 = m_cur_pnt;
  231. lnG.p2 = m_editable_line->GetGeometry()->p2;
  232. break;
  233. case 1:
  234. lnG.p1 = m_editable_line->GetGeometry()->p1;
  235. lnG.p2 = m_cur_pnt;
  236. break;
  237. default:
  238. ASSERT(0);
  239. }
  240. CString mes;
  241. if (sgSpaceMath::PointsDistance(lnG.p1,lnG.p2)>0.000001)
  242. {
  243. sgCLine* ln = sgCreateLine(lnG.p1.x,lnG.p1.y,lnG.p1.z,
  244. lnG.p2.x,lnG.p2.y,lnG.p2.z);
  245. if (!ln)
  246. return;
  247. sgGetScene()->StartUndoGroup();
  248. sgGetScene()->DetachObject(m_editable_line);
  249. sgGetScene()->AttachObject(ln);
  250. sgGetScene()->EndUndoGroup();
  251. m_app->CopyAttributes(*ln,*m_editable_line);
  252. m_app->GetViewPort()->InvalidateViewPort();
  253. m_app->StopCommander();
  254. }
  255. else
  256. {
  257. mes.LoadString(IDS_ERROR_ZERO_LENGTH);
  258. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  259. mes);
  260. }
  261. }
  262. }
  263. void  LineEditCommand::Draw()
  264. {
  265. if (!m_was_started)
  266. return;
  267. if (m_step==0)
  268. {
  269. ASSERT(m_editable_line);
  270. const SG_LINE* lineGeo = m_editable_line->GetGeometry();
  271. float pC[3];
  272. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  273. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  274. if (m_choise_pnt == 0)
  275. {
  276. m_app->GetViewPort()->GetPainter()->DrawPoint(lineGeo->p1);
  277. }
  278. else
  279. {
  280. m_app->GetViewPort()->GetPainter()->DrawPoint(lineGeo->p2);
  281. }
  282. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  283. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  284. m_app->GetViewPort()->GetPainter()->DrawLine(*lineGeo);
  285. }
  286. else
  287. {
  288. ASSERT(m_editable_line);
  289. const SG_LINE* lineGeo = m_editable_line->GetGeometry();
  290. float pC[3];
  291. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  292. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  293. m_app->GetViewPort()->GetPainter()->DrawPoint(m_cur_pnt);
  294. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  295. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  296. SG_LINE ln;
  297. if (m_choise_pnt == 0)
  298. {
  299. ln.p1 = m_cur_pnt;
  300. ln.p2 = lineGeo->p2;
  301. }
  302. else
  303. {
  304. ln.p2 = m_cur_pnt;
  305. ln.p1 = lineGeo->p1;
  306. }
  307. m_app->GetViewPort()->GetPainter()->DrawLine(ln);
  308. }
  309. }
  310. void  LineEditCommand::OnEnter()
  311. {
  312. if (!m_was_started)
  313. return;
  314. SWITCH_RESOURCE
  315. if (m_step==0)
  316. {
  317. m_step++;
  318. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  319. m_message.LoadString(IDS_ENTER_NEW_COORDS);
  320. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,
  321. m_message);
  322. }
  323. else
  324. {
  325. ASSERT(m_get_point_panel);
  326. m_get_point_panel->GetPoint(m_cur_pnt.x,m_cur_pnt.y, m_cur_pnt.z);
  327. SG_LINE lnG;
  328. switch(m_choise_pnt) 
  329. {
  330. case 0:
  331. lnG.p1 = m_cur_pnt;
  332. lnG.p2 = m_editable_line->GetGeometry()->p2;
  333. break;
  334. case 1:
  335. lnG.p1 = m_editable_line->GetGeometry()->p1;
  336. lnG.p2 = m_cur_pnt;
  337. break;
  338. default:
  339. ASSERT(0);
  340. }
  341. CString mes;
  342. if (sgSpaceMath::PointsDistance(lnG.p1,lnG.p2)>0.000001)
  343. {
  344. sgCLine* ln = sgCreateLine(lnG.p1.x,lnG.p1.y,lnG.p1.z,
  345. lnG.p2.x,lnG.p2.y,lnG.p2.z);
  346. if (!ln)
  347. return;
  348. sgGetScene()->StartUndoGroup();
  349. sgGetScene()->DetachObject(m_editable_line);
  350. sgGetScene()->AttachObject(ln);
  351. sgGetScene()->EndUndoGroup();
  352. m_app->CopyAttributes(*ln,*m_editable_line);
  353. m_app->GetViewPort()->InvalidateViewPort();
  354. m_app->StopCommander();
  355. }
  356. else
  357. {
  358. mes.LoadString(IDS_ERROR_ZERO_LENGTH);
  359. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  360. mes);
  361. }
  362. }
  363. }
  364. unsigned int  LineEditCommand::GetItemsCount()
  365. {
  366. if (!m_was_started)
  367. return 1;
  368. else
  369. return 0;
  370. }
  371. void         LineEditCommand::GetItem(unsigned int itemID, CString& itSrt)
  372. {
  373. if (m_was_started)
  374. {
  375. ASSERT(0);
  376. return;
  377. }
  378. SWITCH_RESOURCE
  379. if(itemID==0) 
  380. {
  381. itSrt.LoadString(IDS_CHANGE_COORDS);
  382. }
  383. else
  384. ASSERT(0);
  385. }
  386. void     LineEditCommand::GetItemState(unsigned int itemID, bool& enbl, bool& checked)
  387. {
  388. if (m_was_started)
  389. {
  390. ASSERT(0);
  391. return;
  392. }
  393. enbl = true;
  394. checked = false;
  395. }
  396. HBITMAP   LineEditCommand::GetItemBitmap(unsigned int)
  397. {
  398. /*if (!m_was_started)
  399. return (HBITMAP)m_bitmap;
  400. else*/
  401. return NULL;
  402. }
  403. void         LineEditCommand::Run(unsigned int itemID)
  404. {
  405. if (!m_was_started)
  406. {
  407. if (itemID==0 || itemID==1)
  408. {
  409. //m_scenario = itemID;
  410. Start();
  411. }
  412. else
  413. {
  414. ASSERT(0);
  415. }
  416. }
  417. /*else
  418. m_scenario = itemID;*/
  419. }