Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : OCCLoop.cpp
3 : : //
4 : : // Purpose : Loops for Facet-based geometry module
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Steven J. Owen
9 : : //
10 : : // Creation Date : 12/06/00
11 : : //
12 : : // Owner : Steven J. Owen
13 : : //-------------------------------------------------------------------------
14 : :
15 : : #include "CastTo.hpp"
16 : : #include "OCCLoop.hpp"
17 : : #include "OCCQueryEngine.hpp"
18 : : #include "CoEdgeSM.hpp"
19 : :
20 : : #include "OCCBody.hpp"
21 : : #include "OCCLump.hpp"
22 : : #include "OCCShell.hpp"
23 : : #include "OCCSurface.hpp"
24 : : #include "OCCCoEdge.hpp"
25 : : #include "OCCCurve.hpp"
26 : : #include "OCCPoint.hpp"
27 : :
28 : : #include <TopExp.hxx>
29 : : #include <TopTools_IndexedMapOfShape.hxx>
30 : : #include "TopExp_Explorer.hxx"
31 : : #include "TopoDS.hxx"
32 : : #include "TopTools_ListIteratorOfListOfShape.hxx"
33 : : #include "TopTools_DataMapOfShapeInteger.hxx"
34 : : #include "TopTools_DataMapOfOrientedShapeInteger.hxx"
35 : : #include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
36 : : #include "BRepBuilderAPI_Transform.hxx"
37 : : #include "BRepBuilderAPI_GTransform.hxx"
38 : : #include "BRepBuilderAPI_ModifyShape.hxx"
39 : : #include "BRepAlgoAPI_BooleanOperation.hxx"
40 : : #include "LocOpe_SplitShape.hxx"
41 : : #include "BRepTools_WireExplorer.hxx"
42 : : // ********** END CUBIT INCLUDES **********
43 : :
44 : : // ********** BEGIN STATIC DECLARATIONS **********
45 : : // ********** END STATIC DECLARATIONS **********
46 : :
47 : : // ********** BEGIN PUBLIC FUNCTIONS **********
48 : :
49 : : //-------------------------------------------------------------------------
50 : : // Purpose : The constructor with a pointer to the TopoDS_Wire.
51 : : //
52 : : // Special Notes :
53 : : //
54 : : //-------------------------------------------------------------------------
55 [ + - ]: 34562 : OCCLoop::OCCLoop( TopoDS_Wire *theWire )
56 : : {
57 : 17281 : myTopoDSWire = theWire;
58 : 17281 : }
59 : :
60 : : //-------------------------------------------------------------------------
61 : : // Purpose : The default destructor.
62 : : //
63 : : // Special Notes :
64 : : //
65 : : //-------------------------------------------------------------------------
66 [ + - ]: 32559 : OCCLoop::~OCCLoop()
67 : : {
68 [ + - ]: 10853 : disconnect_all_curves();
69 [ + - ]: 10853 : if (myTopoDSWire)
70 : : {
71 [ + - ]: 10853 : myTopoDSWire->Nullify();
72 [ + - ][ + - ]: 10853 : delete (TopoDS_Wire*)myTopoDSWire;
[ + - ]
73 : 10853 : myTopoDSWire = NULL;
74 : : }
75 [ - + ]: 21706 : }
76 : :
77 : 6259 : void OCCLoop::set_TopoDS_Wire(TopoDS_Wire loop)
78 : : {
79 [ + - ][ + + ]: 6259 : if(myTopoDSWire && loop.IsEqual(*myTopoDSWire))
[ + + ]
80 : 6259 : return;
81 [ + - ][ + + ]: 4925 : if(myTopoDSWire && !loop.IsSame(*myTopoDSWire))
[ + + ]
82 : : {
83 [ + - ]: 4518 : DLIList<OCCCoEdge*> coedges = this->coedges();
84 [ + - ][ + + ]: 20070 : for(int i = 0; i < coedges.size(); i++)
85 : : {
86 [ + - ]: 15552 : OCCCoEdge* coedge = coedges.get_and_step();
87 [ + - ][ - + ]: 15552 : OCCCurve* curve = CAST_TO(coedge->curve(), OCCCurve);
88 [ + - ]: 15552 : TopoDS_Edge *edge = curve->get_TopoDS_Edge( );
89 [ + - ]: 15552 : BRepTools_WireExplorer Ex;
90 : 15552 : CubitBoolean found = false;
91 [ + - ][ + - ]: 54304 : for (Ex.Init(loop); Ex.More(); Ex.Next())
[ + - ][ + + ]
92 : : {
93 [ + - ][ + - ]: 38752 : TopoDS_Shape crv = Ex.Current();
94 [ + - ][ + + ]: 38752 : if(edge->IsPartner(crv))
95 : : {
96 : 15310 : found = true;
97 [ + - ][ + + ]: 38752 : break;
98 : : }
99 : 23442 : }
100 [ + + ]: 15552 : if (!found)
101 [ + - ]: 242 : curve->remove_loop(this);
102 [ + - ][ + - ]: 20070 : }
103 : : }
104 [ + - ]: 4925 : TopoDS_Wire* the_wire = new TopoDS_Wire(loop);
105 [ + - ]: 4925 : if(myTopoDSWire)
106 [ + - ]: 4925 : delete (TopoDS_Wire*)myTopoDSWire;
107 : 4925 : myTopoDSWire = the_wire;
108 : : }
109 : : //-------------------------------------------------------------------------
110 : : // Purpose : Tear down topology
111 : : //
112 : : // Special Notes :
113 : : //
114 : : // Creator : Jane Hu
115 : : //
116 : : // Creation Date : 11/29/07
117 : : //-------------------------------------------------------------------------
118 : 10853 : void OCCLoop::disconnect_all_curves()
119 : : {
120 : 10853 : myCoEdgeList.clean_out();
121 : 10853 : }
122 : :
123 : 40679 : OCCCoEdge* OCCLoop::remove_coedge(OCCCoEdge *coedge)
124 : : {
125 [ + - ]: 40679 : if(myCoEdgeList.remove(coedge))
126 : 40679 : return coedge;
127 : 0 : return NULL;
128 : : }
129 : :
130 : : //-------------------------------------------------------------------------
131 : : // Purpose : The purpose of this function is to append a
132 : : // attribute to the GE. The name is attached to the
133 : : // underlying solid model entity this one points to.
134 : : //
135 : : //
136 : : // Special Notes :
137 : : //
138 : : //-------------------------------------------------------------------------
139 : 0 : void OCCLoop::append_simple_attribute_virt(const CubitSimpleAttrib& /*csattrib_ptr*/)
140 : : {
141 : 0 : }
142 : :
143 : : //-------------------------------------------------------------------------
144 : : // Purpose : The purpose of this function is to remove a simple
145 : : // attribute attached to this geometry entity. The name is
146 : : // removed from the underlying BODY this points to.
147 : : //
148 : : // Special Notes :
149 : : //
150 : : //-------------------------------------------------------------------------
151 : 0 : void OCCLoop::remove_simple_attribute_virt(const CubitSimpleAttrib& /*csattrib_ptr*/)
152 : : {
153 : 0 : }
154 : :
155 : : //-------------------------------------------------------------------------
156 : : // Purpose : The purpose of this function is to remove all simple
157 : : // attributes attached to this geometry entity. Also
158 : : // removes lingering GTC attributes.
159 : : //
160 : : //
161 : : // Special Notes :
162 : : //
163 : : //-------------------------------------------------------------------------
164 : 0 : void OCCLoop::remove_all_simple_attribute_virt()
165 : : {
166 : 0 : }
167 : :
168 : : //-------------------------------------------------------------------------
169 : : // Purpose : The purpose of this function is to get the
170 : : // attributes attached to this geometry entity. The name is
171 : : // attached to the underlying BODY this points to.
172 : : //
173 : : // Special Notes :
174 : : //
175 : : //-------------------------------------------------------------------------
176 : 0 : CubitStatus OCCLoop::get_simple_attribute(DLIList<CubitSimpleAttrib>&
177 : : /*cubit_simple_attrib_list*/)
178 : : {
179 : 0 : return CUBIT_FAILURE;
180 : : }
181 : 0 : CubitStatus OCCLoop::get_simple_attribute(const CubitString&,
182 : : DLIList<CubitSimpleAttrib>&)
183 : 0 : { return CUBIT_FAILURE; }
184 : :
185 : 314 : void OCCLoop::get_parents_virt( DLIList<TopologyBridge*>& parents )
186 : : {
187 [ + - ]: 314 : OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
188 : 314 : OCCSurface * surf = NULL;
189 : 314 : DLIList <OCCSurface* > *surfs = oqe->SurfaceList;
190 [ + - ]: 314 : TopTools_IndexedDataMapOfShapeListOfShape M;
191 [ + - ][ + + ]: 7850 : for(int i = 0; i < surfs->size(); i++)
192 : : {
193 [ + - ]: 7536 : surf = surfs->get_and_step();
194 [ + - ]: 7536 : TopExp::MapShapesAndAncestors(*(surf->get_TopoDS_Face()),
195 [ + - ]: 7536 : TopAbs_WIRE, TopAbs_FACE, M);
196 [ + - ][ + - ]: 7536 : if (!M.Contains(*(get_TopoDS_Wire())))
[ + + ]
197 : 3898 : continue;
198 : :
199 : : const TopTools_ListOfShape& ListOfShapes =
200 [ + - ][ + - ]: 3638 : M.FindFromKey(*(get_TopoDS_Wire()));
201 [ + - ][ + - ]: 3638 : if (!ListOfShapes.IsEmpty())
202 : : {
203 [ + - ]: 3638 : TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
204 [ + - ][ + - ]: 7276 : for (;it.More(); it.Next())
[ + + ]
205 : : {
206 [ + - ][ + - ]: 3638 : TopoDS_Face Face = TopoDS::Face(it.Value());
[ + - ]
207 [ + - ]: 3638 : int k = oqe->OCCMap->Find(Face);
208 [ + - ][ + - ]: 3638 : parents.append_unique((OCCSurface*)(oqe->OccToCGM->find(k))->second);
[ + - ]
209 [ + - ]: 3638 : }
210 : : }
211 [ + - ]: 314 : }
212 : 314 : }
213 : :
214 : 116545 : void OCCLoop::get_children_virt( DLIList<TopologyBridge*>& children )
215 : : {
216 [ + - ][ + + ]: 561069 : CAST_LIST_TO_PARENT(myCoEdgeList, children);
217 : 116545 : }
218 : :
219 : : //-------------------------------------------------------------------------
220 : : // Purpose : compute bounding box of loop
221 : : //
222 : : // Special Notes :
223 : : //
224 : : //-------------------------------------------------------------------------
225 : 0 : CubitBox OCCLoop::bounding_box() const
226 : : {
227 : 0 : CubitBox box;
228 [ # # ][ # # ]: 0 : for (int i = myCoEdgeList.size(); i > 0; i--)
229 : : {
230 [ # # ]: 0 : DLIList<OCCCoEdge*> coedges = myCoEdgeList;
231 [ # # ]: 0 : OCCCoEdge* coedge = coedges.get_and_step();
232 [ # # ][ # # ]: 0 : box |= coedge->curve()->bounding_box();
[ # # ][ # # ]
233 [ # # ]: 0 : }
234 : 0 : return box;
235 : : }
236 : :
237 : : //-------------------------------------------------------------------------
238 : : // Purpose : Get geometry modeling engine: OCCQueryEngine
239 : : //
240 : : // Special Notes :
241 : : //
242 : : //-------------------------------------------------------------------------
243 : 314 : GeometryQueryEngine* OCCLoop::get_geometry_query_engine() const
244 : : {
245 : 314 : return OCCQueryEngine::instance();
246 : : }
247 : :
248 : :
249 : : //----------------------------------------------------------------
250 : : // Function: to update the core Loop
251 : : // for any movement of the body/surface.
252 : : // Author: Jane Hu
253 : : //----------------------------------------------------------------
254 : 3770 : CubitStatus OCCLoop::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
255 : : BRepAlgoAPI_BooleanOperation *op)
256 : : {
257 [ - + ][ # # ]: 3770 : assert(aBRepTrsf != NULL || op != NULL);
258 : :
259 [ + - ]: 3770 : TopoDS_Shape shape;
260 : 3770 : CubitBoolean need_update = CUBIT_TRUE;
261 : 3770 : BRepBuilderAPI_Transform* pTrsf = NULL;
262 : 3770 : BRepBuilderAPI_GTransform* gTrsf = NULL;
263 [ + - ]: 3770 : if(aBRepTrsf)
264 : : {
265 : 3770 : pTrsf = (BRepBuilderAPI_Transform*)aBRepTrsf;
266 [ + - ][ + - ]: 3770 : shape = pTrsf->ModifiedShape(*get_TopoDS_Wire());
[ + - ]
267 [ + - ][ - + ]: 3770 : if(shape.IsNull())
268 : : {
269 : 0 : gTrsf = (BRepBuilderAPI_GTransform*)aBRepTrsf;
270 [ # # ][ # # ]: 0 : shape = gTrsf->ModifiedShape(*get_TopoDS_Wire());
[ # # ]
271 : : }
272 : : }
273 : : else
274 : : {
275 [ # # ]: 0 : TopTools_ListOfShape shapes;
276 [ # # ][ # # ]: 0 : shapes.Assign(op->Modified(*get_TopoDS_Wire()));
[ # # ]
277 [ # # ][ # # ]: 0 : if(shapes.Extent() == 0)
278 [ # # ][ # # ]: 0 : shapes.Assign(op->Generated(*get_TopoDS_Wire()));
[ # # ]
279 [ # # ][ # # ]: 0 : if(shapes.Extent())
280 [ # # ][ # # ]: 0 : shape = shapes.First();
281 [ # # ][ # # ]: 0 : else if (op->IsDeleted(*get_TopoDS_Wire()))
[ # # ]
282 : : ;
283 : : else
284 [ # # ]: 0 : need_update = CUBIT_FALSE;
285 : : }
286 : :
287 : : //set the curves
288 [ + - ][ + + ]: 17166 : for (int i = 1; i <= myCoEdgeList.size(); i++)
289 : : {
290 [ + - ][ + - ]: 13396 : OCCCurve *curve = CAST_TO(myCoEdgeList.get_and_step()->curve(), OCCCurve);
[ - + ]
291 [ + - ]: 13396 : curve->update_OCC_entity(aBRepTrsf, op);
292 : : }
293 [ + - ][ + - ]: 7540 : TopoDS_Wire loop;
294 [ + - ]: 3770 : if (need_update)
295 : : {
296 [ + - ][ + - ]: 3770 : loop = TopoDS::Wire(shape);
297 [ + - ][ + - ]: 3770 : OCCQueryEngine::instance()->update_OCC_map(*myTopoDSWire, loop);
298 : : }
299 [ + - ]: 3770 : return CUBIT_SUCCESS;
300 : : }
301 : :
302 : : //----------------------------------------------------------------
303 : : // Function: TopoDS_Shape level function to update the core Loop
304 : : // for split Boolean operation of the body.
305 : : // Author: Jane Hu
306 : : //----------------------------------------------------------------
307 : 0 : CubitStatus OCCLoop::update_OCC_entity(TopoDS_Wire & old_loop,
308 : : LocOpe_SplitShape* sp)
309 : : {
310 [ # # ]: 0 : TopTools_ListOfShape shapes;
311 [ # # ][ # # ]: 0 : shapes.Assign(sp->DescendantShapes(old_loop));
312 [ # # ][ # # ]: 0 : assert(shapes.Extent() == 1);
313 [ # # ][ # # ]: 0 : TopoDS_Shape new_loop = shapes.First();
[ # # ]
314 [ # # ][ # # ]: 0 : TopoDS_Shape shape_edge;
315 : :
316 : : //set curves
317 [ # # ][ # # ]: 0 : BRepTools_WireExplorer Ex;
318 [ # # ][ # # ]: 0 : for(Ex.Init(old_loop); Ex.More();Ex.Next())
[ # # ][ # # ]
319 : : {
320 [ # # ][ # # ]: 0 : TopoDS_Edge edge = Ex.Current();
321 [ # # ][ # # ]: 0 : shapes.Assign(sp->DescendantShapes(edge));
322 [ # # ][ # # ]: 0 : if(shapes.Extent() > 1)
323 : : {
324 [ # # ][ # # ]: 0 : shape_edge = shapes.First();
325 : :
326 [ # # ][ # # ]: 0 : OCCQueryEngine::instance()->update_OCC_map(edge, shape_edge);
327 : : }
328 [ # # ]: 0 : }
329 : :
330 [ # # ][ # # ]: 0 : OCCQueryEngine::instance()->update_OCC_map(old_loop , new_loop );
331 [ # # ]: 0 : return CUBIT_SUCCESS;
332 [ + - ][ + - ]: 6364 : }
|