XSpot.cpp
上传用户:yokoluohf
上传日期:2013-02-25
资源大小:769k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include "Stdafx.h"
  2. #include "XSpot.h"
  3. #include "XTube.h"
  4. #include <math.h>
  5. const float pi = 3.1415926535f;
  6. XSpot::XSpot (PointF pt, SpotTypeEnum vType, CString vName)
  7. {
  8. parent = NULL;
  9. position = pt;
  10. type = vType;
  11. name = vName;
  12. title = "";
  13. description = "";
  14. icon = ITE_NULL;
  15. left = position;
  16. right = position;
  17. center = position;
  18. fontFace = "Arial";
  19. fontHeight = 10;
  20. fontStyle = FontStyleBold;
  21. angle = 0;
  22. startAngle = 0;
  23. sweepAngle = 0;
  24. radius = 0;
  25. ANGLE = 0;
  26. A = B1 = B2 = C1 = C2 = position;
  27. }
  28. XSpot::XSpot (Point pt, SpotTypeEnum vType, CString vName)
  29. {
  30. parent = NULL;
  31. position = PointF (REAL(pt.X), REAL(pt.Y));
  32. type = vType;
  33. name = vName;
  34. title = "";
  35. description = "";
  36. icon = ITE_NULL;
  37. left = position;
  38. right = position;
  39. center = position;
  40. fontFace = "Arial";
  41. fontHeight = 10;
  42. fontStyle = FontStyleBold;
  43. angle = 0;
  44. startAngle = 0;
  45. sweepAngle = 0;
  46. radius = 0;
  47. ANGLE = 0;
  48. A = B1 = B2 = C1 = C2 = position;
  49. }
  50. bool XSpot::operator == (const XSpot& vSpot)
  51. {
  52. return (parent == vSpot.parent && position.Equals (vSpot.position) == TRUE && type == vSpot.type && name == vSpot.name
  53. && description == vSpot.description );
  54. }
  55. int XSpot::Move (float x, float y)
  56. {
  57. PointF offs (x, y);
  58. position = position + offs;
  59. left = left + offs;
  60. right = right + offs;
  61. center = center + offs;
  62. A = A + offs;
  63. B1 = B1 + offs;
  64. B2 = B2 + offs;
  65. C1 = C1 + offs;
  66. C2 = C2 + offs;
  67. return 0;
  68. }
  69. void XSpot::SetParent (XTube* vParent)
  70. {
  71. parent = vParent;
  72. SetType (type);
  73. fontColor = vParent->defFontColor;
  74. fontFace = vParent->defFontFace;
  75. fontHeight = vParent->defFontHeight;
  76. fontStyle = vParent->defFontStyle;
  77. }
  78. void XSpot::SetType (SpotTypeEnum vType)
  79. {
  80. type = vType;
  81. if (!parent) return;
  82. switch (type)
  83. {
  84. case STE_LEFT:
  85. color = parent->defLeftColor;
  86. break;
  87. case STE_RIGHT:
  88. color = parent->defRightColor;
  89. break;
  90. case STE_CIRCLE:
  91. case STE_SMALL_CIRCLE: //自动取外部点
  92. case STE_MEDIUM_CIRCLE:
  93. case STE_LARGE_CIRCLE: //自动取外部点
  94. color = parent->defCircleOutlineColor;
  95. break;
  96. case STE_START:
  97. color = parent->defStartColor;
  98. break;
  99. case STE_END:
  100. color = parent->defEndColor;
  101. break;
  102. default:
  103. color = Color(255, 0, 0, 0);
  104. break;
  105. }
  106. }
  107. int XSpot::Draw (Graphics* g, map<CString, PointF>* spotMap)
  108. {
  109. if (!parent) return -1;
  110. //<<优化
  111. if (type == STE_NULL) return 0;
  112. if (name == "" || name.IsEmpty ()) return 0;
  113. if (spotMap)
  114. {
  115. map<CString, PointF>::iterator pos = spotMap->find (name);
  116. if (pos == spotMap->end ())
  117. (*spotMap) [name] = position;
  118. else ///***
  119. return 0;
  120. }
  121. //>>
  122. REAL width = parent->lineWidth;
  123. //画车站
  124. Pen spotPen (color, width);
  125. PointF refPoint;
  126. switch (type)
  127. {
  128. case STE_LEFT:
  129. g->DrawLine (&spotPen, A, B1);
  130. refPoint = C1;
  131. break;
  132. case STE_RIGHT:
  133. g->DrawLine (&spotPen, A, B2);
  134. refPoint = C2;
  135. break;
  136. case STE_START:
  137. g->DrawLine (&spotPen, B1, B2);
  138. refPoint = C1; //***
  139. break;
  140. case STE_END:
  141. g->DrawLine (&spotPen, B1, B2);
  142. refPoint = C1; //***
  143. break;
  144. case STE_INNER:
  145. {
  146. float dx1 = A.X - center.X;
  147. float dy1 = A.Y - center.Y;
  148. float dx2 = C1.X - A.X;
  149. float dy2 = C1.Y - A.Y;
  150. if (dx1*dx2 < 0 || dy1*dy2 < 0)
  151. refPoint = C1;
  152. else
  153. refPoint = C2;
  154. break;
  155. }
  156. case STE_CIRCLE:
  157. case STE_SMALL_CIRCLE: //自动取外部点
  158. case STE_MEDIUM_CIRCLE:
  159. case STE_LARGE_CIRCLE: //自动取外部点
  160. {
  161. REAL radius = width;
  162. REAL lineWidth = 2;
  163. if (type == STE_SMALL_CIRCLE)
  164. {
  165. radius = 3;
  166. lineWidth = 1;
  167. }
  168. else if (type == STE_MEDIUM_CIRCLE)
  169. {
  170. radius = 5;
  171. lineWidth = 1.5;
  172. }
  173. else if (type == STE_LARGE_CIRCLE)
  174. {
  175. radius = 10;
  176. lineWidth = 2;
  177. }
  178. Pen circlePen (color, lineWidth);
  179. SolidBrush circleBrush (parent->defCircleFillColor);
  180. g->FillEllipse (&circleBrush, A.X - radius, A.Y-radius, radius*2, radius*2);
  181. g->DrawEllipse (&circlePen, A.X - radius, A.Y-radius, radius*2, radius*2);
  182. //refPoint = C1;
  183. //break;
  184. }
  185. case STE_OUTER:
  186. case STE_AUTO:
  187. {
  188. float dx1 = A.X - center.X;
  189. float dy1 = A.Y - center.Y;
  190. float dx2 = C1.X - A.X;
  191. float dy2 = C1.Y - A.Y;
  192. if (dx1*dx2 < 0 || dy1*dy2 < 0)
  193. refPoint = C2;
  194. else
  195. refPoint = C1;
  196. break;
  197. }
  198. default:
  199. refPoint = C1;
  200. break;
  201. }
  202. //
  203. Font* font;
  204. if (fontFace == parent->defFontFace
  205. && fontHeight == parent->defFontHeight
  206. && fontStyle == parent->defFontStyle)
  207. font = parent->defFont;
  208. else
  209. font = new Font (CStringW(fontFace).GetBuffer(), fontHeight, fontStyle);
  210. RectF testRect (0, 0, 200, 200);
  211. RectF resultRect = testRect;
  212. g->MeasureString (CStringW(name).GetBuffer (), CStringW(name).GetLength(), font, testRect, &resultRect);
  213. RectF layoutRect = resultRect;
  214. float dx = refPoint.X - A.X;
  215. float dy = refPoint.Y - A.Y;
  216. if (fabsf (dx) > fabsf (dy))
  217. {
  218. if (dx > 0) //右
  219. layoutRect.Offset (refPoint.X, refPoint.Y - resultRect.Height/2);
  220. else //左
  221. layoutRect.Offset (refPoint.X - resultRect.Width, refPoint.Y - resultRect.Height/2);
  222. }
  223. else
  224. {
  225. REAL kx = fabsf (dx/dy*resultRect.Width/4);
  226. if (dx < 0)
  227. kx = -kx;
  228. if (dy > 0) //下
  229. layoutRect.Offset (refPoint.X - resultRect.Width/2 + kx, refPoint.Y);
  230. else //上
  231. layoutRect.Offset (refPoint.X - resultRect.Width/2 + kx, refPoint.Y - resultRect.Height);
  232. }
  233. SolidBrush fontBrush (fontColor);
  234. g->DrawString (CStringW(name).GetBuffer (), CStringW(name).GetLength(), font, layoutRect, NULL, &fontBrush);
  235. /*
  236. Pen outlinePen (parent->outlineColor, 1);
  237. g->DrawRectangle (&outlinePen, RectF(refPoint.X - 2, refPoint.Y - 2, 4, 4));
  238. g->DrawRectangle (&outlinePen, layoutRect);
  239. */
  240. if (font != parent->defFont)
  241. delete font;
  242. return 0;
  243. }