00001
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 #ifndef INC_RVC_TIN_H
00231 #define INC_RVC_TIN_H
00232
00233 #ifndef INC_RVC_GEOMETRC_H
00234 #include <rvc/geometrc.h>
00235 #endif
00236
00237 #ifndef INC_MI32_RVCTIN_H
00238 #include <mi32/rvctin.h>
00239 #endif
00240
00241 #ifndef INC_MI32_ERRHANDLER_H
00242 #include <mi32/errhandler.h>
00243 #endif
00244
00245 #ifndef GENERATING_DOXYGEN_OUTPUT
00246
00247 namespace RVC {
00248 class CAD;
00249 class QSEARCHTREE;
00250 class TINHANDLE;
00251 }
00252 #endif // GENERATING_DOXYGEN_OUTPUT
00253
00254
00255 namespace RVC {
00256
00257 class TIN : public GEOMETRIC {
00258 public:
00259
00260 #ifndef GENERATING_DOXYGEN_OUTPUT
00261 class MAKEPARMS;
00262 #endif // GENERATING_DOXYGEN_OUTPUT
00263
00268 template <class _ELEM> class ELEMITERATOR {
00269 public:
00270
00271
00272
00274 ELEMITERATOR (
00275 ) :
00276 m_ElemNum(-1),
00277 m_CurrentObj(0)
00278 {}
00279
00281 ELEMITERATOR (
00282 int WorthlessValue
00283 ) :
00284 m_ElemNum(-1),
00285 m_CurrentObj(0)
00286 {}
00287
00289 ELEMITERATOR (
00290 const RVC::TIN* tin,
00291 INT32 ElemNum
00292 ) :
00293 m_ElemNum(ElemNum),
00294 m_CurrentObj(tin)
00295 {}
00296
00298 ELEMITERATOR (
00299 const ELEMITERATOR<_ELEM>& rhs
00300 ) :
00301 m_ElemNum(rhs.m_ElemNum),
00302 m_CurrentObj(rhs.m_CurrentObj),
00303 m_Element(rhs.m_Element)
00304 {}
00305
00307 ELEMITERATOR (
00308 const RVC::TIN* tin
00309 ) :
00310 m_ElemNum(-1),
00311 m_CurrentObj(tin)
00312 {
00313 ERRVALUE err = 0;
00314 do {
00315 m_ElemNum ++;
00316 ERRORPOSNDISABLE disable;
00317 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00318 if (err < 0) m_ElemNum = -1;
00319 } while (err >= 0 && !m_Element.IsValid());
00320 }
00321
00323 virtual ~ELEMITERATOR (
00324 ) {}
00325
00327 ELEMITERATOR<_ELEM>& operator= (
00328 const ELEMITERATOR<_ELEM>& rhs
00329 ) {
00330 if (this != &rhs) {
00331 m_ElemNum = rhs.m_ElemNum;
00332 m_CurrentObj = rhs.m_CurrentObj;
00333 m_Element = rhs.m_Element;
00334 }
00335 return (*this);
00336 }
00337
00339 const _ELEM& operator* (
00340 ) const { return (m_Element); }
00341
00343 const _ELEM* operator-> (
00344 ) const { return (&**this); }
00345
00347 ELEMITERATOR<_ELEM>& operator++ (
00348 ) {
00349 ERRVALUE err = 0;
00350 do {
00351 m_ElemNum ++;
00352 ERRORPOSNDISABLE disable;
00353 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00354 if (err < 0) m_ElemNum = -1;
00355 } while (err >= 0 && !m_Element.IsValid());
00356 return (*this);
00357 }
00358
00360 bool operator== (
00361 const ELEMITERATOR<_ELEM>& rhs
00362 ) const { return (m_ElemNum == rhs.m_ElemNum && m_CurrentObj == rhs.m_CurrentObj); }
00363
00365 bool operator!= (
00366 const ELEMITERATOR<_ELEM>& rhs
00367 ) const { return (!(*this == rhs)); }
00368
00369 INT32 GetElementNumber (
00370 ) const { return (m_ElemNum); }
00371
00372 protected:
00373 INT32 m_ElemNum;
00374 const TIN *m_CurrentObj;
00375 _ELEM m_Element;
00376 };
00377
00378 typedef ELEMITERATOR<RVCTINEDGE> EDGEITERATOR;
00379 typedef ELEMITERATOR<RVCTINHULL> HULLITERATOR;
00380 typedef ELEMITERATOR<RVCTINNODE> NODEITERATOR;
00381 typedef ELEMITERATOR<RVCTINTRIANGLE> TRIANGLEITERATOR;
00382
00384 TIN (
00385 );
00386
00388 TIN (
00389 const RVC::TIN& rhs
00390 );
00391
00393 virtual ~TIN (
00394 );
00395
00397 RVC::TIN& operator= (
00398 const RVC::TIN& rhs
00399 );
00400
00403 INT32 Add (
00404 const RVCTINEDGE& edge
00405 );
00406
00409 INT32 Add (
00410 const RVCTINHULL& hull
00411 );
00412
00415 INT32 Add (
00416 const RVCTINNODE& node
00417 );
00418
00421 INT32 Add (
00422 const RVCTINTRIANGLE& triangle
00423 );
00424
00427 int ComputeElevation (
00428 DPOINT3D& pt
00429 );
00430
00432 ERRVALUE ComputePlaneCoefficients (
00433 INT32 TriangleNum,
00434 double& A,
00435 double& B,
00436 double& C,
00437 double& D
00438 );
00439
00441 template <class _ELEM> ELEMITERATOR<_ELEM> ElementBegin (
00442 ELEMITERATOR<_ELEM> item
00443 ) const {
00444 return (ELEMITERATOR<_ELEM>(this));
00445 }
00446
00448 template <class _ELEM> ELEMITERATOR<_ELEM> ElementEnd (
00449 ELEMITERATOR<_ELEM> item
00450 ) const {
00451 return (ELEMITERATOR<_ELEM>(this, -1));
00452 }
00453
00455 ERRVALUE GetMakeParms (
00456 RVC::TIN::MAKEPARMS& MakeParms
00457 ) const;
00458
00461 INT32 GetNextEdgeID (
00462 ) const;
00463
00466 INT32 GetNextNodeID (
00467 ) const;
00468
00471 INT32 GetNextTriangleID (
00472 ) const;
00473
00476 INT32 GetNumEdges (
00477 ) const;
00478
00481 INT32 GetNumHullEdges (
00482 INT32 hullnum
00483 ) const;
00484
00487 INT32 GetNumHullIslands (
00488 INT32 hullnum
00489 ) const;
00490
00493 INT32 GetNumHulls (
00494 ) const;
00495
00498 INT32 GetNumNodeEdges (
00499 INT32 NodeNum
00500 ) const;
00501
00504 INT32 GetNumNodes (
00505 ) const;
00506
00509 INT32 GetNumTriangles (
00510 ) const;
00511
00514 double GetTolerance (
00515 ) const;
00516
00517 bool IsPointInTriangle (
00518 INT32 TriangleNum,
00519 const DPOINT2D& point
00520 ) const;
00521
00523 ERRVALUE Make (
00524 const RVC::OBJECT& parent,
00525 const DESCRIPTOR& Descriptor,
00526 const MAKEPARMS& MakeParms,
00527 const CREDENTIALS* Credentials RVC_DEFAULT_CREDENTIALS
00528 );
00529
00531 ERRVALUE Make (
00532 RVC::OBJITEM& ObjItem,
00533 const MAKEPARMS& MakeParms,
00534 #ifdef RVC_CREDENTIALS_MANDATORY
00535 const char* Source,
00536 const CREDENTIALS* Credentials
00537 #else
00538 const char* Source = 0,
00539 const CREDENTIALS* Credentials = 0
00540 #endif
00541 );
00542
00544 ERRVALUE Read (
00545 INT32 EdgeNum,
00546 RVCTINEDGE& Edge
00547 ) const;
00548
00550 ERRVALUE Read (
00551 INT32 hullnum,
00552 RVCTINHULL& hull
00553 ) const;
00554
00556 ERRVALUE Read (
00557 INT32 nodenum,
00558 RVCTINNODE& node
00559 ) const;
00560
00562 ERRVALUE Read (
00563 INT32 trinum,
00564 RVCTINTRIANGLE& triangle
00565 ) const;
00566
00568 ERRVALUE ReadHullEdges (
00569 INT32 hullnum,
00570 INT32 start,
00571 INT32 count,
00572 SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00573 ) const;
00574
00576 ERRVALUE ReadHullIslands (
00577 INT32 hullnum,
00578 INT32 start,
00579 INT32 count,
00580 SIMPLE_ARRAY<INT32>& islands
00581 ) const;
00582
00584 ERRVALUE ReadNodeEdges (
00585 INT32 nodenum,
00586 SIMPLE_ARRAY<INT32>& EdgeList
00587 ) const;
00588
00590 ERRVALUE ReadNodeEdges (
00591 INT32 nodenum,
00592 INT32 start,
00593 INT32 count,
00594 SIMPLE_ARRAY<INT32>& Edges
00595 ) const;
00596
00598 ERRVALUE SetNextEdgeID (
00599 INT32 NextEdgeID
00600 );
00601
00603 ERRVALUE SetNextNodeID (
00604 INT32 NextNodeID
00605 );
00606
00608 ERRVALUE SetNextTriangleID (
00609 INT32 NextTriangleID
00610 );
00611
00613 ERRVALUE SetTolerance (
00614 double tolerance
00615 );
00616
00618 ERRVALUE SwapHullEdges (
00619 INT32 hullnum1,
00620 INT32 hullnum2
00621 );
00622
00624 ERRVALUE SwapNodeEdges (
00625 INT32 node1,
00626 INT32 node2
00627 );
00628
00631 ERRVALUE Write (
00632 INT32 edgenum,
00633 const RVCTINEDGE& edge
00634 );
00635
00638 ERRVALUE Write (
00639 INT32 hullnum,
00640 const RVCTINHULL& hull
00641 );
00642
00645 ERRVALUE Write (
00646 INT32 nodenum,
00647 const RVCTINNODE& node
00648 );
00649
00652 ERRVALUE Write (
00653 INT32 TriangleNum,
00654 const RVCTINTRIANGLE& triangle
00655 );
00656
00659 ERRVALUE WriteHullEdges (
00660 INT32 hullnum,
00661 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00662 );
00663
00666 ERRVALUE WriteHullEdges (
00667 INT32 hullnum,
00668 INT32 total,
00669 INT32 start,
00670 INT32 count,
00671 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00672 );
00673
00676 ERRVALUE WriteHullIslands (
00677 INT32 hullnum,
00678 INT32 total,
00679 INT32 start,
00680 INT32 count,
00681 const INT32 *islands
00682 );
00683
00686 ERRVALUE WriteNodeEdges (
00687 INT32 nodenum,
00688 const SIMPLE_ARRAY<INT32>& EdgeList
00689 );
00690
00693 ERRVALUE WriteNodeEdges (
00694 INT32 nodenum,
00695 INT32 NumEdges,
00696 INT32 start,
00697 INT32 count,
00698 const SIMPLE_ARRAY<INT32>& EdgeList
00699 );
00700
00701 protected:
00702
00703 ERRVALUE ClearNodeEdgeList ();
00704 ERRVALUE SetNumEdges (INT32 NewNumEdges);
00705 ERRVALUE SetNumHulls (INT32 NewNumHulls);
00706 ERRVALUE SetNumNodes (INT32 NewNumNodes);
00707 ERRVALUE SetNumTriangles (INT32 NewNumTriangles);
00708
00709 private:
00710 #ifndef GENERATING_DOXYGEN_OUTPUT
00711
00712 ERRVALUE ExtractToCAD (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00713 ERRVALUE ExtractToTIN (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00714 ERRVALUE ExtractToVector (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00715
00717 virtual ERRVALUE v_CloseObject ();
00718 virtual OBJTYPE v_GetDftObjectType () const;
00719 virtual bool v_IsObjectOpen () const;
00720 virtual ERRVALUE v_OpenObject (OPENMODE OpenMode, MDLGPARENT parent, const CREDENTIALS* Credentials);
00721
00723 virtual void v_GetExtents (DRECT3D &extents) const;
00724 virtual void v_GetScale (double& xscale, double& yscale) const;
00725 virtual double v_GetZScale () const;
00726 virtual double v_GetZOffset () const;
00727 virtual bool v_HasCapability (int Capability) const;
00728 virtual void v_SetScale (double xscale, double yscale);
00729 virtual void v_SetZOffset (double zoffset);
00730 virtual void v_SetZScale (double zscale);
00731
00733 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00734 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, GEOMETRIC::SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00735 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00736 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00737 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00738 virtual POINTTYPE v_GetPointType () const {return (POINTTYPE_3DXYZ);}
00739 virtual INT32 v_GetPointSize () const {return (sizeof(DPOINT3D));}
00740 virtual QSEARCHTREE* v_GetSearchTree (ELEMTYPE ElemType) const;
00741 virtual double v_GetTotalLineLength () const;
00742 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00743 virtual bool v_IsEmpty () const;
00744 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00745 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00746 virtual void v_SetSearchTree (ELEMTYPE ElemType, QSEARCHTREE* SearchTree) const;
00747 virtual ERRVALUE v_SetTotalLineLength (double length);
00748 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00749 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00750 virtual ERRVALUE v_UpdateExtents (const DRECT3D &extents);
00751
00753 virtual ERRVALUE v_FindClosestElementsLow (const DPOINT2D& SearchPt, double SearchDist, SEARCHFILTER* SearchFilter, SIMPLE_ARRAY<RVC::ELEMENT>& ElementList, COMPONENT Component) const;
00754 virtual ERRVALUE v_ReadElement (INT32 ElemNum, POLYLINELIST& LineList, DIMENSION dim) const;
00755 virtual ERRVALUE v_ReadElement (INT32 ElemNum, POLYLINE& PointList, DIMENSION dim) const;
00756 virtual ERRVALUE v_ReadElement (INT32 ElemNum, REGION2D& Region, DIMENSION dim) const;
00757 virtual ERRVALUE v_ReadNextLine (ELEMENT& Element, POLYLINELIST& LineList, DIMENSION dim) const;
00758 virtual ERRVALUE v_ReadNextNode (ELEMENT& Element, DPOINT3D& Node) const;
00759 virtual ERRVALUE v_ReadNextPoint (ELEMENT& Element, POLYLINE& PointList, DIMENSION dim) const;
00760 virtual ERRVALUE v_ReadNextRegion (ELEMENT& Element, REGION2D& Region, DIMENSION dim) const;
00761
00762 ERRVALUE ExtractNodesTo (CAD& CadObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags, INT32& NumElem) const;
00763 ERRVALUE ExtractNodesTo (TIN& TinObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00764 ERRVALUE ExtractNodesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00765 ERRVALUE ExtractEdgesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00766 ERRVALUE ExtractTrianglesTo (CAD& CadObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags, INT32& NumElem) const;
00767 ERRVALUE ExtractTrianglesTo (VECTOR& VectObj, GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00768
00769 int SetupTriangleTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& EdgeSet, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00770 int SetupEdgeTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& EdgeSet, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00771 int SetupNodeTransList(const ELEMSELECTPARMS& SelectParms, ELEMTRANSLIST& TransList, BITSET& NodeSet, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00772
00774 TINHANDLE* m_TINHandle;
00775 mutable QSEARCHTREE *m_NodeQTree;
00776 mutable QSEARCHTREE *m_EdgeQTree;
00777 mutable QSEARCHTREE *m_TriQTree;
00778 class OPTIMIZE;
00779 mutable OPTIMIZE* m_Optimize;
00780 #endif // GENERATING_DOXYGEN_OUTPUT
00781 };
00782
00783
00785 class TIN::MAKEPARMS : public RVC::GEOMETRIC::MAKEPARMSBASE {
00786 public:
00788 MAKEPARMS (
00789 ) :
00790 GEOMETRIC::MAKEPARMSBASE(GEOMETRIC::POINTTYPE_3DXYZ),
00791 m_ZOffset(0.0),
00792 m_NextEdgeID(1),
00793 m_NextNodeID(10),
00794 m_NextTriangleID(1),
00795 m_tolerance(0.0)
00796 {}
00797
00799 MAKEPARMS (
00800 const RVC::TIN& Object
00801 );
00802
00805 INT32 GetNextEdgeID (
00806 ) const {return (m_NextEdgeID);}
00807
00810 INT32 GetNextNodeID (
00811 ) const {return (m_NextNodeID);}
00812
00815 INT32 GetNextTriangleID (
00816 ) const {return (m_NextTriangleID);}
00817
00820 double GetTolerance (
00821 ) const { return (m_tolerance); }
00822
00825 double GetZOffset (
00826 ) const {return (m_ZOffset);}
00827
00829 void SetNextEdgeID (
00830 INT32 NextEdgeID
00831 ) {m_NextEdgeID = NextEdgeID;}
00832
00834 void SetNextNodeID (
00835 INT32 NextNodeID
00836 ) {m_NextNodeID = NextNodeID;}
00837
00839 void SetNextTriangleID (
00840 INT32 NextTriangleID
00841 ) {m_NextTriangleID = NextTriangleID;}
00842
00844 void SetTolerance (
00845 double tolerance
00846 ) { m_tolerance = tolerance; }
00847
00849 void SetZOffset (
00850 double zoffset
00851 ) {m_ZOffset = zoffset;}
00852
00853 private:
00854 #ifndef GENERATING_DOXYGEN_OUTPUT
00855 double m_ZOffset;
00856 INT32 m_NextEdgeID;
00857 INT32 m_NextNodeID;
00858 INT32 m_NextTriangleID;
00859 double m_tolerance;
00860 #endif // GENERATING_DOXYGEN_OUTPUT
00861 };
00862
00863 }
00864
00865 #endif