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

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "Equidi.h"
  3. #include "..//resource.h"
  4. int     equidi_name_index =1;
  5. Equidi::Equidi(IApplicationInterface* appI):
  6. m_app(appI)
  7. , m_start_object(NULL)
  8. , m_get_object_panel(NULL)
  9. , m_get_H_panel(NULL)
  10. , m_step(0)
  11. {
  12. ASSERT(m_app);
  13. }
  14. Equidi::~Equidi()
  15. {
  16. m_app->GetCommandPanel()->RemoveAllDialogs();
  17. m_app->GetViewPort()->InvalidateViewPort();
  18. }
  19. bool    Equidi::PreTranslateMessage(MSG* pMsg)
  20. {
  21. /*if (pMsg->message==WM_KEYUP||
  22. pMsg->message==WM_CHAR)
  23. return false;*/
  24. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  25. pMsg->message==WM_CHAR)
  26. {
  27. if (pMsg->wParam==VK_RETURN)
  28. {
  29. OnEnter();
  30. return true;
  31. }
  32. if (pMsg->wParam==VK_ESCAPE)
  33. {
  34. m_app->StopCommander();
  35. return true;
  36. }
  37. switch(m_step) {
  38. case 0:
  39. if (m_get_object_panel)
  40. m_get_object_panel->GetWindow()->SendMessage(pMsg->message,
  41. pMsg->wParam,
  42. pMsg->lParam);
  43. break;
  44. case 1:
  45. if (m_get_H_panel)
  46. m_get_H_panel->GetWindow()->SendMessage(pMsg->message,
  47. pMsg->wParam,
  48. pMsg->lParam);
  49. break;
  50. }
  51. if (pMsg->message==WM_KEYDOWN)
  52. return false;
  53. else 
  54. return true;
  55. }
  56. else
  57. {
  58. if (pMsg->hwnd == m_app->GetViewPort()->GetWindow()->m_hWnd)
  59. {
  60. switch(pMsg->message) 
  61. {
  62. case WM_MOUSEMOVE:
  63. MouseMove(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  64. return true;
  65. case WM_LBUTTONDOWN:
  66. LeftClick(pMsg->wParam,GET_X_LPARAM(pMsg->lParam),GET_Y_LPARAM(pMsg->lParam));
  67. return true;
  68. default:
  69. return false;
  70. }
  71. }
  72. }
  73. return false;
  74. }
  75. static   bool isObjAddToList(sgCObject* o)
  76. {
  77. if (o->GetType()==SG_OT_CIRCLE ||
  78. o->GetType()==SG_OT_ARC)
  79. return true;
  80. if (o->GetType()==SG_OT_CONTOUR)
  81. {
  82. sgCContour* cc = reinterpret_cast<sgCContour*>(o);
  83. if (!cc->IsLinear() && cc->IsPlane(NULL,NULL))
  84. return true;
  85. else
  86. return false;
  87. }
  88. if (o->GetType()==SG_OT_SPLINE)
  89. {
  90. sgCSpline* cc = reinterpret_cast<sgCSpline*>(o);
  91. if (!cc->IsLinear() && cc->IsPlane(NULL,NULL))
  92. return true;
  93. else
  94. return false;
  95. }
  96. return false;
  97. }
  98. void   Equidi::SendCommanderMessage(ICommander::COMMANDER_MESSAGE mes, void* params)
  99. {
  100. if (mes==ICommander::CM_SWITCH_ROLLUP_DIALOG)
  101. {
  102. ASSERT(params!=NULL);
  103. int   newActiveDlg = *(reinterpret_cast<int*>(params));
  104. ASSERT(newActiveDlg<=1);
  105. m_step = (unsigned int)newActiveDlg;
  106. if (newActiveDlg==0)
  107. {
  108. m_app->GetCommandPanel()->EnableRadio(1,false);
  109. m_message.LoadString(IDS_QEUID_GET_OBJ);
  110. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  111. }
  112. m_app->GetViewPort()->InvalidateViewPort();
  113. return;
  114. }
  115. if (mes==ICommander::CM_SELECT_OBJECT)
  116. {
  117. ASSERT(params!=NULL);
  118. sgCObject* so = (sgCObject*)params;
  119. if (so!=m_start_object)
  120. {
  121. m_app->GetViewPort()->SetHotObject(so);
  122. m_start_object = so;
  123. }
  124. m_app->GetViewPort()->InvalidateViewPort();
  125. }
  126. }
  127. void  Equidi::Start()
  128. {
  129. SWITCH_RESOURCE
  130. m_app->GetCommandPanel()->RemoveAllDialogs();
  131. CString lab;
  132. lab.LoadString(IDS_TOOLTIP_SEVETH);
  133. m_app->StartCommander(lab);
  134. lab.LoadString(IDS_OBJECT);
  135. m_get_object_panel = 
  136. reinterpret_cast<IGetObjectsPanel*>(m_app->GetCommandPanel()->
  137. AddDialog(IBaseInterfaceOfGetDialogs::GET_OBJECTS_DLG,
  138. lab,true));
  139. lab.LoadString(IDS_EQUID_H);
  140. m_get_H_panel = 
  141. reinterpret_cast<IGetNumberPanel*>(m_app->GetCommandPanel()->
  142. AddDialog(IBaseInterfaceOfGetDialogs::GET_NUMBER_DLG,
  143. lab,true));
  144. lab.LoadString(IDS_QEUID_GET_OBJ);
  145. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,lab);
  146. m_app->GetCommandPanel()->SetActiveRadio(0);
  147. m_get_object_panel->SetMultiselectMode(false);
  148. m_get_object_panel->FillList(isObjAddToList);
  149. m_step=0;
  150. }
  151. static  void get_end_points_of_object(sgCObject* ob, SG_POINT& bP, SG_POINT& eP)
  152. {
  153. if (ob->GetType()==SG_OT_ARC)
  154. {
  155. sgCArc* arcO = reinterpret_cast<sgCArc*>(ob);
  156. const SG_ARC* arcG = arcO->GetGeometry();
  157. bP = arcG->begin;
  158. eP = arcG->end;
  159. }
  160. else
  161. if (ob->GetType()==SG_OT_CONTOUR)
  162. {
  163. sgCContour* cO = reinterpret_cast<sgCContour*>(ob);
  164. bP = cO->GetPointFromCoefficient(0.0);
  165. eP = cO->GetPointFromCoefficient(1.0);
  166. }
  167. else
  168. {
  169. ASSERT(0);
  170. }
  171. }
  172. bool  get_point_on_path_after_this(sgCContour* contr, const SG_POINT ppp, SG_POINT& resP)
  173. {
  174. sgCObject* fo = contr->GetChildrenList()->GetHead();
  175. SG_OBJECT_TYPE foT = fo->GetType();
  176. if (foT==SG_OT_LINE)
  177. {
  178. sgCLine* ln = reinterpret_cast<sgCLine*>(fo);
  179. const SG_LINE* lnG = ln->GetGeometry();
  180. if (sgSpaceMath::PointsDistance(lnG->p1,ppp)<0.00001)
  181. {
  182. resP = lnG->p2;
  183. return true;
  184. }
  185. if (sgSpaceMath::PointsDistance(lnG->p2,ppp)<0.00001)
  186. {
  187. resP = lnG->p1;
  188. return true;
  189. }
  190. }
  191. else
  192. if (foT==SG_OT_ARC)
  193. {
  194. sgCArc* ar = reinterpret_cast<sgCArc*>(fo);
  195. const int pntsCnt = ar->GetPointsCount();
  196. const SG_POINT* arcPnts = ar->GetPoints();
  197. if (sgSpaceMath::PointsDistance(*arcPnts,ppp)<0.00001)
  198. {
  199. resP = arcPnts[1];
  200. return true;
  201. }
  202. if (sgSpaceMath::PointsDistance(*(arcPnts+pntsCnt-1),ppp)<0.00001)
  203. {
  204. resP = arcPnts[pntsCnt-2];
  205. return true;
  206. }
  207. }
  208. else
  209. if (foT==SG_OT_CONTOUR)
  210. {
  211. sgCContour* co = reinterpret_cast<sgCContour*>(fo);
  212. if (get_point_on_path_after_this(co, ppp, resP))
  213. return true;
  214. }
  215. sgCObject* so = contr->GetChildrenList()->GetTail();
  216. SG_OBJECT_TYPE soT = so->GetType();
  217. if (soT==SG_OT_LINE)
  218. {
  219. sgCLine* ln = reinterpret_cast<sgCLine*>(so);
  220. const SG_LINE* lnG = ln->GetGeometry();
  221. if (sgSpaceMath::PointsDistance(lnG->p1,ppp)<0.00001)
  222. {
  223. resP = lnG->p2;
  224. return true;
  225. }
  226. if (sgSpaceMath::PointsDistance(lnG->p2,ppp)<0.00001)
  227. {
  228. resP = lnG->p1;
  229. return true;
  230. }
  231. }
  232. else
  233. if (soT==SG_OT_ARC)
  234. {
  235. sgCArc* ar = reinterpret_cast<sgCArc*>(so);
  236. const int pntsCnt = ar->GetPointsCount();
  237. const SG_POINT* arcPnts = ar->GetPoints();
  238. if (sgSpaceMath::PointsDistance(*arcPnts,ppp)<0.00001)
  239. {
  240. resP = arcPnts[1];
  241. return true;
  242. }
  243. if (sgSpaceMath::PointsDistance(*(arcPnts+pntsCnt-1),ppp)<0.00001)
  244. {
  245. resP = arcPnts[pntsCnt-2];
  246. return true;
  247. }
  248. }
  249. else
  250. if (soT==SG_OT_CONTOUR)
  251. {
  252. sgCContour* co = reinterpret_cast<sgCContour*>(so);
  253. if (get_point_on_path_after_this(co, ppp, resP))
  254. return true;
  255. }
  256. return false;
  257. }
  258. bool  Equidi::CheckStartObject()
  259. {
  260. SG_OBJECT_TYPE oT = m_start_object->GetType();
  261. if (oT==SG_OT_ARC)
  262. {
  263. sgCArc* ar = reinterpret_cast<sgCArc*>(m_start_object);
  264. /*const SG_ARC* arcG = ar->GetGeometry();
  265. m_end_points[0] = arcG->begin;
  266. m_end_points[1] = arcG->end;
  267. m_end_vectors[0].x = arcG->center.x-arcG->begin.x;
  268. m_end_vectors[0].y = arcG->center.y-arcG->begin.y;
  269. m_end_vectors[0].z = arcG->center.z-arcG->begin.z;
  270. sgSpaceMath::NormalVector(&m_end_vectors[0]);
  271. m_end_vectors[1].x = arcG->center.x-arcG->end.x;
  272. m_end_vectors[1].y = arcG->center.y-arcG->end.y;
  273. m_end_vectors[1].z = arcG->center.z-arcG->end.z;
  274. sgSpaceMath::NormalVector(&m_end_vectors[1]);
  275. return true;*/
  276. const SG_POINT*  pnts = ar->GetPoints();
  277. m_end_points[0] = pnts[0];
  278. m_end_points[1] = pnts[ar->GetPointsCount()-1];
  279. SG_VECTOR plN = ar->GetGeometry()->normal;
  280. plN.x = -plN.x; plN.y = -plN.y; plN.z = -plN.z;
  281. SG_VECTOR tmpV;
  282. tmpV.x = pnts[1].x - pnts[0].x;
  283. tmpV.y = pnts[1].y - pnts[0].y;
  284. tmpV.z = pnts[1].z - pnts[0].z;
  285. m_end_vectors[0] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  286. sgSpaceMath::NormalVector(m_end_vectors[0]);
  287. tmpV.x = pnts[ar->GetPointsCount()-1].x - pnts[ar->GetPointsCount()-2].x;
  288. tmpV.y = pnts[ar->GetPointsCount()-1].y - pnts[ar->GetPointsCount()-2].y;
  289. tmpV.z = pnts[ar->GetPointsCount()-1].z - pnts[ar->GetPointsCount()-2].z;
  290. m_end_vectors[1] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  291. sgSpaceMath::NormalVector(m_end_vectors[1]);
  292. return true;
  293. }
  294. if (oT==SG_OT_CIRCLE)
  295. {
  296. sgCCircle* cr = reinterpret_cast<sgCCircle*>(m_start_object);
  297. const SG_CIRCLE* crG = cr->GetGeometry();
  298. const SG_POINT*  pnts = cr->GetPoints();
  299. m_end_points[0] = pnts[0];
  300. m_end_points[1] = m_end_points[0];
  301. m_end_vectors[0].x = crG->center.x-pnts[0].x;
  302. m_end_vectors[0].y = crG->center.y-pnts[0].y;
  303. m_end_vectors[0].z = crG->center.z-pnts[0].z;
  304. sgSpaceMath::NormalVector(m_end_vectors[0]);
  305. m_end_vectors[1] = m_end_vectors[0];
  306. return true;
  307. }
  308. if (oT==SG_OT_SPLINE)
  309. {
  310. sgCSpline* spl = reinterpret_cast<sgCSpline*>(m_start_object);
  311. const SG_SPLINE* spG = spl->GetGeometry();
  312. const SG_POINT*  pnts = spG->GetPoints();
  313. m_end_points[0] = pnts[0];
  314. if (!spl->IsClosed())
  315. m_end_points[1] = pnts[spG->GetPointsCount()-1];
  316. else
  317. m_end_points[1] = m_end_points[0];
  318. SG_VECTOR plN;
  319. double    plD;
  320. if (!spl->IsPlane(&plN,&plD))
  321. return false;
  322. SG_VECTOR tmpV;
  323. tmpV.x = pnts[1].x - pnts[0].x;
  324. tmpV.y = pnts[1].y - pnts[0].y;
  325. tmpV.z = pnts[1].z - pnts[0].z;
  326. m_end_vectors[0] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  327. sgSpaceMath::NormalVector(m_end_vectors[0]);
  328. if (!spl->IsClosed())
  329. {
  330. tmpV.x = pnts[spG->GetPointsCount()-1].x - pnts[spG->GetPointsCount()-2].x;
  331. tmpV.y = pnts[spG->GetPointsCount()-1].y - pnts[spG->GetPointsCount()-2].y;
  332. tmpV.z = pnts[spG->GetPointsCount()-1].z - pnts[spG->GetPointsCount()-2].z;
  333. m_end_vectors[1] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  334. sgSpaceMath::NormalVector(m_end_vectors[1]);
  335. }
  336. else
  337. m_end_vectors[1] = m_end_vectors[0];
  338. return true;
  339. }
  340. if (oT==SG_OT_CONTOUR)
  341. {
  342. sgCContour* cnt = reinterpret_cast<sgCContour*>(m_start_object);
  343. //cnt->GetEndPoints(m_end_points[0],m_end_points[1]);
  344. m_end_points[0] = cnt->GetPointFromCoefficient(0.0);
  345. m_end_points[1] = cnt->GetPointFromCoefficient(1.0);
  346. SG_POINT secP;
  347. SG_VECTOR plN;
  348. double    plD;
  349. if (!cnt->IsPlane(&plN,&plD))
  350. return false;
  351. if (!get_point_on_path_after_this(cnt, m_end_points[0], secP))
  352. {
  353. ASSERT(0);
  354. return false;
  355. }
  356. SG_VECTOR tmpV;
  357. tmpV.x = secP.x - m_end_points[0].x;
  358. tmpV.y = secP.y - m_end_points[0].y;
  359. tmpV.z = secP.z - m_end_points[0].z;
  360. m_end_vectors[0] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  361. sgSpaceMath::NormalVector(m_end_vectors[0]);
  362. if (!cnt->IsClosed())
  363. {
  364. if (!get_point_on_path_after_this(cnt, m_end_points[1], secP))
  365. {
  366. ASSERT(0);
  367. return false;
  368. }
  369. tmpV.x = m_end_points[1].x - secP.x;
  370. tmpV.y = m_end_points[1].y - secP.y;
  371. tmpV.z = m_end_points[1].z - secP.z;
  372. m_end_vectors[1] = sgSpaceMath::VectorsVectorMult(plN,tmpV);
  373. sgSpaceMath::NormalVector(m_end_vectors[1]);
  374. }
  375. else
  376. {
  377. m_end_points[1] = m_end_points[0];
  378. m_end_vectors[1] = m_end_vectors[0];
  379. }
  380. return true;
  381. }
  382. return false;
  383. }
  384. void  Equidi::MouseMove(unsigned int nFlags,int pX,int pY)
  385. {
  386. switch(m_step) {
  387. case 0:
  388. if (!(nFlags & MK_LBUTTON))
  389. {
  390. int snapSz = m_app->GetViewPort()->GetSnapSize();
  391. sgCObject* ho = m_app->GetViewPort()->GetTopObject(
  392. m_app->GetViewPort()->GetHitsInRect(CRect(pX-snapSz, pY-snapSz,
  393. pX+snapSz, pY+snapSz)));
  394. if (ho && isObjAddToList(ho))
  395. {
  396. m_app->GetViewPort()->SetHotObject(ho);
  397. if (m_get_object_panel)
  398. m_get_object_panel->SelectObject(ho,true);
  399. }
  400. else
  401. {
  402. m_app->GetViewPort()->SetHotObject(NULL);
  403. if (m_get_object_panel)
  404. m_get_object_panel->SelectObject(NULL,true);
  405. }
  406. m_app->GetViewPort()->InvalidateViewPort();
  407. }
  408. break;
  409. case 1:
  410. {
  411. ASSERT(m_get_H_panel);
  412. if (!m_app->GetViewPort()->
  413. ProjectScreenPointOnLine(pX,pY,m_end_points[0],m_end_vectors[0],
  414. m_projection))
  415. {
  416. m_otstup = 0.0;
  417. m_get_H_panel->SetNumber(m_otstup);
  418. break;
  419. }
  420. char sig = (((m_projection.x-m_end_points[0].x)*m_end_vectors[0].x+
  421. (m_projection.y-m_end_points[0].y)*m_end_vectors[0].y+
  422. (m_projection.z-m_end_points[0].z)*m_end_vectors[0].z)>0)?1:-1;
  423. m_otstup = sgSpaceMath::PointsDistance(m_end_points[0],m_projection)*sig;
  424. m_otstup = m_app->ApplyPrecision(m_otstup);
  425. m_projection.x = m_end_points[0].x+m_end_vectors[0].x*m_otstup;
  426. m_projection.y = m_end_points[0].y+m_end_vectors[0].y*m_otstup;
  427. m_projection.z = m_end_points[0].z+m_end_vectors[0].z*m_otstup;
  428. m_get_H_panel->SetNumber(m_otstup);
  429. m_app->GetViewPort()->InvalidateViewPort();
  430. }
  431. break;
  432. default:
  433. ASSERT(0);
  434. return;
  435. }
  436. }
  437. void  Equidi::LeftClick(unsigned int nFlags,int pX,int pY)
  438. {
  439. SWITCH_RESOURCE
  440. switch(m_step) 
  441. {
  442. case 0:
  443. m_start_object = m_app->GetViewPort()->GetHotObject();
  444. if (m_start_object==NULL)
  445. {
  446. m_message.LoadString(IDS_EQ_ERR_NO_OBJ);
  447. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  448. m_message);
  449. return;
  450. }
  451. m_app->GetViewPort()->InvalidateViewPort();
  452. if (CheckStartObject())
  453. {
  454. m_step++;
  455. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  456. m_message.LoadString(IDS_EQUID_GET_H);
  457. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  458. }
  459. break;
  460. case 1:
  461. if (m_start_object->GetType()==SG_OT_ARC)
  462. {
  463. sgCArc* ar = reinterpret_cast<sgCArc*>(m_start_object);
  464. sgCObject* nO = ar->GetEquidistantContour(m_otstup,m_otstup,false);
  465. if (!nO)
  466. {
  467. m_message.LoadString(IDS_EQ_ERR);
  468. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  469. return;
  470. }
  471. CString nm;
  472. nm.LoadString(IDS_TOOLTIP_SEVETH);
  473. CString nmInd;
  474. nmInd.Format("%i",equidi_name_index);
  475. nm+=nmInd;
  476. nO->SetName(nm);
  477. equidi_name_index++;
  478. sgGetScene()->StartUndoGroup();
  479. sgGetScene()->AttachObject(nO);
  480. m_app->ApplyAttributes(nO);
  481. sgGetScene()->EndUndoGroup();
  482. m_step=0;
  483. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  484. m_app->GetCommandPanel()->EnableRadio(1,false);
  485. if (m_get_object_panel)
  486. m_get_object_panel->AddObject(nO,false);
  487. m_message.LoadString(IDS_QEUID_GET_OBJ);
  488. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  489. m_app->GetViewPort()->InvalidateViewPort();
  490. }
  491. if (m_start_object->GetType()==SG_OT_CIRCLE)
  492. {
  493. sgCCircle* cr = reinterpret_cast<sgCCircle*>(m_start_object);
  494. sgCObject* nO = cr->GetEquidistantContour(m_otstup,m_otstup,false);
  495. if (!nO)
  496. {
  497. m_message.LoadString(IDS_EQ_ERR);
  498. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  499. return;
  500. }
  501. CString nm;
  502. nm.LoadString(IDS_TOOLTIP_SEVETH);
  503. CString nmInd;
  504. nmInd.Format("%i",equidi_name_index);
  505. nm+=nmInd;
  506. nO->SetName(nm);
  507. equidi_name_index++;
  508. sgGetScene()->StartUndoGroup();
  509. sgGetScene()->AttachObject(nO);
  510. m_app->ApplyAttributes(nO);
  511. sgGetScene()->EndUndoGroup();
  512. m_step=0;
  513. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  514. m_app->GetCommandPanel()->EnableRadio(1,false);
  515. if (m_get_object_panel)
  516. m_get_object_panel->AddObject(nO,false);
  517. m_message.LoadString(IDS_QEUID_GET_OBJ);
  518. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  519. m_app->GetViewPort()->InvalidateViewPort();
  520. }
  521. if (m_start_object->GetType()==SG_OT_SPLINE)
  522. {
  523. sgCSpline* spl = reinterpret_cast<sgCSpline*>(m_start_object);
  524. sgCObject* nO = spl->GetEquidistantContour(m_otstup,m_otstup,false);
  525. if (!nO)
  526. {
  527. m_message.LoadString(IDS_EQ_ERR);
  528. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  529. return;
  530. }
  531. CString nm;
  532. nm.LoadString(IDS_TOOLTIP_SEVETH);
  533. CString nmInd;
  534. nmInd.Format("%i",equidi_name_index);
  535. nm+=nmInd;
  536. nO->SetName(nm);
  537. equidi_name_index++;
  538. sgGetScene()->StartUndoGroup();
  539. sgGetScene()->AttachObject(nO);
  540. m_app->ApplyAttributes(nO);
  541. sgGetScene()->EndUndoGroup();
  542. m_step=0;
  543. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  544. m_app->GetCommandPanel()->EnableRadio(1,false);
  545. if (m_get_object_panel)
  546. m_get_object_panel->AddObject(nO,false);
  547. m_message.LoadString(IDS_QEUID_GET_OBJ);
  548. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  549. m_app->GetViewPort()->InvalidateViewPort();
  550. }
  551. if (m_start_object->GetType()==SG_OT_CONTOUR)
  552. {
  553. sgCContour* cn = reinterpret_cast<sgCContour*>(m_start_object);
  554. sgCObject* nO = cn->GetEquidistantContour(m_otstup,m_otstup,false);
  555. if (!nO)
  556. {
  557. m_message.LoadString(IDS_EQ_ERR);
  558. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  559. return;
  560. }
  561. CString nm;
  562. nm.LoadString(IDS_TOOLTIP_SEVETH);
  563. CString nmInd;
  564. nmInd.Format("%i",equidi_name_index);
  565. nm+=nmInd;
  566. nO->SetName(nm);
  567. equidi_name_index++;
  568. sgGetScene()->StartUndoGroup();
  569. sgGetScene()->AttachObject(nO);
  570. m_app->ApplyAttributes(nO);
  571. sgGetScene()->EndUndoGroup();
  572. m_step=0;
  573. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  574. m_app->GetCommandPanel()->EnableRadio(1,false);
  575. if (m_get_object_panel)
  576. m_get_object_panel->AddObject(nO,false);
  577. m_message.LoadString(IDS_QEUID_GET_OBJ);
  578. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  579. m_app->GetViewPort()->InvalidateViewPort();
  580. }
  581. break;
  582. default:
  583. break;
  584. }
  585. }
  586. void  Equidi::Draw()
  587. {
  588. if (m_step==1)
  589. {
  590. float pC[3];
  591. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  592. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  593. m_app->GetViewPort()->GetPainter()->DrawPoint(m_end_points[0]);
  594. m_app->GetViewPort()->GetPainter()->DrawPoint(m_end_points[1]);
  595. m_app->GetViewPort()->GetPainter()->DrawPoint(m_projection);
  596. SG_LINE ln;
  597. ln.p1 = m_end_points[0];
  598. ln.p2 = m_projection;
  599. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  600. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  601. m_app->GetViewPort()->GetPainter()->DrawLine(ln);
  602. ln.p1 = m_end_points[1];
  603. ln.p2.x = m_end_points[1].x+m_end_vectors[1].x*m_otstup;
  604. ln.p2.y = m_end_points[1].y+m_end_vectors[1].y*m_otstup;
  605. ln.p2.z = m_end_points[1].z+m_end_vectors[1].z*m_otstup;
  606. m_app->GetViewPort()->GetPainter()->DrawLine(ln);
  607. }
  608. }
  609. void  Equidi::OnEnter()
  610. {
  611. SWITCH_RESOURCE
  612. switch(m_step) 
  613. {
  614. case 0:
  615. m_start_object = m_app->GetViewPort()->GetHotObject();
  616. if (m_start_object==NULL)
  617. {
  618. m_message.LoadString(IDS_EQ_ERR_NO_OBJ);
  619. m_app->PutMessage(IApplicationInterface::MT_ERROR,
  620. m_message);
  621. return;
  622. }
  623. m_app->GetViewPort()->InvalidateViewPort();
  624. if (CheckStartObject())
  625. {
  626. m_step++;
  627. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  628. m_message.LoadString(IDS_EQUID_GET_H);
  629. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  630. }
  631. break;
  632. case 1:
  633. {
  634. ASSERT(m_get_H_panel);
  635. double m_otstup = m_get_H_panel->GetNumber();
  636. if (m_start_object->GetType()==SG_OT_ARC)
  637. {
  638. sgCArc* ar = reinterpret_cast<sgCArc*>(m_start_object);
  639. sgCObject* nO = ar->GetEquidistantContour(m_otstup,m_otstup,false);
  640. if (!nO)
  641. {
  642. m_message.LoadString(IDS_EQ_ERR);
  643. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  644. return;
  645. }
  646. CString nm;
  647. nm.LoadString(IDS_TOOLTIP_SEVETH);
  648. CString nmInd;
  649. nmInd.Format("%i",equidi_name_index);
  650. nm+=nmInd;
  651. nO->SetName(nm);
  652. equidi_name_index++;
  653. sgGetScene()->StartUndoGroup();
  654. sgGetScene()->AttachObject(nO);
  655. m_app->ApplyAttributes(nO);
  656. sgGetScene()->EndUndoGroup();
  657. m_step=0;
  658. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  659. m_app->GetCommandPanel()->EnableRadio(1,false);
  660. if (m_get_object_panel)
  661. m_get_object_panel->AddObject(nO,false);
  662. m_message.LoadString(IDS_QEUID_GET_OBJ);
  663. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  664. m_app->GetViewPort()->InvalidateViewPort();
  665. }
  666. if (m_start_object->GetType()==SG_OT_CIRCLE)
  667. {
  668. sgCCircle* cr = reinterpret_cast<sgCCircle*>(m_start_object);
  669. sgCObject* nO = cr->GetEquidistantContour(m_otstup,m_otstup,false);
  670. if (!nO)
  671. {
  672. m_message.LoadString(IDS_EQ_ERR);
  673. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  674. return;
  675. }
  676. CString nm;
  677. nm.LoadString(IDS_TOOLTIP_SEVETH);
  678. CString nmInd;
  679. nmInd.Format("%i",equidi_name_index);
  680. nm+=nmInd;
  681. nO->SetName(nm);
  682. equidi_name_index++;
  683. sgGetScene()->StartUndoGroup();
  684. sgGetScene()->AttachObject(nO);
  685. m_app->ApplyAttributes(nO);
  686. sgGetScene()->EndUndoGroup();
  687. m_step=0;
  688. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  689. m_app->GetCommandPanel()->EnableRadio(1,false);
  690. if (m_get_object_panel)
  691. m_get_object_panel->AddObject(nO,false);
  692. m_message.LoadString(IDS_QEUID_GET_OBJ);
  693. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  694. m_app->GetViewPort()->InvalidateViewPort();
  695. }
  696. if (m_start_object->GetType()==SG_OT_SPLINE)
  697. {
  698. sgCSpline* spl = reinterpret_cast<sgCSpline*>(m_start_object);
  699. sgCObject* nO = spl->GetEquidistantContour(m_otstup,m_otstup,false);
  700. if (!nO)
  701. {
  702. m_message.LoadString(IDS_EQ_ERR);
  703. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  704. return;
  705. }
  706. CString nm;
  707. nm.LoadString(IDS_TOOLTIP_SEVETH);
  708. CString nmInd;
  709. nmInd.Format("%i",equidi_name_index);
  710. nm+=nmInd;
  711. nO->SetName(nm);
  712. equidi_name_index++;
  713. sgGetScene()->StartUndoGroup();
  714. sgGetScene()->AttachObject(nO);
  715. m_app->ApplyAttributes(nO);
  716. sgGetScene()->EndUndoGroup();
  717. m_step=0;
  718. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  719. m_app->GetCommandPanel()->EnableRadio(1,false);
  720. if (m_get_object_panel)
  721. m_get_object_panel->AddObject(nO,false);
  722. m_message.LoadString(IDS_QEUID_GET_OBJ);
  723. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  724. m_app->GetViewPort()->InvalidateViewPort();
  725. }
  726. if (m_start_object->GetType()==SG_OT_CONTOUR)
  727. {
  728. sgCContour* cn = reinterpret_cast<sgCContour*>(m_start_object);
  729. sgCObject* nO = cn->GetEquidistantContour(m_otstup,m_otstup,false);
  730. if (!nO)
  731. {
  732. m_message.LoadString(IDS_EQ_ERR);
  733. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  734. return;
  735. }
  736. CString nm;
  737. nm.LoadString(IDS_TOOLTIP_SEVETH);
  738. CString nmInd;
  739. nmInd.Format("%i",equidi_name_index);
  740. nm+=nmInd;
  741. nO->SetName(nm);
  742. equidi_name_index++;
  743. sgGetScene()->StartUndoGroup();
  744. sgGetScene()->AttachObject(nO);
  745. m_app->ApplyAttributes(nO);
  746. sgGetScene()->EndUndoGroup();
  747. m_step=0;
  748. m_app->GetCommandPanel()->SetActiveRadio(m_step);
  749. m_app->GetCommandPanel()->EnableRadio(1,false);
  750. if (m_get_object_panel)
  751. m_get_object_panel->AddObject(nO,false);
  752. m_message.LoadString(IDS_QEUID_GET_OBJ);
  753. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  754. m_app->GetViewPort()->InvalidateViewPort();
  755. }
  756. }
  757. break;
  758. default:
  759. break;
  760. }
  761. }
  762. unsigned int  Equidi::GetItemsCount()
  763. {
  764. return 0;
  765. }
  766. void         Equidi::GetItem(unsigned int, CString&)
  767. {
  768. }
  769. void     Equidi::GetItemState(unsigned int, bool&, bool&)
  770. {
  771. }
  772. HBITMAP   Equidi::GetItemBitmap(unsigned int)
  773. {
  774. return NULL;
  775. }
  776. void         Equidi::Run(unsigned int)
  777. {
  778. }