CFx SDK Documentation 2024 SP0
Loading...
Searching...
No Matches
FMSliceContourBuilder.h
Go to the documentation of this file.
1
2// Copyright (C) 2002-2022, Open Design Alliance (the "Alliance").
3// All rights reserved.
4//
5// This software and its documentation and related materials are owned by
6// the Alliance. The software may only be incorporated into application
7// programs owned by members of the Alliance, subject to a signed
8// Membership Agreement and Supplemental Software License Agreement with the
9// Alliance. The structure and organization of this software are the valuable
10// trade secrets of the Alliance and its suppliers. The software is also
11// protected by copyright law and international treaty provisions. Application
12// programs incorporating this software must include the following statement
13// with their copyright notices:
14//
15// This application incorporates Open Design Alliance software pursuant to a license
16// agreement with Open Design Alliance.
17// Open Design Alliance Copyright (C) 2002-2022 by Open Design Alliance.
18// All rights reserved.
19//
20// By use of this software, its documentation or related materials, you
21// acknowledge and accept the above terms.
23#ifndef FMSLICECONTOURBUILDER_H_INCLUDED
24#define FMSLICECONTOURBUILDER_H_INCLUDED
25
26#include "FMProfile3D.h"
27#include "FMGeometry.h"
28#include "FMGeometryDebug.h"
30
31#include "Ge/GePlane.h"
32#include "Ge/GeLineSeg3d.h"
33#include <UInt32Array.h>
34#include "Si/SiSpatialIndex.h"
35#include "Si/SiShapePlane.h"
36#include "Ge/GeLine3d.h"
37#include "FMDebugDraw.h"
38
39namespace FacetModeler
40{
42 // special container type used to keep sequenced data, but has ability fast search for value
44 template<typename T>
46 {
47 std::list<T> m_lstValues; // keeps sequence
48 std::set<T> m_setValues; // used for fast search
49
50 public:
53
54 const std::list<T>& get_list() const
55 {
56 return m_lstValues;
57 }
58
59 const T& front() const
60 {
61 return m_lstValues.front();
62 }
63
64 const T& back() const
65 {
66 return m_lstValues.back();
67 }
68
69 void push_back(const T& aVal)
70 {
71 m_lstValues.push_back(aVal);
72 m_setValues.insert(aVal);
73 }
74
75 size_t size() const
76 {
77 return m_lstValues.size();
78 }
79
80 void clear()
81 {
82 m_lstValues.clear();
83 m_setValues.clear();
84 }
85
86 void pop_back()
87 {
88 if(size() == 0)
89 return;
90
91 const T& aVal = m_lstValues.back();
92 m_setValues.erase(aVal);
93 m_lstValues.pop_back();
94 }
95
96 bool has_value(const T& aVal) const
97 {
98 return (m_setValues.find(aVal) != m_setValues.end());
99 }
100
101 bool is_equal(const TListSet<T>& t2) const
102 {
103 return (m_lstValues == t2.m_lstValues);
104 }
105 };
106
108 // A sequence of edges indices in EdgeGraph object. The sequence represents closed contour of graph edges
111 {
112 TListSet<OdUInt32> aContour;
113 OdUInt32 m_hash;
114
115 public:
116 typedef std::list<OdUInt32> TContour;
117
118 public:
119 SliceContour() : m_hash(0) {};
121
123
124 const TContour& GetContour() const;
125 void AddEdge(OdUInt32 iEdge);
126
129
130 size_t Size() const;
131 void Clear();
132
134
135 bool HasEdge(OdUInt32 iEdge) const;
136
137 friend bool operator == (const SliceContour& c1, const SliceContour& c2);
138 };
139
140 bool operator == (const SliceContour& c1, const SliceContour& c2);
141
142
144 // A map of SliceContours sorted by it's hash key value. This is used for
145 // storing SliceContours and not let the container to have contours duplicates
147 typedef std::multimap<OdUInt32, SliceContour> SliceContoursMap;
148
150 {
151 SliceContoursMap m_slices;
152
153 public:
154 bool AddContour(const SliceContour& aContour);
155 bool HasContour( const SliceContour& aContour ) const;
156
157 SliceContoursMap& GetContours() { return m_slices; }
158 const SliceContoursMap& GetContours() const { return m_slices; }
159 };
160
162 // Encapsulates algorithm for building slice contours, based on EdgeGraph
164 //typedef std::vector<AECGe::Contour2D> ContoursVector;
166 typedef std::vector<OdUInt32> SliceNodes;
167
168 class EdgeGraph2d;
169
171 {
172 EdgeGraph& m_graph;
173
174 typedef std::set<OdUInt32> AssignedEdges;
175 AssignedEdges m_assignedEdges;
176
177 double m_extLeft;
178 double m_extRight;
179 double m_extTop;
180 double m_extBottom;
181
182 public:
184
185 private:
186 bool IsEdgeAssigned(OdUInt32 edgeIdx) { return m_assignedEdges.find(edgeIdx) != m_assignedEdges.end(); }
187 void SetEdgeAssigned(OdUInt32 edgeIdx) { m_assignedEdges.insert(edgeIdx); }
188
189 void InitializeExtents(const OdGePlane& rCutPlane, const SliceContoursMap& aSlices);
190 void AddPoint2dToExtents(const OdGePoint2d& ptVertex2d);
191 void RemoveOverlappingContours( ContoursVector& rContours2d );
192
193 private:
194 bool RecursiveFindCycle( SliceContour& aContour, SliceContourCollection& aSlices );
195 void MarkDuplicatedEdges();
196 void SplitSliceToContours2d( const OdGePlane& rCutPlane, const SliceContourCollection& aSliceContours, ContoursVector& rContours2d );
197
198 SliceNodes GetSliceContourNodes( const SliceContour& aSlice, OdArray<const Edge*>* aTag = NULL);
199 void MakeClosedContour( Contour2D& rResult );
200 void MakeClosedContour2dFromSliceNodes( const OdGePlane& rCutPlane, const SliceNodes& rSliceNodes, Contour2D& rResult, const OdArray<const Edge*>& aTag);
201
202 void AddSurfacesToProfile( const ContoursVector& rContours2d, Profile2D& rResult );
203 void CutHolesFromProfile( const ContoursVector& rContours2d, Profile2D& rResult );
204 void BuildResultProfile( ContoursVector& rContours2d, Profile2D& rResult );
205
206 public:
207 SliceContourBuilder(EdgeGraph& aGraph) : m_graph (aGraph), m_sourceEdges(NULL)
208 {
209 m_extLeft = 0.0;
210 m_extRight = 0.0;
211 m_extTop = 0.0;
212 m_extBottom = 0.0;
213 };
215
216 bool IsContourClosed( const SliceContour& aContour );
217
218 bool FindContour( std::vector<OdUInt32>& aContour );
219
221
222 public:
223 void BuildSliceProfile( const OdGePlane& rCutPlane, Profile2D& rResult );
224
225 private:
226 OdGePlane m_cutPlane;
227
228 public:
229 void BuildSliceProfile2( const OdGePlane& rCutPlane, Profile2D& rResult );
230
231 private:
232 void FindSliceContours2( SliceContourCollection& aSliceContours ) ;
233
234
235 private:
236 // DEBUG FUNCTIONS
237 typedef std::vector<SliceEdge> Edges;
238
239 void DebugDrawEdgeGraph();
240 void DebugDrawEdge(OdUInt32 uEdgeIdx, Edges& drawnEdges, OdInt16 edgeBaseColor = 0);
241 void DebugDrawEdge(OdUInt32 uEdgeIdx, OdInt16 edgeBaseColor = 0);
242 bool HasCoincidentEdge(OdUInt32 uEdgeIdx, const Edges& drawnEdges);
243 bool HasCoincidentOppositeEdge(OdUInt32 uEdgeIdx, const Edges& drawnEdges);
244 void DebugDrawSliceContour(SliceContour& contour);
245 void DebugDrawSliceContourCollection(SliceContourCollection& contoursColl);
246 void DebugCheckForDuplicatedNodes();
247 };
248}
249
250#endif //FMSLICECONTOURBUILDER_H_INCLUDED
#define FMGEOMETRY_API
unsigned int OdUInt32
short OdInt16
void FindSliceContours(SliceContourCollection &aSliceContours)
void BuildSliceProfile2(const OdGePlane &rCutPlane, Profile2D &rResult)
bool FindContour(std::vector< OdUInt32 > &aContour)
bool IsContourClosed(const SliceContour &aContour)
void BuildSliceProfile(const OdGePlane &rCutPlane, Profile2D &rResult)
OdArray< const Edge * > * m_sourceEdges
bool HasContour(const SliceContour &aContour) const
bool AddContour(const SliceContour &aContour)
const SliceContoursMap & GetContours() const
friend bool operator==(const SliceContour &c1, const SliceContour &c2)
OdUInt32 GetFirstEdge() const
OdUInt32 GetHash() const
std::list< OdUInt32 > TContour
OdUInt32 GetLastEdge() const
void AddEdge(OdUInt32 iEdge)
bool HasEdge(OdUInt32 iEdge) const
const TContour & GetContour() const
bool is_equal(const TListSet< T > &t2) const
bool has_value(const T &aVal) const
void push_back(const T &aVal)
const std::list< T > & get_list() const
std::vector< OdUInt32 > SliceNodes
std::multimap< OdUInt32, SliceContour > SliceContoursMap