00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 #ifndef INC_RVC_CAD_H
00219 #define INC_RVC_CAD_H
00220
00221 #ifndef INC_RVC_GEOMETRC_H
00222 #include <rvc/geometrc.h>
00223 #endif
00224
00225 #ifndef INC_MI32_RVCCAD_H
00226 #include <mi32/rvccad.h>
00227 #endif
00228
00229 #ifndef INC_MI32_POLYLINE_H
00230 #include <mi32/polyline.h>
00231 #endif
00232
00233 #ifndef INC_MI32_SCRNUNIT_H
00234 #include <mi32/scrnunit.h>
00235 #endif
00236
00237 #ifndef INC_RVC_STYLE_H
00238 #include <rvc/style.h>
00239 #endif
00240 #include <utility>
00241
00242 #ifndef GENERATING_DOXYGEN_OUTPUT
00243
00244 class BITSET_UNOWNED;
00245 struct CADBLOCK;
00246 class LABELFRAMEPARMS;
00247 struct LINESTYLE;
00248 class PLANECONIC;
00249 struct POINTSTYLE;
00250 struct POLYSTYLE;
00251 class SUBREGION2D;
00252 struct TEXTSTYLE;
00253 class TRANS2D_AFFINE;
00254 #endif // GENERATING_DOXYGEN_OUTPUT
00255
00256 namespace RVC {
00257
00258 #ifndef GENERATING_DOXYGEN_OUTPUT
00259
00260 class CADHANDLE;
00261 class QSEARCHTREE;
00262 #endif // GENERATING_DOXYGEN_OUTPUT
00263
00264 class CAD : public GEOMETRIC {
00265 public:
00266
00267 typedef INT32 CADBLOCKNUM;
00268
00269 enum LINKTYPE {
00270 LINKTYPE_Internal = 0,
00271 LINKTYPE_MapInfo = 1,
00272 LINKTYPE_AtlasGIS = 2,
00273 LINKTYPE_Shapefile = 3,
00274 LINKTYPE_DGN = 5,
00275 LINKTYPE_DWG = 6,
00276 LINKTYPE_Edit = 1000
00277 };
00278
00279 #ifndef GENERATING_DOXYGEN_OUTPUT
00280 class CONST_ELEMITERATOR;
00281 friend class CONST_ELEMITERATOR;
00282 class DRAW;
00283 class ELEMENT;
00284 class LINKPARMS;
00285 class MAKEPARMS;
00286 #endif // GENERATING_DOXYGEN_OUTPUT
00287
00288
00289 CAD (
00290 );
00291
00292
00293 CAD (
00294 const RVC::CAD& obj
00295 );
00296
00297
00298 virtual ~CAD (
00299 );
00300
00301
00302 RVC::CAD& operator= (
00303 const RVC::CAD& rhs
00304 );
00305
00306
00307 INT32 AddElement (
00308 const ELEMENT& Element
00309 );
00310
00311
00312 ERRVALUE CopyBlock (
00313 CADBLOCKNUM DestBlockNum,
00314 CADBLOCKNUM SrcBlockNum
00315 );
00316
00317
00318 ERRVALUE DeleteElement (
00319 INT32 ElemNum
00320 );
00321
00322 ERRVALUE DeleteLastElement (
00323 );
00324
00325
00326
00327 INT32 DrawBlock (
00328 DRAW& Draw,
00329 INT32 BlockNum = 0,
00330 double MinChordDist = 0.0,
00331 DIMENSION dim = DIMENSION_2D
00332 ) const;
00333
00334
00335
00336 int DrawElement (
00337 DRAW& Draw,
00338 INT32 BlockNum,
00339 INT32 ElemNum,
00340 double MinChordDist = 0.0,
00341 DIMENSION dim = DIMENSION_2D
00342 ) const;
00343
00344
00345
00346 CONST_ELEMITERATOR ElementBegin (
00347 ) const;
00348
00349
00350
00351 CONST_ELEMITERATOR ElementEnd (
00352 ) const;
00353
00354
00355 ERRVALUE EraseBlock (
00356 CADBLOCKNUM BlockNum
00357 );
00358
00359
00360
00361 CADBLOCKNUM GetCurrentBlock (
00362 ) const;
00363
00364
00365
00366 LINKTYPE GetLinkType (
00367 ) const;
00368
00369
00370 ERRVALUE GetMakeParms (
00371 RVC::CAD::MAKEPARMS& MakeParms
00372 ) const;
00373
00374
00375
00376 INT32 GetNextElemID (
00377 ) const;
00378
00379
00380
00381 INT32 GetNumBlocks (
00382 ) const;
00383
00384
00385 ERRVALUE Link (
00386 const RVC::OBJECT& parent,
00387 const RVC::DESCRIPTOR& Descriptor,
00388 const LINKPARMS& LinkParms
00389 );
00390
00391
00392
00393 DEPRECATED ERRVALUE Link (
00394 const RVC::OBJECT& parent,
00395 const RVC::OBJECTNAME& name,
00396 const RVC::OBJECTDESC& desc,
00397 const LINKPARMS& LinkParms,
00398 const char* Source = 0
00399 );
00400
00401
00402 ERRVALUE Make (
00403 const RVC::OBJECT& parent,
00404 const RVC::DESCRIPTOR& Descriptor,
00405 const MAKEPARMS& MakeParms
00406 );
00407
00408
00409
00410 DEPRECATED ERRVALUE Make (
00411 const RVC::OBJECT& parent,
00412 const RVC::OBJECTNAME& name,
00413 const RVC::OBJECTDESC& desc,
00414 const MAKEPARMS& MakeParms,
00415 const char* Source = 0
00416 );
00417
00418
00419 ERRVALUE Make (
00420 const RVC::OBJITEM& ObjItem,
00421 const MAKEPARMS& MakeParms,
00422 const char* Source = 0
00423 );
00424
00425
00426 ERRVALUE ReadBlock (
00427 CADBLOCKNUM BlockNum,
00428 CADBLOCK& block,
00429 bool MakeCurrent = true
00430 ) const;
00431
00432
00433 ERRVALUE ReadElement (
00434 ELEMENT& Element,
00435 DIMENSION dim = DIMENSION_2D
00436 ) const;
00437
00438
00439 ERRVALUE ReadElement (
00440 INT32 ElemNum,
00441 ELEMENT& Element,
00442 DIMENSION dim = DIMENSION_2D
00443 ) const;
00444
00445
00446 ERRVALUE Rewind (
00447 );
00448
00449 ERRVALUE SetEditBlock (
00450 INT32 BlockNum
00451 );
00452
00453
00454 ERRVALUE SetNextElemID (
00455 INT32 NextElemID
00456 );
00457
00458
00459 ERRVALUE SetPointType (
00460 POINTTYPE PointType
00461 );
00462
00463
00464 ERRVALUE SortElement (
00465 INT32 ElemNum,
00466 bool SortToFront
00467 );
00468
00469
00470 ERRVALUE SortElements (
00471 const BITSET_UNOWNED& SortSet,
00472 bool SortToFront
00473 );
00474
00475
00476 ERRVALUE WriteBlock (
00477 CADBLOCKNUM BlockNum,
00478 CADBLOCK& block,
00479 bool MakeCurrent = true
00480 );
00481
00482
00483 ERRVALUE WriteElement (
00484 INT32 ElemNum,
00485 const ELEMENT& Element
00486 );
00487
00488
00489 ERRVALUE UpdateElement (
00490 INT32 ElemNum,
00491 const ELEMENT& Element
00492 );
00493
00494 ERRVALUE UpdateExtentsFromInsertElements (
00495 );
00496
00497 private:
00498 #ifndef GENERATING_DOXYGEN_OUTPUT
00499
00500 ERRVALUE CreateAndPopulateSearchTree (INT32 InitialNumElements, const DRECT2D& InitialExtents, QSEARCHTREE& SearchTree) const;
00501 INT32 DrawBlock (DRAW& Draw, INT32 BlockNum, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00502 int DrawElement (DRAW& Draw, INT32 BlockNum, INT32 ElemNum, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00503 ERRVALUE DrawInsert (DRAW& Draw, INT32 BlockNum, const ELEMENT& Element, const TRANS2D_AFFINE& BlockToCAD, INT32 InsertLevel, double MinChordDist, DIMENSION dim) const;
00504
00505 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::STYLE::PATTERN_NumTypes]) const;
00506 ERRVALUE ExtractToRegion (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00507 ERRVALUE ExtractToVector (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00508
00509 INT64 GetCurrentPosition () const;
00510 void SetCurrentPosition (INT64 Position) const;
00511
00512 int SetupBlockTransList(ELEMTRANSLIST& TransList) const;
00513 int SetupDBRecordTransList(ELEMTRANSLIST& TransList) const;
00514 int SetupElementTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00515
00516
00517 virtual ERRVALUE v_CloseObject ();
00518 virtual RVC::OBJTYPE v_GetDftObjectType () const;
00519 virtual bool v_IsObjectOpen () const;
00520 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);
00521
00522
00523 virtual void v_GetExtents (DRECT3D &extents) const;
00524 virtual void v_GetScale (double& xscale, double& yscale) const;
00525 virtual double v_GetZScale () const;
00526 virtual double v_GetZOffset () const;
00527 virtual bool v_HasCapability (int Capability) const;
00528 virtual void v_SetScale (double xscale, double yscale);
00529 virtual void v_SetZOffset (double zoffset);
00530 virtual void v_SetZScale (double zscale);
00531
00532
00533 virtual ERRVALUE v_AddSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType, const DRECT2D& Extents);
00534 virtual ERRVALUE v_BuildSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00535 virtual ERRVALUE v_ClearSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00536 virtual ERRVALUE v_CopySearchTreeElement (INT32 SourceElement, INT32 DestElement, ELEMTYPE ElemType, const DRECT2D& Extents);
00537 virtual ERRVALUE v_DeleteSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType);
00538 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00539 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00540 virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList, COMPONENT Component) const;
00541 virtual ERRVALUE v_FindElementDrawSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00542 virtual ERRVALUE v_FindElementSearchSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00543 virtual INT32 v_GetAttachmentIndex (const RVC::ELEMENT& Element) const;
00544 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00545 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00546 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00547 virtual POINTTYPE v_GetPointType () const;
00548 virtual INT32 v_GetPointSize () const;
00549 virtual double v_GetTotalLineLength () const;
00550 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00551 virtual bool v_IsEmpty () const;
00552 virtual ERRVALUE v_SaveSearchTrees ();
00553 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00554 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00555 virtual bool v_SetSearchTree (ELEMTYPE ElemType, RVC::QSEARCHTREE* SearchTree, bool ReplaceExisting);
00556 virtual ERRVALUE v_SetTotalLineLength (double length);
00557 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00558 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00559 virtual ERRVALUE v_UpdateExtents (const DRECT3D& extents);
00560
00561 CADHANDLE* m_CadHandle;
00562 LINKTYPE m_LinkType;
00563 mutable QSEARCHTREE *m_CADQTree;
00564 class OPTIMIZE;
00565 mutable OPTIMIZE* m_Optimize;
00566 mutable bool m_SetInstanceData;
00567 #endif
00568
00569 };
00570
00571
00572
00573
00574 class CAD::ELEMENT {
00575 public:
00576
00577
00578 enum TYPE {
00579 TYPE_Insert = 0,
00580 TYPE_Point = 1,
00581 TYPE_Circle = 2,
00582 TYPE_Arc = 3,
00583 TYPE_ArcChord = 4,
00584 TYPE_Text = 5,
00585 TYPE_Line = 7,
00586 TYPE_RotationBox = 8,
00587 TYPE_Polygon = 9,
00588 TYPE_Mesh = 10,
00589 TYPE_Ellipse = 11,
00590 TYPE_EllipticalArc = 12,
00591 TYPE_ArcWedge = 14,
00592 TYPE_EllipticalArcWedge = 15,
00593 TYPE_EllipticalArcChord = 16,
00594 TYPE_MultiLine = 17,
00595 TYPE_MultiPoint = 18,
00596 TYPE_MultiPolygon = 19,
00597 TYPE_LAST
00598 };
00599
00600 #ifndef GENERATING_DOXYGEN_OUTPUT
00601 class BOX;
00602 class DRAW;
00603 class INSERT;
00604 class MESH;
00605 #endif
00606
00607
00608 ELEMENT (
00609 );
00610
00611
00612 ELEMENT (
00613 const ELEMENT& rhs
00614 );
00615
00616
00617 ~ELEMENT (
00618 );
00619
00620
00621 ELEMENT& operator= (
00622 const ELEMENT& rhs
00623 );
00624
00625
00626 void Clear (
00627 );
00628
00629
00630
00631 double ComputeDistanceFrom (
00632 const DPOINT2D& point
00633 ) const;
00634
00635
00636
00637
00638 bool ComputeExtents (
00639 DRECT3D& Extents
00640 ) const;
00641
00642
00643
00644 bool ComputeInsertBorder (
00645 const CAD& CadObj,
00646 POLYLINE& Border
00647 ) const;
00648
00649
00650
00651 bool ComputeInsertExtents (
00652 const CAD& CadObj,
00653 DRECT3D& Extents
00654 ) const;
00655
00656
00657 void ConvertForward (
00658 const TRANS2D_AFFINE& taf
00659 );
00660
00661
00662 ERRVALUE ConvertForward (
00663 const TRANS2D_MAPGEN& tmg
00664 );
00665
00666
00667 ERRVALUE ConvertForwardDense (
00668 const TRANS2D_MAPGEN& tmg
00669 );
00670
00671
00672 void ConvertForward (
00673 const TRANS3D& t3d
00674 );
00675
00676
00677 void ConvertInverse (
00678 const TRANS2D_AFFINE& taf
00679 );
00680
00681
00682 ERRVALUE ConvertInverse (
00683 const TRANS2D_MAPGEN& tmg
00684 );
00685
00686
00687 ERRVALUE ConvertInverseDense (
00688 const TRANS2D_MAPGEN& tmg
00689 );
00690
00691
00692 void ConvertInverse (
00693 const TRANS3D& t3d
00694 );
00695
00696
00697
00698
00699
00700
00701 ERRVALUE DrawElement (
00702 DRAW& Draw,
00703 const TRANS2D_AFFINE& BlockToCAD,
00704 double MinChordDist = 0.0
00705 );
00706
00707
00708
00709 ELEMTYPE GetAppoxElementType (
00710 ) const;
00711
00712
00713
00714 bool GetBox (
00715 BOX& Box
00716 ) const;
00717
00718
00719
00720 INT32 GetDatabaseIndex (
00721 ) const;
00722
00723
00724
00725 TYPE GetElementType (
00726 ) const;
00727
00728
00729 static TEXTID GetElementTypeTextID (
00730 TYPE CadType
00731 );
00732
00733
00734
00735 bool GetElementStyle (
00736 TEXTSTYLE& textstyle
00737 ) const;
00738
00739
00740
00741 bool GetElementStyle (
00742 POINTSTYLE& pointstyle
00743 ) const;
00744
00745
00746
00747 bool GetElementStyle (
00748 LINESTYLE& linestyle
00749 ) const;
00750
00751
00752
00753 bool GetElementStyle (
00754 POLYSTYLE& polystyle
00755 ) const;
00756
00757
00758
00759 bool GetGMLElement (
00760 MISTRING& GMLElement,
00761 const MILIST<std::pair<MISTRING, MISTRING> >& AttribList
00762 );
00763
00764
00765
00766 bool GetInsert (
00767 INSERT& Insert
00768 ) const;
00769
00770
00771
00772 bool GetLabelFrameParms (
00773 LABELFRAMEPARMS& FrameParms
00774 ) const;
00775
00776
00777
00778 bool GetLines (
00779 POLYLINELIST& PolyLineList
00780 ) const;
00781
00782
00783
00784 bool GetMesh (
00785 MESH& Mesh
00786 ) const;
00787
00788
00789
00790 bool GetPlaneConic (
00791 PLANECONIC& Conic
00792 ) const;
00793
00794
00795
00796 bool GetPoints (
00797 POLYLINE& PointArray
00798 ) const;
00799
00800
00801
00802 bool GetRegion (
00803 REGION2D& Region,
00804 bool Validate = false
00805 ) const;
00806
00807
00808
00809 bool GetSubRegion (
00810 SUBREGION2D& SubRegion,
00811 bool Validate = false
00812 ) const;
00813
00814
00815
00816 bool GetTextElement (
00817 POLYLINELIST& PolyLineList,
00818 MISTRING& text,
00819 TEXTSTYLE& style,
00820 LABELFRAMEPARMS* FrameParms = 0
00821 ) const;
00822
00823
00824 SCREENUNIT GetWidthUnits (
00825 ) const;
00826
00827
00828 double GetZValue (
00829 ) const;
00830
00831
00832
00833 bool IsBaselineFit (
00834 ) const;
00835
00836
00837
00838 bool IsBaselineSplineFit (
00839 ) const;
00840
00841
00842
00843 bool IsClipUnderSet (
00844 ) const;
00845
00846
00847
00848 bool IsInsertion (
00849 ) const;
00850
00851
00852
00853 bool IsLine (
00854 ) const;
00855
00856
00857
00858 bool IsPlaneConic (
00859 ) const;
00860
00861
00862
00863 bool IsPoint (
00864 ) const;
00865
00866
00867
00868 bool IsPointInside (
00869 const DPOINT2D& pt
00870 ) const;
00871
00872
00873
00874 bool IsPolygon (
00875 ) const;
00876
00877
00878
00879 bool IsText (
00880 ) const;
00881
00882
00883
00884 bool IsValid (
00885 ) const;
00886
00887
00888 void SetBox (
00889 const BOX& Box
00890 );
00891
00892
00893 void SetBaselineFit (
00894 bool value
00895 );
00896
00897
00898 void SetBaselineSplineFit (
00899 bool value
00900 );
00901
00902
00903 void SetClipUnder (
00904 bool value
00905 );
00906
00907
00908 void SetDatabaseIndex (
00909 INT32 index
00910 );
00911
00912
00913
00914 bool SetElementFromGML (
00915 const MISTRING& GMLElement,
00916 MILIST<std::pair<MISTRING, MISTRING> >& AttribList
00917 );
00918
00919
00920 void SetElementStyle (
00921 const TEXTSTYLE& textstyle
00922 );
00923
00924
00925 void SetElementStyle (
00926 const POINTSTYLE& pointstyle
00927 );
00928
00929
00930 void SetElementStyle (
00931 const LINESTYLE& linestyle
00932 );
00933
00934
00935 void SetElementStyle (
00936 const POLYSTYLE& polystyle
00937 );
00938
00939
00940 void SetInsert (
00941 const INSERT& Insert
00942 );
00943
00944
00945 void SetLines (
00946 const POLYLINELIST& PolyLineList
00947 );
00948
00949
00950 void SetMesh (
00951 const MESH& Mesh
00952 );
00953
00954
00955 void SetPlaneConic (
00956 const PLANECONIC& Conic
00957 );
00958
00959
00960 void SetPoint (
00961 const DPOINT3D& point
00962 );
00963
00964
00965 void SetPoints (
00966 const POLYLINE& PointArray
00967 );
00968
00969
00970 void SetPolyLine (
00971 const POLYLINE& PolyLine
00972 );
00973
00974
00975 void SetRegion (
00976 const REGION2D& Region
00977 );
00978
00979
00980 void SetSubRegion (
00981 const SUBREGION2D& SubRegion
00982 );
00983
00984
00985 void SetTextElement (
00986 const POLYLINELIST& PolyLineList,
00987 const MISTRING& text,
00988 const TEXTSTYLE& style,
00989 const LABELFRAMEPARMS* FrameParms = 0
00990 );
00991
00992
00993 void SetWidthUnits (
00994 SCREENUNIT WidthUnits
00995 );
00996
00997
00998 void SetZValue (
00999 double zvalue
01000 );
01001
01002
01003
01004
01005 bool TestElement (
01006 const REGION2D& Region,
01007 TESTCRITERIA TestMode
01008 ) const;
01009
01010 private:
01011 #ifndef GENERATING_DOXYGEN_OUTPUT
01012 CADELEMHDR m_ElemHdr;
01013 CADELEMOPT m_ElemOpt;
01014 CADELEMDATA m_ElemData;
01015 POLYLINE m_Points;
01016 MISTRING m_String;
01017 SIMPLE_ARRAY<INT32> m_IsleList;
01018 SIMPLE_ARRAY<CADSUBPOLY> m_SubPolyList;
01019
01020 void ClearGeometric ();
01021 void ComputeStringExtents (DRECT3D& Extents) const;
01022 void GeneratePointsFromBox (POLYLINE& PolyLine) const;
01023 void GetPolyLineList (POLYLINELIST& PolyLineList) const;
01024 void SetPolyLineList (const POLYLINELIST& PolyLineList);
01025 void TranslatePatterns (const SIMPLE_ARRAY<INT32> PattTrans[RVC::STYLE::PATTERN_NumTypes]);
01026
01027 class GMLSAX;
01028 friend class GMLSAX;
01029 friend class CAD;
01030 #endif
01031 };
01032
01033 DEFINE_ENUM_OP_INCREMENT(CAD::ELEMENT::TYPE)
01034
01035
01036 class CAD::ELEMENT::BOX {
01037 public:
01038
01039 BOX () : m_Rotation(0.0) {}
01040
01041
01042 BOX (const BOX& rhs) : m_rect(rhs.m_rect), m_Rotation(rhs.m_Rotation) {}
01043
01044
01045 BOX& operator= (
01046 const BOX& rhs
01047 ) {
01048 if (this != &rhs) {
01049 m_rect = rhs.m_rect;
01050 m_Rotation = rhs.m_Rotation;
01051 }
01052 return (*this);
01053 }
01054
01055
01056 void Clear (
01057 ) {
01058 m_rect.SetInvalid();
01059 m_Rotation = 0.0;
01060 return;
01061 }
01062
01063
01064 void GeneratePoints (
01065 POLYLINE& PolyLine,
01066 DIMENSION dim
01067 ) const;
01068
01069
01070
01071 const DRECT3D& GetBoxExtents (
01072 ) const { return (m_rect); }
01073
01074
01075
01076 double GetRotation (
01077 ) const { return (m_Rotation); }
01078
01079
01080 void SetBoxExtents (
01081 const DRECT3D& rect
01082 ) { m_rect = rect; }
01083
01084
01085 void SetRotation (
01086 double Rotation
01087 ) { m_Rotation = Rotation; }
01088
01089 private:
01090 #ifndef GENERATING_DOXYGEN_OUTPUT
01091 DRECT3D m_rect;
01092 double m_Rotation;
01093 #endif
01094 };
01095
01096
01097
01098 class CAD::ELEMENT::DRAW {
01099 public:
01100 DRAW () {}
01101 virtual ~DRAW () {}
01102
01103
01104
01105 int DrawElement (
01106 const CAD::ELEMENT& Element,
01107 const TRANS2D_AFFINE& BtoC
01108 ) { return (v_DrawElement(Element, BtoC)); }
01109
01110
01111 ERRVALUE DrawLines (
01112 const CAD::ELEMENT& Element,
01113 const POLYLINELIST& LineList
01114 ) { return (v_DrawLines(Element, LineList)); }
01115
01116
01117 ERRVALUE DrawPoints (
01118 const CAD::ELEMENT& Element,
01119 const POLYLINE& Points
01120 ) { return (v_DrawPoints(Element, Points)); }
01121
01122
01123 ERRVALUE DrawText (
01124 const CAD::ELEMENT& Element,
01125 const MISTRING& string,
01126 const POLYLINELIST& LineList
01127 ) { return (v_DrawText(Element, string, LineList)); }
01128
01129
01130
01131 ERRVALUE DrawSubRegion (
01132 const CAD::ELEMENT& Element,
01133 const SUBREGION2D& SubRegion
01134 ) { return (v_DrawSubRegion(Element, SubRegion)); }
01135
01136 private:
01137
01138 virtual int v_DrawElement (const CAD::ELEMENT& Element, const TRANS2D_AFFINE& BtoC) { return (0); }
01139 virtual ERRVALUE v_DrawLines (const CAD::ELEMENT& Element, const POLYLINELIST& LineList) { return (0); }
01140 virtual ERRVALUE v_DrawPoints (const CAD::ELEMENT& Element, const POLYLINE& Points) { return (0); }
01141 virtual ERRVALUE v_DrawText (const CAD::ELEMENT& Element, const MISTRING& string, const POLYLINELIST& LineList) { return (0); }
01142 virtual ERRVALUE v_DrawSubRegion (const CAD::ELEMENT& Element, const SUBREGION2D& SubRegion) { return (0); }
01143 };
01144
01145
01146
01147
01148 class CAD::DRAW : public CAD::ELEMENT::DRAW {
01149 public:
01150 DRAW () {}
01151 virtual ~DRAW () {}
01152
01153
01154
01155 int FilterElement (
01156 CAD::ELEMENT& Element,
01157 const TRANS2D_AFFINE& BtoC,
01158 INT32 InsertLevel,
01159 INT32 ElemNum,
01160 const DRECT3D& Extents
01161 ) { return (v_FilterElement(Element, BtoC, InsertLevel, ElemNum, Extents)); }
01162
01163 private:
01164 virtual int v_FilterElement (CAD::ELEMENT& Element, const TRANS2D_AFFINE& BtoC, INT32 InsertLevel, INT32 ElemNum, const DRECT3D& Extents) { return (1); }
01165 };
01166
01167
01168
01169 class CAD::ELEMENT::INSERT {
01170 public:
01171
01172 INSERT (
01173 ) :
01174 m_InsertPt(0.0,0.0,0.0),
01175 m_BlockNum(-1),
01176 m_rotate(0.0),
01177 m_xscale(1.0),
01178 m_yscale(1.0),
01179 m_zscale(1.0),
01180 m_numlins(1),
01181 m_numcols(1),
01182 m_linspace(0.0),
01183 m_colspace(0.0)
01184 {}
01185
01186
01187 void Clear (
01188 ) {
01189 m_InsertPt.x = m_InsertPt.y = m_InsertPt.z = m_linspace = m_colspace = m_rotate = 0.0;
01190 m_BlockNum = -1;
01191 m_xscale = m_yscale = m_zscale = 1.0;
01192 m_numlins = m_numcols = 1;
01193 return;
01194 }
01195
01196
01197
01198 INT32 GetBlockNum (
01199 ) const { return (m_BlockNum); }
01200
01201
01202
01203
01204 double GetColumnSpace (
01205 ) const { return (m_colspace); }
01206
01207
01208
01209 const DPOINT3D& GetInsertPoint (
01210 ) const { return (m_InsertPt); }
01211
01212
01213
01214
01215 double GetLineSpace (
01216 ) const { return (m_linspace); }
01217
01218
01219
01220 INT32 GetNumColumns (
01221 ) const { return (m_numcols); }
01222
01223
01224
01225 INT32 GetNumLines (
01226 ) const { return (m_numlins); }
01227
01228
01229
01230 double GetRotation (
01231 ) const { return (m_rotate); }
01232
01233
01234
01235 double GetXScale (
01236 ) const { return (m_xscale); }
01237
01238
01239
01240 double GetYScale (
01241 ) const { return (m_yscale); }
01242
01243
01244
01245 double GetZScale (
01246 ) const { return (m_zscale); }
01247
01248
01249 void SetBlockNum (
01250 INT32 BlockNum
01251 ) { m_BlockNum = BlockNum; }
01252
01253
01254
01255 void SetColumnSpace (
01256 double ColumnSpace
01257 ) { m_colspace = ColumnSpace; }
01258
01259
01260 void SetInsertPoint (
01261 const DPOINT3D& InsertPt
01262 ) { m_InsertPt = InsertPt; }
01263
01264
01265
01266 void SetLineSpace (
01267 double LineSpace
01268 ) { m_linspace = LineSpace; }
01269
01270
01271 void SetNumColumns (
01272 INT32 NumColumns
01273 ) { m_numcols = static_cast<UINT16>(NumColumns); if (m_numcols == 0) m_numcols = 1; }
01274
01275
01276 void SetNumLines (
01277 INT32 NumLines
01278 ) { m_numlins = static_cast<UINT16>(NumLines); if (m_numlins == 0) m_numlins = 1; }
01279
01280
01281 void SetRotation (
01282 double rotate
01283 ) { m_rotate = rotate; }
01284
01285
01286 void SetXScale (
01287 double xscale
01288 ) { m_xscale = xscale; if (m_xscale == 0.0) m_xscale = 1.0; }
01289
01290
01291 void SetYScale (
01292 double yscale
01293 ) { m_yscale = yscale; if (m_yscale == 0.0) m_yscale = 1.0; }
01294
01295
01296 void SetZScale (
01297 double zscale
01298 ) { m_zscale = zscale; if (m_zscale == 0.0) m_zscale = 1.0; }
01299
01300 private:
01301 #ifndef GENERATING_DOXYGEN_OUTPUT
01302 DPOINT3D m_InsertPt;
01303 INT32 m_BlockNum;
01304 double m_rotate;
01305 double m_xscale;
01306 double m_yscale;
01307 double m_zscale;
01308 UINT16 m_numlins;
01309 UINT16 m_numcols;
01310 double m_linspace;
01311 double m_colspace;
01312 #endif
01313 };
01314
01315
01316
01317 class CAD::ELEMENT::MESH {
01318 public:
01319
01320 MESH (
01321 ) :
01322 m_NumLineVertices(0),
01323 m_NumColumnVertices(0),
01324 m_TopBottomClosed(false),
01325 m_LeftRightClosed(false)
01326 {}
01327
01328
01329 void Clear (
01330 ) {
01331 m_MeshPoints.Clear();
01332 m_NumLineVertices = m_NumColumnVertices = 0;
01333 m_TopBottomClosed = m_LeftRightClosed = false;
01334 return;
01335 }
01336
01337
01338
01339
01340 const POLYLINE& GetMeshPoints (
01341 ) const { return (m_MeshPoints); }
01342
01343
01344
01345 UINT32 GetNumColumnVertices (
01346 ) const { return (m_NumColumnVertices); }
01347
01348
01349
01350 UINT32 GetNumLineVertices (
01351 ) const { return (m_NumLineVertices); }
01352
01353
01354
01355 bool IsLeftRightClosed (
01356 ) const { return (m_LeftRightClosed); }
01357
01358
01359
01360 bool IsTopBottomClosed (
01361 ) const { return (m_TopBottomClosed); }
01362
01363
01364 void SetLeftRightClosed (
01365 bool LeftRightClosed
01366 ) { m_LeftRightClosed = LeftRightClosed; }
01367
01368
01369
01370 void SetMeshPoints (
01371 const POLYLINE& MeshPoints
01372 ) { m_MeshPoints = MeshPoints; }
01373
01374
01375 void SetNumColumnVertices (
01376 UINT32 NumColumnVertices
01377 ) { m_NumColumnVertices = NumColumnVertices; }
01378
01379
01380 void SetNumLineVertices (
01381 UINT32 NumLineVertices
01382 ) { m_NumLineVertices = NumLineVertices; }
01383
01384
01385 void SetTopBottomClosed (
01386 bool TopBottomClosed
01387 ) { m_TopBottomClosed = TopBottomClosed; }
01388
01389 private:
01390 #ifndef GENERATING_DOXYGEN_OUTPUT
01391 UINT32 m_NumLineVertices;
01392 UINT32 m_NumColumnVertices;
01393 bool m_TopBottomClosed;
01394 bool m_LeftRightClosed;
01395 POLYLINE m_MeshPoints;
01396 #endif
01397 };
01398
01399
01400
01401
01402
01403
01404 class CAD::CONST_ELEMITERATOR {
01405 public:
01406
01407 CONST_ELEMITERATOR (
01408 ) :
01409 m_CADObj(0),
01410 m_Element(0),
01411 m_ReachedEnd(false)
01412 {}
01413
01414
01415 CONST_ELEMITERATOR (
01416 const CONST_ELEMITERATOR& rhs
01417 ) :
01418 m_Element(0),
01419 m_CADObj(rhs.m_CADObj),
01420 m_ReachedEnd(rhs.m_ReachedEnd)
01421 {
01422 if (rhs.m_Element != 0) m_Element = new ELEMENT(*rhs.m_Element);
01423 }
01424
01425 #ifndef GENERATING_DOXYGEN_OUTPUT
01426
01427 CONST_ELEMITERATOR (
01428 const RVC::CAD* CADObj,
01429 INT32 LastElemNum
01430 ) :
01431 m_Element(0),
01432 m_CADObj(CADObj),
01433 m_ReachedEnd(true)
01434 {}
01435
01436
01437 CONST_ELEMITERATOR (
01438 const RVC::CAD* CADObj
01439 ) :
01440 m_Element(0),
01441 m_CADObj(CADObj),
01442 m_ReachedEnd(false)
01443 {
01444 ERRORPOSNDISABLE disable;
01445 const_cast<CAD*>(CADObj)->Rewind();
01446 m_Element = new ELEMENT;
01447 m_ReachedEnd = (CADObj->ReadElement(*m_Element) == R_BadCADElemNum);
01448 }
01449
01450 #endif // GENERATING_DOXYGEN_OUTPUT
01451
01452
01453 virtual ~CONST_ELEMITERATOR (
01454 ) {
01455 delete m_Element;
01456 }
01457
01458
01459 CONST_ELEMITERATOR& operator= (
01460 const CONST_ELEMITERATOR& rhs
01461 ) {
01462 if (this != &rhs) {
01463 delete m_Element;
01464 m_Element = 0;
01465 if (rhs.m_Element != 0) m_Element = new ELEMENT(*rhs.m_Element);
01466 m_CADObj = rhs.m_CADObj;
01467 m_ReachedEnd = rhs.m_ReachedEnd;
01468 }
01469 return (*this);
01470 }
01471
01472
01473 const ELEMENT& operator* (
01474 ) const { return (*m_Element); }
01475
01476
01477 const ELEMENT* operator-> (
01478 ) const { return (&**this); }
01479
01480
01481 CONST_ELEMITERATOR& operator++ (
01482 ) {
01483 ERRORPOSNDISABLE disable;
01484 m_ReachedEnd = (m_CADObj->ReadElement(*m_Element) == R_BadCADElemNum);
01485 return (*this);
01486 }
01487
01488
01489 bool operator== (
01490 const CONST_ELEMITERATOR& rhs
01491 ) const { return (m_CADObj == rhs.m_CADObj && m_ReachedEnd == rhs.m_ReachedEnd); }
01492
01493
01494 bool operator!= (
01495 const CONST_ELEMITERATOR& rhs
01496 ) const { return (!(*this == rhs)); }
01497
01498 private:
01499 #ifndef GENERATING_DOXYGEN_OUTPUT
01500 ELEMENT* m_Element;
01501 const CAD* m_CADObj;
015