00001
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef INC_RVC_GEOTABLE_H
00039 #define INC_RVC_GEOTABLE_H
00040
00041 #ifndef INC_RVC_GEOMETRC_H
00042 #include <rvc/geometrc.h>
00043 #endif
00044
00045 #ifndef INC_RVC_DBTABLE_H
00046 #include <rvc/dbtable.h>
00047 #endif
00048
00049 #ifndef GENERATING_DOXYGEN_OUTPUT
00050 class QUADTREE;
00051 #endif // GENERATING_DOXYGEN_OUTPUT
00052
00053 namespace RVC {
00054
00055 class GEOTABLE : public GEOMETRIC {
00056 public:
00057
00058 #ifndef GENERATING_DOXYGEN_OUTPUT
00059 class ELEMITERATOR;
00060 friend class ELEMITERATOR;
00061 class MAKEPARMS;
00062 #endif // GENERATING_DOXYGEN_OUTPUT
00063
00065 GEOTABLE (
00066 );
00067
00069 GEOTABLE (
00070 const RVC::GEOTABLE& rhs
00071 );
00072
00074 virtual ~GEOTABLE (
00075 );
00076
00078 RVC::GEOTABLE& operator= (
00079 const RVC::GEOTABLE& rhs
00080 );
00081
00083 ELEMITERATOR ElementBegin (
00084 ) const;
00085
00087 ELEMITERATOR ElementEnd (
00088 ) const;
00089
00091 bool IsEditable (
00092 ) const;
00093
00095 ERRVALUE Make (
00096 const RVC::DBTABLE& table,
00097 const MAKEPARMS& MakeParms,
00098 const char* Source = 0
00099 );
00100
00102 ERRVALUE Make (
00103 const RVC::OBJITEM& ObjItem,
00104 const MAKEPARMS& MakeParms,
00105 const char* Source = 0
00106 );
00107
00109 ERRVALUE Read (
00110 INT32 RecNum,
00111 DPOINT3D& Point
00112 ) const;
00113
00115 ERRVALUE Read (
00116 INT32 RecNum,
00117 DBTABLE::RECORD& Record
00118 ) const;
00119
00122 ERRVALUE Write (
00123 INT32 RecNum,
00124 const DPOINT3D& Point
00125 );
00126
00127 private:
00128 #ifndef GENERATING_DOXYGEN_OUTPUT
00129
00131 virtual ERRVALUE v_CloseObject ();
00132 virtual OBJTYPE v_GetDftObjectType () const;
00133 virtual bool v_IsObjectOpen () const;
00134 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);
00135
00137 virtual void v_GetExtents (DRECT3D &extents) const;
00138 virtual void v_GetScale (double& xscale, double& yscale) const;
00139 virtual double v_GetZOffset () const;
00140 virtual double v_GetZScale () const;
00141 virtual bool v_HasCapability (int Capability) const;
00142 virtual void v_SetScale (double xscale, double yscale);
00143 virtual void v_SetZOffset (double zoffset);
00144 virtual void v_SetZScale (double zscale);
00145
00147 virtual ERRVALUE v_AddSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType, const DRECT2D& Extents);
00148 virtual ERRVALUE v_BuildSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00149 virtual ERRVALUE v_ClearSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00150 virtual ERRVALUE v_CopySearchTreeElement (INT32 SourceElement, INT32 DestElement, ELEMTYPE ElemType, const DRECT2D& Extents);
00151 virtual ERRVALUE v_DeleteSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType);
00152 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00153 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, GEOMETRIC::SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00154 virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList) const;
00155 virtual ERRVALUE v_FindElementDrawSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00156 virtual ERRVALUE v_FindElementSearchSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00157 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00158 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00159 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00160 virtual POINTTYPE v_GetPointType () const;
00161 virtual INT32 v_GetPointSize () const;
00162 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00163 virtual bool v_IsEmpty () const;
00164 virtual ERRVALUE v_SaveSearchTrees ();
00165 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00166 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00167 virtual bool v_SetSearchTree (ELEMTYPE ElemType, RVC::QSEARCHTREE* SearchTree, bool ReplaceExisting);
00168 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00169 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00170 virtual ERRVALUE v_UpdateExtents (const DRECT3D &extents);
00171
00172 ERRVALUE ComputePoint (INT32 RecNum, DPOINT3D& point);
00173
00174 DBTABLE m_DBTableObj;
00175 INT32 m_XFieldNum;
00176 INT32 m_YFieldNum;
00177 INT32 m_ZFieldNum;
00178 MISTRING m_GeoScript;
00179 SMLCONTEXT* m_Context;
00180 SMLSEGMENT m_Segment;
00181 class PRIV;
00182 mutable PRIV* m_Priv;
00183 mutable QUADTREE* m_QTree;
00184 mutable bool m_SetInstanceData;
00185 #endif // GENERATING_DOXYGEN_OUTPUT
00186 };
00187
00188
00193 class GEOTABLE::ELEMITERATOR {
00194 public:
00195
00197 ELEMITERATOR (
00198 ) :
00199 m_CurrentObj(0),
00200 m_IsDone(false)
00201 {}
00202
00204 ELEMITERATOR (
00205 const RVC::GEOTABLE* GeoTableObj,
00206 bool IsDone
00207 ) :
00208 m_CurrentObj(GeoTableObj)
00209 m_IsDone(IsDone)
00210 {}
00211
00213 ELEMITERATOR (
00214 const ELEMITERATOR& rhs
00215 ) :
00216 m_CurrentObj(rhs.m_CurrentObj),
00217 m_IsDone(rhs.m_IsDone),
00218 m_RecIt(rhs.m_RecIt)
00219 {}
00220
00222 ELEMITERATOR (
00223 const RVC::GEOTABLE* GeoTableObj
00224 ) :
00225 m_CurrentObj(GeoTableObj),
00226 m_IsDone(false)
00227 {
00228 GeoTableObj->RecordBegin(m_RecIt);
00229 }
00230
00232 virtual ~ELEMITERATOR (
00233 ) {}
00234
00236 ELEMITERATOR& operator= (
00237 const ELEMITERATOR& rhs
00238 ) {
00239 if (this != &rhs) {
00240 m_CurrentObj = rhs.m_CurrentObj;
00241 m_IsDone = rhs.m_IsDone;
00242 m_RecIt = rhs.m_RecIt;
00243 }
00244 return (*this);
00245 }
00246
00248 const DPOINT3D& operator* (
00249 ) const;
00250
00252 const DPOINT3D* operator-> (
00253 ) const { return (&**this); }
00254
00256 ELEMITERATOR& operator++ (
00257 ) {
00258 m_RecIt++;
00259 m_IsDone = m_RecIt.IsDone();
00260 return (*this);
00261 }
00262
00264 bool operator== (
00265 const ELEMITERATOR& rhs
00266 ) const { return (m_IsDone == rhs.m_IsDone && m_CurrentObj == rhs.m_CurrentObj); }
00267
00269 bool operator!= (
00270 const ELEMITERATOR& rhs
00271 ) const { return (!(*this == rhs)); }
00272
00275 const DBTABLE::RECORD& GetRecord (
00276 ) const { return (*m_RecIt); }
00277
00278 protected:
00279 const GEOTABLE *m_CurrentObj;
00280 bool m_IsDone;
00281 DBTABLE::CONST_RECORDITERATOR m_RecIt;
00282 DPOINT3D m_Point;
00283 };
00284
00285
00287 class GEOTABLE::MAKEPARMS : public RVC::GEOMETRIC::MAKEPARMSBASE {
00288 public:
00289
00290 MAKEPARMS (
00291 INT32 XFieldNum,
00292 INT32 YFieldNum,
00293 INT32 ZFieldNum = -1
00294 ) :
00295 GEOMETRIC::MAKEPARMSBASE((ZFieldNum == -1) ? POINTTYPE_2DXY : POINTTYPE_3DXY),
00296 m_XFieldNum(XFieldNum),
00297 m_YFieldNum(YFieldNum),
00298 m_ZFieldNum(ZFieldNum)
00299 {}
00300
00301 MAKEPARMS (
00302 const OBJECTNAME& XFieldName,
00303 const OBJECTNAME& YFieldName
00304 ) :
00305 GEOMETRIC::MAKEPARMSBASE(POINTTYPE_2DXY),
00306 m_XFieldNum(-1),
00307 m_YFieldNum(-1),
00308 m_ZFieldNum(-1),
00309 m_XFieldName(XFieldName),
00310 m_YFieldName(YFieldName)
00311 {}
00312
00313 MAKEPARMS (
00314 const MISTRING& GeoScript
00315 ) :
00316 GEOMETRIC::MAKEPARMSBASE(POINTTYPE_2DXY),
00317 m_XFieldNum(-1),
00318 m_YFieldNum(-1),
00319 m_ZFieldNum(-1),
00320 m_GeoScript(GeoScript)
00321 {}
00322
00323 void SetZFieldNum (
00324 INT32 ZFieldNum
00325 ) {
00326 m_ZFieldNum = ZFieldNum;
00327 SetPointType((ZFieldNum == -1) ? POINTTYPE_2DXY : POINTTYPE_3DXY);
00328 return;
00329 }
00330
00331 void SetZFieldName (
00332 const OBJECTNAME& ZFieldName
00333 ) {
00334 m_ZFieldName = ZFieldName;
00335 SetPointType((ZFieldName.IsEmpty()) ? POINTTYPE_2DXY : POINTTYPE_3DXY);
00336 return;
00337 }
00338
00339 private:
00340 INT32 m_XFieldNum;
00341 INT32 m_YFieldNum;
00342 INT32 m_ZFieldNum;
00343 OBJECTNAME m_XFieldName;
00344 OBJECTNAME m_YFieldName;
00345 OBJECTNAME m_ZFieldName;
00346 MISTRING m_GeoScript;
00347
00348 friend class GEOTABLE;
00349 };
00350
00351 }
00352
00353 #endif