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 #ifndef INC_RVC_VECTTOOL_H
00066 #define INC_RVC_VECTTOOL_H
00067
00068 #ifndef INC_RVC_VECTOR_H
00069 #include <rvc/vector.h>
00070 #endif
00071
00072 #ifndef INC_RVC_HYPERINDEX_H
00073 #include <rvc/hyperidx.h>
00074 #endif
00075
00076 #ifndef INC_RVC_STYLE_H
00077 #include <rvc/style.h>
00078 #endif
00079
00080 #ifndef INC_RVC_MSTDATT_H
00081 #include <rvc/mstdatt.h>
00082 #endif
00083
00084 #ifndef INC_RVC_DBPOINT_H
00085 #include <rvc/dbpoint.h>
00086 #endif
00087
00088 #ifndef INC_RVC_DBNODE_H
00089 #include <rvc/dbnode.h>
00090 #endif
00091
00092 #ifndef INC_RVC_LIST_H
00093 #include <rvc/list.h>
00094 #endif
00095
00096 #ifndef INC_VECTOR
00097 #include <vector>
00098 #define INC_VECTOR
00099 #endif
00100
00101
00102 #ifndef GENERATING_DOXYGEN_OUTPUT
00103
00104 class FILE_TEXT;
00105 namespace RVC {
00106 class VECTORTOOLKITOBSERVER;
00107 }
00108 #endif
00109
00110
00111 namespace RVC {
00112
00114 class VECTORTOOLKIT : public SUBJECT<VECTORTOOLKITOBSERVER> {
00115 private:
00116
00117 #ifndef GENERATING_DOXYGEN_OUTPUT
00118 class LINEELEMENT;
00119 #endif // GENERATING_DOXYGEN_OUTPUT
00120
00121 public:
00122
00123 #ifndef GENERATING_DOXYGEN_OUTPUT
00124 class POLYGONDELETEFILTER;
00125 #endif // GENERATING_DOXYGEN_OUTPUT
00126
00127 class SNAPOBJECT {
00128 public:
00129
00130 SNAPOBJECT (
00131 );
00132
00133 ~SNAPOBJECT (
00134 );
00135
00136 const RVC::VECTOR& GetVectorObject (
00137 ) const { return (m_VectorObj); }
00138
00139 const TRANS2D_MAPGEN& GetTransGen (
00140 ) const { return (m_VectorToObject); }
00141
00142 bool IsSameAsEditor (
00143 ) const { return (m_SameAsEditor); }
00144
00145 void SetValues (
00146 const VECTORTOOLKIT& vtk
00147 );
00148
00149 void SetValues (
00150 const VECTOR& VectorObj,
00151 const TRANS2D_MAPGEN& VectorToObject
00152 );
00153
00154 private:
00155
00156 #ifndef GENERATING_DOXYGEN_OUTPUT
00157 bool m_SameAsEditor;
00158 VECTOR m_VectorObj;
00159 TRANS2D_MAPGEN m_VectorToObject;
00160 friend class VECTORTOOLKIT;
00161 friend class LINEELEMENT;
00162
00163 SNAPOBJECT (const VECTORTOOLKIT& vtk);
00164
00165 SNAPOBJECT& operator= (const SNAPOBJECT& rhs);
00166 #endif // GENERATING_DOXYGEN_OUTPUT
00167
00168 };
00169 friend class SNAPOBJECT;
00170
00171 class SNAPPARMS {
00172 public:
00173
00174 class PANEL;
00175
00176 enum SNAPTOELEM {
00177 SNAPTOELEM_AnyElement = 0,
00178 SNAPTOELEM_Line,
00179 SNAPTOELEM_Point,
00180 SNAPTOELEM_Node,
00181 SNAPTOELEM_Nothing,
00182 SNAPTOELEM_Vertex
00183 };
00184
00185 enum SNAPTYPE {
00186 SNAPTYPE_AddVertexSnap = 0,
00187 SNAPTYPE_DirectSnap,
00188 SNAPTYPE_ContinueSnap
00189 };
00190
00191 enum SNAPEND {
00192 SNAPEND_Both = 0,
00193 SNAPEND_Start,
00194 SNAPEND_End
00195 };
00196
00197 SNAPPARMS (
00198 );
00199
00200 bool CanCrossLines (
00201 ) const { return (!m_DontCrossLines); }
00202
00203 bool CanRemoveOvershoots (
00204 ) const { return (m_RemOvershoots); }
00205
00206 bool CanSnapToSelf (
00207 ) const { return (!m_DontSnapToSelf); }
00208
00209 SNAPTOELEM GetElementSnap (
00210 ) const { return (m_SnapToElem); }
00211
00212 UINT32 GetLegacyFlags (
00213 ) const;
00214
00215 double GetSnapBackAngle (
00216 ) const { return (m_SnapBackAngle); }
00217
00218 double GetSnapDist (
00219 ) const { return (m_SnapDist); }
00220
00221 SNAPEND GetSnapEnd (
00222 ) const { return (m_SnapEnd); }
00223
00224 SNAPTYPE GetSnapType (
00225 ) const { return (m_SnapType); }
00226
00227 void SetCrossLines (
00228 bool CrossLines
00229 ) { m_DontCrossLines = !CrossLines; }
00230
00231 void SetElementSnap (
00232 SNAPTOELEM element
00233 ) { m_SnapToElem = element; }
00234
00235 void SetFromLegacyFlags (
00236 UINT32 flags
00237 );
00238
00239 void SetRemoveOvershoots (
00240 bool RemoveOvershoots
00241 ) { m_RemOvershoots = RemoveOvershoots; }
00242
00243 void SetSnapBackAngle (
00244 double angle
00245 ) { m_SnapBackAngle = bound(angle, 0.0, PI); }
00246
00247 void SetSnapDist (
00248 double dist
00249 ) { m_SnapDist = dist; }
00250
00251 void SetSnapEnd (
00252 SNAPEND SnapEnd
00253 ) { m_SnapEnd = SnapEnd; }
00254
00255 void SetSnapToSelf (
00256 bool SnapToSelf
00257 ) { m_DontSnapToSelf = !SnapToSelf; }
00258
00259 void SetSnapType (
00260 SNAPTYPE SnapType
00261 ) { m_SnapType = SnapType; }
00262
00263 private:
00264
00265 #ifndef GENERATING_DOXYGEN_OUTPUT
00266 SNAPTOELEM m_SnapToElem;
00267 SNAPTYPE m_SnapType;
00268 SNAPEND m_SnapEnd;
00269 double m_SnapDist;
00270 double m_SnapBackAngle;
00271 bool m_RemOvershoots;
00272 bool m_DontCrossLines;
00273 bool m_DontSnapToSelf;
00274 #endif // GENERATING_DOXYGEN_OUTPUT
00275
00276 };
00277
00278 enum CLIPFLAGS {
00279 CLIPFLAG_None = 0x00000000,
00280 CLIPFLAG_ForceClipBorder = 0x00000200,
00281 CLIPFLAG_NoClipBorder = 0x00000400,
00282 CLIPFLAG_OnlyClipLines = 0x00000800,
00283 CLIPFLAG_NoStdAttrib = 0x00001000,
00284 CLIPFLAG_RemUnusedDBRec = 0x00002000
00285 };
00286
00287 enum DELETELINE {
00288 DELETELINE_None = 0x0000,
00289 DELETELINE_RemoveExcessNodes = 0x0001
00290 };
00291
00292 enum DELETEPOLYGON {
00293 DELETEPOLYGON_None = 0x0000,
00294 DELETEPOLYGON_LongLineDelete = 0x0001,
00295 DELETEPOLYGON_NoDeleteSpurs = 0x0002,
00296 DELETEPOLYGON_CombineAttrib = 0x0004,
00297 DELETEPOLYGON_RemoveAllIslands = 0x0008
00298 };
00299
00300 enum TOOLKITFLAG {
00301 TOOLKITFLAG_None = 0x00,
00302 TOOLKITFLAG_NoConvIfElemID = 0x01,
00303 TOOLKITFLAG_RemExNodesDelLine = 0x02,
00304 TOOLKITFLAG_NoStatusText = 0x04,
00305 TOOLKITFLAG_NoSaveQTree = 0x08,
00306 TOOLKITFLAG_NoCreateElemID = 0x10,
00307 TOOLKITFLAG_NoQTrees = 0x20,
00308 TOOLKITFLAG_KeepAttachedLabels = 0x40
00309 };
00310
00311 enum OPENFLAGS {
00312 OPENFLAGS_None = 0x00000000,
00313 OPENFLAGS_NoQtree = 0x00000001,
00314 OPENFLAGS_NoLineQtree = 0x00000002,
00315 OPENFLAGS_NoNodeQtree = 0x00000004,
00316 OPENFLAGS_NoPolygonQtree = 0x00000008,
00317 OPENFLAGS_NoPointQtree = 0x00000010,
00318 OPENFLAGS_NoLabelQtree = 0x00000020,
00319 OPENFLAGS_NoDatabase = 0x00000040,
00320 OPENFLAGS_NoCreateTables = 0x00000080,
00321 OPENFLAGS_NoCreateElemID = 0x00000100,
00322 OPENFLAGS_NoDBStatTable = 0x00000200,
00323 OPENFLAGS_NoCreateStyle = 0x00000400,
00324 OPENFLAGS_NoChangeTopoType = 0x00000800,
00325 OPENFLAGS_NoHyper = 0x00001000,
00326 OPENFLAGS_NoStyle = 0x00002000,
00327 OPENFLAGS_NoValidateNodes = 0x00004000,
00328 OPENFLAGS_WriteAbsolute = 0x00008000,
00329 OPENFLAGS_NoLegacyDelete = 0x00010000
00330 };
00331
00332 enum SAVEFLAGS {
00333 SAVEFLAG_None = 0x0000,
00334 SAVEFLAG_RemoveExcessNodes = 0x0001,
00335 SAVEFLAG_RemoveExcessRecords = 0x0002,
00336 SAVEFLAG_Optimize = 0x0004
00337 };
00338
00339 enum STDATTRIBSTATE {
00340 STDATTRIBSTATE_NonExistant = 1,
00341 STDATTRIBSTATE_NeedRebuilding,
00342 STDATTRIBSTATE_Valid
00343 };
00344
00345 enum VALIDATEFLAG {
00346 VALIDATEFLAG_None = 0x0000,
00347 VALIDATEFLAG_RebuildPolys = 0x0001,
00348 VALIDATEFLAG_RebuildIslands = 0x0002,
00349 VALIDATEFLAG_RebuildNodeLineList = 0x0004,
00350 VALIDATEFLAG_DontValidateZ = 0x0008,
00351 VALIDATEFLAG_NoRemoveNodes = 0x0080,
00352 VALIDATEFLAG_NoDBStatTable = 0x0100
00353 };
00354
00355 enum NODEFLAG {
00356 NODEFLAG_None = 0x0000,
00357 NODEFLAG_NoCheckDatabase = 0x0001,
00358 NODEFLAG_NoCheckHyper = 0x0002,
00359 NODEFLAG_NoStdAttrib = 0x0004,
00360 NODEFLAG_RemoveIfPoint = 0x0008
00361 };
00362
00364 static ERRVALUE BuildNodeLineLists (
00365 VECTOR& VectObj
00366 );
00367
00369 static ERRVALUE BuildPolygons (
00370 VECTOR& VectObj
00371 );
00372
00382 static ERRVALUE BuildTopology (
00383 VECTOR& VectObj
00384 );
00385
00387 static ERRVALUE DepthSortPolygons (
00388 VECTOR& VectObj
00389 );
00390
00392 static ERRVALUE RemoveExcessNodes (
00393 VECTOR& VectObj,
00394 NODEFLAG flags
00395 );
00396
00399 static int SplitLinesAtMaxPoints (
00400 const VECTOR& VectorObj,
00401 INT32 MaxPoints,
00402 OBJECT& ParentObj,
00403 VECTOR& NewObject
00404 );
00405
00407 static ERRVALUE ValidateElementID (
00408 VECTOR& VectorObj
00409 );
00410
00412 static ERRVALUE ValidateVectorTopology (
00413 VECTOR& VectorObj,
00414 FILE_TEXT& LogFile,
00415 OPENFLAGS OpenFlags,
00416 VALIDATEFLAG flags
00417 );
00418
00420 static ERRVALUE ValidateVectorTopology (
00421 VECTOR& VectorObj,
00422 OPENFLAGS OpenFlags,
00423 VALIDATEFLAG flags
00424 );
00425
00427 VECTORTOOLKIT (
00428 );
00429
00431 ~VECTORTOOLKIT (
00432 );
00433
00434 ERRVALUE AddLabel (
00435 VECTOR::LABEL& label
00436 );
00437
00438 ERRVALUE AddLine (
00439 POLYLINE& PolyLine
00440 );
00441
00442 ERRVALUE AddLineSnapPoints (
00443 INT32 LineNum,
00444 POLYLINE& PolyLine
00445 );
00446
00447 ERRVALUE AddNode (
00448 DPOINT3D& point
00449 );
00450
00451 ERRVALUE AddPoint (
00452 const DPOINT3D& pt
00453 );
00454
00455 ERRVALUE AddPolygon (
00456 POLYLINE& PolyLine
00457 );
00458
00459 ERRVALUE AddSnapPoints (
00460 POLYLINE& PolyLine,
00461 bool& SnappedStart,
00462 bool& SnappedEnd
00463 );
00464
00465 ERRVALUE BuildNodeLineLists (
00466 );
00467
00468 ERRVALUE BuildPolygons (
00469 );
00470
00480 ERRVALUE BuildTopology (
00481 );
00482
00483 ERRVALUE ChangeLabel (
00484 INT32 LabelNum,
00485 VECTOR::LABEL& label
00486 );
00487
00488 ERRVALUE ChangeLine (
00489 INT32 LineNum,
00490 POLYLINE& PolyLine
00491 );
00492
00493 DEPRECATED ERRVALUE ChangeNode (
00494 INT32 NodeNum,
00495 const DPOINT3D& NewPoint,
00496 const std::vector<POLYLINE>& NodeLines
00497 );
00498
00499 ERRVALUE ChangeNode (
00500 INT32 NodeNum,
00501 const DPOINT3D& NewPoint,
00502 const POLYLINELIST& NodeLines
00503 );
00504
00505 ERRVALUE ChangePoint (
00506 INT32 PointNum,
00507 const DPOINT3D& pt,
00508 bool IsNode = false
00509 );
00510
00511 ERRVALUE ClipToRegion (
00512 const REGION2D& region,
00513 TESTCRITERIA RegionTest,
00514 const BITSET* PolygonSet,
00515 CLIPFLAGS flags
00516 );
00517
00518 ERRVALUE Close (
00519 bool ForceClose
00520 );
00521
00522 ERRVALUE CombineNodes (
00523 INT32 NodeNum,
00524 const DPOINT3D* NewPoint,
00525 const SIMPLE_ARRAY<INT32>& NodeList
00526 );
00527
00528 ERRVALUE ConvertForward (
00529 const TRANS2D_MAPGEN& tmg
00530 );
00531
00532 ERRVALUE ConvertNodeToPoint (
00533 INT32 NodeNum
00534 );
00535
00536 ERRVALUE ConvertPointType (
00537 GEOMETRIC::POINTTYPE NewPointType
00538 );
00539
00540 ERRVALUE DeleteLabel (
00541 INT32 LabelNum
00542 );
00543
00544 ERRVALUE DeleteLabels (
00545 const SIMPLE_ARRAY<INT32>& LabelList
00546 );
00547
00548 ERRVALUE DeleteLine (
00549 INT32 LineNum,
00550 DELETELINE flags,
00551 POLYGONDELETEFILTER* PolyDelFilt = 0
00552 );
00553
00554 ERRVALUE DeleteLines (
00555 const SIMPLE_ARRAY<INT32>& LineList,
00556 DELETELINE flags,
00557 POLYGONDELETEFILTER* PolyDelFilt = 0
00558 );
00559
00560 INT32 DeleteNode (
00561 INT32 NodeNum,
00562 NODEFLAG NodeFlag
00563 );
00564
00565 ERRVALUE DeleteNodes (
00566 const SIMPLE_ARRAY<INT32>& NodeList,
00567 NODEFLAG NodeFlag
00568 );
00569
00570 ERRVALUE DeletePoint (
00571 INT32 PointNum
00572 );
00573
00574 ERRVALUE DeletePoints (
00575 const SIMPLE_ARRAY<INT32>& PointList
00576 );
00577
00578 ERRVALUE DeletePolygon (
00579 INT32 PolyNum,
00580 DELETEPOLYGON flags
00581 );
00582
00583 ERRVALUE DeletePolygons (
00584 SIMPLE_ARRAY<INT32>& PolyList,
00585 DELETEPOLYGON flags
00586 );
00587
00588 ERRVALUE ExtractToRegion (
00589 const REGION2D& region,
00590 TESTCRITERIA RegionTest,
00591 CLIPFLAGS flags
00592 );
00593
00594 INT32 FindClosestLineVertex (
00595 INT32 LineNum,
00596 const DPOINT2D& testpt,
00597 DPOINT3D *retpt
00598 );
00599
00600 ERRVALUE GenerateElementIDTables (
00601 );
00602
00603 ERRVALUE GenerateIntersections (
00604 const POLYLINE& PolyLine,
00605 POLYLINE::INTERSECTINFO& ints,
00606 INT32 MaxIntersections = 0
00607 );
00608
00611 const CREDENTIALS& GetCredentials (
00612 ) const { return (m_VectorObj.GetCredentials()); }
00613
00614 DIMENSION GetDimension (
00615 ) const { return (m_VectorObj.GetDimension()); }
00616
00617 ERRVALUE GetDatabaseObject (
00618 ELEMTYPE ElemType,
00619 DBASE_ELEMENT& DBaseObj
00620 );
00621
00622 INT32 GetNumElements (
00623 ELEMTYPE ElemType
00624 ) const;
00625
00626 ERRVALUE GetObjectItem (
00627 OBJITEM& ObjItem
00628 ) const;
00629
00630 const SNAPOBJECT& GetSnapObject (
00631 ) { return (m_SnapObject); }
00632
00633 const SNAPPARMS& GetSnapParms (
00634 ) const { return (m_SnapParms); }
00635
00636 ERRVALUE GetStyleObject (
00637 STYLE& StyleObj
00638 ) const;
00639
00640 TOOLKITFLAG GetToolkitFlags (
00641 ) const { return (m_ToolkitFlags); }
00642
00643 ERRVALUE GetVectorObject (
00644 VECTOR& VectorObj
00645 ) const;
00646
00647 ERRVALUE GetZValue (
00648 ELEMTYPE ElemType,
00649 INT32 ElemNum,
00650 double& zvalue
00651 ) const;
00652
00653 bool IsOpen (
00654 ) const { return (m_VectorObj.IsOpen()); }
00655
00656 ERRVALUE LocateIslands (
00657 bool LineLeftRightValid
00658 );
00659
00660 ERRVALUE Open (
00661 const RVC::OBJITEM& ObjItem,
00662 OPENFLAGS flags,
00663 #ifdef RVC_CREDENTIALS_MANDATORY
00664 const CREDENTIALS* Credentials
00665 #else
00666 const CREDENTIALS* Credentials = 0
00667 #endif
00668 );
00669
00670 ERRVALUE Open (
00671 const VECTOR& VectorObj,
00672 OPENFLAGS flags
00673 );
00674
00675 ERRVALUE RecoverFromUndo (
00676 );
00677
00678 int RemoveDangleLine (
00679 INT32 LineNum,
00680 double maxdist
00681 );
00682
00683 INT32 RemoveDangleLineSet (
00684 double maxdist
00685 );
00686
00687 INT32 RemoveDangleLineSet (
00688 const SIMPLE_ARRAY<INT32>& LineList,
00689 double maxdist
00690 );
00691
00692 ERRVALUE RemoveElementIDTables (
00693 );
00694
00695 int RemoveExcessNodes (
00696 const BITSET *NodeSet = 0,
00697 NODEFLAG NodeFlags = NODEFLAG_None
00698 );
00699
00700 INT32 RemoveIslandSet (
00701 double MaxArea,
00702 DELETEPOLYGON flags,
00703 INT32 *NumTotalIslands
00704 );
00705
00706 ERRVALUE RemoveStandardAttributeTables (
00707 );
00708
00709 ERRVALUE ReverseLines (
00710 const SIMPLE_ARRAY<INT32>& LineList
00711 );
00712
00713 ERRVALUE Save (
00714 RVC::OBJITEM& ObjItem,
00715 SAVEFLAGS flags
00716 );
00717
00718 ERRVALUE SnapLine (
00719 INT32 LineNum
00720 );
00721
00722 ERRVALUE SnapLines (
00723 const BITSET_UNOWNED& LineSet,
00724 BITSET* UnsnappedSet,
00725 bool AttemptAllElements
00726 );
00727
00728 ERRVALUE SetPrecision (
00729 int Precision
00730 );
00731
00732 void SetSnapObject (
00733 );
00734
00735 void SetSnapObject (
00736 const VECTOR& VectorObj,
00737 const TRANS2D_MAPGEN& VectorToObject
00738 );
00739
00740 void SetSnapParms (
00741 const SNAPPARMS& SnapParms
00742 ) { m_SnapParms = SnapParms; }
00743
00744 void SetToolkitFlags (
00745 TOOLKITFLAG ToolkitFlags
00746 ) { m_ToolkitFlags = ToolkitFlags; }
00747
00748 ERRVALUE SetTopologyType (
00749 VECTOR::TOPOLOGYTYPE VectorType
00750 );
00751
00752 ERRVALUE SetZValue (
00753 ELEMTYPE ElemType,
00754 INT32 ElemNum,
00755 double zvalue
00756 );
00757
00758 ERRVALUE SplineLine (
00759 INT32 LineNum,
00760 POLYLINE::SPLINE SplineType,
00761 INT32 NumKnots,
00762 double Tolerance,
00763 POLYLINE::SPLINEFLAGS flags
00764 );
00765
00766 ERRVALUE SplineLines (
00767 const BITSET* LineList,
00768 POLYLINE::SPLINE SplineType,
00769 INT32 NumKnots,
00770 double Tolerance,
00771 POLYLINE::SPLINEFLAGS flags,
00772 bool AttemptAllElements
00773 );
00774
00775 ERRVALUE SplitLineAtMaxPoints (
00776 INT32 MaxPoints,
00777 bool SetMaxPoints
00778 );
00779
00780 ERRVALUE StraightenLine (
00781 INT32 LineNum
00782 );
00783
00784 ERRVALUE ThinLine (
00785 INT32 LineNum,
00786 POLYLINE::THINMETHOD method,
00787 double Factor,
00788 POLYLINE::SPLINE SplineType,
00789 POLYLINE::SPLINEFLAGS flags
00790 );
00791
00792 ERRVALUE ThinLines (
00793 const BITSET* LineList,
00794 POLYLINE::THINMETHOD method,
00795 double Factor,
00796 POLYLINE::SPLINE SplineType,
00797 POLYLINE::SPLINEFLAGS flags,
00798 bool AttemptAllElements
00799 );
00800
00801 ERRVALUE Update (
00802 );
00803
00804 ERRVALUE UpdateStandardAttrib (
00805 MSTDATT::ADDSTAT flags
00806 );
00807
00808 STDATTRIBSTATE ValidateStandardAttribTables (
00809 );
00810
00811 ERRVALUE ValidateTopology (
00812 VALIDATEFLAG flags,
00813 FILE_TEXT& LogFile
00814 );
00815
00816 ERRVALUE ValidateTopology (
00817 VALIDATEFLAG flags
00818 );
00819
00820 private:
00821
00822 #ifndef GENERATING_DOXYGEN_OUTPUT
00823 enum LINEORIENT {
00824 LINEORIENT_Start = 0,
00825 LINEORIENT_End
00826 };
00827
00828 class BASEELEMENT {
00829 public:
00830
00831 BASEELEMENT (
00832 VECTORTOOLKIT& vtk,
00833 ELEMTYPE elemtype
00834 );
00835
00836 virtual ~BASEELEMENT (
00837 );
00838
00839 virtual INT32 GetNumElements (
00840 ) const = 0;
00841
00842 virtual ERRVALUE GetZValue (
00843 INT32 ElemNum,
00844 double& zvalue
00845 ) const = 0;
00846
00847 virtual ERRVALUE SetZValue (
00848 INT32 ElemNum,
00849 double zvalue
00850 ) = 0;
00851
00852 ERRVALUE AddQTreeElem (
00853 INT32 elemnum,
00854 const DRECT2D& Extents
00855 );
00856
00857 ERRVALUE AddQTreeElem (
00858 INT32 elemnum,
00859 const DPOINT2D& pt
00860 );
00861
00862 ERRVALUE BuildQTree (
00863 );
00864
00865 ERRVALUE ChangeQTreeElem (
00866 INT32 ElemNum,
00867 const DRECT2D& OldExtents,
00868 const DRECT2D& NewExtents
00869 );
00870
00871 ERRVALUE ChangeQTreeElem (
00872 INT32 ElemNum,
00873 const DPOINT2D& OldPt,
00874 const DPOINT2D& NewPt
00875 );
00876
00877 ERRVALUE ClearQTree (
00878 const DRECT2D& Extents,
00879 INT32 NumElements
00880 );
00881
00882 void CloseBase (
00883 );
00884
00885 ERRVALUE CopyQTreeElem (
00886 INT32 source,
00887 INT32 dest,
00888 const DRECT2D& Extents
00889 );
00890
00891 ERRVALUE CopyQTreeElem (
00892 INT32 source,
00893 INT32 dest,
00894 const DPOINT2D& pt
00895 );
00896
00897 ERRVALUE DeleteQTreeElem (
00898 INT32 elemnum,
00899 const DRECT2D& Extents
00900 );
00901
00902 ERRVALUE DeleteQTreeElem (
00903 INT32 elemnum,
00904 const DPOINT2D& pt
00905 );
00906
00907 void DisableQTree (
00908 ) { m_DisableQTree = true; }
00909
00910 bool HasSearchTree (
00911 ) const { return (m_HasSearchTree); }
00912
00913 bool IsQTreeDisabled (
00914 ) const { return (m_DisableQTree); }
00915
00916 ERRVALUE Open (
00917 OPENFLAGS flags
00918 );
00919
00920 ERRVALUE RecoverFromUndo (
00921 );
00922
00923 protected:
00924
00925 ELEMTYPE m_ElemType;
00926 VECTORTOOLKIT& m_vtk;
00927 bool m_DisableQTree;
00928 bool m_HasSearchTree;
00929
00930 friend class SNAPOBJECT;
00931
00932 };
00933 friend class BASEELEMENT;
00934
00935 class DATABASEELEMENT : public BASEELEMENT {
00936 public:
00937
00938 DATABASEELEMENT (
00939 VECTORTOOLKIT& vtk,
00940 ELEMTYPE elemtype,
00941 DBASE_ELEMENT& Database
00942 );
00943
00944 virtual ~DATABASEELEMENT (
00945 );
00946
00947 virtual INT32 GetElemIDCount (
00948 ) const = 0;
00949
00950 virtual bool HasStatHandle (
00951 ) const { return (false); }
00952
00953 virtual ERRVALUE SetElemIDCount (
00954 INT32 NewValue
00955 ) = 0;
00956
00957 virtual ERRVALUE ValidateElementIDTable (
00958 );
00959
00960 ERRVALUE AddElemDBList (
00961 INT32 ElemNum
00962 );
00963
00964 ERRVALUE Close (
00965 );
00966
00967 ERRVALUE CombineDBLists (
00968 INT32 SourceElem,
00969 INT32 DestElem
00970 );
00971
00972 int CompareDBLists (
00973 INT32 ElemNum1,
00974 INT32 ElemNum2
00975 );
00976
00977 INT32 CopyDBRecordRaw (
00978 RVC::DBTABLE& TableObj,
00979 INT32 SourceRecord,
00980 INT32 DestRecord
00981 );
00982
00983 ERRVALUE CopyElemDBRecords (
00984 INT32 SourceElem,
00985 INT32 DestElem,
00986 bool DeleteIdentityRecord
00987 );
00988
00989 ERRVALUE GenerateElementIDTable (
00990 );
00991
00992 SIMPLE_ARRAY<DBLISTELMT>& GetDBListBuffer (
00993 ) { return (m_DBList); }
00994
00995 ERRVALUE GetElementIDTable (
00996 ) const { return (m_ElemIDTableNum); }
00997
00998 DBASE_ELEMENT& GetDatabase (
00999 ) { return (m_Database); }
01000
01001 DBTABLE& GetTable (
01002 INT32 TableNum
01003 );
01004
01005 bool HasElementIDTable (
01006 ) const { return (m_ElemIDTableNum >= 0); }
01007
01008 ERRVALUE MakeElementIDTable (
01009 bool SetInvalid
01010 );
01011
01012 ERRVALUE Open (
01013 OPENFLAGS flags
01014 );
01015
01016 ERRVALUE RecoverFromUndo (
01017 );
01018
01019 ERRVALUE RemoveElementIDTable (
01020 );
01021
01022 ERRVALUE RemoveTable (
01023 INT32 TableNum
01024 );
01025
01026 ERRVALUE SwapDBRecords (
01027 INT32 ElemNum1,
01028 INT32 ElemNum2,
01029 bool DeleteElemNum2Records
01030 );
01031
01032 ERRVALUE UpdateCurrentElemID (
01033 INT32 ElemNum
01034 );
01035
01036 ERRVALUE UpdateNumElements (
01037 INT32 NumElements
01038 );
01039
01040 protected:
01041
01042 class LOCALOBSERVER : public DBASE::OBSERVER {
01043 public:
01044
01045 LOCALOBSERVER (
01046 DATABASEELEMENT* DBaseElem
01047 ) : DBASE::OBSERVER(DBaseElem->m_Database), m_DBaseElem(DBaseElem) {}
01048
01049 private:
01050 virtual void OnTableAdd (INT32 TableNum);
01051 virtual void OnTableDropBegin (INT32 TableNum);
01052 virtual void OnTableDropEnd (INT32 TableNum);
01053
01054 DATABASEELEMENT* m_DBaseElem;
01055 };
01056
01057 DBASE_ELEMENT& m_Database;
01058 INT32 m_ElemIDTableNum;
01059 DBTABLE::RECORD m_Record;
01060 SIMPLE_ARRAY<DBLISTELMT> m_DBList;
01061 SIMPLE_ARRAY<DBLISTELMT> m_DBList2;
01062 bool m_MaintainElementIDTables;
01063 LOCALOBSERVER* m_Observer;
01064 std::vector<DBTABLE> m_DBTableObjArray;
01065
01066 void AllocateObserver (
01067 );
01068
01069 friend class LOCALOBSERVER;
01070 };
01071 friend class DATABASEELEMENT;
01072
01073 class STATELEMENT : public DATABASEELEMENT {
01074 public:
01075
01076 class DISABLESTATS {
01077 public:
01078
01079 DISABLESTATS (
01080 STATELEMENT& StatElem,
01081 bool Condition
01082 ) : m_StatElem(StatElem), m_TempSdh(0), m_Condition(Condition && StatElem.m_sdh != 0) {
01083 if (Condition) {
01084 m_TempSdh = StatElem.m_sdh;
01085 StatElem.m_sdh = 0;
01086 }
01087 }
01088
01089 ~DISABLESTATS (
01090 ) {
01091 if (m_Condition) {
01092 m_StatElem.m_sdh = m_TempSdh;
01093 if (m_StatElem.m_sdh != 0) {
01094 ERRORPOSNDISABLE Disable;
01095 m_StatElem.m_sdh->RebuildTable(MSTDATT::ADDSTAT_None);
01096 }
01097 }
01098 }
01099
01100 bool IsDisabled (
01101 ) const { return (m_TempSdh != 0 && m_StatElem.m_sdh == 0); }
01102
01103 private:
01104 STATELEMENT& m_StatElem;
01105 VECTSTDATT* m_TempSdh;
01106 bool m_Condition;
01107 };
01108 friend class DISABLESTATS;
01109
01110 STATELEMENT (
01111 VECTORTOOLKIT& vtk,
01112 ELEMTYPE elemtype,
01113 DBASE_ELEMENT& Database
01114 );
01115
01116 virtual ~STATELEMENT (
01117 );
01118
01119 virtual bool HasStatHandle (
01120 ) const { return (m_sdh != 0); }
01121
01122 void CloseStat (
01123 );
01124
01125 ERRVALUE Close (
01126 );
01127
01128 INT32 GetNumRecords (
01129 ) const;
01130
01131 bool IsInitialized (
01132 ) const { return (m_sdh != 0); }
01133
01134 ERRVALUE Open (
01135 OPENFLAGS flags
01136 );
01137
01138 ERRVALUE RebuildTable (
01139 MSTDATT::ADDSTAT flags
01140 );
01141
01142 ERRVALUE RecoverFromUndo (
01143 );
01144
01145 ERRVALUE RemoveStatTable (
01146 );
01147
01148 protected:
01149 VECTSTDATT *m_sdh;
01150 bool m_MaintainStdAttribIDTables;
01151 };
01152 friend class STATELEMENT;
01153
01154 class LINEELEMENT : public STATELEMENT {
01155 public:
01156
01157 enum LINESNAP {
01158 LINESNAP_None = 0x0000,
01159 LINESNAP_ForceNode = 0x0001
01160 };
01161
01162 LINEELEMENT (
01163 VECTORTOOLKIT& vtk
01164 );
01165
01166 virtual ~LINEELEMENT (
01167 );
01168
01169 virtual INT32 GetElemIDCount (
01170 ) const;
01171
01172 virtual INT32 GetNumElements (
01173 ) const;
01174
01175 virtual ERRVALUE GetZValue (
01176 INT32 ElemNum,
01177 double& zvalue
01178 ) const;
01179
01180 virtual ERRVALUE SetElemIDCount (
01181 INT32 NewValue
01182 );
01183
01184 virtual ERRVALUE SetZValue (
01185 INT32 ElemNum,
01186 double zvalue
01187 );
01188
01189 INT32 Add (
01190 const POLYLINE& PolyLine
01191 );
01192
01193 int AddSnapPoint (
01194 LINEORIENT LineOrient,
01195 POLYLINE& PolyLine,
01196 LINESNAP LineSnap
01197 );
01198
01199 ERRVALUE Change (
01200 INT32 LineNum,
01201 const POLYLINE& PolyLine
01202 );
01203
01204 ERRVALUE ChangeLine (
01205 INT32 LineNum,
01206 const POLYLINE& PolyLine
01207 );
01208
01209 ERRVALUE ChangeSnapLine (
01210 POLYLINE& PolyLine
01211 );
01212
01213 int CheckIfIntersect (
01214 INT32 SkipLineNum,
01215 const POLYLINE& PolyLine
01216 );
01217
01218 ERRVALUE Close (
01219 );
01220
01221 ERRVALUE Delete (
01222 INT32 LineNum
01223 );
01224
01225 ERRVALUE FindLineAndSplit (
01226 const DPOINT3D& point,
01227 DPOINT3D& retpt
01228 );
01229
01230 BITSET& GetLineBitset (
01231 ) { return (m_ElemList); }
01232
01233 ERRVALUE JoinLines (
01234 INT32 NodeNum,
01235 INT32 RepLineNum,
01236 INT32 DelLineNum
01237 );
01238
01239 ERRVALUE Open (
01240 OPENFLAGS flags
01241 );
01242
01243 ERRVALUE OtherLineIntersect (
01244 const POLYLINE& PolyLine
01245 );
01246
01247 ERRVALUE RecoverFromUndo (
01248 );
01249
01250 ERRVALUE RemoveOvershoots (
01251 POLYLINE& PolyLine
01252 ) const;
01253
01254 ERRVALUE SelfLineIntersect (
01255 const POLYLINE& PolyLine
01256 );
01257
01258 INT32 SplitLineAtVertex (
01259 INT32 OldLineNum,
01260 INT32 vertex,
01261 INT32& NewLineNum
01262 );
01263
01264 INT32 SplitLineNearPoint (
01265 INT32 LineNum,
01266 const DPOINT2D& point,
01267 INT32& NewLineNum
01268 );
01269
01270 ERRVALUE UpdateStats (
01271 INT32 ElemNum
01272 );
01273
01274 private:
01275
01276 class OTHERLINESPLIT;
01277 friend class OTHERLINESPLIT;
01278 class SELFLINESPLIT;
01279 friend class SELFLINESPLIT;
01280
01281 BITSET m_ElemList;
01282 DBASE_LINE m_LineDB;
01283
01284 ERRVALUE AddLineSegment (const POLYLINE& PolyLine);
01285 ERRVALUE ChangeLineSegment (const POLYLINE& PolyLine);
01286 ERRVALUE ComputeLineExtents (INT32 LineNum, VECTOR::LINE& vline);
01287 INT32 FindBestLineSnapPoint (LINEORIENT LineOrient, const POLYLINE& Polyline, DPOINT3D& retpt, double& maxdist) const;
01288 int GenerateExtendSnapPoint (LINEORIENT LineOrient, const POLYLINE& PolyLine, DPOINT3D& retpt, LINESNAP LineSnap);
01289 int GenerateSnapToPoint (LINEORIENT LineOrient, const POLYLINE& PolyLine, DPOINT3D& retpt, LINESNAP LineSnap);
01290 int InsertLinePoint (INT32 LineNum, INT32 segment, DPOINT3D& insertpt);
01291 ERRVALUE ResetLineNodeLink (LINEORIENT LineOrient, INT32 LineNum);
01292
01293 class EXTENDSPLIT;
01294 class SNAPFILTINFO;
01295
01296 friend class VECTORTOOLKIT;
01297 };
01298 friend class LINEELEMENT;
01299 friend class LINEELEMENT::EXTENDSPLIT;
01300 friend class LINEELEMENT::SNAPFILTINFO;
01301 class LINEPOLYJOIN;
01302 friend class LINEPOLYJOIN;
01303
01304 class POINTELEMENT : public DATABASEELEMENT {
01305 public:
01306
01307 POINTELEMENT (
01308 VECTORTOOLKIT& vtk
01309 );
01310
01311 virtual ~POINTELEMENT (
01312 );
01313
01314 virtual INT32 GetElemIDCount (
01315 ) const;
01316
01317 virtual INT32 GetNumElements (
01318 ) const;
01319
01320 virtual ERRVALUE GetZValue (
01321 INT32 ElemNum,
01322 double& zvalue
01323 ) const;
01324
01325 virtual ERRVALUE SetElemIDCount (
01326 INT32 NewValue
01327 );
01328
01329 virtual ERRVALUE SetZValue (
01330 INT32 ElemNum,
01331 double zvalue
01332 );
01333
01334 virtual ERRVALUE ValidateElementIDTable (
01335 );
01336
01337 ERRVALUE Add (
01338 const DPOINT3D& point
01339 );
01340
01341 ERRVALUE Close (
01342 );
01343
01344 ERRVALUE Open (
01345 OPENFLAGS flags
01346 );
01347
01348 ERRVALUE RecoverFromUndo (
01349 );
01350
01351 ERRVALUE RemoveElementIDRecord (
01352 INT32 PointNum
01353 );
01354
01355 private:
01356 DBASE_POINT m_PointDB;
01357 };
01358 friend class POINTELEMENT;
01359
01360 class POLYGONELEMENT : public STATELEMENT {
01361 public:
01362 class POLYLINEDELETE;
01363
01364 POLYGONELEMENT (
01365 VECTORTOOLKIT& vtk
01366 );
01367
01368 virtual ~POLYGONELEMENT (
01369 );
01370
01371 virtual INT32 GetElemIDCount (
01372 ) const;
01373
01374 virtual INT32 GetNumElements (
01375 ) const;
01376
01377 virtual ERRVALUE GetZValue (
01378 INT32 ElemNum,
01379 double& zvalue
01380 ) const;
01381
01382 virtual ERRVALUE SetElemIDCount (
01383 INT32 NewValue
01384 );
01385
01386 virtual ERRVALUE SetZValue (
01387 INT32 ElemNum,
01388 double zvalue
01389 );
01390
01391 ERRVALUE AddIsland (
01392 INT32 PolyNum,
01393 INT32 IslandNum
01394 );
01395
01396 ERRVALUE Build (
01397 );
01398
01399 ERRVALUE ChangeIsland (
01400 INT32 PolyNum,
01401 INT32 OldIsleNum,
01402 INT32 NewIsleNum
01403 );
01404
01405 ERRVALUE ChangeLine (
01406 INT32 PolyNum,
01407 INT32 OldLineNum,
01408 INT32 NewLineNum
01409 );
01410
01411 ERRVALUE Close (
01412 );
01413
01414 ERRVALUE Delete (
01415 INT32 PolyNum
01416 );
01417
01418 ERRVALUE DeleteByLine (
01419 INT32 PolyNum,
01420 DELETEPOLYGON flags
01421 );
01422
01423 ERRVALUE DeleteIsland (
01424 INT32 PolyNum,
01425 INT32 IslandNum
01426 );
01427
01428 ERRVALUE DeleteLine (
01429 INT32 PolyNum,
01430 INT32 LineNum
01431 );
01432
01433 int FindPolygons (
01434 INT32 StartLine,
01435 INT32 PolyInside
01436 );
01437
01438 BITSET& GetPolygonBitset (
01439 ) { return (m_ElemList); }
01440
01441 ERRVALUE MergePolygons (
01442 INT32 LeftPolyNum,
01443 INT32 RightPolyNum,
01444 INT32 LineNum,
01445 POLYGONDELETEFILTER* PolyDelFilt
01446 );
01447
01448 ERRVALUE Open (
01449 OPENFLAGS flags
01450 );
01451
01452 ERRVALUE RecoverFromUndo (
01453 );
01454
01455 ERRVALUE RemoveIslandInfo (
01456 );
01457
01458 ERRVALUE RemovePolygonInfo (
01459 bool IsPolyRebuild
01460 );
01461
01462 ERRVALUE SplitLineInPolygons (
01463 INT32 OrigLineNum,
01464 const VECTOR::LINE& Origvline,
01465 INT32 NewLineNum
01466 );
01467
01468 ERRVALUE SplitLineInPoly (
01469 INT32 PolyNum,
01470 INT32 OrigLineNum,
01471 const VECTOR::LINE& Origvline,
01472 INT32 NewLineNum,
01473 SIMPLE_ARRAY<INT32>& LineList
01474 ) const;
01475
01476 ERRVALUE SplitLineInSamePoly (
01477 INT32 OrigLineNum,
01478 const VECTOR::LINE& Origvline,
01479 INT32 NewLineNum,
01480 SIMPLE_ARRAY<INT32>& LineList
01481 ) const;
01482
01483 ERRVALUE Update (
01484 INT32 PolyNum
01485 );
01486
01487 void UpdateStats (
01488 BITSET& PolySet
01489 );
01490
01491 ERRVALUE ValidatePolyInside (
01492 );
01493
01494 private:
01495 struct LOCATEPOLY;
01496
01497 DBASE_POLYGON m_PolyDB;
01498 BITSET m_ElemList;
01499
01500 ERRVALUE ComputePolyExtents (INT32 PolyNum);
01501 INT32 FindNextLine (LOCATEPOLY& LocatePoly);
01502 ERRVALUE GenerateShellPolyList (INT32 ParentPoly, const SIMPLE_ARRAY<INT32>& LineList, SIMPLE_ARRAY<INT32>& PolyList);
01503 ORIENTATION OrientList (const SIMPLE_ARRAY<INT32>& LineList, const SIMPLE_ARRAY<bool>& LineOrientList) const;
01504 ERRVALUE RemoveZeroAreaPolygon (INT32 StartLine, LOCATEPOLY& LocatePoly);
01505 ERRVALUE ReparentIslands (INT32 PolyNum, INT32 NewParent, bool MoveToNewParent);
01506 ERRVALUE ReparentNestedIslands (INT32 CheckPoly, const SIMPLE_ARRAY<INT32>& LineList);
01507 ERRVALUE SearchNestedIslands (INT32 PolyInside, INT32 IslePoly, bool AddingPolygon);
01508 ERRVALUE SetLeftRight (const LOCATEPOLY& LocatePoly, INT32 PolyNum, INT32 ParentPolyNum);
01509 ERRVALUE UnparentIslets (INT32 OldParentPoly, INT32 NewParentPoly, const INT32 *LineList, INT32 NumLines);
01510 void ValidatePoly (LOCATEPOLY& LocatePoly, INT32 StartLine);
01511
01512 };
01513 friend class POLYGONELEMENT;
01514 friend class POLYGONELEMENT::POLYLINEDELETE;
01515 class POLYLISTDELETE;
01516 friend class POLYLISTDELETE;
01517 class POLYISLANDDELETE;
01518
01519 struct NODELINEANGLE {
01520 double m_Angle;
01521 INT32 m_LineNum;
01522 bool m_Orient;
01523
01524 NODELINEANGLE (
01525 ) { memset(this, 0, sizeof(*this)); }
01526
01527 static int CompareAngle (
01528 NODELINEANGLE *d1,
01529 NODELINEANGLE *d2,
01530 void *data
01531 );
01532
01533 };
01534
01535 class NODEELEMENT : public DATABASEELEMENT {
01536 public:
01537 NODEELEMENT (
01538 VECTORTOOLKIT& vtk
01539 );
01540
01541 virtual ~NODEELEMENT (
01542 );
01543
01544 virtual INT32 GetElemIDCount (
01545 ) const;
01546
01547 virtual INT32 GetNumElements (
01548 ) const;
01549
01550 virtual ERRVALUE GetZValue (
01551 INT32 ElemNum,
01552 double& zvalue
01553 ) const;
01554
01555 virtual ERRVALUE SetElemIDCount (
01556 INT32 NewValue
01557 );
01558
01559 virtual ERRVALUE SetZValue (
01560 INT32 ElemNum,
01561 double zvalue
01562 );
01563
01564 virtual ERRVALUE ValidateElementIDTable (
01565 ) { return (0); }
01566
01567 INT32 AddNode (
01568 const DPOINT3D& point
01569 );
01570
01571 ERRVALUE AddNodeLine (
01572 INT32 NodeNum,
01573 INT32 LineNum
01574 );
01575
01576 ERRVALUE BuildNodeLineList (
01577 );
01578
01579 ERRVALUE ChangeNode (
01580 INT32 NodeNum,
01581 const DPOINT3D& point
01582 );
01583
01584 ERRVALUE ChangeNodeLine (
01585 INT32 NodeNum,
01586 INT32 OldLineNum,
01587 INT32 NewLineNum
01588 );
01589
01590 bool CheckIsPoint (
01591 INT32 NodeNum
01592 );
01593
01594 ERRVALUE Close (
01595 );
01596
01597 ERRVALUE ConvertNodePointToNode (
01598 INT32 NodeNum
01599 );
01600
01601 ERRVALUE ConvertToPoint (
01602 INT32 NodeNum
01603 );
01604
01605 ERRVALUE Delete (
01606 INT32 NodeNum
01607 );
01608
01609 ERRVALUE DeleteNodeLine (
01610 INT32 NodeNum,
01611 INT32 LineNum
01612 );
01613
01614 ERRVALUE FindNodeLineAngles (
01615 INT32 NodeNum,
01616 SIMPLE_ARRAY<NODELINEANGLE>& list
01617 ) const;
01618
01619 DBASE_NODE& GetNodeDatabase (
01620 ) { return (m_NodeDB); }
01621
01622 ERRVALUE Open (
01623 OPENFLAGS flags
01624 );
01625
01626 ERRVALUE RecoverFromUndo (
01627 );
01628
01629 ERRVALUE ValidateNodes (
01630 );
01631
01632 private:
01633 DBASE_NODE m_NodeDB;
01634 };
01635 friend class NODEELEMENT;
01636
01637 class LABELELEMENT : public BASEELEMENT {
01638 public:
01639
01640 LABELELEMENT (
01641 VECTORTOOLKIT& vtk
01642 );
01643
01644 virtual ~LABELELEMENT (
01645 );
01646
01647
01648 virtual INT32 GetNumElements (
01649 ) const;
01650
01651 virtual ERRVALUE GetZValue (
01652 INT32 ElemNum,
01653 double& zvalue
01654 ) const;
01655
01656 virtual ERRVALUE SetZValue (
01657 INT32 ElemNum,
01658 double zvalue
01659 );
01660
01661
01662 ERRVALUE AddLabelAttach (
01663 INT32 LabelNum,
01664 const VECTOR::LABEL& label,
01665 bool CheckAttach = false
01666 );
01667
01668 ERRVALUE ChangeAttachPosn (
01669 ELEMTYPE ElemType,
01670 INT32 ElemNum,
01671 const DPOINT3D& point
01672 );
01673
01674 ERRVALUE ChangeLabelAttach (
01675 ELEMTYPE ElemType,
01676 INT32 OldElemNum,
01677 INT32 NewElemNum
01678 );
01679
01680 ERRVALUE CheckAttachments (
01681 );
01682
01683 void CheckLabelAttach (
01684 const VECTOR::LABEL& label
01685 );
01686
01687 void CleanupElemToLabelTrans (
01688 );
01689
01690 ERRVALUE Close (
01691 );
01692
01693 ERRVALUE DeleteLabelAttach (
01694 ELEMTYPE ElemType,
01695 INT32 ElemNum
01696 );
01697
01698 ERRVALUE Open (
01699 OPENFLAGS flags
01700 );
01701
01702 ERRVALUE PickLineLabelAttach (
01703 INT32 OldLineNum,
01704 INT32 NewLineNum
01705 );
01706
01707 ERRVALUE PickPolyLabelAttach (
01708 INT32 OldPolyNum,
01709 INT32 NewPolyNum
01710 );
01711
01712 ERRVALUE RecoverFromUndo (
01713 );
01714
01715 ERRVALUE RemoveLabelAttach (
01716 INT32 LabelNum
01717 );
01718
01719 ERRVALUE ResizeLabelAttach (
01720 ELEMTYPE ElemType,
01721 INT32 NumItems
01722 );
01723
01724 ERRVALUE SetupElemToLabelTrans (
01725 );
01726
01727 ERRVALUE SwapElementLabelAttach (
01728 ELEMTYPE ElemType,
01729 INT32 FirstElem,
01730 INT32 LastElem
01731 );
01732
01733 ERRVALUE SwapLabelAttach (
01734 INT32 FirstLabel,
01735 INT32 LastLabel
01736 );
01737
01738 private:
01739
01740 LIST& GetTransList (ELEMTYPE ElemType);
01741 ERRVALUE ResizeLabelTransList (ELEMTYPE ElemType);
01742
01743 OBJECT m_LabelTransFile;
01744 LIST m_LineToLabelID;
01745 LIST m_NodeToLabelID;
01746 LIST m_PointToLabelID;
01747 LIST m_PolygonToLabelID;
01748 LIST m_DummyID;
01749
01750 };
01751 friend class LABELELEMENT;
01752
01753 class OPENVECTOR : public VECTOR {
01754 public:
01755
01756 OPENVECTOR (
01757 ) : VECTOR() {}
01758
01759 OPENVECTOR (
01760 const OPENVECTOR& rhs
01761 ) : VECTOR(rhs) {}
01762
01763 virtual ~OPENVECTOR (
01764 ) {}
01765
01766 ERRVALUE ClearLinePointList (
01767 ) { return (VECTOR::ClearLinePointList()); }
01768
01769 ERRVALUE ClearNodeLineList (
01770 ) { return (VECTOR::ClearNodeLineList()); }
01771
01772 ERRVALUE ClearPolygonIslandList (
01773 ) { return (VECTOR::ClearPolygonIslandList()); }
01774
01775 ERRVALUE ClearPolygonLineList (
01776 ) { return (VECTOR::ClearPolygonLineList()); }
01777
01778 ERRVALUE SetNumLabels (
01779 INT32 NewNumLabels
01780 ) { return (VECTOR::SetNumLabels(NewNumLabels)); }
01781
01782 ERRVALUE SetNumLines (
01783 INT32 NewNumLines
01784 ) { return (VECTOR::SetNumLines(NewNumLines)); }
01785
01786 ERRVALUE SetNumNodes (
01787 INT32 NewNumNodes
01788 ) { return (VECTOR::SetNumNodes(NewNumNodes)); }
01789
01790 ERRVALUE SetNumPoints (
01791 INT32 NewNumPoints
01792 ) { return (VECTOR::SetNumPoints(NewNumPoints)); }
01793
01794 ERRVALUE SetNumPolygons (
01795 INT32 NewNumPolygons
01796 ) { return (VECTOR::SetNumPolygons(NewNumPolygons)); }
01797
01798 ERRVALUE SwapLinePoints (
01799 INT32 Line1,
01800 INT32 Line2
01801 ) { return (VECTOR::SwapLinePoints(Line1, Line2)); }
01802
01803 ERRVALUE SwapNodeLines (
01804 INT32 Node1,
01805 INT32 Node2
01806 ) { return (VECTOR::SwapNodeLines(Node1, Node2)); }
01807
01808 ERRVALUE SwapPolyIslands (
01809 INT32 Poly1,
01810 INT32 Poly2
01811 ) { return (VECTOR::SwapPolyIslands(Poly1, Poly2)); }
01812
01813
01814 ERRVALUE SwapPolyLines (
01815 INT32 Poly1,
01816 INT32 Poly2
01817 ) { return (VECTOR::SwapPolyLines(Poly1, Poly2)); }
01818 };
01819
01820 class DISABLETEXT {
01821 public:
01822
01823 DISABLETEXT (
01824 VECTORTOOLKIT& vtk
01825 ) : m_vtk(vtk), m_OldFlags(TOOLKITFLAG_None) {
01826 m_OldFlags = vtk.GetToolkitFlags();
01827 vtk.SetToolkitFlags(static_cast<TOOLKITFLAG>(m_OldFlags | TOOLKITFLAG_NoStatusText));
01828 }
01829
01830 ~DISABLETEXT (
01831 ) { m_vtk.SetToolkitFlags(m_OldFlags); }
01832
01833 bool DoStatusText (
01834 ) const { return ((m_OldFlags & TOOLKITFLAG_NoStatusText) == 0); }
01835
01836 private:
01837 TOOLKITFLAG m_OldFlags;
01838 VECTORTOOLKIT& m_vtk;
01839 };
01840
01841 class BUILDPOLYINFO;
01842 class CLIPDATA;
01843 class CLIPDATA2;
01844 class DEPTHSORTINFO;
01845 class REMOVEEXCESSNODES;
01846 class REMPOLYREC;
01847 class SLIVEROBSERVER;
01848 class VALIDATE;
01849 friend class BUILDPOLYINFO;
01850 friend class CLIPDATA;
01851 friend class CLIPDATA2;
01852 friend class DEPTHSORTINFO;
01853 friend class REMOVEEXCESSNODES;
01854 friend class REMPOLYREC;
01855 friend class SLIVEROBSERVER;
01856 friend class VALIDATE;
01857
01858 OPENVECTOR m_VectorObj;
01859 HYPERINDEX m_HyperObj;
01860 STYLE m_StyleObj;
01861 SIMPLE_ARRAY<INT32> m_LineList;
01862 SIMPLE_ARRAY<INT32> m_IsleList;
01863 SNAPPARMS m_SnapParms;
01864 double m_IntsThresh;
01865 LABELELEMENT m_Label;
01866 POINTELEMENT m_Point;
01867 NODEELEMENT m_Node;
01868 POLYGONELEMENT m_Polygon;
01869 LINEELEMENT m_Line;
01870 POLYLINE m_PointBuff;
01871 SNAPOBJECT m_SnapObject;
01872 bool m_InValidateFunc;
01873 bool m_HasAttachedLabels;
01874 bool m_IgnoreAddDBList;
01875 bool m_MultiLineSnap;
01876 bool m_TestEndLine;
01877 bool m_SnappedSelfLine;
01878 bool m_UseAddLineOverlapCallback;
01879 bool m_IgnoreBadMinMax;
01880 bool m_UseLegacyDelete;
01881 bool m_InPolygonDelete;
01882 TOOLKITFLAG m_ToolkitFlags;
01883 INT32 m_MaxLinePoints;
01884 UINT32 m_RecursiveCount;
01885 INT32 m_ModifyLineNum;
01886 INT32 m_ModifyNodeNum;
01887
01888 static int IsDoubleEqual (double val1, double val2, double scale);
01889
01890 void CallOnAdd (ELEMTYPE ElemType, INT32 ElemNum);
01891 void CallOnDelete (ELEMTYPE ElemType, INT32 ElemNum, INT32 OtherElemNum);
01892 void CallOnJoinBegin (ELEMTYPE ElemType, INT32 ElemNum, INT32 OtherElemNum);
01893 void CallOnJoinEnd (ELEMTYPE ElemType, INT32 ElemNum);
01894 void CallOnLineOverlap (const SIMPLE_ARRAY<POLYLINE::INTERSECTINFO::OVERLAP>& Overlaps);
01895 void CallOnMoveBegin (ELEMTYPE ElemType, INT32 ElemNum);
01896 void CallOnMoveEnd (ELEMTYPE ElemType, INT32 ElemNum);
01897 void CallOnNodeLineAdd (INT32 NodeNum, INT32 NumLines);
01898 void CallOnNodeLineDelete (INT32 NodeNum, INT32 NumLines);
01899 void CallOnNodeToPointBegin (INT32 NodeNum);
01900 void CallOnNodeToPointEnd (INT32 NodeNum);
01901 void CallOnSplitBegin (ELEMTYPE ElemType, INT32 ElemNum);
01902 void CallOnSplitEnd (ELEMTYPE ElemType, INT32 ElemNum, INT32 OtherElemNum);
01903 void CallOnValidateSplitLine (ELEMTYPE ElemType, INT32 ElemNum, INT32 OtherElemNum);
01904 void CallOnZeroAreaPolygon ();
01905 ERRVALUE ChangeElemInHyperShape (ELEMTYPE ElemType, INT32 OldElemNum, INT32 NewElemNum);
01906 ERRVALUE ChangeTypeInHyperShape (ELEMTYPE ElemType, INT32 elemnum, RVC::HYPERINDEX::SHAPE::TYPE newtype);
01907 ERRVALUE ClipToPolyLine (POLYLINE& PolyLine, CLIPDATA& ClipData, CLIPFLAGS flags, bool IsIsland);
01908 ERRVALUE ClipToPolyLine (POLYLINE& PolyLine, CLIPDATA2& ClipData, CLIPFLAGS flags, bool IsIsland);
01909 ERRVALUE CombineHyperLinks (ELEMTYPE ElemType, INT32 SourceElem, INT32 DestElem);
01910 INT32 CompareHyperShapes (ELEMTYPE ElemType, INT32 ElemNum1, INT32 ElemNum2);
01911 ERRVALUE ConflateRegion (POLYLINE& PolyLine);
01912 ERRVALUE CopyHyperLinks (ELEMTYPE ElemType, INT32 SourceElem, INT32 DestElem);
01913 ERRVALUE DeleteElemHyperShape (ELEMTYPE ElemType, INT32 ElemNum);
01914 ERRVALUE ExtractToRegion (const REGION2D& region, TESTCRITERIA RegionTest, const BITSET& LineNotTest, const BITSET& LineDelList, CLIPFLAGS flags);
01915 ERRVALUE FindLineDirection (NODELINEANGLE& nla) const;
01916 ERRVALUE GenerateIntersections (const POLYLINE& PolyLine, POLYLINE::INTERSECTINFO& ints, INT32 MaxIntersections, SNAPOBJECT& SnapObject);
01917 const BASEELEMENT *GetBaseElement (ELEMTYPE ElemType) const;
01918 BASEELEMENT *GetBaseElement (ELEMTYPE ElemType);
01919 double GenerateThreshold (double resolution) const;
01920 int MergeTwoNodes (INT32 LineNum, INT32 OldNode, INT32 NewNode, SIMPLE_ARRAY<INT32>& RemoveLineSet);
01921 ERRVALUE SetZState (double zvalue);
01922 bool TestSnapBackAngle (LINEORIENT LineOrient, const POLYLINE& PolyLine, const DPOINT3D& testpt) const;
01923
01924
01925 VECTORTOOLKIT (const VECTORTOOLKIT&);
01926 VECTORTOOLKIT& operator=(const VECTORTOOLKIT&);
01927
01928 #endif // GENERATING_DOXYGEN_OUTPUT
01929
01930 };
01931
01932
01933 class VECTORTOOLKIT::POLYGONDELETEFILTER {
01934 public:
01935 POLYGONDELETEFILTER() {}
01936
01939 INT32 WhichPolygonDelete (
01940 INT32 LeftPolygon,
01941 INT32 RightPolygon
01942 ) { return (v_WhichPolygonDelete(LeftPolygon, RightPolygon)); }
01943
01944 private:
01945 virtual INT32 v_WhichPolygonDelete (
01946 INT32 LeftPolygon,
01947 INT32 RightPolygon
01948 ) = 0;
01949 };
01950
01951
01952 class VECTORTOOLKITOBSERVER : public OBSERVER_BASE {
01953 public:
01954
01955 VECTORTOOLKITOBSERVER (
01956 VECTORTOOLKIT& vtk
01957 );
01958
01959 virtual ~VECTORTOOLKITOBSERVER (
01960 );
01961
01962 virtual void OnAdd (
01963 ELEMTYPE ElemType,
01964 INT32 ElemNum
01965 );
01966
01967 virtual void OnDelete (
01968 ELEMTYPE ElemType,
01969 INT32 ElemNum,
01970 INT32 OtherElemNum
01971 );
01972
01973 virtual void OnJoinBegin (
01974 ELEMTYPE ElemType,
01975 INT32 ElemNum,
01976 INT32 OtherElemNum
01977 );
01978
01979 virtual void OnJoinEnd (
01980 ELEMTYPE ElemType,
01981 INT32 ElemNum
01982 );
01983
01984 virtual void OnLineOverlap (
01985 const SIMPLE_ARRAY<POLYLINE::INTERSECTINFO::OVERLAP>& Overlaps
01986 );
01987
01988 virtual void OnMoveBegin (
01989 ELEMTYPE ElemType,
01990 INT32 ElemNum
01991 );
01992
01993 virtual void OnMoveEnd (
01994 ELEMTYPE ElemType,
01995 INT32 ElemNum
01996 );
01997
01998 virtual void OnNodeLineAdd (
01999 INT32 NodeNum,
02000 INT32 NumLines
02001 );
02002
02003 virtual void OnNodeLineDelete (
02004 INT32 NodeNum,
02005 INT32 NumLines
02006 );
02007
02008 virtual void OnNodeToPointBegin (
02009 INT32 NodeNum
02010 );
02011
02012 virtual void OnNodeToPointEnd (
02013 INT32 NodeNum
02014 );
02015
02016 virtual void OnSplitBegin (
02017 ELEMTYPE ElemType,
02018 INT32 ElemNum
02019 );
02020
02021 virtual void OnSplitEnd (
02022 ELEMTYPE ElemType,
02023 INT32 ElemNum,
02024 INT32 OtherElemNum
02025 );
02026
02027 virtual void OnValidateSplitLine (
02028 ELEMTYPE ElemType,
02029 INT32 ElemNum,
02030 INT32 OtherElemNum
02031 );
02032
02033 virtual void OnZeroAreaPolygon (
02034 );
02035
02036 };
02037
02038 #ifndef GENERATING_DOXYGEN_OUTPUT
02039 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::CLIPFLAGS);
02040 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::DELETELINE);
02041 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::DELETEPOLYGON);
02042 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::NODEFLAG);
02043 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::OPENFLAGS);
02044 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::SAVEFLAGS);
02045 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::TOOLKITFLAG);
02046 DEFINE_ENUM_OP_BITWISE(VECTORTOOLKIT::VALIDATEFLAG);
02047 #endif // GENERATING_DOXYGEN_OUTPUT
02048
02049 }
02050
02051 #endif // INC_RVC_VECTTOOL_H