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

GDI/图象编程

开发平台:

Visual C++

  1. // QLayerObj.cpp: implementation of the CQLayerObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeResource.h"
  6. #include "..includeQLayerObj.h"
  7. #include "..includeQPointObj.h"
  8. #include "..includeQLineObj.h"
  9. #include "..includeQSelObjManager.h"
  10. #include "..includeQBaseObj.h"
  11. #include "..includeQCoordSys.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. CQLayerObj::CQLayerObj()
  21. {
  22. m_lLayerID = SetLayerIDByRand();
  23. m_lMapID = 0;
  24. m_bShowed = TRUE;
  25. m_bDeleted = FALSE;
  26. m_bCanEdited = TRUE;
  27. m_szLayerName.Format("图层%ld",m_lLayerID);
  28. m_szLayerDis = m_szLayerName;
  29. InitLayerBoundary();
  30. }
  31. CQLayerObj::CQLayerObj(CQLayerObj & Layer)
  32. {
  33. m_lLayerID = Layer.GetLayerID();
  34. m_lMapID = Layer.GetMapID();
  35. m_bShowed = Layer.GetShowFlag();
  36. m_bDeleted = Layer.GetDeleteFlag();
  37. m_bCanEdited = Layer.GetEditFlag();
  38. m_szLayerName = Layer.GetLayerName();
  39. m_szLayerDis = Layer.GetLayerDis();
  40. m_Boundary.Copy(*(Layer.GetBoundary()));
  41. int nObjCount = Layer.GetObjCount();
  42. CQBaseObj * pObj = NULL;
  43. CQBaseObj * pTemp = NULL;
  44. for(int j=0;j<nObjCount;j++)
  45. {
  46. pObj = Layer.GetObj(j);
  47. switch(pObj->GetObjType()) 
  48. {
  49. case 1:
  50. {
  51. pTemp = new CQPointObj;
  52. break;
  53. }
  54. case 2:
  55. {
  56. pTemp = new CQLineObj;
  57. break;
  58. }
  59. case 3:
  60. {
  61. break;
  62. }
  63. case 4:
  64. {
  65. break;
  66. }
  67. case 5:
  68. {
  69. break;
  70. }
  71. default:
  72. {
  73. pTemp = NULL;
  74. break;
  75. }
  76. }
  77. if(pTemp)
  78. {
  79. pTemp->Copy(*pObj);
  80. AddObject(pTemp);
  81. }
  82. }
  83. }
  84. void CQLayerObj::Copy(CQLayerObj & Layer)
  85. {
  86. m_lLayerID = Layer.GetLayerID();
  87. m_lMapID = Layer.GetMapID();
  88. m_bShowed = Layer.GetShowFlag();
  89. m_bDeleted = Layer.GetDeleteFlag();
  90. m_bCanEdited = Layer.GetEditFlag();
  91. m_szLayerName = Layer.GetLayerName();
  92. m_szLayerDis = Layer.GetLayerDis();
  93. m_Boundary.Copy(*(Layer.GetBoundary()));
  94. int nObjCount = Layer.GetObjCount();
  95. CQBaseObj * pObj = NULL;
  96. CQBaseObj * pTemp = NULL;
  97. for(int j=0;j<nObjCount;j++)
  98. {
  99. pObj = Layer.GetObj(j);
  100. switch(pObj->GetObjType()) 
  101. {
  102. case 1:
  103. {
  104. pTemp = new CQPointObj;
  105. break;
  106. }
  107. case 2:
  108. {
  109. pTemp = new CQLineObj;
  110. break;
  111. }
  112. case 3:
  113. {
  114. break;
  115. }
  116. case 4:
  117. {
  118. break;
  119. }
  120. case 5:
  121. {
  122. break;
  123. }
  124. default:
  125. {
  126. pTemp = NULL;
  127. break;
  128. }
  129. }
  130. if(pTemp)
  131. {
  132. pTemp->Copy(*pObj);
  133. AddObject(pTemp);
  134. }
  135. }
  136. }
  137. CQLayerObj::~CQLayerObj()
  138. {
  139. }
  140. long CQLayerObj::SetLayerIDByRand()
  141. {
  142. long lLayerID = 0;   
  143. srand( (unsigned)time( NULL ) );
  144. while(1)
  145. {
  146.  int g = rand()%10; //个位
  147.  int s = rand()%10; //十位
  148.  int b = rand()%10; //百位
  149.  int q = rand()%10; //万位
  150.  int m = rand()%10; //十万位
  151.  int n = rand()%10; //百万位
  152.      lLayerID = n*100000+m*10000+q*1000+b*100+s*10+g;
  153.  if(lLayerID != m_lLayerID)
  154.  break;
  155. }
  156.  return lLayerID;
  157. }
  158. void CQLayerObj::SetLayerID(long lLayerID)
  159. {
  160. if(lLayerID == m_lLayerID)
  161. {
  162. m_lLayerID = SetLayerIDByRand();
  163. }
  164. m_lLayerID = lLayerID;
  165. }
  166. long CQLayerObj::GetLayerID()
  167. {
  168. return m_lLayerID;
  169. }
  170. void CQLayerObj::SetMapID(long lMapID)
  171. {
  172. m_lMapID = lMapID;
  173. }
  174. long CQLayerObj::GetMapID()
  175. {
  176. return m_lMapID;
  177. }
  178. void CQLayerObj::SetEditFlag(BOOL bCanEdit)
  179. {
  180. m_bCanEdited = bCanEdit;
  181. }
  182. BOOL CQLayerObj::GetEditFlag()
  183. {
  184. return m_bCanEdited;
  185. }
  186. void CQLayerObj::SetDeleteFlag(BOOL bDeleted)
  187. {
  188. m_bDeleted = bDeleted;
  189. }
  190. BOOL CQLayerObj::GetDeleteFlag()
  191. {
  192. return m_bDeleted;
  193. }
  194. void CQLayerObj::SetLayerDis(CString szLayerDis)
  195. {
  196. m_szLayerDis = szLayerDis;
  197. }
  198. CString CQLayerObj::GetLayerDis()
  199. {
  200. return m_szLayerDis;
  201. }
  202. void CQLayerObj::SetLayerName(CString szLayerName)
  203. {
  204. m_szLayerName = szLayerName;
  205. }
  206. CString CQLayerObj::GetLayerName()
  207. {
  208. return m_szLayerName;
  209. }
  210. void CQLayerObj::SetShowFlag(BOOL bShowed)
  211. {
  212. m_bShowed = bShowed;
  213. }
  214. BOOL CQLayerObj::GetShowFlag()
  215. {
  216. return m_bShowed;
  217. }
  218. BOOL CQLayerObj::IsEmpty()
  219. {
  220. int nObjCount = m_ObjList.GetSize();
  221. return nObjCount==0?TRUE:FALSE;
  222. }
  223. void CQLayerObj::InitLayerBoundary()
  224. {
  225. m_Boundary.m_fMinX = (double)LARGE_NUMBER;
  226. m_Boundary.m_fMinY = (double)LARGE_NUMBER;
  227. m_Boundary.m_fMaxX = -(double)LARGE_NUMBER;
  228. m_Boundary.m_fMaxY = -(double)LARGE_NUMBER;
  229. }
  230. void CQLayerObj::CalculateBoundary(CBoundaryRect * pRect)
  231. {
  232. InitLayerBoundary();
  233. CBoundaryRect bRect;
  234. int nCount = m_ObjList.GetSize();
  235. if(!pRect)
  236. {
  237. for(int i=0;i<nCount;i++)
  238. {
  239. if(m_ObjList[i]->GetObjDeleted() || m_ObjList[i]->GetObjHided())
  240. continue;
  241. m_ObjList[i]->GetBoundingRect(&bRect);
  242. m_Boundary.Union(&bRect);
  243. }
  244. }
  245. else
  246. {
  247. for(int i=0;i<nCount;i++)
  248. {
  249. if(m_ObjList[i]->GetObjDeleted() || m_ObjList[i]->GetObjHided())
  250. continue;
  251. m_ObjList[i]->GetBoundingRect(&bRect);
  252. m_Boundary.Union(&bRect);
  253. }
  254. *pRect = m_Boundary;
  255. }
  256. }
  257. void CQLayerObj::AddObject(CQBaseObj * pObj)
  258. {
  259. if(!pObj)return;  // 假如要添加的对象不存在 则返回
  260. pObj->SetObjLayerID(m_lLayerID);
  261. pObj->SetObjMapID(m_lMapID);
  262. m_ObjList.Add(pObj);
  263. CBoundaryRect bRect;
  264. pObj->GetBoundingRect(&bRect);  //添加对象的时候 要把对象的边界矩形也添加进去
  265. m_Boundary.Union(&bRect);
  266. }
  267. void CQLayerObj::RemoveObject(CQBaseObj * pObj)
  268. {
  269. if(!pObj)return;
  270. int nCount = m_ObjList.GetSize();
  271. if(nCount == 0)return;
  272. for(int i=0;i<nCount;i++)
  273. {
  274. if(pObj->GetObjID() == m_ObjList[i]->GetObjID())
  275. {
  276. m_ObjList.RemoveAt(i);
  277. return;
  278. }
  279. }
  280. }
  281. void CQLayerObj::Deleteobject(CQBaseObj * pObj)
  282. {
  283. if(!pObj)return;
  284. int nCount = m_ObjList.GetSize();
  285. if(nCount == 0)return;
  286. for(int i=0;i<nCount;i++)
  287. {
  288. if(pObj->GetObjID() == m_ObjList[i]->GetObjID())
  289. {
  290. m_ObjList.RemoveAt(i);
  291. break;
  292. }
  293. }
  294. delete pObj; //这就是Delete与Remove的区别
  295. }
  296. inline int CQLayerObj::GetObjCount()
  297. {
  298. return m_ObjList.GetSize();
  299. }
  300. CQBaseObj * CQLayerObj::GetObj(int nIndex)
  301. {
  302. if(nIndex<0 || nIndex>=GetObjCount()) return NULL;
  303. return m_ObjList[nIndex];
  304. }
  305. CQBaseObj * CQLayerObj::FindObj(long lObjID)
  306. {
  307. int nCount = GetObjCount();
  308. if(nCount == 0)return NULL;
  309. for(int i=0;i<nCount;i++)
  310. {
  311. if(m_ObjList[i]->GetObjID() == lObjID)
  312. {
  313. return m_ObjList[i];
  314. }
  315. }
  316. return NULL;
  317. }
  318. inline int CQLayerObj::GetObjIndex(long lObjID)
  319. {
  320. int nCount = 0;
  321. if((nCount = GetObjCount()) == 0)return -1;
  322. for(int i=0;i<nCount;i++)
  323. {
  324. if(m_ObjList[i]->GetObjID() == lObjID)
  325. return i;
  326. }
  327. return -1;
  328. }
  329. void CQLayerObj::ClearAll()
  330. {
  331. int nCount = 0;
  332. if((nCount = GetObjCount()) == 0)return;
  333. for(int i=0;i<nCount;i++)
  334. {
  335. delete m_ObjList[i];
  336. }
  337. m_ObjList.RemoveAll();
  338. CBoundaryRect r;
  339. m_Boundary = r;   // 边界矩形改变
  340. }
  341. CString CQLayerObj::VarToStr()
  342. {
  343. CString szObj,szLayer,szResult,szBoundary;
  344. szResult.Format("图层ID:%ld图层名称:%s图幅ID:%ld图层描述:%s",m_lLayerID,(const char *)m_szLayerName,m_lMapID,(const char *)m_szLayerDis);
  345. int nCount = GetObjCount();
  346. if(nCount == 0)
  347. return CString("图层为空!");
  348. for(int i=0;i<nCount;i++)
  349. {
  350. szObj = m_ObjList[i]->VarToStr();
  351. szLayer += szObj;
  352. }
  353. szBoundary = m_Boundary.VarToStr();
  354. szResult = szResult + szBoundary + szLayer;
  355. return szResult;
  356. }
  357. void CQLayerObj::Serialize(CArchive & ar)
  358. {
  359. if(ar.IsStoring())
  360. {
  361. for(int m=0;m<m_ObjList.GetSize();m++)
  362. {
  363. CQBaseObj * pp = m_ObjList[m];
  364. if(pp && pp->GetObjDeleted())
  365. {
  366. Deleteobject(pp);
  367. m--;
  368. }
  369. }
  370. ar.Write(&m_lLayerID,sizeof(long));
  371. ar.Write(&m_lMapID,sizeof(long));
  372. int i = m_szLayerName.GetLength();
  373. ar.Write(&i,sizeof(int));
  374. ar.Write((const char *)m_szLayerName,i);
  375. i = m_szLayerDis.GetLength();
  376. ar.Write(&i,sizeof(int));
  377. ar.Write((const char *)m_szLayerDis,i);
  378. i = m_ObjList.GetSize();
  379. ar.Write(&i,sizeof(int));
  380. for(int j=0;j<i;j++)
  381. {
  382. CQBaseObj * pObj = (CQBaseObj *)m_ObjList[j];
  383. short nObjType = pObj->GetObjType();
  384. ar.Write(&nObjType,sizeof(short));
  385. pObj->Serialize(ar);
  386. }
  387. ar.Write(&m_bDeleted,sizeof(BOOL));
  388. ar.Write(&m_bShowed,sizeof(BOOL));
  389. ar.Write(&m_bCanEdited,sizeof(BOOL));
  390. m_Boundary.Serialize(ar);
  391. }
  392. else
  393. {
  394. ar.Read(&m_lLayerID,sizeof(long));
  395. ar.Read(&m_lMapID,sizeof(long));
  396. int i = 0;
  397. ar.Read(&i,sizeof(int));
  398. char sz[255];
  399. ar.Read(sz,i);
  400. sz[i] = '';
  401. m_szLayerName = CString(sz);
  402. ar.Read(&i,sizeof(int));
  403. ar.Read(sz,i);
  404. sz[i] = '';
  405. m_szLayerDis = CString(sz);
  406. ar.Read(&i,sizeof(int));
  407. for(int j=0;j<i;j++)
  408. {
  409. short nObjType = -1;
  410. ar.Read(&nObjType,sizeof(short));
  411. switch(nObjType)
  412. {
  413. case QGIS_OBJ_POINT:
  414. {
  415. CQPointObj * pPoint = new CQPointObj;
  416. pPoint->Serialize(ar);
  417. pPoint->SetObjMapID(m_lMapID);
  418. pPoint->SetObjLayerID(m_lLayerID);
  419. m_ObjList.Add(pPoint);
  420. break;
  421. }
  422. case QGIS_OBJ_LINE:
  423. {
  424. CQLineObj * pLine = new CQLineObj;
  425. pLine->Serialize(ar);
  426. pLine->SetObjLayerID(m_lLayerID);
  427. pLine->SetObjMapID(m_lMapID);
  428. m_ObjList.Add(pLine);
  429. break;
  430. }
  431. default:
  432. break;
  433. }
  434. }
  435. ar.Read(&m_bDeleted,sizeof(BOOL));
  436. ar.Read(&m_bShowed,sizeof(BOOL));
  437. ar.Read(&m_bCanEdited,sizeof(BOOL));
  438. m_Boundary.Serialize(ar);
  439. }
  440. }
  441. CBoundaryRect * CQLayerObj::GetBoundary()
  442. {
  443. return &m_Boundary;
  444. }
  445. void CQLayerObj::Save(const char * sz)
  446. {
  447. CFile file ;
  448. CFileException e;
  449. if(!file.Open(sz,CFile::modeReadWrite|CFile::modeCreate,&e))
  450. {
  451. AfxMessageBox("保存文件失败!n");
  452. return ;
  453. }
  454. CArchive ar( &file, CArchive::store);
  455. this->Serialize(ar);
  456. ar.Close();
  457. file.Close();
  458. }
  459. //显示
  460. void CQLayerObj::Display(CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF* pColor)
  461. {
  462. if(GetDeleteFlag())return;
  463. if(!GetShowFlag()) return;
  464. CRect rect;
  465. pCoorSys->WPtoLP(m_Boundary,&rect); //将图层的边界矩形对象转换为逻辑坐标
  466. int nScreenWidth = pDC->GetDeviceCaps(HORZRES); //水平距离
  467. int nScreenHeight = pDC->GetDeviceCaps(VERTRES);//竖直距离
  468. if(rect.bottom<0)return;
  469. if(rect.top>nScreenHeight)return;
  470. if(rect.left>nScreenWidth)return;
  471. int ncount = m_ObjList.GetSize();
  472. if(ncount == 0) return;
  473. for(int i=0;i<ncount;i++)
  474. {
  475. CQBaseObj * pObj = m_ObjList.GetAt(i);
  476. if(!pObj || pObj->GetObjDeleted() || pObj->GetObjHided()) continue;
  477. pObj->Display(pCoorSys,pDC,nDrawMode,nSpecialMode,pColor);
  478. }
  479. }
  480. void CQLayerObj::Move(double dx,double dy)
  481. {
  482. InitLayerBoundary(); //初始化图层边界矩形
  483. CBoundaryRect BRect;
  484. int ncount = m_ObjList.GetSize();
  485. if(ncount == 0)return;
  486. for(int i=0;i<ncount;i++)
  487. {
  488. CQBaseObj * pObj = m_ObjList.GetAt(i);
  489. if(!pObj || pObj->GetObjDeleted()) return; //隐藏时的状态呢?
  490. pObj->Move(dx,dy);
  491. pObj->GetBoundingRect(&BRect);
  492. m_Boundary.Union(&BRect);  //等于重新计算边界矩形
  493. }
  494. }
  495. //打开图层
  496. BOOL CQLayerObj::Open(const char * sz)
  497. {
  498. CFile file ;
  499. CFileException e;
  500. if(!file.Open(sz,CFile::modeReadWrite,&e))
  501. {
  502. AfxMessageBox("打开文件失败!n");
  503. return -1;
  504. }
  505. CArchive ar( &file, CArchive::load);
  506. this->Serialize(ar);
  507. ar.Close();
  508. file.Close();
  509. //重新设置图层的名称(以打开文件明为标准)
  510. m_szLayerName.Empty();
  511. BYTE bAdd = 0;
  512. for(int i =strlen(sz)-1;i>=0;i--)
  513. {
  514. if(sz[i]=='.') 
  515. {
  516. bAdd = 1;
  517. continue ;
  518. }
  519. if(sz[i]=='\') 
  520. {
  521. bAdd=0;
  522. break;
  523. }
  524. if(bAdd) m_szLayerName.Insert(0,sz[i]);
  525. }
  526. return TRUE;
  527. }
  528. void CQLayerObj::ReadFromFile(CFile * pFile)
  529. {
  530. if(!pFile)return;
  531. pFile->Read(&m_lLayerID,sizeof(long));
  532. pFile->Read(&m_lMapID,sizeof(long));
  533. int ll = 0;
  534. char sz[255];
  535. pFile->Read(&ll,sizeof(int));
  536. pFile->Read(sz,ll);
  537. sz[ll]='';
  538. pFile->Read(&ll,sizeof(int));
  539. pFile->Read(sz,ll);
  540. sz[ll]='';
  541. pFile->Read(&m_bDeleted,sizeof(BOOL));
  542. pFile->Read(&m_bShowed,sizeof(BOOL));
  543. pFile->Read(&m_bCanEdited,sizeof(BOOL));
  544. ReadObjsFromFile(pFile);
  545. m_Boundary.ReadFromFile(pFile);
  546. }
  547. void CQLayerObj::WriteToFile(CFile * pFile)
  548. {
  549. if(!pFile)return;
  550. DeleteAllObjsHavaDeletedflag(); //删除所有带删除标志的对象
  551. pFile->Write(&m_lLayerID,sizeof(long)); //存图层ID
  552. pFile->Write(&m_lMapID,sizeof(long));
  553. int ll = m_szLayerName.GetLength();
  554. pFile->Write(&ll,sizeof(int));
  555. pFile->Write((const char *)m_szLayerName,sizeof(ll));
  556. ll = m_szLayerDis.GetLength();
  557. pFile->Write(&ll,sizeof(int));
  558. pFile->Write((const char *)m_szLayerDis,sizeof(ll));
  559. pFile->Write(&m_bDeleted,sizeof(BOOL));
  560. pFile->Write(&m_bShowed,sizeof(BOOL));
  561. pFile->Write(&m_bCanEdited,sizeof(BOOL));
  562. WriteObjsToFile(pFile);
  563. m_Boundary.WriteToFile(pFile);
  564. }
  565. //删除所有带删除标志的对象
  566. void CQLayerObj::DeleteAllObjsHavaDeletedflag()
  567. {
  568. int nDelObjCount = 0;
  569. CQBaseObj * pObj = 0;
  570. int nCount = m_ObjList.GetSize();
  571. for(int i=0;i<nCount;i++)
  572. {
  573. pObj = m_ObjList[i];
  574. if(pObj->GetObjDeleted()) //假如有删除标志
  575. {
  576. delete pObj;
  577. m_ObjList.RemoveAt(i);
  578. nDelObjCount++;
  579. i--;
  580. }
  581. }
  582. }
  583. void CQLayerObj::WriteObjsToFile(CFile * pFile)
  584. {
  585. if(!pFile)return;
  586. int nCount = m_ObjList.GetSize();
  587. if(nCount == 0)return;
  588. DeleteAllObjsHavaDeletedflag();
  589. pFile->Write(&nCount,sizeof(int));
  590. for(int i=0;i<nCount;i++)
  591. {
  592. CQBaseObj * pObj = m_ObjList[i];
  593. if(pObj)
  594. {
  595. WORD type = pObj->GetObjType();
  596. pFile->Write(&type,sizeof(WORD));
  597. pObj->WriteToFile(pFile);
  598. }
  599. }
  600. }
  601. void CQLayerObj::ReadObjsFromFile(CFile * pFile)
  602. {
  603. if(!pFile)return;
  604. int nCount = 0;
  605. pFile->Read(&nCount,sizeof(int));
  606. if(nCount == 0)return;
  607. int k = m_ObjList.GetSize();
  608. int i=0;
  609. for(i=0;i<k;i++)
  610. {
  611. delete m_ObjList[i];
  612. }
  613. m_ObjList.RemoveAll();
  614. WORD type;
  615. for(i=0;i<nCount;i++)
  616. {
  617. pFile->Read(&type,sizeof(WORD));
  618. switch(type)
  619. {
  620. case QGIS_OBJ_POINT: //点
  621. {
  622. CQPointObj * p = new CQPointObj;
  623. p->ReadFromFile(pFile);
  624. m_ObjList.Add(p);
  625. break;
  626. }
  627. case QGIS_OBJ_LINE:
  628. {
  629. CQLineObj * p = new CQLineObj;
  630. p->ReadFromFile(pFile);
  631. m_ObjList.Add(p);
  632. break;
  633. }
  634. default:
  635. break;
  636. }
  637. }
  638. }
  639. void CQLayerObj::Rotate(CQPoint & pt,double fRotateAngle)
  640. {
  641. int nCount = m_ObjList.GetSize();
  642. if(nCount == 0)return;
  643. InitLayerBoundary();
  644. CBoundaryRect BRect;
  645. for(int i=0;i<nCount;i++)
  646. {
  647. CQBaseObj * pObj = m_ObjList.GetAt(i);
  648. if(pObj->GetObjDeleted())continue;
  649. pObj->Rotate(pt,fRotateAngle);
  650. pObj->GetBoundingRect(&BRect);
  651. m_Boundary.Union(&BRect);
  652. }
  653. }
  654. CQBaseObj * CQLayerObj::Select(CQSelObjManager * pSelObjs,CQCoordSys *pCoorSys,CQPoint & pt, double fEffectedDistance)
  655. {
  656. int nCount = m_ObjList.GetSize();
  657. if(nCount == 0)return NULL;
  658. CQBaseObj * p = NULL;
  659. CQBaseObj * pcur = NULL;
  660. for(int i=0;i<nCount;i++)
  661. {
  662. p = m_ObjList[i];
  663. if(!p || p->GetObjDeleted() || p->GetObjHided() || p->GetObjSeleted())
  664. continue;
  665. if(p->Select(pCoorSys,pt,fEffectedDistance))
  666. {
  667. if(!pcur)
  668. pcur = p;
  669. pSelObjs->AddSelObj(p);
  670. }
  671. }
  672. return pcur;
  673. }
  674. int CQLayerObj::Select(CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect & rectSel)
  675. {
  676. if(!rectSel.IsCross(&m_Boundary))
  677. return 0;
  678. CQBaseObj * p = 0;
  679. int nCount = m_ObjList.GetSize();
  680. if(nCount == 0)return 0;
  681. int k = 0;
  682. for(int i=0;i<nCount;i++)
  683. {
  684. p = m_ObjList[i];
  685. if(!p || p->GetObjHided() || p->GetObjDeleted() || p->GetObjSeleted())
  686. continue;
  687. if(p->Select(pCoorSys,rectSel))
  688. {
  689. pSelObjs->AddSelObj(p);
  690. k++;
  691. }
  692. }
  693. return k;
  694. }
  695. CQBaseObj * CQLayerObj::SingleSelect(CQSelObjManager * pSelObjs,CQCoordSys * pCoordSys,CQPoint & pt,double fEffecttedDistance,int nSelectObjType /* = 0 */)
  696. {
  697. CQBaseObj * pObj = NULL;
  698. if( nSelectObjType!=QGIS_OBJ_POINT 
  699. &&  nSelectObjType!=QGIS_OBJ_LINE 
  700. &&  nSelectObjType!=QGIS_OBJ_LABEL 
  701. &&  nSelectObjType!=QGIS_OBJ_CIRCLE 
  702. &&  nSelectObjType!=QGIS_PBJ_POLYGON) //如果指定无效的对象类型
  703. {
  704. for(int i=0;i<m_ObjList.GetSize();i++)
  705. {
  706. pObj = m_ObjList[i];
  707. if(!pObj || pObj->GetObjDeleted() || pObj->GetObjHided() || pObj->GetObjSeleted()) continue;
  708. if(pObj->Select(pCoordSys,pt,fEffecttedDistance))
  709. {
  710. pSelObjs->AddSelObj(pObj);
  711. return pObj;
  712. }
  713. }
  714. }
  715. else
  716. {
  717. for(int i=0;i<m_ObjList.GetSize();i++)
  718. {
  719. pObj = m_ObjList[i];
  720. if(!pObj || pObj->GetObjDeleted() || pObj->GetObjHided() || pObj->GetObjSeleted()) continue;
  721. if(pObj->GetObjType()!=nSelectObjType)continue;
  722. if(pObj->Select(pCoordSys,pt,fEffecttedDistance))
  723. {
  724. pSelObjs->AddSelObj(pObj);
  725. return pObj;
  726. }
  727. }
  728. }
  729. return NULL;
  730. }
  731. void CQLayerObj::XFlex(double dcp_x,double dFlex)
  732. {
  733. int nObjs = GetObjCount();
  734. for(int i=0;i<nObjs;i++)
  735. {
  736. CQBaseObj * pobj = m_ObjList.GetAt(i);
  737. if(pobj && !pobj->GetObjDeleted() && !pobj->GetObjHided())
  738. {
  739. pobj->XFlex(dcp_x,dFlex);
  740. }
  741. }
  742. }
  743. void CQLayerObj::YFlex(double dcp_y,double dFley)
  744. {
  745. int nObjs = GetObjCount();
  746. for(int i=0;i<nObjs;i++)
  747. {
  748. CQBaseObj * pobj = m_ObjList.GetAt(i);
  749. if(pobj && !pobj->GetObjDeleted() && !pobj->GetObjHided())
  750. {
  751. pobj->XFlex(dcp_y,dFley);
  752. }
  753. }
  754. }