SplineSurf.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 "SplineSurf.h"
  3. #include <math.h>
  4. #include <float.h>
  5. #include "..//resource.h"
  6. int     spline_surface_index = 1;
  7. SplineSurfaceCommand::SplineSurfaceCommand(IApplicationInterface* appI):
  8. m_app(appI)
  9. {
  10. ASSERT(m_app);
  11. m_step = 0;
  12. m_cur_obj = NULL;
  13. m_get_object_panel = NULL;
  14. m_objs.clear();
  15. m_coef_on_curve.clear();
  16. m_need_regime = NEED_OBJECT;
  17. m_inQuestionRegime = false;
  18. }
  19. SplineSurfaceCommand::~SplineSurfaceCommand()
  20. {
  21. if (sgGetScene()->GetSelectedObjectsList()->GetCount()>0)
  22. {
  23. sgCObject*  curObj = sgGetScene()->GetSelectedObjectsList()->GetHead();
  24. while (curObj) 
  25. {
  26. curObj->Select(false);
  27. curObj = sgGetScene()->GetSelectedObjectsList()->GetNext(curObj);
  28. }
  29. }
  30. m_app->GetCommandPanel()->RemoveAllDialogs();
  31. m_app->GetViewPort()->InvalidateViewPort();
  32. }
  33. bool    SplineSurfaceCommand::PreTranslateMessage(MSG* pMsg)
  34. {
  35. if (m_inQuestionRegime)
  36. return false;
  37. if (pMsg->message==WM_KEYUP||pMsg->message==WM_KEYDOWN || 
  38. pMsg->message==WM_CHAR)
  39. {
  40. if (pMsg->wParam==VK_RETURN)
  41. {
  42. OnEnter();
  43. return true;
  44. }
  45. if (pMsg->wParam==VK_ESCAPE)
  46. {
  47. m_app->StopCommander();
  48. return true;
  49. }
  50. if (m_get_object_panel)
  51. m_get_object_panel->GetWindow()->SendMessage(pMsg->message,
  52. pMsg->wParam,
  53. pMsg->lParam);
  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     SplineSurfaceCommand::SendCommanderMessage(ICommander::COMMANDER_MESSAGE mes, 
  79.    void* params) 
  80. {
  81. /*if (mes==ICommander::CM_SWITCH_ROLLUP_DIALOG)
  82. {
  83. ASSERT(params!=NULL);
  84. int   newActiveDlg = *(reinterpret_cast<int*>(params));
  85. ASSERT(newActiveDlg<=1);
  86. m_step = (unsigned int)newActiveDlg;
  87. for (unsigned int i=m_step+1;i<=1;i++)
  88. {
  89. m_app->GetCommandPanel()->EnableRadio(i,false);
  90. m_objs[i]=NULL;
  91. }
  92. SWITCH_RESOURCE
  93. m_message.LoadString(IDS_COON_SEL_1_CONT);
  94. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  95. return;
  96. }
  97. if (mes==ICommander::CM_SELECT_OBJECT)
  98. {
  99. ASSERT(params!=NULL);
  100. ASSERT(m_step==0 || m_step==1);
  101. sgCObject* so = (sgCObject*)params;
  102. if (so!=m_app->GetViewPort()->GetHotObject())
  103. {
  104. m_app->GetViewPort()->SetHotObject(so);
  105. m_cur_obj = so;
  106. }
  107. m_app->GetViewPort()->InvalidateViewPort();
  108. }*/
  109. }
  110. static   bool isObjAddToList(sgCObject* obj)
  111. {
  112. SG_OBJECT_TYPE ot = obj->GetType();
  113. if (ot==SG_OT_LINE ||
  114. ot==SG_OT_ARC ||
  115. ot==SG_OT_CIRCLE)
  116. return true;
  117. if (ot==SG_OT_SPLINE)
  118. {
  119. sgCSpline* spl = reinterpret_cast<sgCSpline*>(obj);
  120. if (!spl->IsSelfIntersecting())
  121. return true;
  122. else
  123. return false;
  124. }
  125. if (ot==SG_OT_CONTOUR)
  126. {
  127. sgCContour* cntr = reinterpret_cast<sgCContour*>(obj);
  128. if (!cntr->IsSelfIntersecting())
  129. return true;
  130. else
  131. return false;
  132. }
  133. return false;
  134. }
  135. void  SplineSurfaceCommand::Start()
  136. {
  137. SWITCH_RESOURCE
  138. m_app->GetCommandPanel()->RemoveAllDialogs();
  139. m_message.LoadString(IDS_TOOLTIP_FIVETH);
  140. m_app->StartCommander(m_message);
  141. m_message.LoadString(IDS_LS_FIR_CONT);
  142. m_get_object_panel = reinterpret_cast<IGetObjectsPanel*>(m_app->
  143. GetCommandPanel()->
  144. AddDialog(IBaseInterfaceOfGetDialogs::GET_OBJECTS_DLG,m_message,true));
  145. if (m_get_object_panel)
  146. {
  147. m_get_object_panel->SetMultiselectMode(true);
  148. m_get_object_panel->FillList(isObjAddToList);
  149. }
  150. m_step=0;
  151. m_app->GetCommandPanel()->SetActiveRadio(0);
  152. m_app->GetCommandPanel()->EnableRadio(0,false);
  153. m_message.LoadString(IDS_LS_SEL_FIR_CONT);
  154. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  155. }
  156. void   SplineSurfaceCommand::NeedObject(int pX, int pY)
  157. {
  158. int snapSz = m_app->GetViewPort()->GetSnapSize();
  159. sgCObject* ho = m_app->GetViewPort()->GetTopObject(
  160. m_app->GetViewPort()->GetHitsInRect(CRect(pX-snapSz, pY-snapSz,
  161. pX+snapSz, pY+snapSz)));
  162. if (ho && isObjAddToList(ho))
  163. {
  164. m_app->GetViewPort()->SetHotObject(ho);
  165. if (m_get_object_panel)
  166. m_get_object_panel->SelectObject(ho,true);
  167. }
  168. else
  169. {
  170. m_app->GetViewPort()->SetHotObject(NULL);
  171. if (m_get_object_panel)
  172. m_get_object_panel->SelectObject(NULL,true);
  173. }
  174. m_app->GetViewPort()->InvalidateViewPort();
  175. }
  176. void  SplineSurfaceCommand::NeedOneOfEndPoint(int pX, int pY)
  177. {
  178. SG_POINT begP,endP;
  179. begP = m_points_on_curve[m_points_on_curve.size()-1][0];
  180. endP = m_points_on_curve[m_points_on_curve.size()-1][m_points_on_curve[m_points_on_curve.size()-1].size()-1];
  181. SG_POINT begP_proj,endP_proj;
  182. m_app->GetViewPort()->ProjectWorldPoint(begP,begP_proj.x,begP_proj.y,begP_proj.z);
  183. m_app->GetViewPort()->ProjectWorldPoint(endP,endP_proj.x,endP_proj.y,endP_proj.z);
  184. double d1;
  185. d1 = sqrt((begP_proj.x-pX)*(begP_proj.x-pX)+
  186. (begP_proj.y-pY)*(begP_proj.y-pY));
  187. double d2;
  188. d2 = sqrt((endP_proj.x-pX)*(endP_proj.x-pX)+
  189. (endP_proj.y-pY)*(endP_proj.y-pY));
  190. if (d1<d2)
  191. m_inverse_curve[m_inverse_curve.size()-1] = false;
  192. else
  193. m_inverse_curve[m_inverse_curve.size()-1] = true;
  194. m_app->GetViewPort()->InvalidateViewPort();
  195. }
  196. void  SplineSurfaceCommand::NeedPointOnCurve(int pX, int pY)
  197. {
  198. double dis = FLT_MAX;
  199. size_t pInd = 0;
  200. size_t sz = m_temp_buffer.size();
  201. SG_POINT P_proj;
  202. double d2;
  203. m_inverse_curve[m_inverse_curve.size()-1] = false;
  204. for (size_t i =0;i<sz;i++)
  205. {
  206. m_app->GetViewPort()->ProjectWorldPoint(m_temp_buffer[i].pnt,
  207. P_proj.x,P_proj.y,P_proj.z);
  208. d2 = sqrt((P_proj.x-pX)*(P_proj.x-pX)+
  209. (P_proj.y-pY)*(P_proj.y-pY));
  210. if (d2<dis)
  211. {
  212. dis=d2;
  213. pInd = i;
  214. m_coef_on_curve[m_coef_on_curve.size()-1] = m_temp_buffer[i].coef;
  215. }
  216. }
  217. m_points_on_curve[m_points_on_curve.size()-1].clear();
  218. m_points_on_curve[m_points_on_curve.size()-1].reserve(COUNT_OF_POINTS_ON_CURVE_2+1);
  219. for (double i=0.0;i<=1.0;i+=1.0/COUNT_OF_POINTS_ON_CURVE_2)
  220. {
  221. double istCoef = m_coef_on_curve[m_coef_on_curve.size()-1]+i;
  222. if (istCoef>1.0)
  223. istCoef-=1.0;
  224. m_points_on_curve[m_points_on_curve.size()-1].push_back(m_objs[m_objs.size()-1]->GetPointFromCoefficient(istCoef));
  225. }
  226. m_app->GetViewPort()->InvalidateViewPort();
  227. }
  228. void  SplineSurfaceCommand::NeedDirection(int pX, int pY)
  229. {
  230. SG_POINT begP,endP;
  231. begP = m_points_on_curve[m_points_on_curve.size()-1][1];
  232. endP = m_points_on_curve[m_points_on_curve.size()-1][m_points_on_curve[m_points_on_curve.size()-1].size()-1];
  233. SG_POINT begP_proj,endP_proj;
  234. m_app->GetViewPort()->ProjectWorldPoint(begP,begP_proj.x,begP_proj.y,begP_proj.z);
  235. m_app->GetViewPort()->ProjectWorldPoint(endP,endP_proj.x,endP_proj.y,endP_proj.z);
  236. double d1;
  237. d1 = sqrt((begP_proj.x-pX)*(begP_proj.x-pX)+
  238. (begP_proj.y-pY)*(begP_proj.y-pY));
  239. double d2;
  240. d2 = sqrt((endP_proj.x-pX)*(endP_proj.x-pX)+
  241. (endP_proj.y-pY)*(endP_proj.y-pY));
  242. if (d1<d2)
  243. m_inverse_curve[m_inverse_curve.size()-1] = false;
  244. else
  245. m_inverse_curve[m_inverse_curve.size()-1] = true;
  246. m_app->GetViewPort()->InvalidateViewPort();
  247. }
  248. void  SplineSurfaceCommand::MouseMove(unsigned int nFlags,int pX,int pY)
  249. {
  250. switch(m_need_regime) 
  251. {
  252. case NEED_OBJECT:
  253. NeedObject(pX,pY);
  254. break;
  255. case NEED_ONE_OF_END_POINT:
  256. NeedOneOfEndPoint(pX,pY);
  257. break;
  258. case NEED_POINT_ON_CURVE:
  259. NeedPointOnCurve(pX,pY);
  260. break;
  261. case NEED_DIRECTION:
  262. NeedDirection(pX,pY);
  263. break;
  264. }
  265. }
  266. void  SplineSurfaceCommand::LeftClick(unsigned int nFlags,int pX,int pY)
  267. {
  268. SWITCH_RESOURCE
  269. switch(m_need_regime) 
  270. {
  271. case NEED_OBJECT:
  272. m_cur_obj=m_app->GetViewPort()->GetHotObject();
  273. if (m_cur_obj)
  274. {
  275. m_cur_obj->Select(true);
  276. sgC2DObject* ooo = reinterpret_cast<sgC2DObject*>(m_cur_obj);
  277. m_objs.push_back(ooo);
  278. std::vector<SG_POINT>  pnts;
  279. pnts.reserve(COUNT_OF_POINTS_ON_CURVE_2+1);
  280. for (double i=0.0;i<=1.0;i+=1.0/COUNT_OF_POINTS_ON_CURVE_2)
  281. pnts.push_back(ooo->GetPointFromCoefficient(i));
  282. m_points_on_curve.push_back(pnts);
  283. m_inverse_curve.push_back(false);
  284. m_coef_on_curve.push_back(0.0);
  285. if (m_objs.size()==1)
  286. {
  287. m_message.LoadString(IDS_SELECT_NEXT_CONTOUR);
  288. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  289. return;
  290. }
  291. if (!ooo->IsClosed())
  292. {
  293. m_need_regime = NEED_ONE_OF_END_POINT;
  294. m_message.LoadString(IDS_SEL_CURVE_DIR);
  295. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  296. m_app->GetViewPort()->InvalidateViewPort();
  297. return;
  298. }
  299. else
  300. {
  301. m_temp_buffer.clear();
  302. m_temp_buffer.reserve(COUNT_OF_POINTS_ON_CURVE_1+1);
  303. for (double i=0.0;i<=1.0;i+=1.0/COUNT_OF_POINTS_ON_CURVE_1)
  304. {
  305. POINT_AND_HER_COEF tmpS;
  306. tmpS.coef = i;
  307. tmpS.pnt = ooo->GetPointFromCoefficient(i);
  308. m_temp_buffer.push_back(tmpS);
  309. }
  310. m_need_regime = NEED_POINT_ON_CURVE;
  311. m_message.LoadString(IDS_SEL_HREBET_POINT);
  312. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  313. return;
  314. }
  315. }
  316. else
  317. {
  318. m_message.LoadString(IDS_ERROR_OBJ_NOT_SEL);
  319. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  320. return;
  321. }
  322. break;
  323. case NEED_ONE_OF_END_POINT:
  324. if (m_inverse_curve[m_inverse_curve.size()-1])
  325. m_objs[m_objs.size()-1]->ChangeOrient();
  326. m_need_regime=NEED_OBJECT;
  327. m_message.LoadString(IDS_SELECT_NEXT_CONTOUR);
  328. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  329. m_app->GetViewPort()->InvalidateViewPort();
  330. return;
  331. case NEED_POINT_ON_CURVE:
  332. m_need_regime = NEED_DIRECTION;
  333. m_message.LoadString(IDS_SEL_CURVE_DIR);
  334. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  335. m_temp_buffer.clear();
  336. m_app->GetViewPort()->InvalidateViewPort();
  337. return;
  338. case NEED_DIRECTION:
  339. {
  340. if (m_inverse_curve[m_inverse_curve.size()-1])
  341. m_objs[m_objs.size()-1]->ChangeOrient();
  342. m_need_regime=NEED_OBJECT;
  343. m_message.LoadString(IDS_SELECT_NEXT_CONTOUR);
  344. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  345. m_app->GetViewPort()->InvalidateViewPort();
  346. return;
  347. }
  348. break;
  349. }
  350. }
  351. void  SplineSurfaceCommand::Draw()
  352. {
  353. size_t curves_cnt = m_points_on_curve.size();
  354. if (curves_cnt==0)
  355. return;
  356. float pC[3];
  357. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  358. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  359. size_t poF = m_points_on_curve[0].size();
  360. for (size_t i =0;i<poF;i++)
  361. m_app->GetViewPort()->GetPainter()->DrawPoint(m_points_on_curve[0][i]);
  362. if (m_points_on_curve.size()==1)
  363. return;
  364. for (size_t i=1;i<curves_cnt;i++)
  365. {
  366. m_app->GetViewPort()->GetPainter()->GetUserColorPoints(pC[0],pC[1],pC[2]);
  367. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  368. for (size_t j =0;j<poF;j++)
  369. {
  370. m_app->GetViewPort()->GetPainter()->DrawPoint(m_points_on_curve[i-1][j]);
  371. m_app->GetViewPort()->GetPainter()->DrawPoint(m_points_on_curve[i][j]);
  372. }
  373. m_app->GetViewPort()->GetPainter()->GetUserColorLines(pC[0],pC[1],pC[2]);
  374. m_app->GetViewPort()->GetPainter()->SetCurColor(pC[0],pC[1],pC[2]);
  375. for (size_t j =0;j<poF;j++)
  376. {
  377. SG_LINE ln;
  378. if (m_inverse_curve[i-1])
  379. ln.p1 = m_points_on_curve[i-1][poF-j-1];
  380. else
  381. ln.p1 = m_points_on_curve[i-1][j];
  382. if (m_inverse_curve[i])
  383. ln.p2 = m_points_on_curve[i][poF-j-1];
  384. else
  385. ln.p2 = m_points_on_curve[i][j];
  386. m_app->GetViewPort()->GetPainter()->DrawLine(ln);
  387. }
  388. }
  389. }
  390. void  SplineSurfaceCommand::OnEnter()
  391. {
  392. /*SWITCH_RESOURCE
  393. m_cur_obj=m_app->GetViewPort()->GetHotObject();*/
  394. }
  395. unsigned int  SplineSurfaceCommand::GetItemsCount()
  396. {
  397. return 1;
  398. }
  399. void         SplineSurfaceCommand::GetItem(unsigned int itemID, CString& itSrt)
  400. {
  401. SWITCH_RESOURCE
  402. if (itemID==0) 
  403. {
  404. itSrt.LoadString(IDS_END_COM);
  405. }
  406. else
  407. {
  408. ASSERT(0);
  409. }
  410. }
  411. void     SplineSurfaceCommand::GetItemState(unsigned int itemID, bool& enbl, bool& checked)
  412. {
  413. if (m_objs.size()>=3)
  414. enbl = true;
  415. else
  416. enbl = false;
  417. checked = false;
  418. }
  419. HBITMAP   SplineSurfaceCommand::GetItemBitmap(unsigned int)
  420. {
  421. return NULL;
  422. }
  423. void         SplineSurfaceCommand::Run(unsigned int itemID)
  424. {
  425. SWITCH_RESOURCE
  426. if (itemID==0)
  427. {
  428. bool  cl = false;
  429. if (m_objs[0]->IsPlane(NULL,NULL) && m_objs[0]->IsClosed() &&
  430. m_objs[m_objs.size()-1]->IsPlane(NULL,NULL) && m_objs[m_objs.size()-1]->IsClosed())
  431. {
  432. m_message.LoadString(IDS_IS_CLOSE);
  433. CString qe;
  434. qe.LoadString(IDS_QUESTION);
  435. m_inQuestionRegime = true;
  436. if (MessageBox(m_app->GetViewPort()->GetWindow()->m_hWnd,
  437. m_message,qe,MB_YESNO|MB_ICONQUESTION)==IDYES)
  438. cl = true;
  439. else
  440. cl = false;
  441. m_inQuestionRegime = false;
  442. }
  443. sgCObject* aaa = sgSurfaces::SplineSurfaceFromSections((const sgC2DObject**)(&m_objs[0]),
  444. (const double*)(&m_coef_on_curve[0]),m_objs.size(),cl);
  445. if (!aaa)
  446. {
  447. m_message.LoadString(IDS_ERR_CANT_CREATE);
  448. m_app->PutMessage(IApplicationInterface::MT_ERROR,m_message);
  449. return;
  450. }
  451. CString nm;
  452. nm.LoadString(IDS_SPLINE_NAME);
  453. CString nmInd;
  454. nmInd.Format("%i",spline_surface_index);
  455. nm+=nmInd;
  456. aaa->SetName(nm);
  457. aaa->SetUserGeometry("{8809183F-18CC-49ee-8B5E-9570D3AF3A6A}",0,NULL);
  458. sgGetScene()->StartUndoGroup();
  459. sgGetScene()->AttachObject(aaa);
  460. m_app->ApplyAttributes(aaa);
  461. sgGetScene()->EndUndoGroup();
  462. spline_surface_index++;
  463. if (sgGetScene()->GetSelectedObjectsList()->GetCount()>0)
  464. {
  465. sgCObject*  curObj = sgGetScene()->GetSelectedObjectsList()->GetHead();
  466. while (curObj) 
  467. {
  468. curObj->Select(false);
  469. curObj = sgGetScene()->GetSelectedObjectsList()->GetNext(curObj);
  470. }
  471. }
  472. for (size_t i=0;i<m_points_on_curve.size();i++)
  473.   m_points_on_curve[i].clear();
  474. m_points_on_curve.clear();
  475. m_temp_buffer.clear();
  476. m_inverse_curve.clear();
  477. m_coef_on_curve.clear();
  478. m_step=0;
  479. m_app->GetCommandPanel()->SetActiveRadio(0);
  480. m_app->GetCommandPanel()->EnableRadio(0,false);
  481. m_message.LoadString(IDS_LS_SEL_FIR_CONT);
  482. m_app->PutMessage(IApplicationInterface::MT_MESSAGE,m_message);
  483. }
  484. else
  485. {
  486. ASSERT(0);
  487. }
  488. }