geometrc.h

Go to the documentation of this file.
00001 /**
00002  * \file rvc/geometrc.h
00003  * \brief interface for the RVC::GEOMETRIC class.
00004  *
00005  * \if NODOC
00006  * $Id: geometrc.h_v 1.78 2006/04/21 20:00:52 dwilliss Exp $
00007  *
00008  * $Log: geometrc.h_v $
00009  * Revision 1.78  2006/04/21 20:00:52  dwilliss
00010  * *** empty log message ***
00011  *
00012  * Revision 1.77  2006/03/08 20:37:52  dwilliss
00013  * ctors for searchfilter_bitset no longer inline
00014  * l;
00015  *
00016  * Revision 1.76  2005/09/15 21:21:02  mju
00017  * Fix unref parm warnings.
00018  *
00019  * Revision 1.75  2005/08/16 15:57:53  dfriberg
00020  * Updated docs for ExtractTo
00021  *
00022  * Revision 1.74  2005/05/20 17:37:00  ldyas
00023  * added extract flag.
00024  *
00025  * Revision 1.73  2005/04/21 20:27:36  scowan
00026  * Fixed set scale methods.
00027  *
00028  * Revision 1.72  2004/12/18 00:07:56  scowan
00029  *  Added component field to findClosestElements.
00030  *
00031  * Revision 1.71  2004/08/30 17:24:01  scowan
00032  * Added new capability enum's.
00033  *
00034  * Revision 1.70  2004/08/24 22:26:41  scowan
00035  * Added virtual methods to get and set total line length.
00036  *
00037  * Revision 1.69  2004/07/19 17:03:05  scowan
00038  * Moved has min elem filter to geometric class.
00039  *
00040  * Revision 1.68  2004/07/14 21:15:35  scowan
00041  * Changed comment
00042  *
00043  * Revision 1.67  2004/07/12 23:21:07  scowan
00044  * Removed use of geo region.
00045  *
00046  * Revision 1.66  2004/07/01 19:57:42  scowan
00047  * Removed use of legacy region code.
00048  *
00049  * Revision 1.65  2004/05/28 20:34:44  scowan
00050  * Added virtual method.
00051  *
00052  * Revision 1.64  2004/04/28 22:04:18  scowan
00053  * Added extract flag.
00054  *
00055  * Revision 1.63  2004/04/09 20:47:03  scowan
00056  * Update some docs.
00057  *
00058  * Revision 1.62  2004/03/16 00:22:22  scowan
00059  * Added a new virtual method.
00060  *
00061  * Revision 1.61  2004/03/01 17:42:49  scowan
00062  * Added more elem select parm methods.
00063  *
00064  * Revision 1.60  2004/02/11 20:01:32  scowan
00065  * Added new filter class override.
00066  *
00067  * Revision 1.59  2004/02/09 20:13:40  scowan
00068  * Added methods to get the bitset and bitset deque from a elem trans list.
00069  *
00070  * Revision 1.58  2004/02/04 14:35:26  scowan
00071  * Added region 2d to elem select parms.
00072  *
00073  * Revision 1.57  2003/11/21 22:17:04  scowan
00074  * Support new Capabilities system.
00075  *
00076  * Revision 1.56  2003/10/22 16:31:07  mju
00077  * Add GETOBJFILTER_HASNOIMPLIEDGEOREF.
00078  *
00079  * Revision 1.55  2003/10/22 16:17:20  scowan
00080  * Added get objtype set static method.
00081  *
00082  * Revision 1.54  2003/09/30 16:52:06  dwilliss
00083  * Doxygen
00084  *
00085  * Revision 1.53  2003/09/25 21:56:37  dwilliss
00086  * doxygen
00087  *
00088  * Revision 1.52  2003/09/15 13:49:45  fileserver!dwilliss
00089  * Doxygen
00090  *
00091  * Revision 1.51  2003/09/11 20:09:31  scowan
00092  * Added is geometric function.
00093  *
00094  * Revision 1.50  2003/06/25 14:49:56  scowan
00095  * Added set array.
00096  *
00097  * Revision 1.49  2003/06/24 21:03:48  scowan
00098  * Added more capability flags.
00099  *
00100  * Revision 1.48  2003/06/19 17:45:27  scowan
00101  * Added virtual method and enum.
00102  *
00103  * Revision 1.47  2003/06/04 23:34:55  scowan
00104  * Added find element draw set.
00105  *
00106  * Revision 1.46  2003/05/30 21:33:19  scowan
00107  * Added is selectable filter.
00108  *
00109  * Revision 1.45  2003/05/27 16:36:30  scowan
00110  * Added new filters and un-inlined a method.
00111  *
00112  * Revision 1.44  2003/05/12 23:32:59  scowan
00113  * Changes to virtual methods.
00114  *
00115  * Revision 1.43  2003/03/07 18:44:07  scowan
00116  * Added on poin type change callback.
00117  *
00118  * Revision 1.42  2003/02/19 20:13:49  scowan
00119  * Added extract flag.
00120  *
00121  * Revision 1.41  2003/02/06 21:26:40  scowan
00122  * *** empty log message ***
00123  *
00124  * Revision 1.40  2003/02/06 21:25:06  scowan
00125  * Added another combine styles.
00126  *
00127  * Revision 1.39  2003/02/06 16:03:31  scowan
00128  * Added new standard empty object filter class.
00129  *
00130  * Revision 1.38  2002/12/06 16:49:03  scowan
00131  * More const.
00132  *
00133  * Revision 1.37  2002/11/06 20:52:26  scowan
00134  * More const.
00135  *
00136  * Revision 1.36  2002/10/23 21:06:55  scowan
00137  * Added another get element set.
00138  *
00139  * Revision 1.35  2002/09/30 23:21:31  scowan
00140  * Made element search code const.
00141  *
00142  * Revision 1.34  2002/09/26 15:02:03  mju
00143  * Fix SEARCHRESULT iterator initialization/increment for ranges case.
00144  *
00145  * Revision 1.33  2002/09/17 22:48:56  scowan
00146  * More virtual method adjustment.
00147  *
00148  * Revision 1.32  2002/09/12 22:10:07  mju
00149  * Add addl ctor for searchfilter_bitset.
00150  *
00151  * Revision 1.31  2002/09/12 21:28:11  mju
00152  * Add SEARCHFILTER_BITSET.
00153  *
00154  * Revision 1.30  2002/09/03 22:17:59  scowan
00155  * More virtual method moves.
00156  *
00157  * Revision 1.29  2002/08/29 22:12:50  scowan
00158  * Virtual method adjustment.
00159  *
00160  * Revision 1.28  2002/08/19 15:05:05  scowan
00161  * Fixed g++3.1 warnings.
00162  *
00163  * Revision 1.27  2002/06/19 22:23:59  scowan
00164  * More methods changes.
00165  *
00166  * Revision 1.26  2002/06/18 22:15:09  scowan
00167  * Added extract interface.
00168  *
00169  * Revision 1.25  2002/05/01 17:42:40  scowan
00170  * Method change.
00171  *
00172  * Revision 1.24  2002/04/30 17:33:43  scowan
00173  * Changed makr parm class name.
00174  *
00175  * Revision 1.23  2002/04/26 22:44:20  scowan
00176  * Added more virtual methods.
00177  *
00178  * Revision 1.22  2002/03/01 16:19:05  scowan
00179  * Added virtual methods.
00180  *
00181  * Revision 1.21  2002/02/28 18:56:23  scowan
00182  * Added sort search restul.
00183  *
00184  * Revision 1.20  2002/02/27 23:24:07  scowan
00185  * Added get geometric and get element extents methods.
00186  *
00187  * Revision 1.19  2002/01/30 15:56:41  scowan
00188  * Added sml context creation method.
00189  *
00190  * Revision 1.18  2002/01/29 17:26:47  scowan
00191  * Added inline method to get the object dimension.
00192  *
00193  * Revision 1.17  2002/01/07 20:24:46  scowan
00194  * Fixed access to observer class.
00195  * Arranged classes for genator docs.
00196  *
00197  * Revision 1.16  2002/01/03 22:56:56  scowan
00198  * Added extents management methods and an exttents changed callback.
00199  *
00200  * Revision 1.15  2001/10/08 20:49:39  scowan
00201  * Added element region method.
00202  *
00203  * Revision 1.14  2001/09/28 15:32:54  scowan
00204  * Add observer class.
00205  *
00206  * Revision 1.13  2001/07/31 16:40:23  scowan
00207  * Added new interface methods.
00208  *
00209  * Revision 1.12  2001/06/13 21:51:33  scowan
00210  * Added to RVC namespace.
00211  *
00212  * Revision 1.10  2001/05/24 17:37:14  scowan
00213  * Added vurtual methods for finding elements.
00214  *
00215  * Revision 1.9  2001/04/23 22:52:04  scowan
00216  * Added find closest methods.
00217  *
00218  * Revision 1.8  2001/04/23 17:40:48  scowan
00219  * Fixed const stuff.
00220  *
00221  * Revision 1.7  2001/04/23 17:38:33  scowan
00222  * Added update extents method.
00223  *
00224  * Revision 1.6  2001/01/18 23:17:57  scowan
00225  * Removed inline constructor / destructor calls.
00226  *
00227  * Revision 1.5  2001/01/16 16:51:52  scowan
00228  * Must have virtual destructor body.
00229  *
00230  * Revision 1.4  2000/12/01 15:57:30  scowan
00231  * Fixed MAC errors.
00232  *
00233  * Revision 1.3  2000/11/24 22:53:23  scowan
00234  * Added set extents pure virtual method.
00235  *
00236  * Revision 1.2  2000/10/19 17:55:45  scowan
00237  * Checked in for vacation.
00238  *
00239  * Revision 1.1  2000/10/02 17:39:43  scowan
00240  * Initial revision
00241  *
00242  * \endif
00243 **/
00244 
00245 //!   \class RVC::GEOMETRIC rvc/geometrc.h
00246 //!   \brief Interface for RVC objects that support line work paradigm.
00247 //!
00248 //!   RVC Object Types that this class supports: Derived class
00249 //!
00250 //!   Default RVC Object Type for this class: Derived class
00251 //!
00252 //!   Valid parents for this class: Derived class
00253 
00254 #ifndef INC_RVC_GEOMETRC_H
00255 #define INC_RVC_GEOMETRC_H
00256 
00257 #ifndef INC_RVC_GEOSPATL_H
00258    #include <rvc/geospatl.h>
00259 #endif
00260 
00261 #ifndef INC_RVC_STYLE_H
00262    #include <rvc/style.h>
00263 #endif
00264 
00265 #ifndef INC_MI32_ELEMTYPE_H
00266    #include <mi32/elemtype.h>
00267 #endif
00268 
00269 #ifndef INC_MI32_SIMPLEAR_H
00270    #include <mi32/simplear.h>
00271 #endif
00272 
00273 #ifndef INC_MI32_RANGE_H
00274    #include <mi32/range.h>
00275 #endif
00276 
00277 #ifndef INC_RVC_GETOBJF_H
00278    #include <rvc/getobjf.h>
00279 #endif
00280 
00281 #ifndef INC_MI32_REGION2D_H
00282    #include <mi32/region2d.h>
00283 #endif
00284 
00285 #ifndef INC_MI32_BITSET_H
00286    #include <mi32/bitset.h>
00287 #endif
00288 
00289 #ifndef INC_MI32_ELEMTYPESET_H
00290    #include <mi32/elemtypeset.h>
00291 #endif
00292 
00293 #ifndef GENERATING_DOXYGEN_OUTPUT
00294 struct SMLCONTEXT;      //!< Forward Declarations
00295 class TRANS2D_MAPGEN;
00296 class BITSET_DEQUE;
00297 #endif // GENERATING_DOXYGEN_OUTPUT
00298 
00299 namespace RVC {
00300 
00301 #ifndef GENERATING_DOXYGEN_OUTPUT
00302 class ELEMENT;          //!< Forward Declarations
00303 class QSEARCHTREE;
00304 class SPATIALTREE;
00305 #endif // GENERATING_DOXYGEN_OUTPUT
00306 
00307 class GEOMETRIC : public GEOSPATIAL {
00308    public:
00309 
00310       //Ignore
00311       class ELEMSELECTFILTER;
00312       class ELEMSELECTPARMS;
00313       class ELEMTRANSLIST;
00314       class GETOBJFILTER_HASMINIMUMELEMENTS;
00315       class GETOBJFILTER_HASNOIMPLIEDGEOREF;
00316       class GETOBJFILTER_ISDISPLAYABLE;
00317       class GETOBJFILTER_ISNOTEMPTY;
00318       class GETOBJFILTER_ISSELECTABLE;
00319       class MAKEPARMSBASE;
00320       class OBSERVER;
00321       class SEARCHFILTER;
00322       class SEARCHFILTER_BITSET;
00323       class SEARCHFILTER_ELEMTRANSLIST;
00324       class SEARCHRESULT;
00325       //End Ignore
00326 
00327       enum CAPABILITY {
00328          CAPABILITY_None =             0,
00329          CAPABILITY_OwnSearchMethods = 512,  //!< Object has its own search methods (Oracle, MySQL, ...)
00330          CAPABILITY_CanAddToEnd,             //!< Object can be modified by adding elements to the end of the object
00331          CAPABILITY_CanChangeElements,       //!< Existing object elements can be modified
00332          CAPABILITY_HasStyleByElement,       //!< Each element can have its own style settings
00333          CAPABILITY_ElementHasExtents,       //!< Each element has extents stored with it, except labels
00334          CAPABILITY_HasLabels,               //!< Object has labels
00335          CAPABILITY_LabelHasExtents,         //!< Each label has extents stored with it
00336          CAPABILITY_CanDeleteLastElement,    //!< Can delete the last element in the set
00337          CAPABILITY_CanDeleteAnyElement      //!< Can delete any element in the set
00338          };
00339 
00340       enum COMPONENT {
00341          COMPONENT_Point =       0x01,
00342          COMPONENT_Line =        0x02,
00343          COMPONENT_Polygon =     0x04,
00344          COMPONENT_Label =       0x08,
00345          COMPONENT_Geometric =   (COMPONENT_Point + COMPONENT_Line + COMPONENT_Polygon),
00346          COMPONENT_All =         (COMPONENT_Geometric + COMPONENT_Label)
00347          };
00348 
00349       enum EXTRACTFLAGS {
00350          EXTRACTFLAG_None =                  0,
00351          EXTRACTFLAG_RegionMethod =          0x00000001,    //!< SelectMethod is a REGION2D
00352          EXTRACTFLAG_RemExRecords =          0x00000002,    //!< Remove Excess (Unattached) database records
00353          EXTRACTFLAG_RemStdAttTables =       0x00000004,    //!< Remove Standard Attribute database tables
00354          EXTRACTFLAG_IgnoreMissingLines =    0x00000008,    //!< Ignore missing lines from extraction operation, polygon and node line lists
00355          EXTRACTFLAG_TableJoinNameStruct =   0x00000010,    //!< Join tables in Append functions if names alike and compatable structures
00356          EXTRACTFLAG_TableJoinStruct =       0x00000020,    //!< Join tables in Append functions if compatable structures
00357          EXTRACTFLAG_TableRemoveDupRec =     0x00000040,    //!< Do not copy over records if exists in dest table
00358          EXTRACTFLAG_IgnorePolygonTables =   0x00000080,    //!< Do not copy over polygon databases
00359          EXTRACTFLAG_RemoveTables =          0x00000100,    //!< Remove destination tables
00360          EXTRACTFLAG_CopyHyperIndexSub =     0x00000200,    //!< Copy Hyper index subobjects
00361          EXTRACTFLAG_DensifyPoints =         0x00000400,    //!< Densify line points using transformation parameters
00362 
00363          EXTRACTFLAG_CreateNewTables =       0x00000800     //!< Copy records and tables instead of maintaining links.
00364          };
00365 
00366       enum POINTTYPE {
00367          POINTTYPE_2DXY = 1,           //!< 2-D coordinates, X and Y given (default)
00368          POINTTYPE_3DXY = 4,           //!< 3-D coordinates, X, Y given, Z constant
00369          POINTTYPE_3DXYZ = 7           //!< 3-D coordinates, X, Y and Z given
00370          };
00371 
00372       //! Default constructor
00373       GEOMETRIC (
00374          );
00375 
00376       //! Copy constructor
00377       GEOMETRIC (
00378          const RVC::GEOMETRIC& rhs
00379          );
00380 
00381       //! Destructor
00382       virtual ~GEOMETRIC (
00383          ) = 0;
00384 
00385       //! Assignment
00386       RVC::GEOMETRIC& operator= (
00387          const RVC::GEOMETRIC& rhs
00388          );
00389 
00390       //! Add an element to the search tree
00391       ERRVALUE AddSearchTreeElement (
00392          INT32 elemnum,
00393          ELEMTYPE ElemType,
00394          const DRECT2D& Extents
00395          ) { return (v_AddSearchTreeElement(elemnum, ElemType, Extents)); }
00396 
00397       //! Populate a search tree given existing elements
00398       ERRVALUE BuildSearchTree (
00399          INT32 InitialNumElements,
00400          ELEMTYPE ElemType,
00401          const DRECT2D& Extents
00402          ) { return (v_BuildSearchTree(InitialNumElements, ElemType, Extents)); }
00403 
00404       //! Re-Initialize search tree to a state with no elements
00405       ERRVALUE ClearSearchTree (
00406          INT32 InitialNumElements,
00407          ELEMTYPE ElemType,
00408          const DRECT2D& Extents
00409          ) { return (v_ClearSearchTree(InitialNumElements, ElemType, Extents)); }
00410 
00411       //! Combine styles from source object 'this' to the destination object 'DestObj'.
00412       //! this method deals with style links from source tables
00413       ERRVALUE CombineStylesTo (
00414          RVC::GEOMETRIC& DestObj
00415          ) const;
00416 
00417       //! Combine styles from source object 'this' to the destination object 'DestObj'.
00418       //! this method deals with style links from source tables
00419       //! Used for objects with direct style attachments (a.k.a CAD)
00420       ERRVALUE CombineStylesTo (
00421          RVC::GEOMETRIC& DestObj,
00422          SIMPLE_ARRAY<INT32>& FontTrans,
00423          SIMPLE_ARRAY<INT32> PattTrans[STYLE::PATTERN_NumTypes]
00424          ) const;
00425 
00426       //! Copy an element from one part of the search tree to another (atomic method)
00427       ERRVALUE CopySearchTreeElement (
00428          INT32 SourceElement,
00429          INT32 DestElement,
00430          ELEMTYPE ElemType,
00431          const DRECT2D& Extents
00432          ) { return (v_CopySearchTreeElement(SourceElement, DestElement, ElemType, Extents)); }
00433 
00434       //! Create an SML context for the given derived class instance
00435       ERRVALUE CreateSMLContext (
00436          SMLCONTEXT **pcontext               //!< SML context allocated and RETURNED
00437          ) const;
00438 
00439       //! Delete an element from the search tree
00440       ERRVALUE DeleteSearchTreeElement (
00441          INT32 elemnum,
00442          ELEMTYPE ElemType
00443          ) { return (v_DeleteSearchTreeElement(elemnum, ElemType)); }
00444 
00445       //! Extract elements from source 'this' object to existing destination object
00446       //! Deals with database attachments and element transfers
00447       //! Not implemented TIN yet
00448       ERRVALUE ExtractTo (
00449          RVC::GEOMETRIC& DestObj,
00450          RVC::GEOMETRIC::ELEMTRANSLIST& TransList,
00451          const TRANS2D_MAPGEN& tmg,
00452          RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags = EXTRACTFLAG_None
00453          ) const { return (v_ExtractTo(DestObj, TransList, tmg, ExtractFlags)); }
00454 
00455       //! Determine closest element based on point and search distance
00456       //! @return Element found, -1 if no elements are close enough, < -1 if error
00457       INT32 FindClosestElement (
00458          ELEMTYPE ElemType,
00459          const DPOINT2D& SearchPt,
00460          double SearchDist,
00461          double* DistFromElem
00462          ) const { return (v_FindClosestElementLow(ElemType, SearchPt, 0, SearchDist, DistFromElem)); }
00463 
00464       //! Determine closest element based on point and search distance with filter
00465       //! @return Element found, -1 if no elements are close enough, < -1 if error
00466       INT32 FindClosestElement (
00467          ELEMTYPE ElemType,
00468          const DPOINT2D& SearchPt,
00469          SEARCHFILTER& SearchFilter,
00470          double SearchDist,
00471          double* DistFromElem
00472          ) const { return (v_FindClosestElementLow(ElemType, SearchPt, &SearchFilter, SearchDist, DistFromElem)); }
00473 
00474       //! Determine set of elements that are within the 'SearchDist' of the 'SearchPt'
00475       ERRVALUE FindClosestElements (
00476          const DPOINT2D& SearchPt,
00477          double SearchDist,
00478          SIMPLE_ARRAY<RVC::ELEMENT>& ElementList,
00479          COMPONENT Component = COMPONENT_All
00480          ) const { return (v_FindClosestElementsLow(SearchPt, SearchDist, 0, ElementList, Component)); }
00481 
00482       //! Determine set of elements that are within the 'SearchDist' of the 'SearchPt' with filter
00483       ERRVALUE FindClosestElements (
00484          const DPOINT2D& SearchPt,
00485          double SearchDist,
00486          SEARCHFILTER& SearchFilter,
00487          SIMPLE_ARRAY<RVC::ELEMENT>& ElementList,
00488          COMPONENT Component = COMPONENT_All
00489          ) const { return (v_FindClosestElementsLow(SearchPt, SearchDist, &SearchFilter, ElementList, Component)); }
00490 
00491       //! Obtain set of elements that fall within the rectangle, return list in 'SearchResult'
00492       //! This method will NOT build search trees to determine the elements that fall within the rectangle.
00493       //! If a search or spatial tree is not available to limit the search, all elements will be returned
00494       ERRVALUE FindElementDrawSet (
00495          ELEMTYPE ElemType,
00496          const DRECT2D& SearchExtents,
00497          SEARCHRESULT& SearchResult
00498          ) const;
00499 
00500       //! Obtain set of elements that fall within the rectangle, return list in 'SearchResult'
00501       //! This method will build search trees, if needed, to determine the elements that fall within the rectangle.
00502       ERRVALUE FindElementSearchSet (
00503          ELEMTYPE ElemType,
00504          const DRECT2D& SearchExtents,
00505          SEARCHRESULT& SearchResult
00506          ) const;
00507 
00508       //! Obtain the DBASE_ELEMENT Attachement index from the element specified
00509       //! @return '-1' if element does not have a database attachment, >= 0 if it does.
00510       INT32 GetAttachmentIndex (
00511          const RVC::ELEMENT& Element
00512          ) const { return (v_GetAttachmentIndex(Element)); }
00513 
00514       //! Obtain DIMENSION type
00515       //! @return DIMENSION type
00516       DIMENSION GetDimension (
00517          ) const { return ((GetPointType() == POINTTYPE_3DXYZ) ? DIMENSION_3D : DIMENSION_2D); }
00518 
00519       //! Obtain element extents using element type and element number
00520       ERRVALUE GetElementExtents (
00521          ELEMTYPE ElemType,
00522          INT32 ElemNum,
00523          DRECT3D& Extents              //!< Element extents RETURNED, set to invalid if error or element is deleted
00524          ) const { return (v_GetElementExtents(ElemType, ElemNum, Extents)); }
00525 
00526       //! Get geometric object referred to by 'object'
00527       //! @return Allocated instance of RVC::GEOMETRIC object (must be 'delete'd) or 0 if error
00528       static RVC::GEOMETRIC* GetGeometric (
00529          const RVC::OBJECT& object
00530          );
00531 
00532       //! Get geometric object referred to by 'ObjItem'
00533       //! @return Allocated instance of RVC::GEOMETRIC object (must be 'delete'd) or 0 if error
00534       static RVC::GEOMETRIC* GetGeometric (
00535          const RVC::OBJITEM& ObjItem
00536          );
00537 
00538       //! Obtain next element ID depending on element type
00539       //! @return Element ID to be used for the next element
00540       INT32 GetNextElementID (
00541          ELEMTYPE ElemType
00542          ) const { return (v_GetNextElementID(ElemType)); }
00543 
00544       //! Obtain number of elements based on element type
00545       //! Specifying ELEMTYPE_All will return the total combination of elements in the object
00546       //! @return Number of elements if valid ELEMTYPE for object, -1 if not
00547       INT32 GetNumElements (
00548          ELEMTYPE ElemType
00549          ) const { return (v_GetNumElements(ElemType)); }
00550 
00551       //! Get correct OBJTYPESET for all geometric OBJTYPE's
00552       //! @return OBJTYPESET for all geometric OBJTYPE's
00553       static RVC::OBJTYPESET GetObjTypeSet (
00554          );
00555 
00556       //! Obtain number of point coordinate dimensions
00557       //! @return Number of dimensions
00558       INT32 GetPointDimension (
00559          ) const { return (GetPointSize() / sizeof(double)); }
00560 
00561       //! Obtain point coordinate type
00562       //! @return POINTTYPE coordinate type
00563       POINTTYPE GetPointType (
00564          ) const { return (v_GetPointType()); }
00565 
00566       //! Obtain size of point coordinate
00567       //! @return Size of point in bytes
00568       INT32 GetPointSize (
00569          ) const { return (v_GetPointSize()); }
00570 
00571       //! Obtain the total line length of all of the lines in the geometric object combined
00572       //! @return Total length of all of the lines combined or zero if not computed
00573       double GetTotalLineLength (
00574          ) const { return (v_GetTotalLineLength()); }
00575 
00576       //! Determine if the element in this object is deleted.
00577       //! @return 'true' if the element is deleted, 'false' if not.
00578       bool IsElementDeleted (
00579          const RVC::ELEMENT& Element
00580          ) const { return (v_IsElementDeleted(Element)); }
00581 
00582       //! Determine if the object has any elements.
00583       //! @return 'true' if the object is empty, 'false' if not.
00584       bool IsEmpty (
00585          ) const { return (v_IsEmpty()); }
00586 
00587       //! Determine if the object type is a geometric object
00588       static bool IsGeometric (
00589          RVC::OBJTYPE ObjType
00590          );
00591 
00592       //! Save search tree objects
00593       ERRVALUE SaveSearchTrees (
00594          ) { return (v_SaveSearchTrees()); }
00595 
00596       //! Set the extents of an object
00597       //! Only use if you have a write lock on the entire object
00598       ERRVALUE SetExtents (
00599          const DRECT3D &extents
00600          ) { return (v_SetExtents(extents)); }
00601 
00602       //! Set next element ID depending on element type
00603       ERRVALUE SetNextElementID (
00604          ELEMTYPE ElemType,
00605          INT32 NextElementID
00606          ) { return (v_SetNextElementID(ElemType, NextElementID)); }
00607 
00608       //! Set search tree handle for all open instances of this object
00609       bool SetSearchTree (
00610          ELEMTYPE ElemType,
00611          RVC::QSEARCHTREE* SearchTree,
00612          bool ReplaceExisting = false
00613          ) { return (v_SetSearchTree(ElemType, SearchTree, ReplaceExisting)); }
00614 
00615       //! Set the total line length of all of the lines in the geometric object combined
00616       ERRVALUE SetTotalLineLength (
00617          double length
00618          ) { return (v_SetTotalLineLength(length)); }
00619 
00620       //! Generate element translation lists dependent on the selection parameters.
00621       //! @return > 0 if elements are found to meet the selection parameters, '0' if no elements found, < 0 error
00622       int SetupElemTransList (
00623          const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms,
00624          RVC::GEOMETRIC::ELEMTRANSLIST& TransList
00625          ) const { return (SetupElemTransList(SelectParms, TransList, 0)); }
00626 
00627       //! Generate element translation lists dependent on the selection parameters.
00628       //! @return > 0 if elements are found to meet the selection parameters, '0' if no elements found, < 0 error
00629       int SetupElemTransList (
00630          const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms,
00631          RVC::GEOMETRIC::ELEMTRANSLIST& TransList,
00632          RVC::GEOMETRIC::ELEMSELECTFILTER& SelectFilter
00633          ) const { return (SetupElemTransList(SelectParms, TransList, &SelectFilter)); }
00634 
00635       //! Test element against region
00636       //! The REGION2D needs to be in 'object' coordinates, no conversion is done internally
00637       //! @return True if test against region was sucessful
00638       bool TestElementAgainstRegion (
00639          const RVC::ELEMENT& Element,
00640          const REGION2D& region,
00641          TESTCRITERIA TestMode
00642          ) const { return (v_TestElementAgainstRegion(Element, region, TestMode)); }
00643 
00644       //! Update the extents of an object, this is a thread safe method
00645       ERRVALUE UpdateExtents (
00646          const DRECT3D &extents
00647          ) { return (v_UpdateExtents(extents)); }
00648 
00649    protected:
00650 
00651       #ifndef GENERATING_DOXYGEN_OUTPUT
00652       static void GeometricCallbackFunc (MfAnyCallbackStruct *cb, void *data);
00653       #endif // GENERATING_DOXYGEN_OUTPUT
00654 
00655    private:
00656       // Pure virtual methods
00657 
00658       virtual ERRVALUE v_AddSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType, const DRECT2D& Extents) = 0;
00659       virtual ERRVALUE v_BuildSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents) = 0;
00660       virtual ERRVALUE v_ClearSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents) = 0;
00661       virtual ERRVALUE v_CopySearchTreeElement (INT32 SourceElement, INT32 DestElement, ELEMTYPE ElemType, const DRECT2D& Extents) = 0;
00662       virtual ERRVALUE v_DeleteSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType) = 0;
00663       virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const = 0;
00664       virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const = 0;
00665       virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList, COMPONENT Component) const;
00666       virtual ERRVALUE v_FindElementDrawSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const = 0;
00667       virtual ERRVALUE v_FindElementSearchSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const = 0;
00668       virtual INT32 v_GetAttachmentIndex (const RVC::ELEMENT& Element) const;
00669       virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const = 0;
00670       virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const = 0;
00671       virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const = 0;
00672       virtual POINTTYPE v_GetPointType () const = 0;
00673       virtual INT32 v_GetPointSize () const = 0;
00674       virtual double v_GetTotalLineLength () const = 0;
00675       virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const = 0;
00676       virtual bool v_IsEmpty () const = 0;
00677       virtual ERRVALUE v_SaveSearchTrees () = 0;
00678       virtual ERRVALUE v_SetExtents (const DRECT3D &extents) = 0;
00679       virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID) = 0;
00680       virtual bool v_SetSearchTree (ELEMTYPE ElemType, RVC::QSEARCHTREE* SearchTree, bool ReplaceExisting) = 0;
00681       virtual ERRVALUE v_SetTotalLineLength (double length) = 0;
00682       virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const = 0;
00683       virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const = 0;
00684       virtual ERRVALUE v_UpdateExtents (const DRECT3D &extents) = 0;
00685 
00686       #ifndef GENERATING_DOXYGEN_OUTPUT
00687       int SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00688       #endif // GENERATING_DOXYGEN_OUTPUT
00689    };
00690 
00691 DEFINE_ENUM_OP_BITWISE(GEOMETRIC::EXTRACTFLAGS);
00692 DEFINE_ENUM_OP_BITWISE(GEOMETRIC::COMPONENT);
00693 
00694 
00695 class GEOMETRIC::ELEMSELECTFILTER {
00696    public:
00697       ELEMSELECTFILTER () {}
00698 
00699       //! Filter elements based on some external criteria
00700       //! @return '1' for element acceptance, '0' to reject element, < 0 for an error
00701       int FilterElement (
00702          RVC::ELEMENT& Element
00703          ) { return (v_FilterElement(Element)); }
00704 
00705    private:
00706       // Pure virtual
00707       virtual int v_FilterElement (RVC::ELEMENT& element) = 0;
00708    };
00709 
00710 
00711 class GEOMETRIC::ELEMSELECTPARMS {
00712    public:
00713 
00714       enum EXTRACT {
00715          EXTRACT_All,
00716          EXTRACT_PartInside,
00717          EXTRACT_FullInside,
00718          EXTRACT_ClipInside,
00719          EXTRACT_PartOutside,
00720          EXTRACT_FullOutside,
00721          EXTRACT_ClipOutside
00722          };
00723 
00724       struct ITEM {
00725          enum SELECT {
00726             SELECT_None = 0,
00727             SELECT_All,
00728             SELECT_ByRecord,
00729             SELECT_ByScript,
00730             SELECT_ByElement,
00731             SELECT_Last
00732             };
00733 
00734          ITEM (
00735             );
00736 
00737          SELECT m_SelectType;
00738          MISTRING m_QueryStr;
00739          RVC::OBJECTNAME m_TableName;     //!< Table that 'RecordList' is selected from
00740          BITSET m_RecordList;             //!< List of records in 'TableNum' that the user has selected (bit array)
00741          BITSET m_ElemList;               //!< List of elements (bit array)
00742          };
00743 
00744       ELEMSELECTPARMS (
00745          );
00746 
00747       const REGION2D& GetRegion2D (
00748          ) const { return (m_Region); }
00749 
00750       EXTRACT GetRegionExtractMode (
00751          ) const { return (m_ExtractMode); }
00752 
00753       TESTCRITERIA GetRegionTestCriteria (
00754          ) const {
00755          TESTCRITERIA TestCriteria = TESTCRITERIA_PartInside;
00756          switch (m_ExtractMode) {
00757             case EXTRACT_FullOutside:  TestCriteria = TESTCRITERIA_FullOutside; break;
00758             case EXTRACT_PartOutside:  TestCriteria = TESTCRITERIA_PartOutside; break;
00759             case EXTRACT_ClipOutside:  TestCriteria = TESTCRITERIA_PartOutside; break;
00760             case EXTRACT_FullInside:   TestCriteria = TESTCRITERIA_FullInside; break;
00761             case EXTRACT_PartInside:   TestCriteria = TESTCRITERIA_PartInside; break;
00762             case EXTRACT_ClipInside:   TestCriteria = TESTCRITERIA_PartInside; break;
00763             }
00764          return (TestCriteria);
00765          }
00766 
00767       const ITEM& GetSelectParmItem (
00768          ELEMTYPE ElemType
00769          ) const;
00770 
00771       ITEM& GetSelectParmItem (
00772          ELEMTYPE ElemType
00773          );
00774 
00775       bool HasRegion (
00776          ) const { return (!m_Region.IsEmpty()); }
00777 
00778       void SetRegion (
00779          const REGION2D& Region
00780          ) { m_Region = Region; }
00781 
00782       void SetRegionExtractMode (
00783          EXTRACT ExtractMode
00784          ) { m_ExtractMode = ExtractMode; }
00785 
00786       void SetSelectAll (
00787          );
00788 
00789       void SetSelectNone (
00790          );
00791 
00792       void SetSelectParmItem (
00793          ELEMTYPE ElemType,
00794          const ITEM& item
00795          );
00796 
00797    private:
00798       #ifndef GENERATING_DOXYGEN_OUTPUT
00799       ITEM m_SelectParm[6];
00800       REGION2D m_Region;
00801       EXTRACT m_ExtractMode;
00802       #endif // GENERATING_DOXYGEN_OUTPUT
00803    };
00804 
00805 
00806 //! Class to manage element translation lists from source to destination elements
00807 //! Eg: 'DestElemNum = TransList[SourceElemNum]' where 'TransList' is an array of INT32's
00808 //! The value '-1' states that the source element does not translate to a destination number.
00809 class GEOMETRIC::ELEMTRANSLIST {
00810    public:
00811 
00812       //! Constructor
00813       ELEMTRANSLIST (
00814          ) {}
00815 
00816       //! Copy Constructor
00817       ELEMTRANSLIST (
00818          const ELEMTRANSLIST& rhs
00819          );
00820 
00821       //! Destructor
00822       ~ELEMTRANSLIST (
00823          ) {}
00824 
00825       //! Assignment Operator
00826       ELEMTRANSLIST& operator= (
00827          const ELEMTRANSLIST& rhs
00828          );
00829 
00830       //! Obtain the element translation array for a particular element type (ELEMTYPE)
00831       //! @return Element Translation List
00832       const SIMPLE_ARRAY<INT32>& GetElementTransList (
00833          ELEMTYPE ElemType
00834          ) const;
00835 
00836       //! Obtain the element translation array for a particular element type (ELEMTYPE)
00837       //! @return Element Translation List
00838       SIMPLE_ARRAY<INT32>& GetElementTransList (
00839          ELEMTYPE ElemType
00840          );
00841 
00842       //! Obtain the element bitset for a particular element type (ELEMTYPE)
00843       ERRVALUE GetElementBitset (
00844          ELEMTYPE ElemType,
00845          BITSET& Bitset
00846          ) const;
00847 
00848       //! Obtain the element bitset deque for a particular element type (ELEMTYPE)
00849       ERRVALUE GetElementBitsetDeque (
00850          ELEMTYPE ElemType,
00851          BITSET_DEQUE& BitsetDeque
00852          ) const;
00853 
00854       ERRVALUE GetReverseTransList (
00855          ELEMTYPE ElemType,
00856          SIMPLE_ARRAY<INT32>& ReverseTrans,
00857          INT32 NumDestElems
00858          ) const;
00859 
00860       //! Set an element translation list entry to a pre-built list
00861       void SetElementTransList (
00862          const SIMPLE_ARRAY<INT32>& TransList,
00863          ELEMTYPE ElemType
00864          );
00865 
00866       //! Set an element translation list entry to a pre-built list
00867       ERRVALUE SetElementTransList (
00868          INT32* TransList,
00869          INT32 NumItems,
00870          ELEMTYPE ElemType
00871          );
00872 
00873       //! Set translation list to a one-to-one (Identity) mapping
00874       ERRVALUE SetIdentity (
00875          const RVC::GEOMETRIC& GeoObj        //!< Geometric object used to set identity arrays using the object type and number of elements per element type
00876          );
00877 
00878       //! Set an element translation list entry to a one-to-one (Identity) mapping
00879       ERRVALUE SetIdentity (
00880          const RVC::GEOMETRIC& GeoObj,       //!< Geometric object used to set identity arrays using the object type
00881          ELEMTYPE ElemType                   //!< Element Type used to set the identity array entry using the number of elements for this type
00882          );
00883 
00884    private:
00885       #ifndef GENERATING_DOXYGEN_OUTPUT
00886       SIMPLE_ARRAY<INT32> m_TransList[6];
00887       #endif // GENERATING_DOXYGEN_OUTPUT
00888    };
00889 
00890 
00891 //! GETOBJFILTER derived class to determine if the geometric object has the minimum number of elements of the specified types
00892 class GEOMETRIC::GETOBJFILTER_HASMINIMUMELEMENTS : public GETOBJFILTER {
00893    public:
00894       GETOBJFILTER_HASMINIMUMELEMENTS (
00895          const ELEMTYPESET& ElemTypeSet,
00896          INT32 MinElements = 1
00897          ) : m_ElemTypeSet(ElemTypeSet), m_MinElements(MinElements) {}
00898 
00899    private:
00900       #ifndef GENERATING_DOXYGEN_OUTPUT
00901       ELEMTYPESET m_ElemTypeSet;
00902       INT32 m_MinElements;
00903 
00904       virtual bool v_IsSelectable (const RVC::OBJITEM& ObjItem, int position);
00905       #endif // GENERATING_DOXYGEN_OUTPUT
00906    };
00907 
00908 //! Geometric object selection filter to disallow selection of geometric objects already having implied georeference.
00909 class GEOMETRIC::GETOBJFILTER_HASNOIMPLIEDGEOREF : public GETOBJFILTER {
00910    public:
00911       GETOBJFILTER_HASNOIMPLIEDGEOREF () {}
00912    private:
00913       #ifndef GENERATING_DOXYGEN_OUTPUT
00914       virtual bool v_IsSelectable (const RVC::OBJITEM& ObjItem, int position);
00915       #endif // GENERATING_DOXYGEN_OUTPUT
00916    };
00917 
00918 //! Geometric object selection filter to disallow selection of empty and invalid extent geometric objects
00919 class GEOMETRIC::GETOBJFILTER_ISDISPLAYABLE : public GETOBJFILTER {
00920    public:
00921       GETOBJFILTER_ISDISPLAYABLE () {}
00922    private:
00923       #ifndef GENERATING_DOXYGEN_OUTPUT
00924       virtual bool v_IsSelectable (const RVC::OBJITEM& ObjItem, int position);
00925       #endif // GENERATING_DOXYGEN_OUTPUT
00926    };
00927 
00928 //! Geometric object selection filter to disallow selection of empty geometric objects
00929 class GEOMETRIC::GETOBJFILTER_ISNOTEMPTY : public GETOBJFILTER {
00930    public:
00931       GETOBJFILTER_ISNOTEMPTY () {}
00932    private:
00933       #ifndef GENERATING_DOXYGEN_OUTPUT
00934       virtual bool v_IsSelectable (const RVC::OBJITEM& ObjItem, int position);
00935       #endif // GENERATING_DOXYGEN_OUTPUT
00936    };
00937 
00938 //! Geometric object selection filter to disallow selection of non geometric objects
00939 class GEOMETRIC::GETOBJFILTER_ISSELECTABLE : public GETOBJFILTER {
00940    public:
00941       GETOBJFILTER_ISSELECTABLE () {}
00942    private:
00943       #ifndef GENERATING_DOXYGEN_OUTPUT
00944       virtual bool v_IsSelectable (const RVC::OBJITEM& ObjItem, int position);
00945       #endif // GENERATING_DOXYGEN_OUTPUT
00946    };
00947 
00948 
00949 //! Make parameter base class for RVC::GEOMETRIC objects.
00950 class GEOMETRIC::MAKEPARMSBASE {
00951    public:
00952 
00953       //! Default constructor
00954       MAKEPARMSBASE (
00955          POINTTYPE PointType
00956          ) :
00957          m_PointType(PointType),
00958          m_XScale(1.0),
00959          m_YScale(1.0),
00960          m_ZScale(1.0)
00961          {}
00962 
00963       //! Get vector object extents
00964       //! @return Extents of the vector object
00965       const DRECT3D& GetExtents (
00966          ) const {return (m_Extents);}
00967 
00968       //! Obtain point coordinate type for vector creation
00969       //! @return RVCGEOMETRIC::POINTTYPE coordinate type
00970       POINTTYPE GetPointType (
00971          ) const {return (m_PointType);}
00972 
00973       //! Get vector x scale value
00974       //! @return Vector X scale value
00975       double GetXScale (
00976          ) const {return (m_XScale);}
00977 
00978       //! Get vector y scale value
00979       //! @return Vector Y scale value
00980       double GetYScale (
00981          ) const {return (m_YScale);}
00982 
00983       //! Get vector z scale value
00984       //! @return Vector Z scale value
00985       double GetZScale (
00986          ) const {return (m_ZScale);}
00987 
00988       //! Set vector object extents
00989       void SetExtents (
00990          const DRECT3D& rect
00991          ) {m_Extents = rect;}
00992 
00993       //! Set coordinate point type for vector creation
00994       void SetPointType (
00995          POINTTYPE PointType
00996          ) {m_PointType = PointType;}
00997 
00998       //! Set vector x scale value
00999       void SetXScale (
01000          double xscale
01001          ) {m_XScale = xscale;}
01002 
01003       //! Set vector y scale value
01004       void SetYScale (
01005          double yscale
01006          ) {m_YScale = yscale;}
01007 
01008       //! Set vector x scale value
01009       void SetZScale (
01010          double zscale
01011          ) {m_ZScale = zscale;}
01012 
01013    protected:
01014 
01015       DRECT3D m_Extents;
01016       POINTTYPE m_PointType;
01017       double m_XScale;
01018       double m_YScale;
01019       double m_ZScale;
01020    };
01021 
01022 //! OBSERVER class for RVC::GEOMETRIC objects.
01023 class GEOMETRIC::OBSERVER : public RVC::OBJECTOBSERVER {
01024    public:
01025       enum TYPE {
01026          TYPE_ExtentsChange = 0x00000108,
01027          TYPE_PointTypeChange = 0x00000110
01028 //!         TYPE_AddElement = 0x00000201
01029          };
01030 
01031       explicit OBSERVER (
01032          RVC::GEOMETRIC& object
01033          ) : OBJECTOBSERVER(object) {}
01034 
01035       virtual ~OBSERVER (
01036          ) {}
01037 
01038 //!      virtual void OnAddElement (
01039 //!         ELEMTYPE ElemType,
01040 //!         INT32 ElemNum
01041 //!         ) { return; }
01042 
01043       //! Called when the geoemtric object extents has changed
01044       virtual void OnExtentsChanged (
01045          const DRECT3D&                      //!< NewExtents
01046          ) { return; }
01047 
01048       //! Called when the geoemtric object extents has changed
01049       virtual void OnPointTypeChanged (
01050          GEOMETRIC::POINTTYPE                //!< NewPointType
01051          ) { return; }
01052 
01053    private:
01054       #ifndef GENERATING_DOXYGEN_OUTPUT
01055       virtual void OnNotifyRaw (UINT32 reason, void *data);
01056       #endif // GENERATING_DOXYGEN_OUTPUT
01057    };
01058 
01059 
01060 //! Filter search class for FindClosestElement() method
01061 class GEOMETRIC::SEARCHFILTER {
01062    public:
01063       //! Element filter for locating correct elements.
01064       //! @return True to use element in search, False to not use element in search
01065       virtual bool Filter (
01066          const RVC::GEOMETRIC& object,
01067          ELEMTYPE ElemType,
01068          INT32 ElemNum
01069          ) = 0;
01070 
01071    protected:
01072       //! Destructor
01073       virtual ~SEARCHFILTER () {}
01074    };
01075 
01076 
01077 //! Filter search class for FindClosestElement() method supporting bit-set.
01078 class GEOMETRIC::SEARCHFILTER_BITSET : public GEOMETRIC::SEARCHFILTER {
01079    public:
01080 
01081       //! Construct from BITSET_UNOWNED.
01082       SEARCHFILTER_BITSET (
01083          const BITSET_UNOWNED& bitset
01084          ) : m_bitset(bitset) { }
01085 
01086       //! Construct from bit array and count.
01087       SEARCHFILTER_BITSET (
01088          const UINT8 *set,
01089          UINT32 NumEntries
01090          ) : m_bitset(const_cast<UINT8*>(set),NumEntries) { }
01091 
01092       //! Destructor
01093       virtual ~SEARCHFILTER_BITSET () {}
01094 
01095    protected:
01096 
01097       //! Element filter for locating correct elements.
01098       //! @return True if element in set, false if not.
01099       virtual bool Filter (
01100          const RVC::GEOMETRIC& object,
01101          ELEMTYPE ElemType,
01102          INT32 ElemNum
01103          );
01104 
01105    private:
01106       #ifndef GENERATING_DOXYGEN_OUTPUT
01107       BITSET_UNOWNED m_bitset;
01108       #endif // GENERATING_DOXYGEN_OUTPUT
01109    };
01110 
01111 
01112 //! Filter search class for FindClosestElement() method supporting bit-set.
01113 class GEOMETRIC::SEARCHFILTER_ELEMTRANSLIST : public GEOMETRIC::SEARCHFILTER {
01114    public:
01115 
01116       //! Construct from ELEMTRANSLIST
01117       SEARCHFILTER_ELEMTRANSLIST (
01118          const GEOMETRIC::ELEMTRANSLIST& ElemTransList
01119          ) : m_ElemTransList(ElemTransList) { }
01120 
01121       //! Destructor
01122       virtual ~SEARCHFILTER_ELEMTRANSLIST () {}
01123 
01124    protected:
01125 
01126       //! Element filter for locating correct elements.
01127       //! @return True if element in set, false if not.
01128       virtual bool Filter (
01129          const RVC::GEOMETRIC& object,
01130          ELEMTYPE ElemType,
01131          INT32 ElemNum
01132          );
01133 
01134    private:
01135       #ifndef GENERATING_DOXYGEN_OUTPUT
01136       GEOMETRIC::ELEMTRANSLIST m_ElemTransList;
01137       #endif // GENERATING_DOXYGEN_OUTPUT
01138    };
01139 
01140 
01141 class GEOMETRIC::SEARCHRESULT {
01142    public:
01143 
01144       class CONST_ITERATOR;
01145       friend class CONST_ITERATOR;
01146 
01147       class CONST_ITERATOR {
01148          public:
01149 
01150             //! Default constructor
01151             CONST_ITERATOR (
01152                ) :
01153                m_IsRange(false),
01154                m_CurElemNum(0),
01155                m_CurIndex(0),
01156                m_sr(0)
01157                {}
01158 
01159             //! Internal constructor, used by container.
01160             CONST_ITERATOR (
01161                const SEARCHRESULT* sr,
01162                bool CreateEnd = false
01163                );
01164 
01165             //! Copy constructor
01166             CONST_ITERATOR (
01167                const CONST_ITERATOR& rhs
01168                ) :
01169                m_IsRange(rhs.m_IsRange),
01170                m_CurElemNum(rhs.m_CurElemNum),
01171                m_CurIndex(rhs.m_CurIndex),
01172                m_sr(rhs.m_sr)
01173                {}
01174 
01175             //! Dereference operator, returns current element number.
01176             const INT32& operator* (
01177                ) const { return (m_CurElemNum); }
01178 
01179             //! Pre-increment operator.
01180             CONST_ITERATOR& operator++ (
01181                );
01182 
01183             //! Post-increment operator.
01184             CONST_ITERATOR operator++(int
01185                ) {
01186                CONST_ITERATOR temp = *this;
01187                ++*this;
01188                return (temp);
01189                }
01190 
01191             bool operator== (          //! Equality operator
01192                const CONST_ITERATOR& rhs
01193                ) const { return (m_CurElemNum == rhs.m_CurElemNum); }
01194 
01195             bool operator!= (          //! Inequality operator
01196                const CONST_ITERATOR& rhs
01197                ) const { return (!(*this == rhs)); }
01198 
01199          private:
01200             #ifndef GENERATING_DOXYGEN_OUTPUT
01201             bool m_IsRange;
01202             INT32 m_CurElemNum;
01203             INT32 m_CurIndex;
01204             const SEARCHRESULT* m_sr;
01205             #endif // GENERATING_DOXYGEN_OUTPUT
01206          };
01207 
01208       SEARCHRESULT (
01209          );
01210 
01211       SEARCHRESULT (
01212          const SEARCHRESULT& rhs
01213          );
01214 
01215       ~SEARCHRESULT (
01216          );
01217 
01218       SEARCHRESULT& operator= (
01219          const SEARCHRESULT& rhs
01220          );
01221 
01222       CONST_ITERATOR Begin (
01223          ) const {return (CONST_ITERATOR(this));}
01224 
01225       void Clear (
01226          );
01227 
01228       CONST_ITERATOR End (
01229          ) const {return (CONST_ITERATOR(this, true));}
01230 
01231       ERRVALUE FindElements (
01232          ELEMTYPE ElemType,
01233          const DRECT2D& SearchExtents,
01234          RVC::QSEARCHTREE& QTreeObj
01235          );
01236 
01237       ERRVALUE FindElements (
01238          ELEMTYPE ElemType,
01239          const DRECT2D& SearchExtents,
01240          RVC::SPATIALTREE& STreeObj
01241          );
01242 
01243       ERRVALUE GetElementSet (
01244          BITSET& SelectSet
01245          ) const;
01246 
01247       ERRVALUE GetElementSet (
01248          SIMPLE_ARRAY<INT32>& SelectList
01249          ) const;
01250 
01251       INT32 GetNumItems (
01252          ) const;
01253 
01254       bool IsEmpty (
01255          ) const;
01256 
01257       //! Set the search result for the all elements set
01258       void SetAll (
01259          INT32 NumElements
01260          );
01261 
01262       //! Set the search result for array passed in
01263       void SetArray (
01264          const SIMPLE_ARRAY<INT32>& ElemSet
01265          );
01266 
01267       //! Sort the elements in the list using the elements extents from smallest to largest
01268       void SortItemsByExtentArea (
01269          const RVC::GEOMETRIC& GeoObj,
01270          ELEMTYPE ElemType
01271          );
01272 
01273    private:
01274       #ifndef GENERATING_DOXYGEN_OUTPUT
01275       SIMPLE_ARRAY<INT32> m_list;
01276       SIMPLE_ARRAY<INT32_RANGE> m_range;
01277       #endif // GENERATING_DOXYGEN_OUTPUT
01278    };
01279 
01280 
01281 }     //! End of RVC namespace
01282 
01283 #endif   //!< INC_RVC_GEOMETRC_H

Generated on Wed May 31 15:27:24 2006 for TNTsdk by  doxygen 1.3.8-20040913