DrawDoc.cpp
上传用户:yklx818
上传日期:2013-04-13
资源大小:459k
文件大小:12k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // DrawDoc.cpp : implementation of the CDrawDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "Draw.h"
  5. #include "DrawDoc.h"
  6. #include "math.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CDrawDoc
  14. IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)
  15. BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)
  16. //{{AFX_MSG_MAP(CDrawDoc)
  17. // NOTE - the ClassWizard will add and remove mapping macros here.
  18. //    DO NOT EDIT what you see in these blocks of generated code!
  19. //}}AFX_MSG_MAP
  20. END_MESSAGE_MAP()
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CDrawDoc construction/destruction
  23. float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen;
  24. BOOL IsRectCross(float minx,float miny,float maxx,float maxy);
  25. CDrawDoc::~CDrawDoc()
  26. {
  27. delete m_Index;
  28. delete GraphSelect;
  29. }
  30. BOOL CDrawDoc::OnNewDocument()
  31. {
  32. if (!CDocument::OnNewDocument())
  33. return FALSE;
  34. // TODO: add reinitialization code here
  35. // (SDI documents will reuse this document)
  36. return TRUE;
  37. }
  38. COLORREF CGraphPara::GetColor(int n)
  39. {
  40. return m_ColorList[n];
  41. }
  42. BOOL CGraphPara::GetDisplayStatue(int n)
  43. {
  44. return m_LayerList[n].b_Display;
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CDrawDoc serialization
  48. void CDrawDoc::Serialize(CArchive& ar)
  49. {
  50. if (ar.IsStoring())
  51. {
  52. // TODO: add storing code here
  53. }
  54. else
  55. {
  56. // TODO: add loading code here
  57. }
  58. }
  59. CLine* CDrawDoc::AddLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2)
  60. {
  61. CLine* p_Line=new CLine(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,X1,Y1,X2,Y2);
  62. m_LineArray.Add(p_Line);
  63. return p_Line;
  64. return  NULL;
  65. }
  66. CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL bFill)
  67. {
  68. CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,bFill);
  69. m_CircleArray.Add(p_Circle);
  70. return p_Circle;
  71. return NULL;
  72. }
  73. CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2)
  74. {
  75. CArc* p_Arc=new CArc( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, CircleX, CircleY, CircleR, Angle1, Angle2);
  76. m_ArcArray.Add(p_Arc);
  77. return p_Arc;
  78. return NULL;
  79. }
  80. CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text)
  81. {
  82. CText* p_Text=new CText(ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, StartX, StartY, Angle1, Angle2, TextHeight, TextWide, OffWide,0,Text);
  83. m_TextArray.Add(p_Text);
  84. return p_Text;
  85. return NULL;
  86. }
  87. /*CTag* CDrawDoc::AddTag(short ColorPen,int Layer,float xInsert,float yInsert,float xScale,float yScale,float angle,int only_id,int idBlock)
  88. {
  89. CTag* p_Tag=new CTag( ColorPen, Layer,0, xInsert, yInsert, xScale, yScale, angle, only_id, idBlock);
  90. m_TagArray.Add(p_Tag);
  91. return p_Tag;
  92. }*/
  93. CPline* CDrawDoc::AddPLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList)
  94. {
  95. CPline* p_Pline=new CPline( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, Numble,PointList);
  96. m_PLineArray.Add(p_Pline);
  97. return p_Pline;
  98. return NULL;
  99. }
  100. CPlineRgn* CDrawDoc::AddPLineRgn(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList,BOOL bTransparent,BOOL bFill)
  101. {
  102. CPlineRgn* p_PlineRgn=new CPlineRgn( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, Numble,PointList, bTransparent, bFill);
  103. m_PLineRgnArray.Add(p_PlineRgn);
  104. return p_PlineRgn;
  105. return NULL;
  106. }
  107. CLinkNet* CDrawDoc::AddNetPoint(float x,float y,float rRadiu,short Layer,int id_only,short ColorPen)
  108. {
  109. CLinkNet* p_Net=new CLinkNet( ColorPen, x, y, rRadiu, Layer, id_only);
  110. m_NetArray.Add(p_Net);
  111. return p_Net;
  112. return NULL;
  113. }
  114. CDraw* CDrawDoc::GetGraph(short Lb,int index)
  115. {
  116. switch(Lb)
  117. {
  118. case 1:
  119. if(index<0||index>m_LineArray.GetUpperBound())
  120. return 0;
  121. return m_LineArray.GetAt(index);
  122. break;
  123. case 2:
  124.         if(index<0||index>m_PLineArray.GetUpperBound())
  125. return 0;
  126. return m_PLineArray.GetAt(index);
  127. break;
  128.     case 3:
  129. if(index<0||index>m_CircleArray.GetUpperBound())
  130. return 0;
  131. return m_CircleArray.GetAt(index);
  132. break;
  133. case 4:
  134.         if(index<0||index>m_ArcArray.GetUpperBound())
  135. return 0;
  136. return m_ArcArray.GetAt(index);
  137. break;
  138.     case 5:
  139. if(index<0||index>m_TextArray.GetUpperBound())
  140. return 0;
  141. return m_TextArray.GetAt(index);
  142. break;
  143. case 6:
  144.         if(index<0||index>m_TagArray.GetUpperBound())
  145. return 0;
  146. return m_TagArray.GetAt(index);
  147. break;
  148.     case 7:
  149. if(index<0||index>m_PLineRgnArray.GetUpperBound())
  150. return 0;
  151. return m_PLineRgnArray.GetAt(index);
  152. break;
  153. case 8:
  154.         if(index<0||index>m_NetArray.GetUpperBound())
  155. return 0;
  156. return m_NetArray.GetAt(index);
  157. break;
  158. default:
  159. return 0;
  160. }
  161. }
  162. void CDrawDoc::DeleteGraph(short Lb,int index)
  163. {
  164. switch(Lb)
  165. {
  166. case 1:
  167. if(index<0||index>m_LineArray.GetUpperBound())
  168. return ;
  169. m_LineArray.RemoveAt(index);
  170. break;
  171. case 2:
  172.         if(index<0||index>m_PLineArray.GetUpperBound())
  173. return ;
  174. m_PLineArray.RemoveAt(index);
  175. break;
  176.     case 3:
  177. if(index<0||index>m_CircleArray.GetUpperBound())
  178. return ;
  179.     m_CircleArray.RemoveAt(index);
  180. break;
  181. case 4:
  182.         if(index<0||index>m_ArcArray.GetUpperBound())
  183. return ;
  184. m_ArcArray.RemoveAt(index);
  185. break;
  186.     case 5:
  187. if(index<0||index>m_TextArray.GetUpperBound())
  188. return ;
  189. m_TextArray.RemoveAt(index);
  190. break;
  191. case 6:
  192.         if(index<0||index>m_TagArray.GetUpperBound())
  193. return ;
  194. m_TagArray.RemoveAt(index);
  195. break;
  196.     case 7:
  197. if(index<0||index>m_PLineRgnArray.GetUpperBound())
  198. return ;
  199. m_PLineRgnArray.RemoveAt(index);
  200. break;
  201. case 8:
  202.         if(index<0||index>m_NetArray.GetUpperBound())
  203. return ;
  204. m_NetArray.RemoveAt(index);
  205. break;
  206. default:
  207. return;
  208. }
  209. }
  210. int CDrawDoc::GetGraphNumb(short Lb)
  211. {
  212. switch(Lb)
  213. {
  214. case 1:
  215. return m_LineArray.GetSize();
  216. break;
  217.     case 2:
  218. return m_PLineArray.GetSize();
  219. break;
  220.    case 3:
  221. return m_CircleArray.GetSize();
  222. break;
  223.     case 4:
  224. return m_ArcArray.GetSize();
  225. break;
  226.     case 5:
  227. return m_TextArray.GetSize();
  228. break;
  229.     case 6:
  230. return m_TagArray.GetSize();
  231. break;
  232.    case 7:
  233. return m_PLineRgnArray.GetSize();
  234. break;
  235.     case 8:
  236. return m_NetArray.GetSize();
  237. break;
  238. default:
  239. return 0;
  240. }
  241. }
  242. int  CDrawDoc::GetGraphUpperBound(short Lb)
  243. {
  244. switch(Lb)
  245. {
  246. case 1:
  247. return m_LineArray.GetUpperBound();
  248. break;
  249.     case 2:
  250. return m_PLineArray.GetUpperBound();
  251. break;
  252.    case 3:
  253. return m_CircleArray.GetUpperBound();
  254. break;
  255.     case 4:
  256. return m_ArcArray.GetUpperBound();
  257. break;
  258.     case 5:
  259. return m_TextArray.GetUpperBound();
  260. break;
  261.     case 6:
  262. return m_TagArray.GetUpperBound();
  263. break;
  264.    case 7:
  265. return m_PLineRgnArray.GetUpperBound();
  266. break;
  267.     case 8:
  268. return m_NetArray.GetUpperBound();
  269. break;
  270. default:
  271. return -1;
  272. break;
  273.      }
  274.     return  -1;
  275. }
  276. int CDrawDoc::GetGraphIndex(short Lb,int ID)
  277. {
  278. int nn=this->GetGraphUpperBound(Lb)+1;
  279. for(int i=0;i<nn;i++)
  280. {
  281. CDraw* pDraw=this->GetGraph(Lb,i);
  282. if(pDraw&&pDraw->GetID()==ID)
  283. {
  284. return i;
  285. }
  286. }
  287. return -1;
  288. }
  289. CLinkNet* CDrawDoc::AddNetLink(float sID,float eID)
  290. {
  291. int xh=this->GetGraphIndex(8,(int)sID);
  292. CLinkNet* pNet=NULL;
  293. if(xh>=0)
  294. {
  295. pNet=(CLinkNet*)GetGraph(8,xh);
  296. pNet->AddLink((int)eID);
  297. }
  298. return pNet;
  299. }
  300. BOOL CDrawDoc::GetNetXy(int netID,float *x,float *y,BOOL *bDelete)
  301. {
  302. int nn=this->GetGraphIndex(8,netID);
  303. if(nn<0)
  304. return FALSE;
  305. CLinkNet* pNet=(CLinkNet*)GetGraph(8,nn);
  306. *bDelete=pNet->b_Delete;
  307. *x=pNet->m_x;
  308. *y=pNet->m_y;
  309. return TRUE;
  310. }
  311. void CDrawDoc::Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)
  312. {
  313.     for(int i=0;i<=8;i++)
  314. {
  315. int nn=GetGraphUpperBound(i)+1;
  316. while(nn--)
  317. GetGraph(i,nn)->Draw(pDC,m_DrawMode,m_DrawModel,BackColor);
  318. }
  319. //实现对被选中的图形元素的特殊绘制
  320. for(i=0;i<n_GraphSelect;i++)
  321. {
  322. DrawGraph(pDC,GraphSelect[i].Lb,GraphSelect[i].index,0,1,BackColor);
  323. }
  324. }
  325. int CDrawDoc::GetGraphID(short Lb)
  326. {
  327. int nn=GetGraphUpperBound(Lb);
  328. for(int i=0;i<3000;i++)
  329. {
  330. m_Index[i]=0;
  331. }
  332. for(i=0;i<=nn;i++)
  333. {
  334. if(GetGraph(Lb,i))
  335. m_Index[GetGraph(Lb,i)->GetID()]=1;
  336. }
  337. for(i=0;i<30000;i++)
  338. {
  339. if(m_Index[i]==0)
  340. return i;
  341. }
  342. return -1;
  343. }
  344. float  CDrawDoc::GetAngle(float xx,float yy,float m_x,float m_y)
  345. {
  346. float i;
  347. i=(float)acos((m_x-xx)/sqrt((m_y-yy)*(m_y-yy)+(m_x-xx)*(m_x-xx)));
  348.     return i;
  349. }
  350. void CArc::Init(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,BOOL Delete,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2)
  351. {
  352. m_ColorPen=ColorPen;
  353. m_ColorBrush=ColorBrush;
  354. m_LineWide=LineWide;
  355. m_LineType=LineType;
  356. m_Layer=Layer;
  357. m_CircleX=CircleX;
  358. m_CircleY=CircleY;
  359. m_CircleR=CircleR;
  360. m_Angle1=Angle1;
  361. m_Angle2=Angle2;
  362. b_Delete=Delete;
  363. }
  364. BOOL CDrawDoc::PointSelect(float x,float y,float j1,float blc,int *Lb,int* index,int* id_only)
  365. {
  366. for(int i=0;i<=8;i++)
  367. {
  368. int nn=GetGraphUpperBound(i)+1;
  369. while(nn--)
  370. {
  371. if(GetGraph(i,nn)->IsPoint(x,y,j1,blc))
  372. {
  373. *index=nn;
  374. *Lb=i;
  375. *id_only=GetGraph(i,nn)->GetID();
  376. return TRUE;
  377. }
  378. }
  379. }
  380. return FALSE;
  381. }
  382. float CalDisp(int  x,int y,int m_x,int m_y)
  383. {
  384. float l;
  385. l=(float)(sqrt((m_x-x)*(m_x-x)+(m_y-y)*(m_y-y)));
  386. return l;
  387. }
  388. void CDrawDoc::AddScreen(float StartX,float StartY,float blc)
  389. {
  390. int i;
  391. if(m_CurrentScreen==m_MaxScreen)
  392. {
  393. for(i=1;i<m_MaxScreen-1;i++)
  394. m_Screen[i]=m_Screen[i+1];
  395. }
  396. else
  397. m_CurrentScreen++;
  398. //记录下当前屏幕的参数,存到结构数组对应的项中
  399. m_Screen[m_CurrentScreen].sx=StartX;
  400. m_Screen[m_CurrentScreen].sy=StartY;
  401. m_Screen[m_CurrentScreen].blc=blc;
  402. }
  403. BOOL CDrawDoc::GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax)
  404. {
  405. float m_minX,m_minY,m_maxX,m_maxY;
  406. BOOL pb;
  407. *m_Xmin=(float)(1E+20);
  408. *m_Ymin=(float)(1E+20);
  409. *m_Xmax=(float)(1E-20);
  410. *m_Ymax=(float)(1E-20);
  411. pb=0;
  412. for(int i=0;i<=8;i++)
  413. {
  414. int nn=GetGraphUpperBound(i)+1;
  415. while(nn--)
  416. {
  417. if(GetGraph(i,nn))
  418. GetGraph(i,nn)->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY);
  419. else
  420. continue;
  421. pb=1;
  422. if(*m_Xmin>m_minX)
  423. *m_Xmin=m_minX;
  424. if(*m_Xmax<m_maxX)
  425. *m_Xmax=m_maxX;
  426. if(*m_Ymin>m_minY)
  427. *m_Ymin=m_minY;
  428. if(*m_Ymax<m_maxY)
  429. *m_Ymax=m_maxY;
  430. }
  431. }
  432. return pb;
  433. }
  434. BOOL IsRectCross(float minx,float miny,float maxx,float maxy)
  435. {
  436. if(minx>xMaxScreen||maxx<xMinScreen||miny>yMaxScreen||maxy<yMinScreen)
  437. return FALSE;  //如两个矩形不相交
  438. else
  439. return TRUE;
  440. }
  441. BOOL CDrawDoc::AddSelectList(int Lb,int index,int id_only)
  442. {
  443. for(int i=0;i<n_GraphSelect;i++)
  444. {
  445. if(Lb==GraphSelect[i].Lb&&index==GraphSelect[i].index&&id_only==GraphSelect[i].id_only)
  446. return FALSE;
  447. }
  448. GraphSelect[n_GraphSelect].Lb=Lb;
  449. GraphSelect[n_GraphSelect].index=index;
  450. GraphSelect[n_GraphSelect++].id_only=id_only;
  451. return TRUE;
  452. }
  453. void CDrawDoc::DrawGraph(CDC* pDC,int Lb,int index,int DrawMode,int DrawModel,short BackColor)
  454. {
  455. GetGraph(Lb,index)->Draw(pDC,DrawMode,DrawModel,BackColor);
  456. }
  457. /*BOOL CDrawDoc::PointSelect(float x,float y,float j1,float blc,int *Lb,int *index,int * id_only)
  458. {
  459. for(int i=1;i<=8;i++)
  460. {
  461. int nn=GetGraphUpperBound(i)+1;
  462. while(nn--)
  463. {
  464. if(GetGraph(i,nn)->IsPoint(x,y,j1,blc))
  465. {
  466. *index=nn;
  467. *Lb=i;
  468. *id_only=GetGraph(i,nn)->GetID();
  469. return  TRUE;
  470. }
  471. }
  472. }
  473. return FALSE;
  474. }*/
  475. /////////////////////////////////////////////////////////////////////////////
  476. // CDrawDoc diagnostics
  477. #ifdef _DEBUG
  478. void CDrawDoc::AssertValid() const
  479. {
  480. CDocument::AssertValid();
  481. }
  482. void CDrawDoc::Dump(CDumpContext& dc) const
  483. {
  484. CDocument::Dump(dc);
  485. }
  486. #endif //_DEBUG
  487. /////////////////////////////////////////////////////////////////////////////
  488. // CDrawDoc commands