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