vecttool.h

Go to the documentation of this file.
00001 /****
00002 *  \file rvc/vecttool.h
00003 *  \brief Vector toolkit include file
00004 *
00005 *  \if NODOC
00006 *  $Id: vecttool.h_v 1.44 2004/10/29 22:59:26 scowan Exp $
00007 *
00008 *  $Log: vecttool.h_v $
00009 *  Revision 1.44  2004/10/29 22:59:26  scowan
00010 *  Added internal class yet again.
00011 *
00012 *  Revision 1.43  2004/09/28 17:03:20  scowan
00013 *  Added parameter to method.
00014 *
00015 *  Revision 1.42  2004/09/14 22:09:09  scowan
00016 *  Added validate flag to not build std attrib tables.
00017 *
00018 *  Revision 1.41  2004/07/29 15:55:16  scowan
00019 *  Added set precision method.
00020 *
00021 *  Revision 1.40  2004/07/13 13:58:16  scowan
00022 *  Removed use of geo region methods.
00023 *
00024 *  Revision 1.39  2004/03/02 21:01:40  scowan
00025 *  Removed unnecessary include files.
00026 *
00027 *  Revision 1.38  2004/02/04 21:51:47  scowan
00028 *  Added YAC.
00029 *
00030 *  Revision 1.37  2004/02/04 21:44:30  scowan
00031 *  Added panel for snap parms dialog.
00032 *
00033 *  Revision 1.36  2004/01/15 22:59:37  scowan
00034 *  Added new clip to region methods.
00035 *
00036 *  Revision 1.35  2004/01/09 23:02:08  scowan
00037 *  Added inline.
00038 *
00039 *  Revision 1.34  2004/01/06 23:43:48  scowan
00040 *  Added inline method.
00041 *
00042 *  Revision 1.33  2003/11/06 18:24:26  scowan
00043 *  Added inline method to node class.
00044 *
00045 *  Revision 1.32  2003/10/31 16:31:23  scowan
00046 *  Added node delete flag.
00047 *
00048 *  Revision 1.31  2003/10/16 20:16:32  scowan
00049 *  Passed mi string instead of file pointer for log in validate.
00050 *
00051 *  Revision 1.30  2003/10/08 22:21:08  scowan
00052 *  Doxygen adjustments.
00053 *
00054 *  Revision 1.29  2003/09/30 16:52:06  dwilliss
00055 *  Doxygen
00056 *
00057 *  Revision 1.28  2003/09/25 21:56:58  dwilliss
00058 *  doxygen
00059 *
00060 *  Revision 1.27  2003/09/15 13:49:45  fileserver!dwilliss
00061 *  Doxygen
00062 *
00063 *  Revision 1.26  2003/08/15 17:48:54  scowan
00064 *  Added ctor to node line angle struct to remove UMR reports.
00065 *
00066 *  Revision 1.25  2003/07/07 16:31:21  scowan
00067 *  Added new observable option.
00068 *
00069 *  Revision 1.24  2003/07/03 14:37:05  scowan
00070 *  Added method.
00071 *
00072 *  Revision 1.23  2003/03/25 18:08:02  scowan
00073 *  Moved internal methods from private to public.
00074 *
00075 *  Revision 1.22  2003/03/07 18:43:59  scowan
00076 *  nc.
00077 *
00078 *  Revision 1.21  2003/02/17 17:32:54  scowan
00079 *  Removed unnecessary variables and added a polygon attribute class.
00080 *
00081 *  Revision 1.20  2003/02/05 23:03:31  scowan
00082 *  Fixed UMR.
00083 *
00084 *  Revision 1.19  2003/01/23 23:02:50  scowan
00085 *  Modified inline method.
00086 *
00087 *  Revision 1.18  2003/01/23 16:14:00  scowan
00088 *  Added method.
00089 *
00090 *  Revision 1.17  2003/01/22 20:52:15  scowan
00091 *  Moved ctor for snap object to non-inline.
00092 *
00093 *  Revision 1.16  2003/01/17 20:13:28  scowan
00094 *  Added methods to get the node database.
00095 *
00096 *  Revision 1.15  2002/10/24 22:21:03  scowan
00097 *  Made dtors virtual.
00098 *
00099 *  Revision 1.14  2002/10/08 14:42:32  scowan
00100 *  Moved forward declaration.
00101 *
00102 *  Revision 1.13  2002/10/04 21:19:07  scowan
00103 *  Multiple little changes.
00104 *
00105 *  Revision 1.12  2002/06/27 14:32:50  scowan
00106 *  Added parameter.
00107 *
00108 *  Revision 1.11  2002/05/15 20:13:30  dwilliss
00109 *  Share, damn it!
00110 *
00111 *  Revision 1.10  2002/05/15 19:58:38  dwilliss
00112 *  Can't we all just be friends?
00113 *
00114 *  Revision 1.9  2002/04/15 19:58:06  scowan
00115 *  Adjusted get database method.
00116 *
00117 *  Revision 1.8  2002/04/08 16:34:14  scowan
00118 *  Fixed database name chages.
00119 *
00120 *  Revision 1.7  2001/11/07 21:41:42  scowan
00121 *  Method parametyer change.
00122 *
00123 *  Revision 1.6  2001/10/23 17:46:03  scowan
00124 *  *** empty log message ***
00125 *
00126 *  Revision 1.5  2001/10/12 14:57:31  scowan
00127 *  Added save flag.
00128 *
00129 *  Revision 1.4  2001/10/08 21:03:00  scowan
00130 *  Added methods to clip to a region.
00131 *
00132 *  Revision 1.3  2001/09/19 16:47:46  scowan
00133 *  Fixed MAC errors.
00134 *
00135 *  Revision 1.2  2001/09/18 14:12:23  scowan
00136 *  Moved std att include file.
00137 *
00138 *  Revision 1.1  2001/09/18 13:56:22  scowan
00139 *  Initial revision
00140 *
00141 *  \endif
00142 ****/
00143 
00144 #ifndef  INC_RVC_VECTTOOL_H
00145 #define  INC_RVC_VECTTOOL_H
00146 
00147 #ifndef  INC_MI32_ELEMTYPE_H
00148    #include <mi32/elemtype.h>
00149 #endif
00150 
00151 #ifndef  INC_MI32_SIMPLEAR_H
00152    #include <mi32/simplear.h>
00153 #endif
00154 
00155 #ifndef  INC_MI32_BITSET_H
00156    #include <mi32/bitset.h>
00157 #endif
00158 
00159 #ifndef  INC_RVC_VECTOR_H
00160    #include <rvc/vector.h>
00161 #endif
00162 
00163 #ifndef  INC_RVC_HYPERINDEX_H
00164    #include <rvc/hyperidx.h>
00165 #endif
00166 
00167 #ifndef  INC_RVC_STYLE_H
00168    #include <rvc/style.h>
00169 #endif
00170 
00171 #ifndef  INC_MI32_OBSERVER_H
00172    #include <mi32/observer.h>
00173 #endif
00174 
00175 #ifndef  INC_RVC_MSTDATT_H
00176    #include <rvc/mstdatt.h>
00177 #endif
00178 
00179 #ifndef  INC_RVC_DBPOINT_H
00180    #include <rvc/dbpoint.h>
00181 #endif
00182 
00183 #ifndef  INC_RVC_DBLINE_H
00184    #include <rvc/dbline.h>
00185 #endif
00186 
00187 #ifndef  INC_RVC_DBPOLY_H
00188    #include <rvc/dbpoly.h>
00189 #endif
00190 
00191 #ifndef  INC_RVC_DBNODE_H
00192    #include <rvc/dbnode.h>
00193 #endif
00194 
00195 #ifndef  INC_RVC_DBTABLE_H
00196    #include <rvc/dbtable.h>
00197 #endif
00198 
00199 #ifndef  INC_RVC_LIST_H
00200    #include <rvc/list.h>
00201 #endif
00202 
00203 #ifndef  INC_MI32_POLYLINE_H
00204    #include <mi32/polyline.h>
00205 #endif
00206 
00207 #include <vector>
00208 
00209 #ifndef GENERATING_DOXYGEN_OUTPUT
00210 // Forward Declarations
00211 class REGION2D;
00212 #endif // GENERATING_DOXYGEN_OUTPUT
00213 
00214 namespace RVC {
00215 
00216 #ifndef GENERATING_DOXYGEN_OUTPUT
00217 // Forward Declarations
00218 class VECTORTOOLKITOBSERVER;
00219 #endif // GENERATING_DOXYGEN_OUTPUT
00220 
00221 //! \class VECTORTOOLKIT rvc/vecttool.h
00222 //! \brief Vector Toolkit
00223 //!
00224 class VECTORTOOLKIT : public SUBJECT<VECTORTOOLKITOBSERVER> {
00225    private:
00226 
00227       #ifndef GENERATING_DOXYGEN_OUTPUT
00228       class LINEELEMENT;
00229       #endif // GENERATING_DOXYGEN_OUTPUT
00230       
00231    public:
00232 
00233       #ifndef GENERATING_DOXYGEN_OUTPUT
00234       class POLYGONDELETEFILTER;
00235       #endif // GENERATING_DOXYGEN_OUTPUT
00236 
00237       class SNAPOBJECT {
00238          public:
00239          
00240             SNAPOBJECT (
00241                );
00242                
00243             ~SNAPOBJECT (
00244                );
00245                
00246             const RVC::VECTOR& GetVectorObject (
00247                ) const { return (m_VectorObj); }
00248                
00249             const TRANS2D_MAPGEN& GetTransGen (
00250                ) const { return (m_VectorToObject); }
00251                
00252             bool IsSameAsEditor (
00253                ) const { return (m_SameAsEditor); }
00254                
00255             void SetValues (
00256                const VECTORTOOLKIT& vtk
00257                );
00258                
00259             void SetValues (
00260                const VECTOR& VectorObj,
00261                const TRANS2D_MAPGEN& VectorToObject
00262                );
00263                
00264          private:
00265          
00266             #ifndef GENERATING_DOXYGEN_OUTPUT
00267             bool m_SameAsEditor;
00268             VECTOR m_VectorObj;
00269             TRANS2D_MAPGEN m_VectorToObject;
00270             friend class VECTORTOOLKIT;
00271             friend class LINEELEMENT;
00272             
00273             SNAPOBJECT (const VECTORTOOLKIT& vtk);
00274                
00275             SNAPOBJECT& operator= (const SNAPOBJECT& rhs);
00276             #endif // GENERATING_DOXYGEN_OUTPUT
00277                
00278          };
00279       friend class SNAPOBJECT;
00280       
00281       class SNAPPARMS {
00282          public:
00283          
00284             class PANEL;
00285 
00286             enum SNAPTOELEM {
00287                SNAPTOELEM_AnyElement = 0,
00288                SNAPTOELEM_Line,
00289                SNAPTOELEM_Point,
00290                SNAPTOELEM_Node,
00291                SNAPTOELEM_Nothing,
00292                SNAPTOELEM_Vertex
00293                };
00294 
00295             enum SNAPTYPE {
00296                SNAPTYPE_AddVertexSnap = 0,
00297                SNAPTYPE_DirectSnap,
00298                SNAPTYPE_ContinueSnap
00299                };
00300                
00301             enum SNAPEND {
00302                SNAPEND_Both = 0,
00303                SNAPEND_Start,
00304                SNAPEND_End
00305                };
00306                
00307             SNAPPARMS (
00308                );
00309                
00310             bool CanCrossLines (
00311                ) const { return (!m_DontCrossLines); }
00312 
00313             bool CanRemoveOvershoots (
00314                ) const { return (m_RemOvershoots); }
00315 
00316             bool CanSnapToSelf (
00317                ) const { return (!m_DontSnapToSelf); }
00318 
00319             SNAPTOELEM GetElementSnap (
00320                ) const { return (m_SnapToElem); }
00321 
00322             UINT32 GetLegacyFlags (
00323                ) const;
00324                
00325             double GetSnapBackAngle (
00326                ) const { return (m_SnapBackAngle); }
00327                
00328             double GetSnapDist (
00329                ) const { return (m_SnapDist); }
00330                
00331             SNAPEND GetSnapEnd (
00332                ) const { return (m_SnapEnd); }
00333                
00334             SNAPTYPE GetSnapType (
00335                ) const { return (m_SnapType); }
00336                
00337             void SetCrossLines (
00338                bool CrossLines
00339                ) { m_DontCrossLines = !CrossLines; }
00340 
00341             void SetElementSnap (
00342                SNAPTOELEM element
00343                ) { m_SnapToElem = element; }
00344                
00345             void SetFromLegacyFlags (
00346                UINT32 flags
00347                );
00348                
00349             void SetRemoveOvershoots (
00350                bool RemoveOvershoots
00351                ) { m_RemOvershoots = RemoveOvershoots; }
00352 
00353             void SetSnapBackAngle (
00354                double angle
00355                ) { m_SnapBackAngle = bound(angle, 0.0, PI); }
00356                
00357             void SetSnapDist (
00358                double dist
00359                ) { m_SnapDist = dist; }
00360                
00361             void SetSnapEnd (
00362                SNAPEND SnapEnd
00363                ) { m_SnapEnd = SnapEnd; }
00364                
00365             void SetSnapToSelf (
00366                bool SnapToSelf
00367                ) { m_DontSnapToSelf = !SnapToSelf; }
00368 
00369             void SetSnapType (
00370                SNAPTYPE SnapType
00371                ) { m_SnapType = SnapType; }
00372                
00373          private:
00374 
00375             #ifndef GENERATING_DOXYGEN_OUTPUT
00376             SNAPTOELEM m_SnapToElem;   
00377             SNAPTYPE m_SnapType; 
00378             SNAPEND m_SnapEnd;
00379             double m_SnapDist;
00380             double m_SnapBackAngle;             //!<  Allowable variation of angle of snap point to differ with the line segment 
00381             bool m_RemOvershoots;
00382             bool m_DontCrossLines;
00383             bool m_DontSnapToSelf;
00384             #endif // GENERATING_DOXYGEN_OUTPUT
00385             
00386          };
00387       
00388       enum CLIPFLAGS {
00389          CLIPFLAG_None = 0x00000000,               //!< Nothing
00390          CLIPFLAG_ForceClipBorder = 0x00000200,    //!< Force the clip routine to add a border
00391          CLIPFLAG_NoClipBorder = 0x00000400,       //!< Force the clip routine to not add any border
00392          CLIPFLAG_OnlyClipLines = 0x00000800,      //!< Do not bother with the points and labels
00393          CLIPFLAG_NoStdAttrib = 0x00001000,        //!< Avoid standard attribute rebuild in validate
00394          CLIPFLAG_RemUnusedDBRec = 0x00002000      //!< Removed unattached database records
00395          };
00396          
00397       enum DELETELINE {
00398          DELETELINE_None = 0x0000,
00399          DELETELINE_RemoveExcessNodes = 0x0001
00400          };
00401          
00402       enum DELETEPOLYGON {
00403          DELETEPOLYGON_None = 0x0000,
00404          DELETEPOLYGON_LongLineDelete = 0x0001,
00405          DELETEPOLYGON_NoDeleteSpurs = 0x0002,
00406          DELETEPOLYGON_CombineAttrib = 0x0004,
00407          DELETEPOLYGON_RemoveAllIslands = 0x0008
00408          };
00409          
00410       enum TOOLKITFLAG {
00411          TOOLKITFLAG_None = 0x00,
00412          TOOLKITFLAG_NoConvIfElemID = 0x01,        //!< Do not convert node to point if element ID attachment only
00413          TOOLKITFLAG_RemExNodesDelLine = 0x02,     //!< Delete excess nodes when deleting lines
00414          TOOLKITFLAG_NoStatusText = 0x04,          //!< Do not show status text
00415          TOOLKITFLAG_NoSaveQTree = 0x08,           //!< Do not save search tree in MfvClose() or MfvStop()
00416          TOOLKITFLAG_NoCreateElemID = 0x10,        //!< Do not create element ID tables
00417          TOOLKITFLAG_NoQTrees = 0x20,              //!< Do not create search trees
00418          TOOLKITFLAG_KeepAttachedLabels = 0x40     //!< Keep attached labels after elements attached are gone
00419          };
00420          
00421       enum OPENFLAGS {
00422          OPENFLAGS_None = 0x00000000,
00423          OPENFLAGS_NoQtree = 0x00000001,
00424          OPENFLAGS_NoLineQtree = 0x00000002,
00425          OPENFLAGS_NoNodeQtree = 0x00000004,
00426          OPENFLAGS_NoPolygonQtree = 0x00000008,
00427          OPENFLAGS_NoPointQtree = 0x00000010,
00428          OPENFLAGS_NoLabelQtree = 0x00000020,
00429          OPENFLAGS_NoDatabase = 0x00000040,
00430          OPENFLAGS_NoCreateTables = 0x00000080,
00431          OPENFLAGS_NoCreateElemID = 0x00000100,
00432          OPENFLAGS_NoDBStatTable = 0x00000200,
00433          OPENFLAGS_NoCreateStyle = 0x00000400,
00434          OPENFLAGS_NoChangeTopoType = 0x00000800,
00435          OPENFLAGS_NoHyper = 0x00001000,
00436          OPENFLAGS_NoStyle = 0x00002000,
00437          OPENFLAGS_NoValidateNodes = 0x00004000,
00438          OPENFLAGS_WriteAbsolute = 0x00008000,
00439          OPENFLAGS_NoLegacyDelete = 0x00010000
00440          };
00441          
00442       enum SAVEFLAGS {
00443          SAVEFLAG_None = 0x0000,
00444          SAVEFLAG_RemoveExcessNodes = 0x0001,
00445          SAVEFLAG_RemoveExcessRecords = 0x0002,
00446          SAVEFLAG_Optimize = 0x0004
00447          };
00448          
00449       enum STDATTRIBSTATE {
00450          STDATTRIBSTATE_NonExistant = 1,
00451          STDATTRIBSTATE_NeedRebuilding,
00452          STDATTRIBSTATE_Valid
00453          };
00454          
00455       enum VALIDATEFLAG {
00456          VALIDATEFLAG_None =                    0x0000,
00457          VALIDATEFLAG_RebuildPolys =            0x0001,
00458          VALIDATEFLAG_RebuildIslands =          0x0002,
00459          VALIDATEFLAG_RebuildNodeLineList =     0x0004,
00460          VALIDATEFLAG_DontValidateZ =           0x0008,
00461          VALIDATEFLAG_NoRemoveNodes =           0x0080,
00462          VALIDATEFLAG_NoDBStatTable =           0x0100            //!< Do not build and / or update the standard attribute tables
00463          };
00464          
00465       enum NODEFLAG {
00466          NODEFLAG_None =            0x0000,
00467          NODEFLAG_NoCheckDatabase = 0x0001,
00468          NODEFLAG_NoCheckHyper =    0x0002,
00469          NODEFLAG_NoStdAttrib =     0x0004,
00470          NODEFLAG_RemoveIfPoint =   0x0008
00471          };
00472          
00473       //! Rebuild vector polygons from scratch, does not maintain attribute attachment
00474       static ERRVALUE BuildPolygons (
00475          VECTOR& VectObj
00476          );
00477 
00478       //! Determine islands by depth sort algorithm      
00479       static ERRVALUE DepthSortPolygons (
00480          VECTOR& VectObj
00481          );
00482 
00483       //! Remove excess nodes from a vector object    
00484       static ERRVALUE RemoveExcessNodes (
00485          VECTOR& VectObj,
00486          NODEFLAG flags
00487          );
00488 
00489       //! Split lines at max points if necessary
00490       //! @return > 0 if lines split into new object, 0 if not, < 0 if error
00491       static int SplitLinesAtMaxPoints (
00492          const VECTOR& VectorObj,
00493          INT32 MaxPoints,
00494          OBJECT& ParentObj,
00495          VECTOR& NewObject
00496          );
00497          
00498       //! Validate vector element ID tables
00499       static ERRVALUE ValidateElementID (
00500          VECTOR& VectorObj
00501          );
00502          
00503       //! Validate vector topology     
00504       static ERRVALUE ValidateVectorTopology (
00505          VECTOR& VectorObj,
00506          MISTRING& LogString,
00507          OPENFLAGS OpenFlags,
00508          VALIDATEFLAG flags
00509          );
00510          
00511 
00512       //! Default constructor
00513       VECTORTOOLKIT (
00514          );
00515 
00516       //! Destructor
00517       ~VECTORTOOLKIT (
00518          );
00519          
00520       ERRVALUE AddLabel (
00521          VECTOR::LABEL& label
00522          );
00523       
00524       ERRVALUE AddLine (
00525          POLYLINE& PolyLine
00526          );
00527       
00528       ERRVALUE AddLineSnapPoints (
00529          INT32 LineNum,
00530          POLYLINE& PolyLine
00531          );
00532          
00533       ERRVALUE AddNode (
00534          DPOINT3D& point         //!< Position of added node will most likely change
00535          );
00536       
00537       ERRVALUE AddPoint (
00538          const DPOINT3D& pt
00539          );
00540       
00541       ERRVALUE AddPolygon (
00542          POLYLINE& PolyLine
00543          );
00544          
00545       ERRVALUE AddSnapPoints (
00546          POLYLINE& PolyLine,
00547          bool& SnappedStart,
00548          bool& SnappedEnd
00549          );
00550          
00551       ERRVALUE BuildPolygons (
00552          );
00553          
00554       ERRVALUE ChangeLabel (
00555          INT32 LabelNum,
00556          VECTOR::LABEL& label
00557          );
00558          
00559       ERRVALUE ChangeLine (
00560          INT32 LineNum,
00561          POLYLINE& PolyLine
00562          );
00563          
00564       ERRVALUE ChangeNode (
00565          INT32 NodeNum,
00566          const DPOINT3D& NewPoint,
00567          const std::vector<POLYLINE>& NodeLines
00568          );
00569          
00570       ERRVALUE ChangePoint (
00571          INT32 PointNum,
00572          const DPOINT3D& pt,
00573          bool IsNode = false
00574          );
00575       
00576       ERRVALUE ClipToRegion (
00577          const REGION2D& region,
00578          TESTCRITERIA RegionTest,
00579          const BITSET* PolygonSet,
00580          CLIPFLAGS flags
00581          );
00582          
00583       ERRVALUE Close (
00584          bool ForceClose
00585          );
00586          
00587       ERRVALUE CombineNodes (
00588          INT32 NodeNum,
00589          const DPOINT3D* NewPoint,                 //!< Location of new node
00590          const SIMPLE_ARRAY<INT32>& NodeList       //!< List of Nodes to combine
00591          );
00592          
00593       ERRVALUE ConvertForward (
00594          const TRANS2D_MAPGEN& tmg
00595          );
00596          
00597       ERRVALUE ConvertNodeToPoint (
00598          INT32 NodeNum
00599          );
00600       
00601       ERRVALUE ConvertPointType (
00602          GEOMETRIC::POINTTYPE NewPointType
00603          );
00604          
00605       ERRVALUE DeleteLabel (
00606          INT32 LabelNum
00607          );
00608          
00609       ERRVALUE DeleteLabels (
00610          const SIMPLE_ARRAY<INT32>& LabelList
00611          );
00612          
00613       ERRVALUE DeleteLine (
00614          INT32 LineNum,
00615          DELETELINE flags,
00616          POLYGONDELETEFILTER* PolyDelFilt = 0
00617          );
00618          
00619       ERRVALUE DeleteLines (
00620          const SIMPLE_ARRAY<INT32>& LineList,
00621          DELETELINE flags,
00622          POLYGONDELETEFILTER* PolyDelFilt = 0
00623          );
00624          
00625       INT32 DeleteNode (
00626          INT32 NodeNum,
00627          NODEFLAG NodeFlag
00628          );
00629          
00630       ERRVALUE DeleteNodes (
00631          const SIMPLE_ARRAY<INT32>& NodeList,
00632          NODEFLAG NodeFlag
00633          );
00634       
00635       ERRVALUE DeletePoint (
00636          INT32 PointNum
00637          );
00638          
00639       ERRVALUE DeletePoints (
00640          const SIMPLE_ARRAY<INT32>& PointList
00641          );
00642          
00643       ERRVALUE DeletePolygon (
00644          INT32 PolyNum,
00645          DELETEPOLYGON flags
00646          );
00647          
00648       ERRVALUE DeletePolygons (
00649          SIMPLE_ARRAY<INT32>& PolyList,
00650          DELETEPOLYGON flags
00651          );
00652          
00653       ERRVALUE ExtractToRegion (
00654          const REGION2D& region,
00655          TESTCRITERIA RegionTest,
00656          CLIPFLAGS flags
00657          );
00658          
00659       INT32 FindClosestLineVertex (
00660          INT32 LineNum,
00661          const DPOINT2D& testpt,
00662          DPOINT3D *retpt
00663          );
00664          
00665       ERRVALUE GenerateElementIDTables (
00666          );
00667          
00668       ERRVALUE GenerateIntersections (
00669          const POLYLINE& PolyLine,
00670          POLYLINE::INTERSECTINFO& ints,
00671          INT32 MaxIntersections = 0
00672          );
00673          
00674       DIMENSION GetDimension (
00675          ) const { return (m_VectorObj.GetDimension()); }
00676          
00677       ERRVALUE GetDatabaseObject (
00678          ELEMTYPE ElemType,
00679          DBASE_ELEMENT& DBaseObj
00680          );
00681          
00682       INT32 GetNumElements (
00683          ELEMTYPE ElemType
00684          ) const;
00685          
00686       ERRVALUE GetObjectItem (
00687          OBJITEM& ObjItem
00688          ) const;
00689          
00690       const SNAPOBJECT& GetSnapObject (
00691          ) { return (m_SnapObject); }
00692 
00693       const SNAPPARMS& GetSnapParms (
00694          ) const { return (m_SnapParms); }
00695          
00696       ERRVALUE GetStyleObject (
00697          STYLE& StyleObj
00698          ) const;
00699          
00700       TOOLKITFLAG GetToolkitFlags (
00701          ) const { return (m_ToolkitFlags); }
00702          
00703       ERRVALUE GetVectorObject (
00704          VECTOR& VectorObj
00705          ) const;
00706          
00707       ERRVALUE GetZValue (
00708          ELEMTYPE ElemType,
00709          INT32 ElemNum,
00710          double& zvalue
00711          ) const;
00712          
00713       bool IsOpen (
00714          ) const { return (m_VectorObj.IsOpen()); }
00715       
00716       ERRVALUE LocateIslands (
00717          bool LineLeftRightValid
00718          );
00719             
00720       ERRVALUE Open (
00721          const RVC::OBJITEM& ObjItem,
00722          OPENFLAGS flags
00723          );
00724          
00725       ERRVALUE Open (
00726          const VECTOR& VectorObj,
00727          OPENFLAGS flags
00728          );
00729          
00730       ERRVALUE RecoverFromUndo (
00731          );
00732       
00733       int RemoveDangleLine (
00734          INT32 LineNum,
00735          double maxdist       //!< Remove line if smaller than this value
00736          );
00737          
00738       INT32 RemoveDangleLineSet (
00739          double maxdist
00740          );
00741          
00742       INT32 RemoveDangleLineSet (
00743          const SIMPLE_ARRAY<INT32>& LineList,
00744          double maxdist
00745          );
00746          
00747       ERRVALUE RemoveElementIDTables (
00748          );
00749          
00750       int RemoveExcessNodes (
00751          const BITSET *NodeSet = 0,
00752          NODEFLAG NodeFlags = NODEFLAG_None
00753          );
00754          
00755       INT32 RemoveIslandSet (
00756          double MaxArea,
00757          DELETEPOLYGON flags,
00758          INT32 *NumTotalIslands
00759          );
00760          
00761       ERRVALUE RemoveStandardAttributeTables (
00762          );
00763          
00764       ERRVALUE ReverseLines (
00765          const SIMPLE_ARRAY<INT32>& LineList
00766          );
00767          
00768       ERRVALUE Save (
00769          RVC::OBJITEM& ObjItem,
00770          SAVEFLAGS flags
00771          );
00772          
00773       ERRVALUE SnapLine (
00774          INT32 LineNum
00775          );
00776          
00777       ERRVALUE SnapLines (
00778          const BITSET_UNOWNED& LineSet,
00779          BITSET* UnsnappedSet,
00780          bool AttemptAllElements
00781          );
00782          
00783       ERRVALUE SetPrecision (
00784          int Precision
00785          );
00786          
00787       void SetSnapObject (
00788          );
00789          
00790       void SetSnapObject (
00791          const VECTOR& VectorObj,
00792          const TRANS2D_MAPGEN& VectorToObject
00793          );
00794          
00795       void SetSnapParms (
00796          const SNAPPARMS& SnapParms
00797          ) { m_SnapParms = SnapParms; }
00798 
00799       void SetToolkitFlags (
00800          TOOLKITFLAG ToolkitFlags
00801          ) { m_ToolkitFlags = ToolkitFlags; }
00802 
00803       ERRVALUE SetTopologyType (
00804          VECTOR::TOPOLOGYTYPE VectorType
00805          );
00806          
00807       ERRVALUE SetZValue (
00808          ELEMTYPE ElemType,
00809          INT32 ElemNum,
00810          double zvalue
00811          );
00812          
00813       ERRVALUE SplineLine (
00814          INT32 LineNum,
00815          POLYLINE::SPLINE SplineType,
00816          INT32 NumKnots,
00817          double Tolerance,
00818          POLYLINE::SPLINEFLAGS flags
00819          );
00820          
00821       ERRVALUE SplineLines (
00822          const BITSET* LineList,       //!<  Can be NULL 
00823          POLYLINE::SPLINE SplineType,
00824          INT32 NumKnots,
00825          double Tolerance,
00826          POLYLINE::SPLINEFLAGS flags,
00827          bool AttemptAllElements
00828          );
00829       
00830       ERRVALUE SplitLineAtMaxPoints (
00831          INT32 MaxPoints,
00832          bool SetMaxPoints
00833          );
00834          
00835       ERRVALUE StraightenLine (
00836          INT32 LineNum
00837          );
00838          
00839       ERRVALUE ThinLine (
00840          INT32 LineNum,
00841          POLYLINE::THINMETHOD method,
00842          double Factor,
00843          POLYLINE::SPLINE SplineType,
00844          POLYLINE::SPLINEFLAGS flags
00845          );
00846          
00847       ERRVALUE ThinLines (
00848          const BITSET* LineList,       //!<  Can be NULL 
00849          POLYLINE::THINMETHOD method,
00850          double Factor,
00851          POLYLINE::SPLINE SplineType,
00852          POLYLINE::SPLINEFLAGS flags,
00853          bool AttemptAllElements
00854          );
00855          
00856       ERRVALUE Update (
00857          );
00858          
00859       ERRVALUE UpdateStandardAttrib (
00860          MSTDATT::ADDSTAT flags
00861          );
00862          
00863       STDATTRIBSTATE ValidateStandardAttribTables (
00864          );
00865          
00866       ERRVALUE ValidateTopology (
00867          VALIDATEFLAG flags,
00868          MISTRING& LogString
00869          );
00870          
00871    private:
00872 
00873       #ifndef GENERATING_DOXYGEN_OUTPUT
00874       enum LINEORIENT {
00875          LINEORIENT_Start = 0,
00876          LINEORIENT_End
00877          };
00878 
00879       class BASEELEMENT {
00880          public:
00881          
00882             BASEELEMENT (
00883                VECTORTOOLKIT& vtk,
00884                ELEMTYPE elemtype
00885                );
00886                
00887             virtual ~BASEELEMENT (
00888                );
00889 
00890             virtual INT32 GetNumElements (
00891                ) const = 0;
00892                
00893             virtual ERRVALUE GetZValue (
00894                INT32 ElemNum,
00895                double& zvalue
00896                ) const = 0;
00897                
00898             virtual ERRVALUE SetZValue (
00899                INT32 ElemNum,
00900                double zvalue
00901                ) = 0;
00902                
00903             ERRVALUE AddQTreeElem (
00904                INT32 elemnum,
00905                const DRECT2D& Extents
00906                );
00907                
00908             ERRVALUE BuildQTree (
00909                );
00910                
00911             ERRVALUE ChangeQTreeElem (
00912                INT32 ElemNum,
00913                const DRECT2D& Extents
00914                ) { return (CopyQTreeElem(ElemNum, ElemNum, Extents)); }
00915                
00916             ERRVALUE ClearQTree (
00917                const DRECT2D& Extents,
00918                INT32 NumElements
00919                );
00920                
00921             void CloseBase (
00922                );
00923                
00924             ERRVALUE CopyQTreeElem (
00925                INT32 source,
00926                INT32 dest,
00927                const DRECT2D& Extents
00928                );
00929                
00930             ERRVALUE DeleteQTreeElem (
00931                INT32 elemnum
00932                );
00933                
00934             void DisableQTree (
00935                ) { m_DisableQTree = true; }
00936                
00937             bool HasSearchTree (
00938                ) const { return (m_HasSearchTree); }
00939             
00940             bool IsQTreeDisabled (
00941                ) const { return (m_DisableQTree); }
00942                
00943             ERRVALUE Open (
00944                OPENFLAGS flags
00945                );
00946                
00947             ERRVALUE RecoverFromUndo (
00948                );
00949                
00950          protected:
00951          
00952             ELEMTYPE m_ElemType;
00953             VECTORTOOLKIT& m_vtk;
00954             bool m_DisableQTree;
00955             bool m_HasSearchTree;
00956             
00957             friend class SNAPOBJECT;
00958             
00959          };
00960       friend class BASEELEMENT;
00961 
00962       class DATABASEELEMENT : public BASEELEMENT {
00963          public:
00964          
00965             DATABASEELEMENT (
00966                VECTORTOOLKIT& vtk,
00967                ELEMTYPE elemtype,
00968                DBASE_ELEMENT& Database
00969                );
00970                
00971             virtual ~DATABASEELEMENT (
00972                );
00973                
00974             virtual INT32 GetElemIDCount (
00975                ) const = 0;
00976                
00977             virtual bool HasStatHandle (
00978                ) const { return (false); }
00979                
00980             virtual ERRVALUE SetElemIDCount (
00981                INT32 NewValue
00982                ) = 0;
00983                
00984             virtual ERRVALUE ValidateElementIDTable (
00985                );
00986          
00987             ERRVALUE AddElemDBList (
00988                INT32 ElemNum
00989                );
00990          
00991             ERRVALUE Close (
00992                );
00993                
00994             ERRVALUE CombineDBLists (
00995                INT32 SourceElem,
00996                INT32 DestElem
00997                );
00998                
00999             int CompareDBLists (
01000                INT32 ElemNum1,
01001                INT32 ElemNum2
01002                );
01003                
01004             INT32 CopyDBRecordRaw (
01005                INT32 TableNum,
01006                INT32 SourceRecord,
01007                INT32 DestRecord
01008                );
01009                
01010             ERRVALUE CopyElemDBRecords (
01011                INT32 SourceElem,
01012                INT32 DestElem,
01013                bool DeleteIdentityRecord
01014                );
01015                
01016             ERRVALUE GenerateElementIDTable (
01017                );
01018                
01019             SIMPLE_ARRAY<DBLISTELMT>& GetDBListBuffer (
01020                ) { return (m_DBList); }
01021                
01022             ERRVALUE GetElementIDTable (
01023                ) const { return (m_ElemIDTableNum); }
01024                
01025             DBASE_ELEMENT& GetDatabase (
01026                ) { return (m_Database); }
01027             
01028             bool HasElementIDTable (
01029                ) const { return (m_ElemIDTableNum >= 0); }
01030                
01031             ERRVALUE MakeElementIDTable (
01032                bool SetInvalid
01033                );
01034                
01035             ERRVALUE Open (
01036                OPENFLAGS flags
01037                );
01038          
01039             ERRVALUE RecoverFromUndo (
01040                );
01041          
01042             ERRVALUE RemoveElementIDTable (
01043                );
01044                
01045             ERRVALUE RemoveTable (
01046                INT32 TableNum
01047                );
01048                
01049             ERRVALUE SwapDBRecords (
01050                INT32 ElemNum1,
01051                INT32 ElemNum2,
01052                bool DeleteElemNum2Records       //!<  If 1, the 'elem1' record is to be overwritten and 'elem2' records are to be deleted 
01053                );
01054                
01055             ERRVALUE UpdateCurrentElemID (
01056                INT32 ElemNum
01057                );
01058                
01059             ERRVALUE UpdateNumElements (
01060                INT32 NumElements
01061                );
01062                
01063          protected:
01064          
01065             class LOCALOBSERVER : public DBASE::OBSERVER {
01066                public:
01067                
01068                   LOCALOBSERVER (
01069                      DBASE_ELEMENT& Database,
01070                      INT32& ElemIDTableNum
01071                      ) : DBASE::OBSERVER(Database), m_ElemIDTableNum(ElemIDTableNum) {}
01072                
01073                private:
01074                   virtual void OnTableDropEnd (INT32 TableNum);
01075                
01076                   INT32& m_ElemIDTableNum;
01077                };
01078          
01079             DBASE_ELEMENT& m_Database;
01080             INT32 m_ElemIDTableNum;       //!< Element ID table number
01081             DBTABLE::RECORD m_Record;
01082             SIMPLE_ARRAY<DBLISTELMT> m_DBList;
01083             bool m_MaintainElementIDTables;
01084             LOCALOBSERVER* m_Observer;
01085          
01086             void AllocateObserver (
01087                DBASE_ELEMENT& Database
01088                );
01089                
01090          };
01091       friend class DATABASEELEMENT;
01092       
01093       class STATELEMENT : public DATABASEELEMENT {
01094          public:
01095          
01096             class DISABLESTATS {
01097                public:
01098                
01099                   DISABLESTATS (
01100                      STATELEMENT& StatElem,
01101                      bool Condition
01102                      ) : m_StatElem(StatElem), m_TempSdh(0), m_Condition(Condition && StatElem.m_sdh != 0) {
01103                      if (Condition) {
01104                         m_TempSdh = StatElem.m_sdh;
01105                         StatElem.m_sdh = 0;
01106                         }
01107                      }
01108                      
01109                   ~DISABLESTATS (
01110                      ) {
01111                      if (m_Condition) {
01112                         m_StatElem.m_sdh = m_TempSdh;
01113                         if (m_StatElem.m_sdh != 0) {
01114                            ERRORPOSNDISABLE Disable;
01115                            m_StatElem.m_sdh->RebuildTable(MSTDATT::ADDSTAT_None);
01116                            }
01117                         }
01118                      }
01119                      
01120                   bool IsDisabled (
01121                      ) const { return (m_TempSdh != 0 && m_StatElem.m_sdh == 0); }
01122                
01123                private:
01124                   STATELEMENT& m_StatElem;
01125                   VECTSTDATT* m_TempSdh;
01126                   bool m_Condition;
01127                };
01128             friend class DISABLESTATS;
01129             
01130             STATELEMENT (
01131                VECTORTOOLKIT& vtk,
01132                ELEMTYPE elemtype,
01133                DBASE_ELEMENT& Database
01134                );
01135                
01136             virtual ~STATELEMENT (
01137                );
01138          
01139             virtual bool HasStatHandle (
01140                ) const { return (m_sdh != 0); }
01141                
01142             void CloseStat (
01143                );
01144                
01145             ERRVALUE Close (
01146                );
01147                
01148             INT32 GetNumRecords (
01149                ) const;
01150                
01151             bool IsInitialized (
01152                ) const { return (m_sdh != 0); }
01153                
01154             ERRVALUE Open (
01155                OPENFLAGS flags
01156                );
01157                
01158             ERRVALUE RebuildTable (
01159                MSTDATT::ADDSTAT flags
01160                );
01161          
01162             ERRVALUE RecoverFromUndo (
01163                );
01164                
01165             ERRVALUE RemoveStatTable (
01166                );
01167                
01168          protected:
01169             VECTSTDATT *m_sdh;               //!< Standard attribute manager handle
01170             bool m_MaintainStdAttribIDTables;
01171          };
01172       friend class STATELEMENT;
01173       
01174       class LINEELEMENT : public STATELEMENT {
01175          public:
01176          
01177             enum LINESNAP {
01178                LINESNAP_None = 0x0000,
01179                LINESNAP_ForceNode = 0x0001
01180                };
01181 
01182             LINEELEMENT (
01183                VECTORTOOLKIT& vtk
01184                );
01185                
01186             virtual ~LINEELEMENT (
01187                );
01188                
01189             virtual INT32 GetElemIDCount (
01190                ) const;
01191                
01192             virtual INT32 GetNumElements (
01193                ) const;
01194 
01195             virtual ERRVALUE GetZValue (
01196                INT32 ElemNum,
01197                double& zvalue
01198                ) const;
01199                
01200             virtual ERRVALUE SetElemIDCount (
01201                INT32 NewValue
01202                );
01203                
01204             virtual ERRVALUE SetZValue (
01205                INT32 ElemNum,
01206                double zvalue
01207                );
01208                
01209             INT32 Add (
01210                const POLYLINE& PolyLine
01211                );
01212             
01213             int AddSnapPoint (
01214                LINEORIENT LineOrient,
01215                POLYLINE& PolyLine,
01216                LINESNAP LineSnap
01217                );
01218                
01219             ERRVALUE Change (
01220                INT32 LineNum,
01221                const POLYLINE& PolyLine
01222                );
01223             
01224             ERRVALUE ChangeLine (
01225                INT32 LineNum,
01226                const POLYLINE& PolyLine
01227                );
01228                
01229             ERRVALUE ChangeSnapLine (
01230                POLYLINE& PolyLine
01231                );
01232                
01233             int CheckIfIntersect (
01234                INT32 SkipLineNum,
01235                const POLYLINE& PolyLine
01236                );
01237                
01238             ERRVALUE Close (
01239                );
01240                
01241             ERRVALUE Delete (
01242                INT32 LineNum
01243                );
01244                
01245             ERRVALUE FindLineAndSplit (
01246                const DPOINT3D& point, 
01247                DPOINT3D& retpt
01248                );
01249                
01250             BITSET& GetLineBitset (
01251                ) { return (m_ElemList); }
01252                
01253             ERRVALUE JoinLines (
01254                INT32 NodeNum,
01255                INT32 RepLineNum,
01256                INT32 DelLineNum
01257                );
01258                
01259             ERRVALUE Open (
01260                OPENFLAGS flags
01261                );
01262          
01263             ERRVALUE OtherLineIntersect (
01264                const POLYLINE& PolyLine
01265                );
01266                
01267             ERRVALUE RecoverFromUndo (
01268                );
01269          
01270             ERRVALUE RemoveOvershoots (
01271                POLYLINE& PolyLine
01272                ) const;
01273                
01274             ERRVALUE SelfLineIntersect (
01275                const POLYLINE& PolyLine
01276                );
01277                
01278             INT32 SplitLineAtVertex (
01279                INT32 OldLineNum,
01280                INT32 vertex,
01281                INT32& NewLineNum
01282                );
01283                
01284             INT32 SplitLineNearPoint (
01285                INT32 LineNum,
01286                const DPOINT2D& point,
01287                INT32& NewLineNum
01288                );
01289                
01290             ERRVALUE UpdateStats (
01291                INT32 ElemNum
01292                );
01293                
01294          private:
01295          
01296             class OTHERLINESPLIT;
01297             friend class OTHERLINESPLIT;
01298             class SELFLINESPLIT;
01299             friend class SELFLINESPLIT;
01300             
01301             BITSET m_ElemList;   
01302             DBASE_LINE m_LineDB;
01303             
01304             ERRVALUE AddLineSegment (const POLYLINE& PolyLine);
01305             ERRVALUE ChangeLineSegment (const POLYLINE& PolyLine);
01306             ERRVALUE ComputeLineExtents (INT32 LineNum, RVCVECTLINE& vline);
01307             INT32 FindBestLineSnapPoint (LINEORIENT LineOrient, const POLYLINE& Polyline, DPOINT3D& retpt, double& maxdist) const;
01308             int GenerateExtendSnapPoint (LINEORIENT LineOrient, const POLYLINE& PolyLine, DPOINT3D& retpt, LINESNAP LineSnap);
01309             int GenerateSnapToPoint (LINEORIENT LineOrient, const POLYLINE& PolyLine, DPOINT3D& retpt, LINESNAP LineSnap);
01310             int InsertLinePoint (INT32 LineNum, INT32 segment, DPOINT3D& insertpt);
01311             ERRVALUE ResetLineNodeLink (LINEORIENT LineOrient, INT32 LineNum);
01312                
01313             class EXTENDSPLIT;
01314             class SNAPFILTINFO;
01315 
01316             friend class VECTORTOOLKIT;
01317          };
01318       friend class LINEELEMENT;
01319       friend class LINEELEMENT::EXTENDSPLIT;
01320       friend class LINEELEMENT::SNAPFILTINFO;
01321       class LINEPOLYJOIN;
01322       friend class LINEPOLYJOIN;
01323 
01324       class POINTELEMENT : public DATABASEELEMENT {
01325          public:
01326          
01327             POINTELEMENT (
01328                VECTORTOOLKIT& vtk
01329                );
01330                
01331             virtual ~POINTELEMENT (
01332                );
01333 
01334             virtual INT32 GetElemIDCount (
01335                ) const;
01336                
01337             virtual INT32 GetNumElements (
01338                ) const;
01339 
01340             virtual ERRVALUE GetZValue (
01341                INT32 ElemNum,
01342                double& zvalue
01343                ) const;
01344                
01345             virtual ERRVALUE SetElemIDCount (
01346                INT32 NewValue
01347                );
01348                
01349             virtual ERRVALUE SetZValue (
01350                INT32 ElemNum,
01351                double zvalue
01352                );
01353                
01354             virtual ERRVALUE ValidateElementIDTable (
01355                );
01356          
01357             ERRVALUE Add (
01358                const DPOINT3D& point
01359                );
01360                
01361             ERRVALUE Close (
01362                );
01363                
01364             ERRVALUE Open (
01365                OPENFLAGS flags
01366                );
01367          
01368             ERRVALUE RecoverFromUndo (
01369                );
01370          
01371             ERRVALUE RemoveElementIDRecord (
01372                INT32 PointNum
01373                );
01374                
01375          private:
01376             DBASE_POINT m_PointDB;
01377          };
01378       friend class POINTELEMENT;
01379 
01380       class POLYGONELEMENT : public STATELEMENT {
01381          public:
01382             class POLYLINEDELETE;
01383          
01384             POLYGONELEMENT (
01385                VECTORTOOLKIT& vtk
01386                );
01387                
01388             virtual ~POLYGONELEMENT (
01389                );
01390 
01391             virtual INT32 GetElemIDCount (
01392                ) const;
01393                
01394             virtual INT32 GetNumElements (
01395                ) const;
01396 
01397             virtual ERRVALUE GetZValue (
01398                INT32 ElemNum,
01399                double& zvalue
01400                ) const;
01401                
01402             virtual ERRVALUE SetElemIDCount (
01403                INT32 NewValue
01404                );
01405                
01406             virtual ERRVALUE SetZValue (
01407                INT32 ElemNum,
01408                double zvalue
01409                );
01410                
01411             ERRVALUE AddIsland (
01412                INT32 PolyNum,
01413                INT32 IslandNum
01414                );
01415                
01416             ERRVALUE Build (
01417                );
01418             
01419             ERRVALUE ChangeIsland (
01420                INT32 PolyNum,
01421                INT32 OldIsleNum,
01422                INT32 NewIsleNum
01423                );
01424                
01425             ERRVALUE ChangeLine (
01426                INT32 PolyNum,
01427                INT32 OldLineNum,
01428                INT32 NewLineNum
01429                );
01430                
01431             ERRVALUE Close (
01432                );
01433                
01434             ERRVALUE Delete (
01435                INT32 PolyNum
01436                );
01437                
01438             ERRVALUE DeleteByLine (
01439                INT32 PolyNum,
01440                DELETEPOLYGON flags
01441                );
01442                
01443             ERRVALUE DeleteIsland (
01444                INT32 PolyNum,
01445                INT32 IslandNum
01446                );
01447                
01448             ERRVALUE DeleteLine (
01449                INT32 PolyNum,
01450                INT32 LineNum
01451                );
01452                
01453             int FindPolygons (
01454                INT32 StartLine,
01455                INT32 PolyInside
01456                );
01457                
01458             BITSET& GetPolygonBitset (
01459                ) { return (m_ElemList); }
01460                
01461             ERRVALUE MergePolygons (
01462                INT32 LeftPolyNum,
01463                INT32 RightPolyNum,
01464                INT32 LineNum,
01465                POLYGONDELETEFILTER* PolyDelFilt
01466                );
01467                
01468             ERRVALUE Open (
01469                OPENFLAGS flags
01470                );
01471          
01472             ERRVALUE RecoverFromUndo (
01473                );
01474          
01475             ERRVALUE RemoveIslandInfo (
01476                );
01477                
01478             ERRVALUE RemovePolygonInfo (
01479                bool IsPolyRebuild
01480                );
01481                
01482             ERRVALUE SplitLineInPolygons (
01483                INT32 OrigLineNum,
01484                const RVCVECTLINE& Origvline,
01485                INT32 NewLineNum
01486                );
01487                
01488             ERRVALUE SplitLineInPoly (
01489                INT32 OrigLineNum, 
01490                const RVCVECTLINE& Origvline, 
01491                INT32 NewLineNum, 
01492                SIMPLE_ARRAY<INT32>& LineList
01493                ) const;
01494                
01495             ERRVALUE SplitLineInSamePoly (
01496                INT32 OrigLineNum, 
01497                const RVCVECTLINE& Origvline, 
01498                INT32 NewLineNum, 
01499                SIMPLE_ARRAY<INT32>& LineList
01500                ) const;
01501             
01502             ERRVALUE Update (
01503                INT32 PolyNum
01504                );
01505                
01506             void UpdateStats (
01507                BITSET& PolySet
01508                );
01509                
01510             ERRVALUE ValidatePolyInside (
01511                );
01512                
01513          private:
01514             struct LOCATEPOLY;      //!< Forward Declaration
01515             
01516             DBASE_POLYGON m_PolyDB;
01517             BITSET m_ElemList;   
01518             
01519             ERRVALUE ComputePolyExtents (INT32 PolyNum);
01520             INT32 FindNextLine (LOCATEPOLY& LocatePoly);
01521             ERRVALUE GenerateShellPolyList (INT32 ParentPoly, const SIMPLE_ARRAY<INT32>& LineList, SIMPLE_ARRAY<INT32>& PolyList);
01522             ORIENTATION OrientList (const SIMPLE_ARRAY<INT32>& LineList, const SIMPLE_ARRAY<bool>& LineOrientList) const;
01523             ERRVALUE RemoveZeroAreaPolygon (INT32 StartLine, LOCATEPOLY& LocatePoly);
01524             ERRVALUE ReparentIslands (INT32 PolyNum, INT32 NewParent, bool MoveToNewParent);
01525             ERRVALUE ReparentNestedIslands (INT32 CheckPoly, const SIMPLE_ARRAY<INT32>& LineList);
01526             ERRVALUE SearchNestedIslands (INT32 PolyInside, INT32 IslePoly, bool AddingPolygon);
01527             ERRVALUE SetLeftRight (const LOCATEPOLY& LocatePoly, INT32 PolyNum, INT32 ParentPolyNum);
01528             ERRVALUE UnparentIslets (INT32 OldParentPoly, INT32 NewParentPoly, const INT32 *LineList, INT32 NumLines);
01529             void ValidatePoly (LOCATEPOLY& LocatePoly, INT32 StartLine);
01530                
01531          };
01532       friend class POLYGONELEMENT;
01533       friend class POLYGONELEMENT::POLYLINEDELETE;
01534       class POLYLISTDELETE;
01535       friend class POLYLISTDELETE;
01536       class POLYISLANDDELETE;
01537       
01538       struct NODELINEANGLE {
01539          double m_Angle;               //!< Angle going out from the node
01540          INT32 m_LineNum;              //!< Line coming to/from the node
01541          bool m_Orient;                //!< true = To the node, false = From the node
01542          
01543          NODELINEANGLE (
01544             ) { memset(this, 0, sizeof(*this)); }     //! Fix UMR reports since there is padding after the bool
01545             
01546          static int CompareAngle (
01547             NODELINEANGLE *d1,
01548             NODELINEANGLE *d2,
01549             void *data
01550             );
01551 
01552          };
01553 
01554       class NODEELEMENT : public DATABASEELEMENT {
01555          public:
01556             NODEELEMENT (
01557                VECTORTOOLKIT& vtk
01558                );
01559                
01560             virtual ~NODEELEMENT (
01561                );
01562 
01563             virtual INT32 GetElemIDCount (
01564                ) const;
01565                
01566             virtual INT32 GetNumElements (
01567                ) const;
01568 
01569             virtual ERRVALUE GetZValue (
01570                INT32 ElemNum,
01571                double& zvalue
01572                ) const;
01573                
01574             virtual ERRVALUE SetElemIDCount (
01575                INT32 NewValue
01576                );
01577                
01578             virtual ERRVALUE SetZValue (
01579                INT32 ElemNum,
01580                double zvalue
01581                );
01582                
01583             virtual ERRVALUE ValidateElementIDTable (
01584                ) { return (0); }
01585          
01586             INT32 AddNode (
01587                const DPOINT3D& point
01588                );
01589                
01590             ERRVALUE AddNodeLine (
01591                INT32 NodeNum,
01592                INT32 LineNum
01593                );
01594          
01595             ERRVALUE BuildNodeLineList (
01596                );
01597                
01598             ERRVALUE ChangeNode (
01599                INT32 NodeNum,
01600                const DPOINT3D& point
01601                );
01602                
01603             ERRVALUE ChangeNodeLine (
01604                INT32 NodeNum,
01605                INT32 OldLineNum,
01606                INT32 NewLineNum
01607                );
01608                
01609             bool CheckIsPoint (
01610                INT32 NodeNum
01611                );
01612                
01613             ERRVALUE Close (
01614                );
01615                
01616             ERRVALUE ConvertNodePointToNode (
01617                INT32 NodeNum
01618                );
01619             
01620             ERRVALUE ConvertToPoint (
01621                INT32 NodeNum
01622                );
01623                
01624             ERRVALUE Delete (
01625                INT32 NodeNum
01626                );
01627                
01628             ERRVALUE DeleteNodeLine (
01629                INT32 NodeNum,
01630                INT32 LineNum
01631                );
01632                
01633             ERRVALUE FindNodeLineAngles (
01634                INT32 NodeNum,
01635                SIMPLE_ARRAY<NODELINEANGLE>& list
01636                ) const;
01637                
01638             DBASE_NODE& GetNodeDatabase (
01639                ) { return (m_NodeDB); }
01640                
01641             ERRVALUE Open (
01642                OPENFLAGS flags
01643                );
01644          
01645             ERRVALUE RecoverFromUndo (
01646                );
01647          
01648             ERRVALUE ValidateNodes (
01649                );
01650 
01651          private:
01652             DBASE_NODE m_NodeDB;
01653          };
01654       friend class NODEELEMENT;
01655 
01656       class LABELELEMENT : public BASEELEMENT {
01657          public:
01658          
01659             LABELELEMENT (
01660                VECTORTOOLKIT& vtk
01661                );
01662                
01663             virtual ~LABELELEMENT (
01664                );
01665 
01666             // VIRTUAL METHODS
01667             virtual INT32 GetNumElements (
01668                ) const;
01669 
01670             virtual ERRVALUE GetZValue (
01671                INT32 ElemNum,
01672                double& zvalue
01673                ) const;
01674                
01675             virtual ERRVALUE SetZValue (
01676                INT32 ElemNum,
01677                double zvalue
01678                );
01679                
01680             // METHODS  
01681             ERRVALUE AddLabelAttach (
01682                INT32 LabelNum,
01683                const VECTOR::LABEL& label,
01684                bool CheckAttach = false
01685                );
01686                
01687             ERRVALUE ChangeAttachPosn (
01688                ELEMTYPE ElemType,
01689                INT32 ElemNum,
01690                const DPOINT3D& point
01691                );
01692                
01693             ERRVALUE ChangeLabelAttach (
01694                ELEMTYPE ElemType,
01695                INT32 OldElemNum,
01696                INT32 NewElemNum
01697                );
01698             
01699             ERRVALUE CheckAttachments (
01700                STATUSCONTEXT& sc
01701                );
01702                
01703             void CheckLabelAttach (
01704                const VECTOR::LABEL& label
01705                );
01706                   
01707             void CleanupElemToLabelTrans (
01708                );
01709          
01710             ERRVALUE Close (
01711                );
01712 
01713             ERRVALUE DeleteLabelAttach (
01714                ELEMTYPE ElemType,
01715                INT32 ElemNum
01716                );
01717                
01718             ERRVALUE Open (
01719                OPENFLAGS flags
01720                );
01721          
01722             ERRVALUE PickLineLabelAttach (
01723                INT32 OldLineNum,
01724                INT32 NewLineNum
01725                );
01726                
01727             ERRVALUE PickPolyLabelAttach (
01728                INT32 OldPolyNum,
01729                INT32 NewPolyNum
01730                );
01731                
01732             ERRVALUE RecoverFromUndo (
01733                );
01734          
01735             ERRVALUE RemoveLabelAttach (
01736                INT32 LabelNum
01737                );
01738                
01739             ERRVALUE ResizeLabelAttach (
01740                ELEMTYPE ElemType,
01741                INT32 NumItems
01742                );
01743                
01744             ERRVALUE SetupElemToLabelTrans (
01745                );
01746                
01747             ERRVALUE SwapElementLabelAttach (
01748                ELEMTYPE ElemType,
01749                INT32 FirstElem,
01750                INT32 LastElem
01751                );
01752                
01753             ERRVALUE SwapLabelAttach (
01754                INT32 FirstLabel,
01755                INT32 LastLabel
01756                );
01757                
01758          private:
01759          
01760             LIST& GetTransList (ELEMTYPE ElemType);
01761             ERRVALUE ResizeLabelTransList (ELEMTYPE ElemType);
01762                
01763             OBJECT m_LabelTransFile;
01764             LIST m_LineToLabelID;
01765             LIST m_NodeToLabelID;
01766             LIST m_PointToLabelID;
01767             LIST m_PolygonToLabelID;
01768             LIST m_DummyID;
01769             
01770          };
01771       friend class LABELELEMENT;
01772       
01773       class OPENVECTOR : public VECTOR {
01774          public:
01775          
01776             OPENVECTOR (
01777                ) : VECTOR() {}
01778          
01779             OPENVECTOR (
01780                const OPENVECTOR& rhs
01781                ) : VECTOR(rhs) {}
01782          
01783             virtual ~OPENVECTOR (
01784                ) {}
01785                
01786             ERRVALUE ClearLinePointList (
01787                ) { return (VECTOR::ClearLinePointList()); }
01788 
01789             ERRVALUE ClearNodeLineList (
01790                ) { return (VECTOR::ClearNodeLineList()); }
01791          
01792             ERRVALUE ClearPolygonIslandList (
01793                ) { return (VECTOR::ClearPolygonIslandList()); }
01794          
01795             ERRVALUE ClearPolygonLineList (
01796                ) { return (VECTOR::ClearPolygonLineList()); }
01797          
01798             ERRVALUE SetNumLabels (
01799                INT32 NewNumLabels
01800                ) { return (VECTOR::SetNumLabels(NewNumLabels)); }
01801          
01802             ERRVALUE SetNumLines (
01803                INT32 NewNumLines
01804                ) { return (VECTOR::SetNumLines(NewNumLines)); }
01805          
01806             ERRVALUE SetNumNodes (
01807                INT32 NewNumNodes
01808                ) { return (VECTOR::SetNumNodes(NewNumNodes)); }
01809                
01810             ERRVALUE SetNumPoints (
01811                INT32 NewNumPoints
01812                ) { return (VECTOR::SetNumPoints(NewNumPoints)); }
01813             
01814             ERRVALUE SetNumPolygons (
01815                INT32 NewNumPolygons
01816                ) { return (VECTOR::SetNumPolygons(NewNumPolygons)); }
01817             
01818             ERRVALUE SwapLinePoints (
01819                INT32 Line1,
01820                INT32 Line2
01821                ) { return (VECTOR::SwapLinePoints(Line1, Line2)); }
01822                
01823             ERRVALUE SwapNodeLines (
01824                INT32 Node1,
01825                INT32 Node2
01826                ) { return (VECTOR::SwapNodeLines(Node1, Node2)); }
01827                
01828             ERRVALUE SwapPolyIslands (
01829                INT32 Poly1,
01830                INT32 Poly2
01831                ) { return (VECTOR::SwapPolyIslands(Poly1, Poly2)); }
01832                
01833 
01834             ERRVALUE SwapPolyLines (
01835                INT32 Poly1,
01836                INT32 Poly2
01837                ) { return (VECTOR::SwapPolyLines(Poly1, Poly2)); }
01838          };
01839       
01840       class DISABLETEXT {
01841          public:
01842          
01843             DISABLETEXT (
01844