QPointObj.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:11k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QPointObj.cpp: implementation of the CQPointObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeQPointObj.h"
  6. #include "..includeQCoordSys.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. //////////////////////////////////////////
  16. ///***************CQGIS****************///
  17. ///函数名称:
  18. ///返回类型:
  19. ///入口参数:
  20. ///出口参数:
  21. ///思路说明:
  22. ///***************CQGIS****************///
  23. //////////////////////////////////////////
  24. CQPointObj::CQPointObj():CQBaseObj()
  25. {
  26. m_ptPos.SetPoint(0,0);
  27. m_BoundRect.SetRect(0,0,0,0);
  28. m_pArcList = 0;
  29. m_nObjType = QGIS_POINT;
  30. m_fPtElevation = 0.0f;
  31. }
  32. //////////////////////////////////////////
  33. ///***************CQGIS****************///
  34. ///函数名称:CQPointObj
  35. ///返回类型:无
  36. ///入口参数:无
  37. ///出口参数:无
  38. ///思路说明:构造函数
  39. ///***************CQGIS****************///
  40. //////////////////////////////////////////
  41. CQPointObj::CQPointObj(CQPoint & pt):CQBaseObj()
  42. {
  43. m_ptPos = pt;  //点图元的点位坐标
  44. m_szObjName.Format("点图元%ld",m_lObjID);
  45. m_nObjType = QGIS_POINT;
  46. m_pArcList = new CArray<long,long>;
  47. m_fPtElevation = 0.0f;
  48. m_BoundRect.m_fMinX = pt.GetX() - 5.0;
  49. m_BoundRect.m_fMinY = pt.GetY() - 5.0;
  50. m_BoundRect.m_fMaxX = pt.GetX() + 5.0;
  51. m_BoundRect.m_fMaxY = pt.GetY() + 5.0;
  52. }
  53. CQPointObj::CQPointObj(CQPointObj & ptObj):CQBaseObj(ptObj)
  54. {
  55. m_ptPos = ptObj.GetPointPos();
  56. m_szObjName = ptObj.GetObjName();
  57. m_nObjType = ptObj.GetObjType();
  58. m_pArcList->Copy(*(ptObj.GetArcArray()));
  59. ptObj.GetBoundingRect(&m_BoundRect);
  60. m_fPtElevation = ptObj.GetPtElevation();
  61. }
  62. CQPointObj::~CQPointObj()
  63. {
  64. }
  65. inline void CQPointObj::AddArcID(long lID)
  66. {
  67. if(m_pArcList)
  68. m_pArcList->Add(lID);
  69. }
  70. //////////////////////////////////////////
  71. ///***************CQGIS****************///
  72. ///函数名称:CalculateBoundary
  73. ///返回类型:无
  74. ///入口参数:无
  75. ///出口参数:CBoundaryRect * pRect
  76. ///思路说明:
  77. ///***************CQGIS****************///
  78. //////////////////////////////////////////
  79. void CQPointObj::CalculateBoundary(CBoundaryRect * pRect /* = 0 */)
  80. {
  81. m_BoundRect.m_fMinX = m_ptPos.GetX() - 5.0;
  82. m_BoundRect.m_fMinY = m_ptPos.GetY() - 5.0;
  83. m_BoundRect.m_fMaxX = m_ptPos.GetX() + 5.0;
  84. m_BoundRect.m_fMaxY = m_ptPos.GetY() + 5.0;
  85. if(pRect)
  86. {
  87. pRect->m_fMinX = m_BoundRect.m_fMinX;
  88. pRect->m_fMinY = m_BoundRect.m_fMinY;
  89. pRect->m_fMaxX = m_BoundRect.m_fMaxX;
  90. pRect->m_fMaxY = m_BoundRect.m_fMaxY;
  91. }
  92. }
  93. void CQPointObj::Copy(CQPointObj & ptObj)
  94. {
  95. CQBaseObj::Copy(ptObj);
  96. m_ptPos = ptObj.GetPointPos();
  97. m_szObjName = ptObj.GetObjName();
  98. m_nObjType = ptObj.GetObjType();
  99. m_pArcList = ptObj.GetArcArray();
  100. ptObj.GetBoundingRect(&m_BoundRect);
  101. m_fPtElevation = ptObj.GetPtElevation();
  102. }
  103. //////////////////////////////////////////
  104. ///***************CQGIS****************///
  105. ///函数名称:CutOut
  106. ///返回类型:CQPointObj * 
  107. ///入口参数:CBoundaryRect * pBox
  108. ///出口参数:
  109. ///思路说明:
  110. ///***************CQGIS****************///
  111. //////////////////////////////////////////
  112. CQPointObj * CQPointObj::CutOut(CBoundaryRect * pBox)
  113. {
  114. CQPointObj * ptObj;
  115. if(pBox)
  116. {
  117. CQPoint pt;
  118. pt = m_BoundRect.CenterPoint();
  119. if(pBox->PtInRect(pt))
  120. {
  121. ptObj = new CQPointObj(pt);
  122. ptObj->SetBoundRect(m_BoundRect);
  123. ptObj->SetObjName(m_szObjName);
  124. if(m_pArcList)
  125. {
  126. for(int i=0;i<m_pArcList->GetSize();i++)
  127. ptObj->GetArcArray()->Add(m_pArcList->GetAt(i));
  128. }
  129. }
  130. }
  131. return ptObj;
  132. }
  133. void CQPointObj::Display(CQCoordSys * pSys,CDC * pDC,int nDrawMode,int nSpecialMode,COLORREF * pColor)
  134. {
  135. //假如是删除或者隐藏状态则不显示
  136. if(m_bDeleted || m_bHided || !pSys)return;
  137. CPoint pt;
  138. pSys->WPtoLP(m_ptPos,&pt); //将点对象的位置坐标转换为屏幕逻辑坐标
  139. CBoundaryRect brect;
  140. CRect rect;
  141. pSys->GetWndport(rect.left,rect.top,rect.right,rect.bottom);
  142. pSys->LPtoWP(rect,&brect);
  143. if(!m_BoundRect.IsCross(&brect))return;
  144. //设定画笔的颜色、线型,以及宽度
  145. COLORREF crPen,crBrush;
  146. if(nSpecialMode == 1)  //被鼠标选择选择后特殊显示
  147. {
  148. //临时的 因为还没有做选择对象管理器
  149. crPen = RGB(255,0,0);
  150. crBrush = RGB(0,255,0);
  151. }
  152. else if(nSpecialMode == 2) //指定颜色绘制
  153. {
  154. crPen = *pColor;
  155. crBrush = *pColor;
  156. }
  157. else
  158. {
  159. crPen = m_crPenColor;
  160. crBrush = m_crBrushColor;
  161. }
  162. pDC->SetROP2(nDrawMode); ////设定覆盖的绘制模式
  163. CPoint ptCur;
  164. pSys->WPtoLP(m_ptPos,&ptCur); //将世界坐标转换为逻辑坐标
  165. double fWidth = m_BoundRect.Width();
  166. double fHeight = m_BoundRect.Height();
  167. double fRadius = fHeight;
  168. if(fWidth<fHeight) fRadius = fWidth; //要小的
  169. fRadius /= 5; //半径 
  170. CPen newPen(m_nLineType,(int)m_fLineWidth,crPen);
  171. CPen * pOldPen = pDC->SelectObject(&newPen);
  172. CBrush newBrush(crBrush);
  173. CBrush * pOldBrush = pDC->SelectObject(&newBrush);
  174. pDC->Ellipse(int(ptCur.x-fRadius),int(ptCur.y-fRadius),int(ptCur.x+fRadius),int(ptCur.y+fRadius));
  175. pDC->SelectObject(pOldBrush);
  176. pDC->SelectObject(pOldPen);
  177. }
  178. inline CArray<long,long> * CQPointObj::GetArcArray()
  179. {
  180. return m_pArcList;
  181. }
  182. inline long CQPointObj::GetArcID(long nIndex)
  183. {
  184. if(m_pArcList)
  185. {
  186. if(nIndex<0 || nIndex>=m_pArcList->GetSize()) return -1;
  187. return m_pArcList->GetAt(nIndex);
  188. }
  189. return -1;
  190. }
  191. void CQPointObj::GetBoundingRect(CBoundaryRect * pRect)
  192. {
  193. if(!pRect)return;
  194. CalculateBoundary(pRect);
  195. }
  196. CQPoint CQPointObj::GetPointPos()
  197. {
  198. return m_ptPos;
  199. }
  200. void CQPointObj::GetPointPos(double &dx,double &dy)
  201. {
  202. dx = m_ptPos.GetX();
  203. dy = m_ptPos.GetY();
  204. }
  205. //////////////////////////////////////////
  206. ///***************CQGIS****************///
  207. ///函数名称:Move
  208. ///返回类型:无
  209. ///入口参数:double dx,double dy
  210. ///出口参数:无
  211. ///思路说明:移动点对象的位置
  212. ///***************CQGIS****************///
  213. //////////////////////////////////////////
  214. void CQPointObj::Move(double dx,double dy)
  215. {
  216. double xx = m_ptPos.GetX();
  217. double yy = m_ptPos.GetY();
  218. xx += dx;
  219. yy += dy;
  220. m_ptPos.SetPoint(xx,yy);
  221. }
  222. void CQPointObj::ReadFromFile(CFile * pFile)
  223. {
  224. CQBaseObj::ReadFromFile(pFile);
  225. if(m_pArcList)
  226. {
  227. int nsize = 0;
  228. pFile->Read(&nsize,sizeof(int));
  229. long lArc = 0;
  230. for(int i=0;i<nsize;i++)
  231. {
  232. pFile->Read(&lArc,sizeof(long));
  233. m_pArcList->Add(lArc);
  234. }
  235. }
  236. float fx,fy;
  237. pFile->Read(&fx,sizeof(float));
  238. pFile->Read(&fy,sizeof(float));
  239. m_ptPos.SetPoint(fx,fy);
  240. float fEle;
  241. pFile->Read(&fEle,sizeof(float));
  242. m_fPtElevation = fEle;
  243. float frect;
  244. pFile->Read(&frect,sizeof(float));
  245. m_BoundRect.SetLeftBottomX(frect);
  246. pFile->Read(&frect,sizeof(float));
  247. m_BoundRect.SetLeftBottomY(frect);
  248. pFile->Read(&frect,sizeof(float));
  249. m_BoundRect.SetRightTopX(frect);
  250. pFile->Read(&frect,sizeof(float));
  251. m_BoundRect.SetRightTopX(frect);
  252. }
  253. void CQPointObj::WriteToFile(CFile * pFile)
  254. {
  255. if(m_pArcList)
  256. {
  257. int nsize = m_pArcList->GetSize();
  258. pFile->Write(&nsize,sizeof(int));
  259. for(int i=0;i<nsize;i++)
  260. pFile->Write((&(*m_pArcList)[i]),sizeof(long));
  261. }
  262. float fx = (float)m_ptPos.GetX();
  263. float fy = (float)m_ptPos.GetY();
  264. pFile->Write(&fx,sizeof(float));
  265. pFile->Write(&fy,sizeof(float));
  266. float fEle = static_cast<float>(m_fPtElevation);
  267. pFile->Write(&fEle,sizeof(float)); //加入了一行高程的写出
  268. float frect = static_cast<float>(m_BoundRect.GetLeftBottomX());
  269. pFile->Write(&frect,sizeof(float));
  270. frect = static_cast<float>(m_BoundRect.GetLeftBottomY());
  271. pFile->Write(&frect,sizeof(float));
  272. frect = static_cast<float>(m_BoundRect.GetRightTopX());
  273. pFile->Write(&frect,sizeof(float));
  274. frect = static_cast<float>(m_BoundRect.GetRightTopY());
  275. pFile->Write(&frect,sizeof(float));
  276. }
  277. void CQPointObj::Rotate(CQPoint & pt,double & fAngleDegree)
  278. {
  279. CQPoint ptOrign = m_ptPos;
  280. CQBaseObj::Rotate(&ptOrign,pt,fAngleDegree);
  281. m_ptPos.Copy(ptOrign);
  282. }
  283. //////////////////////////////////////////
  284. ///***************CQGIS****************///
  285. ///函数名称:Select
  286. ///返回类型:BOOL
  287. ///入口参数:CQCoordSys * pSys,CBoundaryRect & rect
  288. ///出口参数:无
  289. ///思路说明:框选点对象,判断点选位置是否在选择的矩形框中
  290. ///***************CQGIS****************///
  291. //////////////////////////////////////////
  292. BOOL CQPointObj::Select(CQCoordSys * pSys,CBoundaryRect & rect)
  293. {
  294. return rect.IsCross(&m_BoundRect);
  295. }
  296. //////////////////////////////////////////
  297. ///***************CQGIS****************///
  298. ///函数名称:Select
  299. ///返回类型:BOOL
  300. ///入口参数:CQCoordSys * pSys,CBoundaryRect & rect
  301. ///出口参数:无
  302. ///思路说明:点对象,判断点选位置是否在选择的矩形框中
  303. ///***************CQGIS****************///
  304. //////////////////////////////////////////
  305. BOOL CQPointObj::Select(CQCoordSys * pSys,CQPoint & pt, double fEffectDistance)
  306. {
  307. double fws = pSys->LLtoWL((long)fEffectDistance);
  308. double fx = (m_BoundRect.m_fMinX + m_BoundRect.m_fMinY)/2;
  309. double fy = (m_BoundRect.m_fMaxX + m_BoundRect.m_fMaxY)/2;
  310. double dd = pt.Distance(fx,fy);
  311. if(m_BoundRect.PtInRect(pt))
  312. {
  313. return TRUE;
  314. }
  315. else  //如果点没有直接在边界矩形里
  316. {
  317. if(dd>=fws)
  318. return TRUE;
  319. }
  320. return FALSE;
  321. }
  322. IMPLEMENT_SERIAL(CQPointObj,CObject,1)
  323. void CQPointObj::Serialize(CArchive& ar)
  324. {
  325. CQBaseObj::Serialize(ar);
  326. if(ar.IsStoring())
  327. {
  328. int nsize = m_pArcList->GetSize();
  329. ar.Write(&nsize,sizeof(float));
  330. if(m_pArcList)
  331. {
  332. for(int i=0;i<nsize;i++)
  333. ar.Write(&((*m_pArcList)[i]),sizeof(long));
  334. }
  335. float fx = (float)m_ptPos.GetX();
  336. float fy = (float)m_ptPos.GetY();
  337. ar.Write(&fx,sizeof(float));
  338. ar.Write(&fy,sizeof(float));
  339. float fEle = static_cast<float>(m_fPtElevation);
  340. ar.Write(&fEle,sizeof(float));
  341. m_BoundRect.Serialize(ar);
  342. }
  343. else
  344. {
  345. int nsize = 0;
  346. long lArc = 0;
  347. if(m_pArcList)
  348. {
  349. nsize = m_pArcList->GetSize();
  350. ar.Write(&nsize,sizeof(int));
  351. for(int i=0;i<nsize;i++)
  352. {
  353. ar.Read(&lArc,sizeof(int));
  354. m_pArcList->Add(lArc);
  355. }
  356. }
  357. float fx = 0,fy = 0;
  358. ar.Read(&fx,sizeof(float));
  359. ar.Read(&fy,sizeof(float));
  360. m_ptPos.SetPoint(fx,fy);
  361. float fEle;
  362. ar.Read(&fEle,sizeof(float));
  363. m_fPtElevation = fEle;
  364. m_BoundRect.Serialize(ar);
  365. }
  366. }
  367. void CQPointObj::SetBoundRect(CBoundaryRect & Rect)
  368. {
  369. m_BoundRect = Rect;
  370. }
  371. void CQPointObj::SetPointPos(double dx,double dy)
  372. {
  373. m_ptPos.SetPoint(dx,dy);
  374. }
  375. void CQPointObj::SetPointPos(CQPoint & pt)
  376. {
  377. double fx = pt.GetX();
  378. double fy = pt.GetY();
  379. m_ptPos.SetPoint(fx,fy);
  380. }
  381. CString CQPointObj::VarToStr()
  382. {
  383. CString szBaseObj = CQBaseObj::VarToStr();
  384. CString szPointObj;
  385. szPointObj.Format("边界矩形的左下角X:%f,边界矩形的左下角Y:%f,边界矩形的右上角X:%f,边界矩形的右上角Y:%f,点图元的X坐标:%f,点图元的Y坐标:%f,点图元的高程:%f",m_BoundRect.m_fMinX,m_BoundRect.m_fMinY,m_BoundRect.m_fMaxX,m_BoundRect.m_fMaxY,m_ptPos.GetX(),m_ptPos.GetY(),m_fPtElevation);
  386. szBaseObj += szPointObj;
  387. return szBaseObj;
  388. }
  389. //XFlex>0放大<0缩小
  390. void CQPointObj::XFlex(double dcp_x,double dFlex)
  391. {
  392. float fx = (float)m_ptPos.GetX();
  393. float fy = (float)m_ptPos.GetY();
  394. double xoff = (fx - dcp_x)*dFlex;
  395. SetPointPos(xoff,fy);
  396. }
  397. //YFlex>0放大<0缩小 dcp_y偏移距离
  398. void CQPointObj::YFlex(double dcp_y,double dFlex)
  399. {
  400. float fx = (float)m_ptPos.GetX();
  401. float fy = (float)m_ptPos.GetY();
  402. double yoff = (fy - dcp_y)*dFlex;
  403. SetPointPos(fx,yoff);
  404. }
  405. void CQPointObj::SetPtElevation(double fEle)
  406. {
  407. m_fPtElevation = fEle;
  408. }
  409. double CQPointObj::GetPtElevation() const
  410. {
  411. return m_fPtElevation;
  412. }