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

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "ExtrudeBody.h"
  3. #include "..//resource.h"
  4. #include <math.h>
  5. #include <algorithm>
  6. int     extrude_name_index = 1;
  7. ExtrudeCommand::ExtrudeCommand(IApplicationInterface* appI):
  8. m_app(appI)
  9. ,m_get_main_object_panel(NULL)
  10. ,m_get_sub_objects_panel(NULL)
  11. ,m_get_H_panel(NULL)
  12. {
  13. ASSERT(m_app);
  14. m_step = 0;
  15. m_otv.clear();
  16. m_inQuestionRegime = false;
  17. }
  18. ExtrudeCommand::~ExtrudeCommand()
  19. {
  20. m_otv.clear();
  21. if (!m_object_lines.empty())
  22. m_object_lines.clear();
  23. if (sgGetScene()->GetSelectedObjectsList()->GetCount()>0)
  24. {
  25. sgCObject*  curObj = sgGetScene()->GetSelectedObjectsList()->GetHead();
  26. while (curObj) 
  27. {
  28. curObj->Select(false);
  29. curObj = sgGetScene()->GetSelectedObjectsList()->GetNext(curObj);
  30. }
  31. }
  32. m_app->GetCommandPanel()->RemoveAllDialogs();
  33. m_app->GetViewPort()->InvalidateViewPort();
  34. }
  35. bool    ExtrudeCommand::PreTranslateMessage(MSG* pMsg)
  36. {
  37. if (m_inQuestionRegime)
  38. return false;
  39. /*if (pMsg->message==WM_KEYUP||
  40. pMsg->message==WM_CHAR)
  41. return false;*/
  42. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  43. pMsg->message==WM_CHAR)
  44. {
  45. if (pMsg->wParam==VK_RETURN)
  46. {
  47. OnEnter();
  48. return true;
  49. }
  50. if (pMsg->wParam==VK_ESCAPE)
  51. {
  52. m_app->StopCommander();
  53. return true;
  54. }
  55. switch(m_step) 
  56. {
  57. case 0:
  58. if (m_get_main_object_panel)
  59. m_get_main_object_panel->GetWindow()->SendMessage(pMsg->message,
  60. pMsg->wParam,
  61. pMsg->lParam);
  62. break;
  63. case 1:
  64. if (m_get_sub_objects_panel)
  65. m_get_sub_objects_panel->GetWindow()->SendMessage(pMsg->message,
  66. pMsg->wParam,
  67. pMsg->lParam);
  68. case 2:
  69. if (m_get_H_panel)
  70. m_get_H_panel->GetWindow()->SendMessage(pMsg->message,
  71. pMsg->wParam,
  72. pMsg->lParam);
  73. break;
  74. }
  75. if (pMsg->message==WM_KEYDOWN)
  76. return false;
  77. else 
  78. return true;
  79. }
  80. else
  81. {
  82. if (pMsg->hwnd == m_app->GetViewPort()->GetWindow()->m_hWnd)
  83. {
  84. switch(pMsg->message) 
  85. {
  86. case WM_MOUSEMOVE:
  87. MouseMove(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  88. return true;
  89. case WM_LBUTTONDOWN:
  90. LeftClick(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  91. return true;
  92. default:
  93. return false;
  94. }
  95. }
  96. }
  97. return false;
  98. }
  99. void     ExtrudeCommand::SendCommanderMessage(ICommander::COMMANDER_MESSAGE mes, 
  100.    void* params) 
  101. {
  102. if (mes==ICommander::CM_SWITCH_ROLLUP_DIALOG)
  103. {
  104. ASSERT(params!=NULL);
  105. int   newActiveDlg = *(reinterpret_cast<int*>(params));
  106. ASSERT(newActiveDlg<=1);
  107. m_step = (unsigned int)newActiveDlg;
  108. for (unsigned int i=m_step+1;i<=2;i++)
  109. m_app->GetCommandPanel()->EnableRadio(i,false);
  110. SWITCH_RESOURCE
  111. switch(m_step) 
  112. {
  113. case 0:
  114. m_message.LoadString(IDS_SEL_MAIN_CONT);
  115. m_get_main_object_panel->SelectObject(NULL,false);
  116. if (m_first_obj)
  117. {
  118. m_get_sub_objects_panel->AddObject(m_first_obj,false);
  119. m_first_obj->Select(false);
  120. }
  121. m_first_obj = NULL;
  122. m_get_sub_objects_panel->SelectObject(NULL,false);
  123. for (size_t i=0;i<m_otv.size();i++)
  124. m_otv[i]->Select(false);
  125. m_otv.clear();
  126. m_object_lines.clear();
  127. break;
  128. case 1:
  129. m_get_sub_objects_panel->SelectObject(NULL,false);
  130. for (size_t i=0;i<m_otv.size();i++)
  131. m_otv[i]->Select(false);
  132. m_otv.clear();
  133. m_message.LoadString(IDS_SEL_OTV);
  134. break;
  135. case 2:
  136. m_message.LoadString(IDS_SEL_H);
  137. break;
  138. default:
  139. ASSERT(0);
  140. break;
  141. }
  142. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  143. return;
  144. }
  145. if (mes==ICommander::CM_SELECT_OBJECT)
  146. {
  147. ASSERT(params!=NULL);
  148. if (m_step>1)
  149. return;
  150. sgCObject* so = (sgCObject*)params;
  151. if (so!=m_app->GetViewPort()->GetHotObject())
  152. m_app->GetViewPort()->SetHotObject(so);
  153. if (m_step==0)
  154. {
  155. m_first_obj = so;
  156. }
  157. else
  158. {
  159. if (!so->IsSelect())
  160. {
  161. SWITCH_RESOURCE
  162. sgC2DObject* curH = reinterpret_cast<sgC2DObject*>(m_app->GetViewPort()->GetHotObject());
  163. HO_CORRECT_PATHS_RES testRes = GoodObjectForHole(curH);
  164. if (testRes!=HO_SUCCESS)
  165. {
  166. switch(testRes) 
  167. {
  168. case HO_NOT_IN_ONE_PLANE:
  169. m_message.LoadString(IDS_NOT_IN_ONE_PLANE);
  170. break;
  171. case HO_INTERSECTS_WITH_OUT:
  172. m_message.LoadString(IDS_INTERS_OUT);
  173. break;
  174. case HO_IN_NOT_INSIDE_OUT:
  175. m_message.LoadString(IDS_NOT_INSIDE_OUT);
  176. break;
  177. case HO_INTERSECTS_WITH_OTHER_HOLE:
  178. m_message.LoadString(IDS_INTERS_WITH_OTHERS);
  179. break;
  180. case HO_INSIDE_EXIST_HOLE:
  181. m_message.LoadString(IDS_INSIDE_EXIST_HOLE);
  182. break;
  183. case HO_CONTAIN_EXIST_HOLE:
  184. m_message.LoadString(IDS_CONSIST_EXIST_HOLE);
  185. break;
  186. default:
  187. m_message.LoadString(IDS_ERROR_OBJ_NOT_SEL);
  188. break;
  189. }
  190. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  191. m_get_sub_objects_panel->SelectObject(so,false);
  192. return;
  193. }
  194. }
  195. so->Select(!so->IsSelect());
  196. if (so->IsSelect())
  197. m_otv.push_back(so);
  198. else
  199. {
  200. std::vector<sgCObject*>::iterator resultIt;
  201. resultIt = std::find(m_otv.begin(),m_otv.end(),so);
  202. if (resultIt!=m_otv.end())
  203. m_otv.erase(resultIt);
  204. }
  205. }
  206. m_app->GetViewPort()->InvalidateViewPort();
  207. }
  208. }
  209. static   bool isObjAddToList1(sgCObject* obj)
  210. {
  211. SG_OBJECT_TYPE ot = obj->GetType();
  212. if (ot==SG_OT_CIRCLE || ot==SG_OT_ARC || ot==SG_OT_LINE)
  213. return true;
  214. if (ot==SG_OT_SPLINE)
  215. {
  216. sgCSpline* spl = reinterpret_cast<sgCSpline*>(obj);
  217. if (spl->IsPlane(NULL,NULL) && !spl->IsSelfIntersecting())
  218. return true;
  219. else
  220. return false;
  221. }
  222. if (ot==SG_OT_CONTOUR)
  223. {
  224. sgCContour* cntr = reinterpret_cast<sgCContour*>(obj);
  225. if (cntr->IsPlane(NULL,NULL) && !cntr->IsSelfIntersecting())
  226. return true;
  227. else
  228. return false;
  229. }
  230. return false;
  231. }
  232. static   bool isObjAddToList2(sgCObject* obj)
  233. {
  234. SG_OBJECT_TYPE ot = obj->GetType();
  235. if (ot==SG_OT_CIRCLE)
  236. return true;
  237. if (ot==SG_OT_SPLINE)
  238. {
  239. sgCSpline* spl = reinterpret_cast<sgCSpline*>(obj);
  240. if (spl->IsPlane(NULL,NULL) && spl->IsClosed() && !spl->IsSelfIntersecting())
  241. return true;
  242. else
  243. return false;
  244. }
  245. if (ot==SG_OT_CONTOUR)
  246. {
  247. sgCContour* cntr = reinterpret_cast<sgCContour*>(obj);
  248. if (cntr->IsPlane(NULL,NULL) && cntr->IsClosed() && !cntr->IsSelfIntersecting())
  249. return true;
  250. else
  251. return false;
  252. }
  253. return false;
  254. }
  255. void  ExtrudeCommand::Start()
  256. {
  257. SWITCH_RESOURCE
  258. m_app->GetCommandPanel()->RemoveAllDialogs();
  259. m_message.LoadString(IDS_TOOLTIP_ZERO);
  260. m_app->StartCommander(m_message);
  261. m_message.LoadString(IDS_MAIN_CON);
  262. m_get_main_object_panel = reinterpret_cast<IGetObjectsPanel*>(m_app->
  263. GetCommandPanel()->
  264. AddDialog(IBaseInterfaceOfGetDialogs::GET_OBJECTS_DLG,m_message,true));
  265. m_message.LoadString(IDS_OTV);
  266. m_get_sub_objects_panel = reinterpret_cast<IGetObjectsPanel*>(m_app->
  267. GetCommandPanel()->
  268. AddDialog(IBaseInterfaceOfGetDialogs::GET_OBJECTS_DLG,m_message,true));
  269. m_message.LoadString(IDS_EXTR_H);
  270. m_get_H_panel = reinterpret_cast<IGetNumberPanel*>(m_app->
  271. GetCommandPanel()->
  272. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,m_message,true));
  273. m_get_main_object_panel->SetMultiselectMode(false);
  274. m_get_main_object_panel->FillList(isObjAddToList1);
  275. m_get_sub_objects_panel->SetMultiselectMode(true);
  276. m_get_sub_objects_panel->FillList(isObjAddToList2);
  277. m_step=0;
  278. m_app->GetCommandPanel()->SetActiveRadio(0);
  279. m_message.LoadString(IDS_SEL_MAIN_CONT);
  280. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  281. }
  282. void  ExtrudeCommand::MouseMove(unsigned int nFlags,int pX,int pY)
  283. {
  284. if (m_step==0)
  285. {
  286. if (!(nFlags & MK_LBUTTON))
  287. {
  288. int snapSz = m_app->GetViewPort()->GetSnapSize();
  289. sgCObject* ho = m_app->GetViewPort()->GetTopObject(
  290. m_app->GetViewPort()->GetHitsInRect(CRect(pX-snapSz, pY-snapSz,
  291. pX+snapSz, pY+snapSz)));
  292. if (ho && isObjAddToList1(ho))
  293. {
  294. m_app->GetViewPort()->SetHotObject(ho);
  295. if (m_get_main_object_panel)
  296. m_get_main_object_panel->SelectObject(ho,true);
  297. }
  298. else
  299. {
  300. m_app->GetViewPort()->SetHotObject(NULL);
  301. if (m_get_main_object_panel)
  302. m_get_main_object_panel->SelectObject(NULL,true);
  303. }
  304. m_app->GetViewPort()->InvalidateViewPort();
  305. }
  306. return;
  307. }
  308. else
  309. if (m_step==1)
  310. {
  311. if (!(nFlags & MK_LBUTTON))
  312. {
  313. int snapSz = m_app->GetViewPort()->GetSnapSize();
  314. sgCObject* ho = m_app->GetViewPort()->GetTopObject(
  315. m_app->GetViewPort()->GetHitsInRect(CRect(pX-snapSz, pY-snapSz,
  316. pX+snapSz, pY+snapSz)));
  317. if (ho && isObjAddToList2(ho))
  318. {
  319. m_app->GetViewPort()->SetHotObject(ho);
  320. //if (m_get_sub_objects_panel)
  321. // m_get_sub_objects_panel->SelectObject(ho,true);
  322. }
  323. else
  324. {
  325. m_app->GetViewPort()->SetHotObject(NULL);
  326. //if (m_get_sub_objects_panel)
  327. // m_get_sub_objects_panel->SelectObject(NULL,true);
  328. }
  329. m_app->GetViewPort()->InvalidateViewPort();
  330. }
  331. return;
  332. }
  333. else
  334. if (m_step==2)
  335. {
  336. m_app->GetViewPort()->ProjectScreenPointOnLine(pX,pY,
  337. m_gab_center,m_plane_Normal,m_cur_pnt);
  338. ASSERT(m_get_H_panel);
  339. SG_VECTOR ddd;
  340. ddd.x = m_cur_pnt.x-m_gab_center.x;
  341. ddd.y = m_cur_pnt.y-m_gab_center.y;
  342. ddd.z = m_cur_pnt.z-m_gab_center.z;
  343. double hh = sqrt(ddd.x*ddd.x+ddd.y*ddd.y+ddd.z*ddd.z);
  344. if (sgSpaceMath::VectorsScalarMult(m_plane_Normal,ddd)<0)
  345. hh*=-1.0;
  346. m_get_H_panel->SetNumber(hh);
  347. m_app->GetViewPort()->InvalidateViewPort();
  348. }
  349. else
  350. ASSERT(0);
  351. }
  352. void   ExtrudeCommand::FillObjectLinesList(sgCObject* obj)
  353. {
  354. if (!obj)
  355. {
  356. ASSERT(0);
  357. return;
  358. }
  359. SG_OBJECT_TYPE ot = obj->GetType();
  360. SG_LINE  tmpLn;
  361. switch(ot) 
  362. {
  363. case SG_OT_LINE:
  364. {
  365. sgCLine* ln = reinterpret_cast<sgCLine*>(obj);
  366. memcpy(&tmpLn,ln->GetGeometry(),sizeof(SG_LINE));
  367. m_object_lines.push_back(tmpLn);
  368. }
  369. break;
  370. case SG_OT_ARC:
  371. {
  372. sgCArc* arcc = reinterpret_cast<sgCArc*>(obj);
  373. const int pc = arcc->GetPointsCount();
  374. const SG_POINT* pnts = arcc->GetPoints();
  375. if (pc>2)
  376. {
  377. for (int i=0;i<pc-1;i++)
  378. {
  379. tmpLn.p1 = pnts[i];
  380. tmpLn.p2 = pnts[i+1];
  381. m_object_lines.push_back(tmpLn);
  382. }
  383. }
  384. }
  385. break;
  386. case SG_OT_CIRCLE:
  387. {
  388. sgCCircle* ccir = reinterpret_cast<sgCCircle*>(obj);
  389. const int pc = ccir->GetPointsCount();
  390. const SG_POINT* pnts = ccir->GetPoints();
  391. if (pc>2)
  392. {
  393. for (int i=0;i<pc-1;i++)
  394. {
  395. tmpLn.p1 = pnts[i];
  396. tmpLn.p2 = pnts[i+1];
  397. m_object_lines.push_back(tmpLn);
  398. }
  399. }
  400. }
  401. break;
  402. case SG_OT_SPLINE:
  403. {
  404. sgCSpline* spl = reinterpret_cast<sgCSpline*>(obj);
  405. const int pc = spl->GetGeometry()->GetPointsCount();
  406. const SG_POINT* pnts = spl->GetGeometry()->GetPoints();
  407. if (pc>2)
  408. {
  409. for (int i=0;i<pc-1;i++)
  410. {
  411. tmpLn.p1 = pnts[i];
  412. tmpLn.p2 = pnts[i+1];
  413. m_object_lines.push_back(tmpLn);
  414. }
  415. }
  416. }
  417. break;
  418. case SG_OT_CONTOUR:
  419. {
  420. sgCContour* cntr = reinterpret_cast<sgCContour*>(obj);
  421. sgCObject*  curObj = cntr->GetChildrenList()->GetHead();
  422. while (curObj) 
  423. {
  424. FillObjectLinesList(curObj);
  425. curObj = cntr->GetChildrenList()->GetNext(curObj);
  426. }
  427. }
  428. break;
  429. default:
  430. ASSERT(0);
  431. }
  432. }
  433. HO_CORRECT_PATHS_RES  ExtrudeCommand::GoodObjectForHole(const sgC2DObject* try_hole)
  434. {
  435. if (m_first_obj==NULL)
  436. return HO_UNKNOWN_ERROR;
  437. sgC2DObject::SG_2D_OBJECT_ORIENT out_or;
  438. SG_VECTOR out_Norm;
  439. double    out_D;
  440. sgC2DObject* out_obj = reinterpret_cast<sgC2DObject*>(m_first_obj);
  441. if (!out_obj->IsPlane(&out_Norm,&out_D))
  442. return HO_OUT_NOT_FLAT;
  443. out_or = out_obj->GetOrient(out_Norm);
  444. if (out_or == sgC2DObject::OO_ERROR) 
  445. {
  446. // 纤握紊 峦咆腿