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