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

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "Sphere.h"
  3. #include "..//resource.h"
  4. #include <math.h>
  5. int     sphere_name_index = 1;
  6. SphereCommand::SphereCommand(IApplicationInterface* appI):
  7. m_app(appI)
  8. ,m_base_point_panel(NULL)
  9. ,m_r_panel(NULL)
  10. , m_step(0)
  11. {
  12. ASSERT(m_app);
  13. m_matrix = new sgCMatrix;
  14. }
  15. SphereCommand::~SphereCommand()
  16. {
  17. if (m_matrix)
  18. delete m_matrix;
  19. m_app->GetCommandPanel()->RemoveAllDialogs();
  20. m_app->GetViewPort()->InvalidateViewPort();
  21. }
  22. bool    SphereCommand::PreTranslateMessage(MSG* pMsg)
  23. {
  24. /*if (pMsg->message==WM_KEYUP||
  25. pMsg->message==WM_CHAR)
  26. return false;*/
  27. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  28. pMsg->message==WM_CHAR)
  29. {
  30. if (pMsg->wParam==VK_RETURN)
  31. {
  32. OnEnter();
  33. return true;
  34. }
  35. if (pMsg->wParam==VK_ESCAPE)
  36. {
  37. m_app->StopCommander();
  38. return true;
  39. }
  40. switch(m_step) {
  41. case 0:
  42. if (m_base_point_panel)
  43. m_base_point_panel->GetWindow()->SendMessage(pMsg->message,
  44. pMsg->wParam,
  45. pMsg->lParam);
  46. break;
  47. case 1:
  48. if (m_r_panel)
  49. m_r_panel->GetWindow()->SendMessage(pMsg->message,
  50. pMsg->wParam,
  51. pMsg->lParam);
  52. break;
  53. }
  54. if (pMsg->message==WM_KEYDOWN)
  55. return false;
  56. else 
  57. return true;
  58. }
  59. else
  60. {
  61. if (pMsg->hwnd == m_app->GetViewPort()->GetWindow()->m_hWnd)
  62. {
  63. switch(pMsg->message) 
  64. {
  65. case WM_MOUSEMOVE:
  66. MouseMove(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  67. return true;
  68. case WM_LBUTTONDOWN:
  69. LeftClick(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  70. return true;
  71. default:
  72. return false;
  73. }
  74. }
  75. }
  76. return false;
  77. }
  78. void   SphereCommand::SendCommanderMessage(ICommander::COMMANDER_MESSAGE mes, void* params)
  79. {
  80. if (mes==ICommander::CM_SWITCH_ROLLUP_DIALOG)
  81. {
  82. ASSERT(params!=NULL);
  83. int   newActiveDlg = *(reinterpret_cast<int*>(params));
  84. ASSERT(newActiveDlg<=1);
  85. m_step = (unsigned int)newActiveDlg;
  86. if (m_step==0)
  87. {
  88. m_app->GetCommandPanel()->EnableRadio(1,false);
  89. SWITCH_RESOURCE
  90. CString aaa;
  91. aaa.LoadString(IDS_SPH_ENTER_CENTER);
  92. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,aaa);
  93. }
  94. }
  95. }
  96. void  SphereCommand::Start()
  97. {
  98. NewScenar();
  99. SWITCH_RESOURCE
  100. CString nm;
  101. nm.LoadString(IDS_TOOLTIP_FIRST);
  102. m_app->StartCommander(nm);
  103. }
  104. void  SphereCommand::MouseMove(unsigned int nFlags,int pX,int pY)
  105. {
  106. switch(m_step) 
  107. {
  108. case 0:
  109. {
  110. ASSERT(m_base_point_panel);
  111. IViewPort::GET_SNAP_IN in_arg;
  112. in_arg.scrX = pX;
  113. in_arg.scrY = pY;
  114. in_arg.snapType = SNAP_SYSTEM;
  115. in_arg.XFix = m_base_point_panel->IsXFixed();
  116. in_arg.YFix = m_base_point_panel->IsYFixed();
  117. in_arg.ZFix = m_base_point_panel->IsZFixed();
  118. double tmpFl[3];
  119. m_base_point_panel->GetPoint(tmpFl[0],tmpFl[1],tmpFl[2]);
  120. in_arg.FixPoint.x = tmpFl[0];
  121. in_arg.FixPoint.y = tmpFl[1];
  122. in_arg.FixPoint.z = tmpFl[2];
  123. IViewPort::GET_SNAP_OUT out_arg;
  124. m_app->GetViewPort()->GetWorldPointAfterSnap(in_arg,out_arg);
  125. m_cur_pnt = out_arg.result_point;
  126. m_base_point_panel->SetPoint(m_cur_pnt.x,m_cur_pnt.y,m_cur_pnt.z);
  127. }
  128. break;
  129. case 1:
  130. {
  131. ASSERT(m_r_panel);
  132. double plD;
  133. SG_VECTOR PlNorm;
  134. m_app->GetViewPort()->GetViewPortNormal(PlNorm);
  135. sgSpaceMath::PlaneFromNormalAndPoint(m_first_pnt,PlNorm,plD);
  136. if (m_app->GetViewPort()->ProjectScreenPointOnPlane(pX,pY,PlNorm,plD,m_cur_pnt))
  137. {
  138. m_rad = m_app->ApplyPrecision(
  139. sgSpaceMath::PointsDistance(m_first_pnt,m_cur_pnt)
  140. );
  141. }
  142. else
  143. m_rad = 0.0;
  144. m_r_panel->SetNumber(m_rad);
  145. }
  146. break;
  147. default:
  148. ASSERT(0);
  149. }
  150. m_app->GetViewPort()->InvalidateViewPort();
  151. }
  152. void  SphereCommand::LeftClick(unsigned int nFlags,int pX,int pY)
  153. {
  154. SWITCH_RESOURCE
  155. switch(m_step) 
  156. {
  157. case 0:
  158. m_first_pnt=m_cur_pnt;
  159. m_matrix->Identity();
  160. m_matrix->Translate(m_first_pnt);
  161. m_step++;
  162. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  163. {
  164. CString aaa;
  165. aaa.LoadString(IDS_SPH_ENTER_RAD);
  166. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,aaa);
  167. }
  168. break;
  169. case 1:
  170. {
  171. double rd = sgSpaceMath::PointsDistance(m_first_pnt,m_cur_pnt);
  172. rd = m_app->ApplyPrecision(rd);
  173. if (fabs(rd)<0.0001)
  174. {
  175. m_message.LoadString(IDS_ERROR_ZERO_RAD);
  176. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  177. m_message);
  178. return;
  179. }
  180. else
  181. if (rd<-0.0001)
  182. {
  183. m_message.LoadString(IDS_ERROR_RAD_MUST_BE_POSIT);
  184. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  185. m_message);
  186. return;
  187. }
  188. sgCSphere* sp = sgCreateSphere(rd,24,24);
  189. if (!sp) return;
  190. sp->InitTempMatrix()->Translate(m_first_pnt);
  191. sp->ApplyTempMatrix();
  192. sp->DestroyTempMatrix();
  193. CString nm;
  194. nm.LoadString(IDS_TOOLTIP_FIRST);
  195. CString nmInd;
  196. nmInd.Format("%i",sphere_name_index);
  197. nm+=nmInd;
  198. sp->SetName(nm);
  199. sgGetScene()->StartUndoGroup();
  200. sgGetScene()->AttachObject(sp);
  201. m_app->ApplyAttributes(sp);
  202. sgGetScene()->EndUndoGroup();
  203. sphere_name_index++;
  204. m_app->GetViewPort()->InvalidateViewPort();
  205. NewScenar();
  206. }
  207. break;
  208. default:
  209. ASSERT(0);
  210. break;
  211. }
  212. }
  213. void  SphereCommand::Draw()
  214. {
  215. switch(m_step) 
  216. {
  217. case 0:
  218. {
  219. float pC[3];
  220. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  221. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  222. m_app->GetViewPort()->GetPainter()->DrawPoint(m_cur_pnt);
  223. }
  224. break;
  225. case 1:
  226. {
  227. float pC[3];
  228. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  229. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  230. m_app->GetViewPort()->GetPainter()->DrawPoint(m_cur_pnt);
  231. m_app->GetViewPort()->GetPainter()->DrawPoint(m_first_pnt);
  232. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  233. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  234. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(m_matrix);
  235. m_app->GetViewPort()->GetPainter()->DrawSphere(m_rad);
  236. m_app->GetViewPort()->GetPainter()->SetTransformMatrix(NULL);
  237. }
  238. break;
  239. default:
  240. ASSERT(0);
  241. }
  242. }
  243. void  SphereCommand::OnEnter()
  244. {
  245. SWITCH_RESOURCE
  246. switch(m_step) 
  247. {
  248. case 0:
  249. {
  250. ASSERT(m_base_point_panel);
  251. m_base_point_panel->GetPoint(m_first_pnt.x,
  252. m_first_pnt.y,
  253. m_first_pnt.z);
  254. m_matrix->Identity();
  255. m_matrix->Translate(m_first_pnt);
  256. m_step++;
  257. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  258. {
  259. CString aaa;
  260. aaa.LoadString(IDS_SPH_ENTER_RAD);
  261. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,aaa);
  262. }
  263. }
  264. break;
  265. case 1:
  266. {
  267. double rd = m_r_panel->GetNumber();
  268. if (fabs(rd)<0.0001)
  269. {
  270. m_message.LoadString(IDS_ERROR_ZERO_RAD);
  271. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  272. m_message);
  273. return;
  274. }
  275. else
  276. if (rd<-0.0001)
  277. {
  278. m_message.LoadString(IDS_ERROR_RAD_MUST_BE_POSIT);
  279. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  280. m_message);
  281. return;
  282. }
  283. sgCSphere* sp = sgCreateSphere(rd,24,24);
  284. if (!sp) return;
  285. sp->InitTempMatrix()->Translate(m_first_pnt);
  286. sp->ApplyTempMatrix();
  287. sp->DestroyTempMatrix();
  288. CString nm;
  289. nm.LoadString(IDS_TOOLTIP_FIRST);
  290. CString nmInd;
  291. nmInd.Format("%i",sphere_name_index);
  292. nm+=nmInd;
  293. sp->SetName(nm);
  294. sgGetScene()->StartUndoGroup();
  295. sgGetScene()->AttachObject(sp);
  296. m_app->ApplyAttributes(sp);
  297. sgGetScene()->EndUndoGroup();
  298. sphere_name_index++;
  299. m_app->GetViewPort()->InvalidateViewPort();
  300. NewScenar();
  301. }
  302. break;
  303. default:
  304. ASSERT(0);
  305. break;
  306. }
  307. }
  308. unsigned int  SphereCommand::GetItemsCount()
  309. {
  310. return 0;
  311. }
  312. void         SphereCommand::GetItem(unsigned int, CString&)
  313. {
  314. //SWITCH_RESOURCE
  315. }
  316. void     SphereCommand::GetItemState(unsigned int, bool&, bool&)
  317. {
  318. }
  319. HBITMAP    SphereCommand::GetItemBitmap(unsigned int)
  320. {
  321. return NULL;
  322. }
  323. void         SphereCommand::Run(unsigned int)
  324. {
  325. }
  326. void  SphereCommand::NewScenar()
  327. {
  328. SWITCH_RESOURCE
  329. m_app->GetCommandPanel()->RemoveAllDialogs();
  330. CString lab;
  331. lab.LoadString(IDS_CENTER);
  332. m_base_point_panel = reinterpret_cast<IGetPointPanel*>(m_app->
  333. GetCommandPanel()->
  334. AddDialog(IBaseInterfaceOfGetDialogs::GET_POINT_DLG,lab,true));
  335. lab.LoadString(IDS_RADIUS);
  336. m_r_panel = reinterpret_cast<IGetNumberPanel*>(m_app->
  337. GetCommandPanel()->
  338. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,lab,true));
  339. m_app->GetCommandPanel()->SetActiveRadio(0);
  340. CString aaa;
  341. aaa.LoadString(IDS_SPH_ENTER_CENTER);
  342. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,aaa);
  343. m_step=0;
  344. }