Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : CoEdge.cpp
3 : : //
4 : : // Purpose :
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Xuechen Liu
9 : : //
10 : : // Creation Date : 08/02/96
11 : : //
12 : : // Owner : Jihong Ma
13 : : //-------------------------------------------------------------------------
14 : :
15 : : // ********** BEGIN STANDARD INCLUDES **********
16 : : // ********** END STANDARD INCLUDES **********
17 : :
18 : : // ********** BEGIN CUBIT INCLUDES **********
19 : : #include "CoEdge.hpp"
20 : : #include "RefEdge.hpp"
21 : : #include "RefFace.hpp"
22 : : #include "Loop.hpp"
23 : : #include "DLIList.hpp"
24 : : #include "GeometryDefines.h"
25 : : #include "GeometryQueryTool.hpp"
26 : : #include "CastTo.hpp"
27 : : #include "CoEdgeSM.hpp"
28 : : #include "Curve.hpp"
29 : :
30 : : // ********** END CUBIT INCLUDES **********
31 : :
32 : : // ********** BEGIN STATIC DECLARATIONS **********
33 : : // ********** END STATIC DECLARATIONS **********
34 : :
35 : : // ********** BEGIN PUBLIC FUNCTIONS **********
36 : : //-------------------------------------------------------------------------
37 : : // Purpose : The default constructor.
38 : : //
39 : : // Special Notes :
40 : : //
41 : : // Creator : Xuechen Liu
42 : : //
43 : : // Creation Date : 08/02/96
44 : : //-------------------------------------------------------------------------
45 [ + - ]: 135202 : CoEdge::CoEdge()
46 : : {
47 : 67601 : }
48 : :
49 : : //-------------------------------------------------------------------------
50 : : // Purpose : The destructor.
51 : : //
52 : : // Special Notes :
53 : : //
54 : : // Creator : Raikanta Sahu
55 : : //
56 : : // Creation Date : 10/22/96
57 : : //-------------------------------------------------------------------------
58 [ + - ]: 125733 : CoEdge::~CoEdge()
59 : : {
60 [ + - ]: 41911 : remove_from_observers();
61 [ - + ]: 83822 : }
62 : :
63 : : //-------------------------------------------------------------------------
64 : : // Purpose : The constructor with a pointer to a edge and the
65 : : // sense of this CoEdge.
66 : : //
67 : : // Special Notes :
68 : : //
69 : : // Creator : Xuechen Liu
70 : : //
71 : : // Creation Date : 08/02/96
72 : : //-------------------------------------------------------------------------
73 [ # # ]: 0 : CoEdge::CoEdge(RefEdge* edgePtr, CubitSense sense)
74 : : {
75 [ # # ]: 0 : attach_basic_topology_entity(edgePtr) ;
76 [ # # ]: 0 : set_sense(sense) ;
77 : 0 : }
78 : :
79 : : //-------------------------------------------------------------------------
80 : : // Purpose :
81 : : //
82 : : // Special Notes :
83 : : //
84 : : // Creator : Jason Kraftcheck
85 : : //
86 : : // Creation Date : 07/22/03
87 : : //-------------------------------------------------------------------------
88 [ # # ]: 0 : CoEdge::CoEdge( CoEdgeSM* osme_ptr )
89 : : {
90 [ # # ]: 0 : set_co_edge_sm_ptr(osme_ptr);
91 : 0 : }
92 : :
93 : : //-------------------------------------------------------------------------
94 : : // Purpose : Get the RefEdge associated with this CoEdge.
95 : : //
96 : : // Special Notes :
97 : : //
98 : : // Creator : Malcolm J. Panthaki
99 : : //
100 : : // Creation Date : 08/02/96
101 : : //-------------------------------------------------------------------------
102 : 97724 : RefEdge* CoEdge::get_ref_edge_ptr()
103 : : {
104 : : // Call the generic function defined in the SenseEntity class to
105 : : // do the real work
106 : 97724 : BasicTopologyEntity* BTEPtr = get_basic_topology_entity_ptr();
107 : :
108 : : // Cast the returned pointer to RefEdge and return it
109 : 97724 : return STATIC_CAST_TO( BTEPtr, RefEdge );
110 : : }
111 : :
112 : : //-------------------------------------------------------------------------
113 : : // Purpose : Get the parent Loop
114 : : //
115 : : // Special Notes :
116 : : //
117 : : // Creator : Jason Kraftcheck
118 : : //
119 : : // Creation Date : 09/23/99
120 : : //-------------------------------------------------------------------------
121 : 18760 : Loop* CoEdge::get_loop_ptr()
122 : : {
123 : 18760 : return STATIC_CAST_TO( get_grouping_entity_ptr(), Loop );
124 : : }
125 : :
126 : :
127 : : //-------------------------------------------------------------------------
128 : : // Purpose : Get the ref_face associated with this CoEdge.
129 : : //
130 : : // Special Notes : Will assert if more than one ref_face but will
131 : : // return NULL if no RefFaces are associated with it.
132 : : //
133 : : // Creator : David White
134 : : //
135 : : // Creation Date : 3/14/97
136 : : //-------------------------------------------------------------------------
137 : 264 : RefFace* CoEdge::get_ref_face()
138 : : {
139 : 264 : return static_cast<RefFace*>(get_parent_basic_topology_entity_ptr());
140 : : }
141 : :
142 : :
143 : :
144 : : //-------------------------------------------------------------------------
145 : : // Purpose : This function is called after a child of a TopologyEntity
146 : : // is switched. The sense of a CoEdge may change if one
147 : : // of its RefEdges changes. This function takes care of
148 : : // that. If the sense of the RefEdges that were switched
149 : : // is same, nothing is done. If the RefEdges are of
150 : : // opposite sense, the sense of this object is switched,
151 : : // i.e. if it was FORWARD, it is made REVERSE, and vice
152 : : // versa.
153 : : //
154 : : // Special Notes :
155 : : //
156 : : // Creator : Raikanta Sahu
157 : : //
158 : : // Creation Date : 02/26/97
159 : : //-------------------------------------------------------------------------
160 : :
161 : 0 : void CoEdge::switch_child_notify(TopologyEntity const* newChild,
162 : : TopologyEntity const* oldChild)
163 : : {
164 : : // Make sure the entities being switched are RefEdges. If not,
165 : : // get out of this function.
166 : :
167 : 0 : TopologyEntity* tmp_new_child = const_cast<TopologyEntity*>(newChild);
168 : 0 : TopologyEntity* tmp_old_child = const_cast<TopologyEntity*>(oldChild);
169 [ # # ]: 0 : RefEdge * newChildRefEdge = CAST_TO(tmp_new_child, RefEdge) ;
170 [ # # ]: 0 : RefEdge * oldChildRefEdge = CAST_TO(tmp_old_child, RefEdge) ;
171 : :
172 [ # # ][ # # ]: 0 : if ( ( newChildRefEdge == NULL ) || ( oldChildRefEdge == NULL ) )
173 : : {
174 : 0 : return ;
175 : : }
176 : :
177 : : // If the children are RefEdges, get the sense of the old RefEdge
178 : : // relative to the new one.
179 : :
180 : : CubitSense sense;
181 : : CubitBoolean spatially_equal;
182 : : //We really don't care at this point if the two are spatially equal.
183 : : // The user could have done a force merge and in which case they are not.
184 : : // So just ignore that spatial comparison.
185 : :
186 : : //When this function is called, the merge has already taken place, so force
187 : : // merge actually makes more sense to use here...
188 : 0 : CubitBoolean force_merge = CUBIT_TRUE;
189 : :
190 : : /*CubitStatus stat = */
191 : : newChildRefEdge->relative_sense(
192 : : oldChildRefEdge, GeometryQueryTool::get_geometry_factor(), &sense,
193 [ # # ][ # # ]: 0 : spatially_equal, force_merge );
194 : :
195 : : // If the sense of the old RefEdge relative to the new RefEdge is
196 : : // same, nothing needs to be done. However, if the relative sense
197 : : // is reversed, switch the sense of the CoEdge.
198 [ # # ]: 0 : if ( sense == CUBIT_REVERSED )
199 : : {
200 [ # # ][ # # ]: 0 : if ( get_sense() == CUBIT_FORWARD )
201 : : {
202 [ # # ]: 0 : set_sense(CUBIT_REVERSED) ;
203 : : }
204 : : else
205 : : {
206 [ # # ]: 0 : set_sense(CUBIT_FORWARD) ;
207 : : }
208 : : }
209 : : }
210 : :
211 : : //-------------------------------------------------------------------------
212 : : // Purpose : Get CoEdgeSM pointer
213 : : //
214 : : // Special Notes :
215 : : //
216 : : // Creator : Jason Kraftcheck
217 : : //
218 : : // Creation Date : 07/23/03
219 : : //-------------------------------------------------------------------------
220 : 0 : CoEdgeSM* CoEdge::get_co_edge_sm_ptr() const
221 : : {
222 : 0 : return static_cast<CoEdgeSM*>(bridge_manager()->topology_bridge());
223 : : }
224 : :
225 : :
226 : 0 : CubitStatus CoEdge::set_co_edge_sm_ptr( CoEdgeSM* ptr )
227 : : {
228 [ # # ]: 0 : if (!bridge_manager()->topology_bridge())
229 : 0 : return bridge_manager()->add_bridge(ptr);
230 [ # # ]: 0 : else if(bridge_manager()->topology_bridge() != ptr)
231 : 0 : return CUBIT_FAILURE;
232 : : else
233 : 0 : return CUBIT_SUCCESS;
234 : : }
235 : :
236 : : //-------------------------------------------------------------------------
237 : : // Purpose : Check if child RefEdges are equal and have correct
238 : : // relative sense.
239 : : //
240 : : // Special Notes :
241 : : //
242 : : // Creator : Jason Kraftcheck
243 : : //
244 : : // Creation Date : 04/01/04
245 : : //-------------------------------------------------------------------------
246 : 9849 : CubitBoolean CoEdge::about_spatially_equal( CoEdge* other_coedge,
247 : : CubitSense relative_sense,
248 : : double tolerance_factor,
249 : : CubitBoolean notify_refEntity )
250 : : {
251 [ + - ]: 9849 : RefEdge* this_ref_edge = get_ref_edge_ptr();
252 [ + - ]: 9849 : RefEdge* other_ref_edge = other_coedge->get_ref_edge_ptr();
253 : : CubitSense edge_sense;
254 : :
255 [ + + ]: 9849 : if (!this_ref_edge->about_spatially_equal( other_ref_edge,
256 : : tolerance_factor,
257 : : &edge_sense,
258 [ + - ]: 9849 : notify_refEntity ))
259 : 8910 : return CUBIT_FALSE;
260 : :
261 [ + - ][ + - ]: 1878 : if (this_ref_edge->get_curve_ptr()->geometry_type() == POINT_CURVE_TYPE ||
[ + - ][ - + ]
[ - + ]
262 [ + - ][ + - ]: 939 : other_ref_edge->get_curve_ptr()->geometry_type() == POINT_CURVE_TYPE)
263 : 0 : return CUBIT_TRUE;
264 : :
265 [ - + ]: 939 : if (edge_sense == CUBIT_UNKNOWN)
266 : : {
267 [ # # ][ # # ]: 0 : PRINT_WARNING("Failed to determine relative sense of curves.\n");
[ # # ][ # # ]
268 : 0 : return CUBIT_TRUE;
269 : : }
270 : :
271 [ + - ][ + - ]: 939 : bool coedges_reversed = get_sense() != other_coedge->get_sense();
272 : 939 : bool want_reversed = edge_sense != relative_sense;
273 [ + + ]: 939 : if (coedges_reversed == want_reversed)
274 : 616 : return CUBIT_TRUE;
275 : :
276 : : // if (notify_refEntity)
277 : : // {
278 : : // this_ref_edge->remove_compare_data();
279 : : // other_ref_edge->remove_compare_data();
280 : : // }
281 : 9849 : return CUBIT_FALSE;
282 : : }
283 : :
284 : : //-------------------------------------------------------------------------
285 : : // Purpose : Get start/end vertex
286 : : //
287 : : // Special Notes :
288 : : //
289 : : // Creator : Jason Kraftcheck
290 : : //
291 : : // Creation Date : 05/11/04
292 : : //-------------------------------------------------------------------------
293 : 0 : RefVertex* CoEdge::start_vertex()
294 : : {
295 : 0 : return get_sense() == CUBIT_FORWARD ?
296 : 0 : get_ref_edge_ptr()->start_vertex() :
297 [ # # ]: 0 : get_ref_edge_ptr()->end_vertex();
298 : : }
299 : 0 : RefVertex* CoEdge::end_vertex()
300 : : {
301 : 0 : return get_sense() == CUBIT_REVERSED ?
302 : 0 : get_ref_edge_ptr()->start_vertex() :
303 [ # # ]: 0 : get_ref_edge_ptr()->end_vertex();
304 [ + - ][ + - ]: 6540 : }
305 : :
306 : : // ********** END PUBLIC FUNCTIONS **********
307 : :
308 : : // ********** BEGIN PROTECTED FUNCTIONS **********
309 : : // ********** END PROTECTED FUNCTIONS **********
310 : :
311 : : // ********** BEGIN PRIVATE FUNCTIONS **********
312 : : // ********** END PRIVATE FUNCTIONS **********
313 : :
314 : : // ********** BEGIN HELPER CLASSES **********
315 : : // ********** END HELPER CLASSES **********
316 : :
317 : : // ********** BEGIN EXTERN FUNCTIONS **********
318 : : // ********** END EXTERN FUNCTIONS **********
319 : :
320 : : // ********** BEGIN STATIC FUNCTIONS **********
321 : : // ********** END STATIC FUNCTIONS **********
322 : :
|