00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef INC_RVC_MSTDATT_H
00037 #define INC_RVC_MSTDATT_H
00038
00039 #ifndef INC_MI32_STDDEFNS_H
00040 #include <mi32/stddefns.h>
00041 #endif
00042
00043 #ifndef INC_MI32_ELEMTYPE_H
00044 #include <mi32/elemtype.h>
00045 #endif
00046
00047 #ifndef INC_MI32_TRANS2DC_H
00048 #include <mi32/trans2dc.h>
00049 #endif
00050
00051 #ifndef INC_MI32_SPATREF_H
00052 #include <mi32/spatref.h>
00053 #endif
00054
00055 #ifndef INC_MI32_BITSET_H
00056 #include <mi32/bitset.h>
00057 #endif
00058
00059 #ifndef INC_RVC_VECTOR_H
00060 #include <rvc/vector.h>
00061 #endif
00062
00063 #ifndef INC_RVC_CAD_H
00064 #include <rvc/cad.h>
00065 #endif
00066
00067 #ifndef INC_RVC_TIN_H
00068 #include <rvc/tin.h>
00069 #endif
00070
00071 #ifndef INC_RVC_DBLINE_H
00072 #include <rvc/dbline.h>
00073 #endif
00074
00075 #ifndef INC_RVC_DBPOLY_H
00076 #include <rvc/dbpoly.h>
00077 #endif
00078
00079 #ifndef INC_RVC_DBCAD_H
00080 #include <rvc/dbcad.h>
00081 #endif
00082
00083 #ifndef INC_RVC_DBTEDGE_H
00084 #include <rvc/dbtedge.h>
00085 #endif
00086
00087 #ifndef INC_RVC_DBTTRI_H
00088 #include <rvc/dbttri.h>
00089 #endif
00090
00091 #ifndef INC_RVC_DBTABLE_H
00092 #include <rvc/dbtable.h>
00093 #endif
00094
00095 struct MSTATDATA;
00096
00097 namespace RVC {
00098
00099 class MSTDATT {
00100 public:
00101
00102
00103 enum ADDSTAT {
00104 ADDSTAT_None = 0,
00105 ADDSTAT_MaxDim = 1,
00106 ADDSTAT_PointInPoly = 2,
00107 ADDSTAT_ZAttrib = 4
00108 };
00109
00110 enum TABLEFLAG {
00111 TABLEFLAG_None = 0,
00112 TABLEFLAG_OnlyIfExisting = 1,
00113 TABLEFLAG_UseExistingFields = 2
00114 };
00115
00116 struct ATTDEF;
00117 class COMPSTAT {
00118 public:
00119
00120 COMPSTAT (
00121 );
00122
00123 ~COMPSTAT (
00124 ) {};
00125
00126 double Get2DDistance (
00127 const DPOINT2D& pt1,
00128 const DPOINT2D& pt2
00129 ) const;
00130
00131 double Get3DDistance (
00132 const DPOINT3D& pt1,
00133 const DPOINT3D& pt2
00134 ) const;
00135
00136 double GetAreaScaled (
00137 const DPOINT2D& point1,
00138 double area
00139 ) const;
00140
00141 void GetEdgeStats (
00142 DPOINT3D& pt1,
00143 DPOINT3D& pt2,
00144 MSTATDATA& StatValues
00145 ) const;
00146
00147 double GetEdgeSlopeStat (
00148 DPOINT3D& pt1,
00149 DPOINT3D& pt2,
00150 DPOINT3D& pt3,
00151 MSTATDATA& StatValues
00152 ) const;
00153
00154 ERRVALUE GetLineStats (
00155 const POLYLINE& PolyLine,
00156 MSTATDATA& StatValues
00157 ) const;
00158
00159 ERRVALUE GetPolygonArea (
00160 const POLYLINE& PolyLine,
00161 MSTATDATA& StatValues
00162 ) const;
00163
00164 const TRANS2D_MAPGEN& GetTransparm (
00165 ) const { return (m_tmg); }
00166
00167 void GetTriangleStats (
00168 DPOINT3D& Node1,
00169 DPOINT3D& Node2,
00170 DPOINT3D& Node3,
00171 MSTATDATA& StatValues
00172 ) const;
00173
00174 double GetXScale (
00175 ) const { return (m_XScale); }
00176
00177 double GetYScale (
00178 ) const { return (m_YScale); }
00179
00180 void SetCoordRefSys (
00181 const SPATREF::COORDREFSYS& CoordRefSys
00182 ) { m_CoordRefSys = CoordRefSys; }
00183
00184 void SetTransparm (
00185 const TRANS2D_MAPGEN& tmg
00186 ) { m_tmg = tmg; }
00187
00188 void SetXScale (
00189 double xscale
00190 ) { m_XScale = (xscale == 0.0) ? 1.0 : xscale; }
00191
00192 void SetYScale (
00193 double yscale
00194 ) { m_YScale = (yscale == 0.0) ? 1.0 : yscale; }
00195
00196 void SetZScale (
00197 double zscale
00198 ) { m_ZScale = (zscale == 0.0) ? 1.0 : zscale; }
00199
00200 void SetZOffset (
00201 double zoffset
00202 ) { m_ZOffset = zoffset; }
00203
00204 private:
00205 #ifndef GENERATING_DOXYGEN_OUTPUT
00206
00207 TRANS2D_MAPGEN m_tmg;
00208 SPATREF::COORDREFSYS m_CoordRefSys;
00209 double m_XScale;
00210 double m_YScale;
00211 double m_ZScale;
00212 double m_ZOffset;
00213 #endif // GENERATING_DOXYGEN_OUTPUT
00214 };
00215
00216
00217 static ERRVALUE BuildTable (
00218 const RVC::GEOMETRIC& GeoObj,
00219 ELEMTYPE ElemType,
00220 ADDSTAT AddStats = ADDSTAT_None,
00221 TABLEFLAG TableFlag = TABLEFLAG_None
00222 );
00223
00224
00225 MSTDATT (
00226 );
00227
00228 virtual ~MSTDATT (
00229 ) = 0;
00230
00231
00232 INT32 GetNumRecords (
00233 ) const;
00234
00235 const RVC::DBTABLE& GetStatTable (
00236 ) const { return (m_TableObj); }
00237
00238 ERRVALUE RebuildTable (
00239 ADDSTAT AddStats = ADDSTAT_None
00240 );
00241
00242 protected:
00243
00244 virtual void CheckFields () { return; }
00245 virtual RVC::DBTABLE::ATTACHMENT GetAttachmentType () = 0;
00246 virtual const ATTDEF* GetAttribDef () = 0;
00247 virtual RVC::DBTABLE::REFELEM GetRefElem () = 0;
00248 virtual void GetTableDesc (RVC::OBJECTDESC& desc) = 0;
00249 virtual void GetTableName (RVC::OBJECTNAME& name) = 0;
00250 virtual ERRVALUE RebuildBaseTable () = 0;
00251 virtual bool SkipTable (RVC::DBTABLE::REFELEM RefElem) const { return (false); }
00252
00253 INT32 AddRecord (const MSTATDATA& StatValues);
00254 const COMPSTAT& GetCompStat () const { return (m_CompStat); }
00255 ERRVALUE GetPolygonMaxDim (const POLYLINE& PolyLine, MSTATDATA& StatValues);
00256 bool HasField (int index) const { return (m_FieldIndex[index] > -1); }
00257 ERRVALUE ReadRecord (INT32 RecordNum, MSTATDATA& StatValues);
00258 ERRVALUE Setup (const RVC::GEOMETRIC& GeoObj, RVC::DBASE& DBaseObj, ADDSTAT AddStats = ADDSTAT_None, TABLEFLAG TableFlag = TABLEFLAG_None);
00259 ERRVALUE WriteRecord (INT32 RecordNum, const MSTATDATA& StatValues);
00260
00261 private:
00262 #ifndef GENERATING_DOXYGEN_OUTPUT
00263
00264 class STDATTRECORD : public RVC::DBTABLE::RECORD {
00265 public:
00266
00267
00268 STDATTRECORD (
00269 ) : RECORD() {}
00270
00271
00272 STDATTRECORD (
00273 const STDATTRECORD& rhs
00274 ) : RECORD(rhs) {}
00275
00276
00277 STDATTRECORD (
00278 const RVC::DBTABLE& table
00279 ) : RECORD(table) {}
00280
00281
00282 virtual ~STDATTRECORD (
00283 ) {}
00284
00285
00286 STDATTRECORD& operator= (
00287 const STDATTRECORD& rhs
00288 ) {
00289 RECORD::operator=(rhs);
00290 return (*this);
00291 }
00292
00293 const void *const GetFieldPtr (
00294 INT32 FieldNum
00295 ) const {
00296 return (RECORD::GetFieldPtr(FieldNum));
00297 }
00298
00299 void *GetFieldPtr (
00300 INT32 FieldNum
00301 ) { return (RECORD::GetFieldPtr(FieldNum)); }
00302
00303 };
00304
00305 class OBSERVER : public RVC::DBASE::OBSERVER {
00306 public:
00307 explicit OBSERVER (
00308 MSTDATT& StdAtt
00309 ) :
00310 RVC::DBASE::OBSERVER(*StdAtt.m_DBaseObj),
00311 m_StdAtt(StdAtt)
00312 {}
00313
00314
00315 virtual ~OBSERVER (
00316 ) {}
00317
00318
00319 virtual void OnTableDropBegin (
00320 INT32 TableNum
00321 );
00322
00323 private:
00324 MSTDATT& m_StdAtt;
00325 };
00326 friend class OBSERVER;
00327
00328 MSTDATT (const MSTDATT& rhs);
00329 MSTDATT& operator= (const MSTDATT& rhs);
00330
00331 ERRVALUE BuildFields (const RVC::DBTABLE::FIELDINFOARRAY& dbf);
00332
00333 COMPSTAT m_CompStat;
00334 STDATTRECORD m_Record;
00335 RVC::DBTABLE::FIELDINFOARRAY m_FieldList;
00336 SIMPLE_ARRAY<INT32> m_FieldIndex;
00337 RVC::DBTABLE m_TableObj;
00338 RVC::DBASE* m_DBaseObj;
00339 ADDSTAT m_AddStats;
00340 const ATTDEF *m_AttribDef;
00341 OBSERVER *m_Observer;
00342 #endif // GENERATING_DOXYGEN_OUTPUT
00343 };
00344
00345
00346 class VECTSTDATT : public MSTDATT {
00347 public:
00348
00349 VECTSTDATT (
00350 );
00351
00352 virtual ~VECTSTDATT (
00353 );
00354
00355 ERRVALUE GetPolygonArea (
00356 INT32 PolyNum,
00357 double& Area
00358 );
00359
00360 ERRVALUE Setup (
00361 const RVC::VECTOR& VectObj,
00362 ELEMTYPE ElemType,
00363 ADDSTAT AddStats = ADDSTAT_None,
00364 TABLEFLAG TableFlag = TABLEFLAG_None
00365 );
00366
00367 ERRVALUE UpdateLine (
00368 INT32 LineNum
00369 );
00370
00371 ERRVALUE UpdatePolygon (
00372 INT32 PolyNum
00373 );
00374
00375 ERRVALUE UpdatePolygonIsleOnly (
00376 INT32 PolyNum
00377 );
00378
00379 ERRVALUE UpdatePolygonSet (
00380 const BITSET& PolySet
00381 );
00382
00383 private:
00384 #ifndef GENERATING_DOXYGEN_OUTPUT
00385 virtual void CheckFields ();
00386 virtual RVC::DBTABLE::ATTACHMENT GetAttachmentType ();
00387 virtual const ATTDEF* GetAttribDef ();
00388 virtual RVC::DBTABLE::REFELEM GetRefElem ();
00389 virtual void GetTableDesc (RVC::OBJECTDESC& desc);
00390 virtual void GetTableName (RVC::OBJECTNAME& name);
00391 virtual ERRVALUE RebuildBaseTable ();
00392 ERRVALUE GetPolygonStats (INT32 PolyNum, MSTATDATA& StatValues);
00393 ERRVALUE RebuildLineTable ();
00394 ERRVALUE RebuildPolygonTable ();
00395 ERRVALUE UpdateIslands (INT32 PolyNum, INT32 NumIslands, MSTATDATA& StatValues);
00396
00397 RVC::VECTOR m_VectObj;
00398 RVC::DBASE_LINE m_LineDBaseObj;
00399 RVC::DBASE_POLYGON m_PolyDBaseObj;
00400 ELEMTYPE m_ElemType;
00401 bool m_HasMaxDimField;
00402 bool m_HasPointInPolyField;
00403 #endif // GENERATING_DOXYGEN_OUTPUT
00404 };
00405
00406 class CADSTDATT : public MSTDATT {
00407 public:
00408
00409 CADSTDATT (
00410 );
00411
00412 virtual ~CADSTDATT (
00413 );
00414
00415 ERRVALUE Setup (
00416 const RVC::CAD& CadObj,
00417 ADDSTAT AddStats = ADDSTAT_None,
00418 TABLEFLAG TableFlag = TABLEFLAG_None
00419 );
00420
00421 ERRVALUE UpdateElement (
00422 const RVC::CAD::ELEMENT& Element
00423 );
00424
00425 private:
00426 #ifndef GENERATING_DOXYGEN_OUTPUT
00427 virtual void CheckFields ();
00428 virtual RVC::DBTABLE::ATTACHMENT GetAttachmentType ();
00429 virtual const ATTDEF* GetAttribDef ();
00430 virtual RVC::DBTABLE::REFELEM GetRefElem ();
00431 virtual void GetTableDesc (RVC::OBJECTDESC& desc);
00432 virtual void GetTableName (RVC::OBJECTNAME& name);
00433 virtual ERRVALUE RebuildBaseTable ();
00434 ERRVALUE RebuildCADTable ();
00435
00436 RVC::CAD m_CadObj;
00437 RVC::DBASE_CAD m_DBaseObj;
00438 bool m_HasMaxDimField;
00439 bool m_HasPointInPolyField;
00440 #endif // GENERATING_DOXYGEN_OUTPUT
00441 };
00442
00443 class TINSTDATT : public MSTDATT {
00444 public:
00445
00446 TINSTDATT (
00447 );
00448
00449 virtual ~TINSTDATT (
00450 );
00451
00452 ERRVALUE Setup (
00453 const RVC::TIN& TinObj,
00454 ELEMTYPE ElemType,
00455 ADDSTAT AddStats = ADDSTAT_None,
00456 TABLEFLAG TableFlag = TABLEFLAG_None
00457 );
00458
00459 ERRVALUE UpdateEdge (
00460 INT32 EdgeNum
00461 );
00462
00463 ERRVALUE UpdateTriangle (
00464 INT32 TriangleNum
00465 );
00466
00467 private:
00468 #ifndef GENERATING_DOXYGEN_OUTPUT
00469 virtual RVC::DBTABLE::ATTACHMENT GetAttachmentType ();
00470 virtual const ATTDEF* GetAttribDef ();
00471 virtual RVC::DBTABLE::REFELEM GetRefElem ();
00472 virtual void GetTableDesc (RVC::OBJECTDESC& desc);
00473 virtual void GetTableName (RVC::OBJECTNAME& name);
00474 virtual ERRVALUE RebuildBaseTable ();
00475 virtual bool SkipTable (RVC::DBTABLE::REFELEM RefElem) const;
00476 ERRVALUE RebuildTINEdgeTable ();
00477 ERRVALUE RebuildTINTriangleTable ();
00478
00479 RVC::TIN m_TinObj;
00480 RVC::DBASE_TINEDGE m_EdgeDBaseObj;
00481 RVC::DBASE_TINTRIANGLE m_TriDBaseObj;
00482 ELEMTYPE m_ElemType;
00483 #endif // GENERATING_DOXYGEN_OUTPUT
00484 };
00485
00486 DEFINE_ENUM_OPERATORS(MSTDATT::ADDSTAT)
00487 DEFINE_ENUM_OPERATORS(MSTDATT::TABLEFLAG)
00488
00489 }
00490
00491 #endif
00492