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