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
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 #ifndef INC_RVC_TIN_H
00189 #define INC_RVC_TIN_H
00190
00191 #ifndef INC_RVC_GEOMETRC_H
00192 #include <rvc/geometrc.h>
00193 #endif
00194
00195 #ifndef INC_MI32_RVCTIN_H
00196 #include <mi32/rvctin.h>
00197 #endif
00198
00199 #ifndef INC_MI32_SIMPLEAR_H
00200 #include <mi32/simplear.h>
00201 #endif
00202
00203 namespace RVC {
00204
00205 #ifndef GENERATING_DOXYGEN_OUTPUT
00206
00207 class QSEARCHTREE;
00208 class CAD;
00209 #endif // GENERATING_DOXYGEN_OUTPUT
00210
00211 class TIN : public GEOMETRIC {
00212 public:
00213
00214 #ifndef GENERATING_DOXYGEN_OUTPUT
00215 class MAKEPARMS;
00216 #endif // GENERATING_DOXYGEN_OUTPUT
00217
00218
00219
00220
00221
00222 template <class _ELEM>
00223 class ELEMITERATOR {
00224 public:
00225
00226
00227
00228
00229 ELEMITERATOR (
00230 ) :
00231 m_ElemNum(-1),
00232 m_CurrentObj(0)
00233 {}
00234
00235
00236 ELEMITERATOR (
00237 int WorthlessValue
00238 ) :
00239 m_ElemNum(-1),
00240 m_CurrentObj(0)
00241 {}
00242
00243
00244 ELEMITERATOR (
00245 const RVC::TIN* tin,
00246 INT32 ElemNum
00247 ) :
00248 m_ElemNum(ElemNum),
00249 m_CurrentObj(tin)
00250 {}
00251
00252
00253 ELEMITERATOR (
00254 const ELEMITERATOR<_ELEM>& rhs
00255 ) :
00256 m_ElemNum(rhs.m_ElemNum),
00257 m_CurrentObj(rhs.m_CurrentObj),
00258 m_Element(rhs.m_Element)
00259 {}
00260
00261
00262 ELEMITERATOR (
00263 const RVC::TIN* tin
00264 ) :
00265 m_ElemNum(-1),
00266 m_CurrentObj(tin)
00267 {
00268 ERRVALUE err = 0;
00269 do {
00270 m_ElemNum ++;
00271 ERRORPOSNDISABLE disable;
00272 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00273 if (err < 0) m_ElemNum = -1;
00274 } while (err >= 0 && !m_Element.IsValid());
00275 }
00276
00277
00278 virtual ~ELEMITERATOR (
00279 ) {}
00280
00281
00282 ELEMITERATOR<_ELEM>& operator= (
00283 const ELEMITERATOR<_ELEM>& rhs
00284 ) {
00285 if (this != &rhs) {
00286 m_ElemNum = rhs.m_ElemNum;
00287 m_CurrentObj = rhs.m_CurrentObj;
00288 m_Element = rhs.m_Element;
00289 }
00290 return (*this);
00291 }
00292
00293
00294 const _ELEM& operator* (
00295 ) const { return (m_Element); }
00296
00297
00298 const _ELEM* operator-> (
00299 ) const { return (&**this); }
00300
00301
00302 ELEMITERATOR<_ELEM>& operator++ (
00303 ) {
00304 ERRVALUE err = 0;
00305 do {
00306 m_ElemNum ++;
00307 ERRORPOSNDISABLE disable;
00308 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00309 if (err < 0) m_ElemNum = -1;
00310 } while (err >= 0 && !m_Element.IsValid());
00311 return (*this);
00312 }
00313
00314
00315 bool operator== (
00316 const ELEMITERATOR<_ELEM>& rhs
00317 ) const { return (m_ElemNum == rhs.m_ElemNum && m_CurrentObj == rhs.m_CurrentObj); }
00318
00319
00320 bool operator!= (
00321 const ELEMITERATOR<_ELEM>& rhs
00322 ) const { return (!(*this == rhs)); }
00323
00324 INT32 GetElementNumber (
00325 ) const { return (m_ElemNum); }
00326
00327 protected:
00328 INT32 m_ElemNum;
00329 const TIN *m_CurrentObj;
00330 _ELEM m_Element;
00331 };
00332
00333 typedef ELEMITERATOR<RVCTINEDGE> EDGEITERATOR;
00334 typedef ELEMITERATOR<RVCTINHULL> HULLITERATOR;
00335 typedef ELEMITERATOR<RVCTINNODE> NODEITERATOR;
00336 typedef ELEMITERATOR<RVCTINTRIANGLE> TRIANGLEITERATOR;
00337
00338
00339 TIN (
00340 );
00341
00342
00343 TIN (
00344 const RVC::TIN& rhs
00345 );
00346
00347
00348 virtual ~TIN (
00349 );
00350
00351
00352 RVC::TIN& operator= (
00353 const RVC::TIN& rhs
00354 );
00355
00356
00357
00358 INT32 Add (
00359 const RVCTINEDGE& edge
00360 );
00361
00362
00363
00364 INT32 Add (
00365 const RVCTINHULL& hull
00366 );
00367
00368
00369
00370 INT32 Add (
00371 const RVCTINNODE& node
00372 );
00373
00374
00375
00376 INT32 Add (
00377 const RVCTINTRIANGLE& triangle
00378 );
00379
00380
00381
00382 int ComputeElevation (
00383 DPOINT3D& pt
00384 );
00385
00386
00387 ERRVALUE ComputePlaneCoefficients (
00388 INT32 TriangleNum,
00389 double& A,
00390 double& B,
00391 double& C,
00392 double& D
00393 );
00394
00395
00396 template <class _ELEM> ELEMITERATOR<_ELEM> ElementBegin (
00397 ELEMITERATOR<_ELEM> item
00398 ) const {
00399 return (ELEMITERATOR<_ELEM>(this));
00400 }
00401
00402
00403 template <class _ELEM> ELEMITERATOR<_ELEM> ElementEnd (
00404 ELEMITERATOR<_ELEM> item
00405 ) const {
00406 return (ELEMITERATOR<_ELEM>(this, -1));
00407 }
00408
00409
00410 ERRVALUE GetMakeParms (
00411 RVC::TIN::MAKEPARMS& MakeParms
00412 ) const;
00413
00414
00415
00416 INT32 GetNextEdgeID (
00417 ) const;
00418
00419
00420
00421 INT32 GetNextNodeID (
00422 ) const;
00423
00424
00425
00426 INT32 GetNextTriangleID (
00427 ) const;
00428
00429
00430
00431 INT32 GetNumEdges (
00432 ) const;
00433
00434
00435
00436 INT32 GetNumHullEdges (
00437 INT32 hullnum
00438 ) const;
00439
00440
00441
00442 INT32 GetNumHullIslands (
00443 INT32 hullnum
00444 ) const;
00445
00446
00447
00448 INT32 GetNumHulls (
00449 ) const;
00450
00451
00452
00453 INT32 GetNumNodeEdges (
00454 INT32 NodeNum
00455 ) const;
00456
00457
00458
00459 INT32 GetNumNodes (
00460 ) const;
00461
00462
00463
00464 INT32 GetNumTriangles (
00465 ) const;
00466
00467
00468
00469 double GetTolerance (
00470 ) const;
00471
00472
00473 ERRVALUE Make (
00474 const RVC::OBJECT& parent,
00475 const RVC::OBJECTNAME& name,
00476 const RVC::OBJECTDESC& desc,
00477 const MAKEPARMS& MakeParms,
00478 const char* Source = 0
00479 );
00480
00481
00482 ERRVALUE Make (
00483 const RVC::OBJITEM& ObjItem,
00484 const MAKEPARMS& MakeParms,
00485 const char* Source = 0
00486 );
00487
00488
00489 ERRVALUE Read (
00490 INT32 EdgeNum,
00491 RVCTINEDGE& Edge
00492 ) const;
00493
00494
00495 ERRVALUE Read (
00496 INT32 hullnum,
00497 RVCTINHULL& hull
00498 ) const;
00499
00500
00501 ERRVALUE Read (
00502 INT32 nodenum,
00503 RVCTINNODE& node
00504 ) const;
00505
00506
00507 ERRVALUE Read (
00508 INT32 trinum,
00509 RVCTINTRIANGLE& triangle
00510 ) const;
00511
00512
00513 ERRVALUE ReadHullEdges (
00514 INT32 hullnum,
00515 INT32 start,
00516 INT32 count,
00517 SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00518 ) const;
00519
00520
00521 ERRVALUE ReadHullIslands (
00522 INT32 hullnum,
00523 INT32 start,
00524 INT32 count,
00525 SIMPLE_ARRAY<INT32>& islands
00526 ) const;
00527
00528
00529 ERRVALUE ReadNodeEdges (
00530 INT32 nodenum,
00531 SIMPLE_ARRAY<INT32>& EdgeList
00532 ) const;
00533
00534
00535 ERRVALUE ReadNodeEdges (
00536 INT32 nodenum,
00537 INT32 start,
00538 INT32 count,
00539 SIMPLE_ARRAY<INT32>& Edges
00540 ) const;
00541
00542
00543 ERRVALUE SetNextEdgeID (
00544 INT32 NextEdgeID
00545 );
00546
00547
00548 ERRVALUE SetNextNodeID (
00549 INT32 NextNodeID
00550 );
00551
00552
00553 ERRVALUE SetNextTriangleID (
00554 INT32 NextTriangleID
00555 );
00556
00557
00558 ERRVALUE SetTolerance (
00559 double tolerance
00560 );
00561
00562
00563 ERRVALUE SwapHullEdges (
00564 INT32 hullnum1,
00565 INT32 hullnum2
00566 );
00567
00568
00569 ERRVALUE SwapNodeEdges (
00570 INT32 node1,
00571 INT32 node2
00572 );
00573
00574
00575
00576 ERRVALUE Write (
00577 INT32 edgenum,
00578 const RVCTINEDGE& edge
00579 );
00580
00581
00582
00583 ERRVALUE Write (
00584 INT32 hullnum,
00585 const RVCTINHULL& hull
00586 );
00587
00588
00589
00590 ERRVALUE Write (
00591 INT32 nodenum,
00592 const RVCTINNODE& node
00593 );
00594
00595
00596
00597 ERRVALUE Write (
00598 INT32 TriangleNum,
00599 const RVCTINTRIANGLE& triangle
00600 );
00601
00602
00603
00604 ERRVALUE WriteHullEdges (
00605 INT32 hullnum,
00606 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00607 );
00608
00609
00610
00611 ERRVALUE WriteHullEdges (
00612 INT32 hullnum,
00613 INT32 total,
00614 INT32 start,
00615 INT32 count,
00616 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00617 );
00618
00619
00620
00621 ERRVALUE WriteHullIslands (
00622 INT32 hullnum,
00623 INT32 total,
00624 INT32 start,
00625 INT32 count,
00626 const INT32 *islands
00627 );
00628
00629
00630
00631 ERRVALUE WriteNodeEdges (
00632 INT32 nodenum,
00633 const SIMPLE_ARRAY<INT32>& EdgeList
00634 );
00635
00636
00637
00638 ERRVALUE WriteNodeEdges (
00639 INT32 nodenum,
00640 INT32 NumEdges,
00641 INT32 start,
00642 INT32 count,
00643 const SIMPLE_ARRAY<INT32>& EdgeList
00644 );
00645
00646 protected:
00647
00648 ERRVALUE ClearNodeEdgeList ();
00649 ERRVALUE SetNumEdges (INT32 NewNumEdges);
00650 ERRVALUE SetNumHulls (INT32 NewNumHulls);
00651 ERRVALUE SetNumNodes (INT32 NewNumNodes);
00652 ERRVALUE SetNumTriangles (INT32 NewNumTriangles);
00653
00654 private:
00655 #ifndef GENERATING_DOXYGEN_OUTPUT
00656
00657 ERRVALUE ExtractToCAD (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00658 ERRVALUE ExtractToTIN (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00659 ERRVALUE ExtractToVector (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00660
00661
00662 virtual ERRVALUE v_CloseObject ();
00663 virtual OBJTYPE v_GetDftObjectType () const;
00664 virtual bool v_IsObjectOpen () const;
00665 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);
00666
00667
00668 virtual void v_GetExtents (DRECT3D &extents) const;
00669 virtual void v_GetScale (double& xscale, double& yscale) const;
00670 virtual double v_GetZScale () const;
00671 virtual double v_GetZOffset () const;
00672 virtual bool v_HasCapability (int Capability) const;
00673 virtual void v_SetScale (double xscale, double yscale);
00674 virtual void v_SetZOffset (double zoffset);
00675 virtual void v_SetZScale (double zscale);
00676
00677
00678 virtual ERRVALUE v_AddSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType, const DRECT2D& Extents);
00679 virtual ERRVALUE v_BuildSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00680 virtual ERRVALUE v_ClearSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00681 virtual ERRVALUE v_CopySearchTreeElement (INT32 SourceElement, INT32 DestElement, ELEMTYPE ElemType, const DRECT2D& Extents);
00682 virtual ERRVALUE v_DeleteSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType);
00683 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00684 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, GEOMETRIC::SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00685 virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList) const;
00686 virtual ERRVALUE v_FindElementDrawSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00687 virtual ERRVALUE v_FindElementSearchSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00688 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00689 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00690 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00691 virtual POINTTYPE v_GetPointType () const {return (POINTTYPE_3DXYZ);}
00692 virtual INT32 v_GetPointSize () const {return (sizeof(DPOINT3D));}
00693 virtual double v_GetTotalLineLength () const;
00694 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00695 virtual bool v_IsEmpty () const;
00696 virtual ERRVALUE v_SaveSearchTrees ();
00697 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00698 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00699 virtual bool v_SetSearchTree (ELEMTYPE ElemType, RVC::QSEARCHTREE* SearchTree, bool ReplaceExisting);
00700 virtual ERRVALUE v_SetTotalLineLength (double length);
00701 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00702 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00703 virtual ERRVALUE v_UpdateExtents (const DRECT3D &extents);
00704
00705 ERRVALUE ExtractNodesTo (CAD& CadObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags, INT32& NumElem) const;
00706 ERRVALUE ExtractNodesTo (TIN& TinObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00707 ERRVALUE ExtractNodesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00708 ERRVALUE ExtractEdgesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00709 ERRVALUE ExtractTrianglesTo (CAD& CadObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags, INT32& NumElem) const;
00710 ERRVALUE ExtractTrianglesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00711
00712 int SetupTriangleTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& EdgeSet, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00713 int SetupEdgeTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& EdgeSet, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00714 int SetupNodeTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00715
00716
00717 int m_TinID;
00718 mutable QSEARCHTREE *m_NodeQTree;
00719 mutable QSEARCHTREE *m_EdgeQTree;
00720 mutable QSEARCHTREE *m_TriQTree;
00721 class OPTIMIZE;
00722 mutable OPTIMIZE* m_Optimize;
00723 #endif
00724 };
00725
00726
00727
00728 class TIN::MAKEPARMS : public RVC::GEOMETRIC::MAKEPARMSBASE {
00729 public:
00730
00731 MAKEPARMS (
00732 ) :
00733 GEOMETRIC::MAKEPARMSBASE(GEOMETRIC::POINTTYPE_3DXYZ),
00734 m_ZOffset(0.0),
00735 m_NextEdgeID(1),
00736 m_NextNodeID(10),
00737 m_NextTriangleID(1),
00738 m_tolerance(0.0)
00739 {}
00740
00741
00742 MAKEPARMS (
00743 const RVC::TIN& Object
00744 );
00745
00746
00747
00748 INT32 GetNextEdgeID (
00749 ) const {return (m_NextEdgeID);}
00750
00751
00752
00753 INT32 GetNextNodeID (
00754 ) const {return (m_NextNodeID);}
00755
00756
00757
00758 INT32 GetNextTriangleID (
00759 ) const {return (m_NextTriangleID);}
00760
00761
00762
00763 double GetTolerance (
00764 ) const { return (m_tolerance); }
00765
00766
00767
00768 double GetZOffset (
00769 ) const {return (m_ZOffset);}
00770
00771
00772 void SetNextEdgeID (
00773 INT32 NextEdgeID
00774 ) {m_NextEdgeID = NextEdgeID;}
00775
00776
00777 void SetNextNodeID (
00778 INT32 NextNodeID
00779 ) {m_NextNodeID = NextNodeID;}
00780
00781
00782 void SetNextTriangleID (
00783 INT32 NextTriangleID
00784 ) {m_NextTriangleID = NextTriangleID;}
00785
00786
00787 void SetTolerance (
00788 double tolerance
00789 ) { m_tolerance = tolerance; }
00790
00791
00792 void SetZOffset (
00793 double zoffset
00794 ) {m_ZOffset = zoffset;}
00795
00796 private:
00797 #ifndef GENERATING_DOXYGEN_OUTPUT
00798 double m_ZOffset;
00799 INT32 m_NextEdgeID;
00800 INT32 m_NextNodeID;
00801 INT32 m_NextTriangleID;
00802 double m_tolerance;
00803 #endif // GENERATING_DOXYGEN_OUTPUT
00804 };
00805
00806 }
00807
00808 #endif