00001
00165 #ifndef INC_RVC_CAD_H
00166 #define INC_RVC_CAD_H
00167
00168 #ifndef INC_RVC_GEOMETRC_H
00169 #include <rvc/geometrc.h>
00170 #endif
00171
00172 #ifndef INC_RVC_CADELEMENT_H
00173 #include <rvc/cadelement.h>
00174 #endif
00175
00176
00177 #ifndef GENERATING_DOXYGEN_OUTPUT
00178
00179 class BITSET_UNOWNED;
00180 struct CADBLOCK;
00181 class POLYLINE;
00182 class POLYLINELIST;
00183 namespace RVC {
00184 class CADHANDLE;
00185 class DESCRIPTOR;
00186 class QSEARCHTREE;
00187 }
00188 #endif
00189
00190
00191 namespace RVC {
00192
00202 class CAD : public GEOMETRIC {
00203 public:
00204
00205 typedef INT32 CADBLOCKNUM;
00206 typedef RVC::CADELEMENT ELEMENT;
00207
00208 enum LINKTYPE {
00209 LINKTYPE_Internal = 0,
00210 LINKTYPE_MapInfo = 1,
00211 LINKTYPE_Shapefile = 3,
00212 LINKTYPE_DGN = 5,
00213 LINKTYPE_DWG = 6,
00214 LINKTYPE_Edit = 1000
00215 };
00216
00217 #ifndef GENERATING_DOXYGEN_OUTPUT
00218 class CONST_ELEMITERATOR;
00219 friend class CONST_ELEMITERATOR;
00220 class DRAW;
00221 class LINKPARMS;
00222 class MAKEPARMS;
00223 #endif // GENERATING_DOXYGEN_OUTPUT
00224
00226 CAD (
00227 );
00228
00230 CAD (
00231 const RVC::CAD& obj
00232 );
00233
00235 virtual ~CAD (
00236 );
00237
00239 RVC::CAD& operator= (
00240 const RVC::CAD& rhs
00241 );
00242
00244 INT32 AddElement (
00245 const ELEMENT& Element
00246 );
00247
00249 ERRVALUE CopyBlock (
00250 CADBLOCKNUM DestBlockNum,
00251 CADBLOCKNUM SrcBlockNum
00252 );
00253
00255 ERRVALUE DeleteElement (
00256 INT32 ElemNum
00257 );
00258
00259 ERRVALUE DeleteLastElement (
00260 );
00261
00264 INT32 DrawBlock (
00265 DRAW& Draw,
00266 INT32 BlockNum = 0,
00267 double MinChordDist = 0.0,
00268 DIMENSION dim = DIMENSION_2D
00269 ) const;
00270
00273 int DrawElement (
00274 DRAW& Draw,
00275 INT32 BlockNum,
00276 INT32 ElemNum,
00277 double MinChordDist = 0.0,
00278 DIMENSION dim = DIMENSION_2D
00279 ) const;
00280
00283 CONST_ELEMITERATOR ElementBegin (
00284 ) const;
00285
00288 CONST_ELEMITERATOR ElementEnd (
00289 ) const;
00290
00292 ERRVALUE EraseBlock (
00293 CADBLOCKNUM BlockNum
00294 );
00295
00297 ERRVALUE GetBlockDescriptor (
00298 INT32 BlockNum,
00299 DESCRIPTOR& Descriptor
00300 );
00301
00304 CADBLOCKNUM GetCurrentBlock (
00305 ) const;
00306
00309 LINKTYPE GetLinkType (
00310 ) const;
00311
00313 ERRVALUE GetMakeParms (
00314 RVC::CAD::MAKEPARMS& MakeParms
00315 ) const;
00316
00319 INT32 GetNextElemID (
00320 ) const;
00321
00324 INT32 GetNumBlocks (
00325 ) const;
00326
00328 ERRVALUE Link (
00329 const RVC::OBJECT& parent,
00330 const RVC::DESCRIPTOR& Descriptor,
00331 const LINKPARMS& LinkParms,
00332 const CREDENTIALS* Credentials RVC_DEFAULT_CREDENTIALS
00333 );
00334
00336 ERRVALUE Make (
00337 const RVC::OBJECT& parent,
00338 const RVC::DESCRIPTOR& Descriptor,
00339 const MAKEPARMS& MakeParms,
00340 const CREDENTIALS* Credentials RVC_DEFAULT_CREDENTIALS
00341 );
00342
00344 ERRVALUE Make (
00345 RVC::OBJITEM& ObjItem,
00346 const MAKEPARMS& MakeParms,
00347 #ifdef RVC_CREDENTIALS_MANDATORY
00348 const char* Source,
00349 const CREDENTIALS* Credentials
00350 #else
00351 const char* Source = 0,
00352 const CREDENTIALS* Credentials = 0
00353 #endif
00354 );
00355
00357 ERRVALUE ReadBlock (
00358 CADBLOCKNUM BlockNum,
00359 CADBLOCK& block,
00360 bool MakeCurrent = true
00361 ) const;
00362
00364 ERRVALUE ReadElement (
00365 ELEMENT& Element,
00366 DIMENSION dim = DIMENSION_2D
00367 ) const;
00368
00370 ERRVALUE ReadElement (
00371 INT32 ElemNum,
00372 ELEMENT& Element,
00373 DIMENSION dim = DIMENSION_2D
00374 ) const;
00375
00377 ERRVALUE Rewind (
00378 );
00379
00381 ERRVALUE SetBlockDescriptor (
00382 INT32 BlockNum,
00383 const DESCRIPTOR& Descriptor
00384 );
00385
00386 ERRVALUE SetEditBlock (
00387 INT32 BlockNum
00388 );
00389
00391 ERRVALUE SetNextElemID (
00392 INT32 NextElemID
00393 );
00394
00396 ERRVALUE SetPointType (
00397 POINTTYPE PointType
00398 );
00399
00401 ERRVALUE SortElement (
00402 INT32 ElemNum,
00403 bool SortToFront
00404 );
00405
00407 ERRVALUE SortElements (
00408 const BITSET_UNOWNED& SortSet,
00409 bool SortToFront
00410 );
00411
00413 ERRVALUE WriteBlock (
00414 CADBLOCKNUM BlockNum,
00415 CADBLOCK& block,
00416 bool MakeCurrent = true
00417 );
00418
00420 ERRVALUE WriteElement (
00421 INT32 ElemNum,
00422 const ELEMENT& Element
00423 );
00424
00426 ERRVALUE UpdateElement (
00427 INT32 ElemNum,
00428 const ELEMENT& Element
00429 );
00430
00431 ERRVALUE UpdateExtentsFromInsertElements (
00432 );
00433
00434 private:
00435 #ifndef GENERATING_DOXYGEN_OUTPUT
00436
00437 INT32 DrawBlock (DRAW& Draw, INT32 BlockNum, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00438 int DrawElement (DRAW& Draw, INT32 BlockNum, INT32 ElemNum, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00439 ERRVALUE DrawInsert (DRAW& Draw, INT32 BlockNum, const ELEMENT& Element, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00440
00441 ERRVALUE ExtractToCAD (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags, const SIMPLE_ARRAY<INT32>& FontTrans, const SIMPLE_ARRAY<INT32> PattTrans[RVC::PATTERNTYPE_NumTypes]) const;
00442 ERRVALUE ExtractToRegion (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00443 ERRVALUE ExtractToShape (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00444 ERRVALUE ExtractToVector (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00445
00446 INT64 GetCurrentPosition () const;
00447 void SetCurrentPosition (INT64 Position) const;
00448
00449 int SetupBlockTransList(ELEMTRANSLIST& TransList) const;
00450 int SetupDBRecordTransList(ELEMTRANSLIST& TransList) const;
00451 int SetupElementTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00452
00454 virtual ERRVALUE v_CloseObject ();
00455 virtual RVC::OBJTYPE v_GetDftObjectType () const;
00456 virtual bool v_IsObjectOpen () const;
00457 virtual ERRVALUE v_OpenObject (OPENMODE OpenMode, MDLGPARENT parent, const CREDENTIALS* Credentials);
00458
00460 virtual void v_GetExtents (DRECT3D &extents) const;
00461 virtual void v_GetScale (double& xscale, double& yscale) const;
00462 virtual double v_GetZScale () const;
00463 virtual double v_GetZOffset () const;
00464 virtual bool v_HasCapability (int Capability) const;
00465 virtual void v_SetScale (double xscale, double yscale);
00466 virtual void v_SetZOffset (double zoffset);
00467 virtual void v_SetZScale (double zscale);
00468
00470 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00471 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00472 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00473 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00474 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00475 virtual POINTTYPE v_GetPointType () const;
00476 virtual INT32 v_GetPointSize () const;
00477 virtual QSEARCHTREE* v_GetSearchTree (ELEMTYPE ElemType) const;
00478 virtual double v_GetTotalLineLength () const;
00479 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00480 virtual bool v_IsEmpty () const;
00481 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00482 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00483 virtual void v_SetSearchTree (ELEMTYPE ElemType, QSEARCHTREE* SearchTree) const;
00484 virtual ERRVALUE v_SetTotalLineLength (double length);
00485 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00486 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00487 virtual ERRVALUE v_UpdateExtents (const DRECT3D& extents);
00488
00490 virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList, COMPONENT Component) const;
00491 virtual INT32 v_GetAttachmentIndex (const RVC::ELEMENT& Element) const;
00492 virtual ERRVALUE v_ReadElement (INT32 ElemNum, POLYLINELIST& LineList, DIMENSION dim) const;
00493 virtual ERRVALUE v_ReadElement (INT32 ElemNum, POLYLINE& PointList, DIMENSION dim) const;
00494 virtual ERRVALUE v_ReadElement (INT32 ElemNum, REGION2D& Region, DIMENSION dim) const;
00495 virtual ERRVALUE v_ReadNextLabel (RVC::ELEMENT& Element, MILIST<LABEL>& Label, DIMENSION dim, STYLE* StyleObj) const;
00496 virtual ERRVALUE v_ReadNextLine (RVC::ELEMENT& Element, POLYLINELIST& LineList, DIMENSION dim) const;
00497 virtual ERRVALUE v_ReadNextPoint (RVC::ELEMENT& Element, POLYLINE& PointList, DIMENSION dim) const;
00498 virtual ERRVALUE v_ReadNextRegion (RVC::ELEMENT& Element, REGION2D& Region, DIMENSION dim) const;
00499 virtual ERRVALUE v_ReadRegion (const BITSET_UNOWNED& ElemSet, REGION2D& Region, DIMENSION dim, bool NoIslands) const;
00500
00501 CADHANDLE* m_CadHandle;
00502 LINKTYPE m_LinkType;
00503 mutable QSEARCHTREE *m_CADQTree;
00504 class OPTIMIZE;
00505 mutable OPTIMIZE* m_Optimize;
00506 #endif // GENERATING_DOXYGEN_OUTPUT
00507
00508 };
00509
00510
00513 class CAD::DRAW : public CADELEMENT::DRAW {
00514 public:
00515 DRAW () {}
00516 virtual ~DRAW () {}
00517
00520 int FilterElement (
00521 CADELEMENT& Element,
00522 const TRANS2D_AFFINE& BtoC,
00523 INT32 InsertLevel,
00524 INT32 ElemNum,
00525 const DRECT3D& Extents
00526 ) { return (v_FilterElement(Element, BtoC, InsertLevel, ElemNum, Extents)); }
00527
00528 private:
00529 #ifdef WIN32
00530 #pragma warning (push)
00531 #pragma warning (disable:4100) // Unreferenced formal parameter
00532 #endif
00533 virtual int v_FilterElement (CADELEMENT& Element, const TRANS2D_AFFINE& BtoC, INT32 InsertLevel, INT32 ElemNum, const DRECT3D& Extents) { return (1); }
00534 #ifdef WIN32
00535 #pragma warning (pop)
00536 #endif
00537 };
00538
00539
00544 class CAD::CONST_ELEMITERATOR {
00545 public:
00547 CONST_ELEMITERATOR (
00548 ) :
00549 m_CADObj(0),
00550 m_Element(0),
00551 m_ReachedEnd(false)
00552 {}
00553
00555 CONST_ELEMITERATOR (
00556 const CONST_ELEMITERATOR& rhs
00557 ) :
00558 m_Element(0),
00559 m_CADObj(rhs.m_CADObj),
00560 m_ReachedEnd(rhs.m_ReachedEnd)
00561 {
00562 if (rhs.m_Element != 0) m_Element = new ELEMENT(*rhs.m_Element);
00563 }
00564
00565 #ifndef GENERATING_DOXYGEN_OUTPUT
00567 CONST_ELEMITERATOR (
00568 const RVC::CAD* CADObj,
00569 INT32
00570 ) :
00571 m_Element(0),
00572 m_CADObj(CADObj),
00573 m_ReachedEnd(true)
00574 {}
00575
00577 CONST_ELEMITERATOR (
00578 const RVC::CAD* CADObj
00579 );
00580
00581 #endif // GENERATING_DOXYGEN_OUTPUT
00582
00584 virtual ~CONST_ELEMITERATOR (
00585 ) {
00586 delete m_Element;
00587 }
00588
00590 CONST_ELEMITERATOR& operator= (
00591 const CONST_ELEMITERATOR& rhs
00592 ) {
00593 if (this != &rhs) {
00594 delete m_Element;
00595 m_Element = 0;
00596 if (rhs.m_Element != 0) m_Element = new ELEMENT(*rhs.m_Element);
00597 m_CADObj = rhs.m_CADObj;
00598 m_ReachedEnd = rhs.m_ReachedEnd;
00599 }
00600 return (*this);
00601 }
00602
00604 const ELEMENT& operator* (
00605 ) const { return (*m_Element); }
00606
00608 const ELEMENT* operator-> (
00609 ) const { return (&**this); }
00610
00612 CONST_ELEMITERATOR& operator++ (
00613 );
00614
00616 bool operator== (
00617 const CONST_ELEMITERATOR& rhs
00618 ) const { return (m_CADObj == rhs.m_CADObj && m_ReachedEnd == rhs.m_ReachedEnd); }
00619
00621 bool operator!= (
00622 const CONST_ELEMITERATOR& rhs
00623 ) const { return (!(*this == rhs)); }
00624
00625 private:
00626 #ifndef GENERATING_DOXYGEN_OUTPUT
00627 ELEMENT* m_Element;
00628 const CAD* m_CADObj;
00629 bool m_ReachedEnd;
00630 #endif // GENERATING_DOXYGEN_OUTPUT
00631 };
00632
00633
00634 class CAD::LINKPARMS {
00635 public:
00636
00638 LINKPARMS (
00639 const FILEPATH& filename,
00640 LINKTYPE LinkType,
00641 CHAR_ENCODING encoding = CHAR_ENCODING_ASCII
00642 ) :
00643 m_filename(filename),
00644 m_LinkType(LinkType),
00645 m_encoding(encoding)
00646 {}
00647
00650 CHAR_ENCODING GetEncoding (
00651 ) const {return (m_encoding);}
00652
00655 const FILEPATH& GetLinkFilePath (
00656 ) const {return (m_filename);}
00657
00660 LINKTYPE GetLinkType (
00661 ) const {return (m_LinkType);}
00662
00664 void SetEncoding (
00665 CHAR_ENCODING encoding
00666 ) {m_encoding = encoding;}
00667
00669 void SetLinkFilePath (
00670 const FILEPATH& FilePath
00671 ) {m_filename = FilePath;}
00672
00674 void SetLinkType (
00675 LINKTYPE LinkType
00676 ) {m_LinkType = LinkType;}
00677
00678 private:
00679 #ifndef GENERATING_DOXYGEN_OUTPUT
00680 FILEPATH m_filename;
00681 LINKTYPE m_LinkType;
00682 CHAR_ENCODING m_encoding;
00683 #endif // GENERATING_DOXYGEN_OUTPUT
00684 };
00685
00686
00687 class CAD::MAKEPARMS : public RVC::GEOMETRIC::MAKEPARMSBASE {
00688 public:
00689
00691 MAKEPARMS (
00692 POINTTYPE PointType = POINTTYPE_2DXY
00693 ) :
00694 GEOMETRIC::MAKEPARMSBASE(PointType),
00695 m_NextElemID(1),
00696 m_EditBlockNum(-1)
00697 {}
00698
00700 MAKEPARMS (
00701 const RVC::CAD& Template
00702 );
00703
00705 MAKEPARMS (
00706 const RVC::OBJITEMLIST& GeoObjItemList
00707 );
00708
00711 INT32 GetEditBlockNum (
00712 ) const { return (m_EditBlockNum); }
00713
00716 INT32 GetNextElemID (
00717 ) const {return (m_NextElemID);}
00718
00721 void SetEditBlockNum (
00722 INT32 BlockNum
00723 ) { m_EditBlockNum = BlockNum; }
00724
00726 void SetNextElemID (
00727 INT32 NextElemID
00728 ) {m_NextElemID = NextElemID;}
00729
00730 private:
00731 #ifndef GENERATING_DOXYGEN_OUTPUT
00732 INT32 m_NextElemID;
00733 INT32 m_EditBlockNum;
00734 #endif // GENERATING_DOXYGEN_OUTPUT
00735 };
00736
00737 }
00738
00739 #endif // INC_RVC_CAD_H