Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : OCCLump.cpp
3 : : //
4 : : // Purpose :
5 : : //
6 : : // Creator : David White
7 : : //
8 : : // Creation Date : 7/18/2000
9 : : //
10 : : //-------------------------------------------------------------------------
11 : :
12 : : // ********** BEGIN STANDARD INCLUDES **********
13 : : #include <assert.h>
14 : : // ********** END STANDARD INCLUDES **********
15 : : // ********** BEGIN CUBIT INCLUDES **********
16 : : #include "OCCQueryEngine.hpp"
17 : : #include "OCCLump.hpp"
18 : : #include "CastTo.hpp"
19 : : #include "Surface.hpp"
20 : : #include "DLIList.hpp"
21 : : #include "CubitVector.hpp"
22 : : #include "CubitString.hpp"
23 : : #include "ShellSM.hpp"
24 : : #include "BodySM.hpp"
25 : : #include "Body.hpp"
26 : :
27 : : #include "OCCBody.hpp"
28 : : #include "OCCShell.hpp"
29 : : #include "OCCSurface.hpp"
30 : : #include "OCCLoop.hpp"
31 : : #include "OCCCoEdge.hpp"
32 : : #include "OCCCurve.hpp"
33 : : #include "OCCPoint.hpp"
34 : : #include "OCCAttribSet.hpp"
35 : :
36 : : #include <TopExp.hxx>
37 : : #include <TopTools_IndexedMapOfShape.hxx>
38 : : #include "BRepBuilderAPI_Transform.hxx"
39 : : #include "BRepBuilderAPI_GTransform.hxx"
40 : : #include "TopTools_DataMapOfShapeInteger.hxx"
41 : : #include "TopTools_ListIteratorOfListOfShape.hxx"
42 : : #include "BRepAlgoAPI_BooleanOperation.hxx"
43 : : #include "BRepBuilderAPI_MakeShape.hxx"
44 : : #include "BRepBuilderAPI_ModifyShape.hxx"
45 : : #include "Bnd_Box.hxx"
46 : : #include "BRepBndLib.hxx"
47 : : #include "GProp_GProps.hxx"
48 : : #include "BRepGProp.hxx"
49 : : #include "BRepClass3d_SolidExplorer.hxx"
50 : : #include "BRepClass3d_SClassifier.hxx"
51 : : #include "TopExp_Explorer.hxx"
52 : : #include "TopoDS.hxx"
53 : : #include "BRep_Tool.hxx"
54 : : #include "LocOpe_SplitShape.hxx"
55 : : // ********** END CUBIT INCLUDES **********
56 : :
57 : : // ********** BEGIN FORWARD DECLARATIONS **********
58 : : class RefVolume;
59 : : // ********** END FORWARD DECLARATIONS **********
60 : :
61 : : // ********** BEGIN STATIC DECLARATIONS **********
62 : : // ********** END STATIC DECLARATIONS **********
63 : :
64 : : // ********** BEGIN PUBLIC FUNCTIONS **********
65 : :
66 : : //-------------------------------------------------------------------------
67 : : // Purpose : The constructor with a pointer to TopoDS_Solid
68 : : //
69 : : // Special Notes :
70 : : //
71 : : //-------------------------------------------------------------------------
72 : 5714 : OCCLump::OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface, OCCShell* shell)
73 : : {
74 : 2857 : myTopoDSSolid = theSolid;
75 : 2857 : mySheetSurface = surface;
76 : 2857 : myShell = shell;
77 [ + + ][ + - ]: 2857 : if(myTopoDSSolid && !myTopoDSSolid->IsNull())
[ + - ][ + + ]
78 [ + - ][ - + ]: 2238 : assert(myTopoDSSolid->ShapeType() == TopAbs_SOLID);
79 : 2857 : }
80 : :
81 : 5367 : OCCLump::~OCCLump()
82 : : {
83 [ + + ]: 1789 : if (myTopoDSSolid)
84 : : {
85 [ + - ]: 1514 : myTopoDSSolid->Nullify();
86 [ + - ][ + - ]: 1514 : delete myTopoDSSolid;
[ + - ]
87 : : }
88 [ - + ]: 3578 : }
89 : :
90 : 1246 : void OCCLump::set_TopoDS_Solid(TopoDS_Solid solid)
91 : : {
92 [ + - ][ + + ]: 1246 : if(myTopoDSSolid && solid.IsEqual(*myTopoDSSolid) )
[ + + ]
93 : 295 : return;
94 : :
95 [ + - ]: 951 : if(myTopoDSSolid)
96 : 951 : myTopoDSSolid->Nullify() ;
97 : :
98 : 951 : *myTopoDSSolid = solid;
99 : : }
100 : : //-------------------------------------------------------------------------
101 : : // Purpose : Find centroid
102 : : //
103 : : // Special Notes :
104 : : //
105 : : // Author : Jane Hu
106 : : //
107 : : // Creation Date : 12/06/07
108 : : //-------------------------------------------------------------------------
109 : 0 : CubitStatus OCCLump::mass_properties( CubitVector& centroid,
110 : : double& volume )
111 : : {
112 [ # # ][ # # ]: 0 : if (mySheetSurface || myShell)
113 : 0 : return CUBIT_FAILURE;
114 : :
115 [ # # ]: 0 : GProp_GProps myProps;
116 [ # # ]: 0 : BRepGProp::VolumeProperties(*myTopoDSSolid, myProps);
117 [ # # ]: 0 : volume = myProps.Mass();
118 [ # # ]: 0 : gp_Pnt pt = myProps.CentreOfMass();
119 [ # # ][ # # ]: 0 : centroid.set(pt.X(), pt.Y(), pt.Z());
[ # # ][ # # ]
120 : :
121 : 0 : return CUBIT_SUCCESS;
122 : : }
123 : :
124 : : //-------------------------------------------------------------------------
125 : : // Purpose : The purpose of this function is to append a
126 : : // attribute to the GE. The name is attached to the
127 : : // underlying solid model entity this one points to.
128 : : //
129 : : //
130 : : // Special Notes :
131 : : //
132 : : // Creator : Malcolm J. Panthaki
133 : : //
134 : : // Creation Date : 11/21/96
135 : : //-------------------------------------------------------------------------
136 : 1350 : void OCCLump::append_simple_attribute_virt(const CubitSimpleAttrib &csa)
137 : : {
138 [ + - ]: 1350 : TopoDS_Shape shape;
139 [ - + ]: 1350 : if(mySheetSurface)
140 [ # # ][ # # ]: 0 : shape = *(mySheetSurface->get_TopoDS_Face());
141 [ - + ]: 1350 : else if(myShell)
142 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
143 : : else
144 [ + - ]: 1350 : shape =*myTopoDSSolid;
145 [ + - ][ + - ]: 1350 : OCCAttribSet::append_attribute(csa, shape);
146 : 1350 : }
147 : :
148 : : //-------------------------------------------------------------------------
149 : : // Purpose : The purpose of this function is to remove a simple
150 : : // attribute attached to this geometry entity. The name is
151 : : // removed from the underlying BODY this points to.
152 : : //
153 : : // Special Notes :
154 : : //
155 : : // Creator : David R. White
156 : : //
157 : : // Creation Date : 03/18/97
158 : : //-------------------------------------------------------------------------
159 : 8440 : void OCCLump::remove_simple_attribute_virt(const CubitSimpleAttrib &csa )
160 : : {
161 [ + - ]: 8440 : TopoDS_Shape shape;
162 [ + + ]: 8440 : if(mySheetSurface)
163 [ + - ][ + - ]: 1419 : shape = *(mySheetSurface->get_TopoDS_Face());
164 [ - + ]: 7021 : else if(myShell)
165 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
166 : : else
167 [ + - ]: 7021 : shape =*myTopoDSSolid;
168 [ + - ][ + - ]: 8440 : OCCAttribSet::remove_attribute(csa, shape);
169 : 8440 : }
170 : :
171 : : //-------------------------------------------------------------------------
172 : : // Purpose : The purpose of this function is to remove all simple
173 : : // attributes attached to this geometry entity. Also
174 : : // removes lingering GTC attributes.
175 : : //
176 : : //
177 : : // Special Notes :
178 : : //
179 : : // Creator : Greg Nielson
180 : : //
181 : : // Creation Date : 07/10/98
182 : : //-------------------------------------------------------------------------
183 : 5589 : void OCCLump::remove_all_simple_attribute_virt()
184 : : {
185 [ + - ]: 5589 : TopoDS_Shape shape;
186 [ + + ]: 5589 : if(mySheetSurface)
187 [ + - ][ + - ]: 1590 : shape = *(mySheetSurface->get_TopoDS_Face());
188 [ - + ]: 3999 : else if(myShell)
189 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
190 : : else
191 [ + - ]: 3999 : shape =*myTopoDSSolid;
192 [ + - ][ + - ]: 5589 : OCCAttribSet::remove_attribute(CubitSimpleAttrib(), shape);
[ + - ][ + - ]
193 : 5589 : }
194 : :
195 : : //-------------------------------------------------------------------------
196 : : // Purpose : The purpose of this function is to get the
197 : : // attributes attached to this geometry entity. The name is
198 : : // attached to the underlying BODY this points to.
199 : : //
200 : : // Special Notes :
201 : : //
202 : : //-------------------------------------------------------------------------
203 : 5294 : CubitStatus OCCLump::get_simple_attribute(DLIList<CubitSimpleAttrib>& csa_list)
204 : : {
205 [ + - ]: 5294 : TopoDS_Shape shape;
206 [ + + ]: 5294 : if(mySheetSurface)
207 [ + - ][ + - ]: 847 : shape = *(mySheetSurface->get_TopoDS_Face());
208 [ - + ]: 4447 : else if(myShell)
209 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
210 : : else
211 [ + - ]: 4447 : shape =*myTopoDSSolid;
212 [ + - ][ + - ]: 5294 : return OCCAttribSet::get_attributes(shape, csa_list );
213 : : }
214 : :
215 : 4255 : CubitStatus OCCLump::get_simple_attribute( const CubitString& name,
216 : : DLIList<CubitSimpleAttrib>& csa_list )
217 : : {
218 [ + - ]: 4255 : TopoDS_Shape shape;
219 [ + + ]: 4255 : if(mySheetSurface)
220 [ + - ][ + - ]: 960 : shape = *(mySheetSurface->get_TopoDS_Face());
221 [ - + ]: 3295 : else if(myShell)
222 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
223 : : else
224 [ + - ]: 3295 : shape =*myTopoDSSolid;
225 [ + - ][ + - ]: 4255 : return OCCAttribSet::get_attributes( name, shape, csa_list );
226 : : }
227 : :
228 : :
229 : : //-------------------------------------------------------------------------
230 : : // Purpose : Get the bounding box of the object.
231 : : //
232 : : // Special Notes :
233 : : //
234 : : //-------------------------------------------------------------------------
235 : 661 : CubitBox OCCLump::bounding_box() const
236 : : {
237 [ + - ]: 661 : Bnd_Box box;
238 [ + - ]: 661 : TopoDS_Shape shape;
239 [ + + ]: 661 : if(mySheetSurface)
240 [ + - ][ + - ]: 22 : shape = *(mySheetSurface->get_TopoDS_Face());
241 [ - + ]: 639 : else if(myShell)
242 [ # # ][ # # ]: 0 : shape = *(myShell->get_TopoDS_Shell());
243 : : else
244 [ + - ]: 639 : shape =*myTopoDSSolid;
245 : :
246 : : //calculate the bounding box
247 [ + - ]: 661 : BRepBndLib::Add(shape, box);
248 : : double min[3], max[3];
249 : :
250 : : //get values
251 [ + - ]: 661 : box.Get(min[0], min[1], min[2], max[0], max[1], max[2]);
252 : :
253 : : //update boundingbox.
254 [ + - ]: 661 : CubitBox cBox(min, max);
255 [ + - ]: 661 : return cBox;
256 : : }
257 : :
258 : : //-------------------------------------------------------------------------
259 : : // Purpose : Get geometry modeling engine: OCCGeometryEngine
260 : : //
261 : : // Special Notes :
262 : : //
263 : : //-------------------------------------------------------------------------
264 : : GeometryQueryEngine*
265 : 22 : OCCLump::get_geometry_query_engine() const
266 : : {
267 : 22 : return OCCQueryEngine::instance();
268 : : }
269 : :
270 : : //-------------------------------------------------------------------------
271 : : // Purpose : Returns the volume of the Lump
272 : : //
273 : : // Special Notes :
274 : : //
275 : : // Creator :
276 : : //
277 : : // Creation Date :
278 : : //-------------------------------------------------------------------------
279 : 106 : double OCCLump::measure()
280 : : {
281 [ + + ]: 106 : if(mySheetSurface)
282 [ + - ]: 22 : return mySheetSurface->measure();
283 [ - + ]: 84 : else if(myShell)
284 [ # # ]: 0 : return myShell->measure();
285 : :
286 [ + - ]: 84 : GProp_GProps myProps;
287 [ + - ]: 84 : BRepGProp::VolumeProperties(*myTopoDSSolid, myProps);
288 [ + - ]: 106 : return myProps.Mass();
289 : : }
290 : :
291 : 942 : void OCCLump::get_parents_virt(DLIList<TopologyBridge*> &bodies)
292 : : {
293 [ + + ]: 942 : if(mySheetSurface)
294 [ + - ]: 484 : bodies.append(mySheetSurface->my_body());
295 [ - + ]: 458 : else if (myShell)
296 [ # # ]: 0 : bodies.append(myShell->my_body());
297 : : else
298 [ + - ]: 458 : bodies.append(myBodyPtr);
299 : 942 : }
300 : :
301 : 4512 : BodySM* OCCLump::get_body() const
302 : : {
303 [ - + ]: 4512 : if(mySheetSurface)
304 : 0 : return mySheetSurface->my_body();
305 [ - + ]: 4512 : if(myShell)
306 : 0 : return myShell->my_body();
307 : 4512 : return myBodyPtr;
308 : : }
309 : :
310 : 24880 : void OCCLump::get_children_virt(DLIList<TopologyBridge*> &shellsms)
311 : : {
312 [ + + ]: 24880 : if (mySheetSurface)
313 : : {
314 [ + - ][ + - ]: 4223 : shellsms.append(mySheetSurface->my_shell());
315 : 24880 : return;
316 : : }
317 [ - + ]: 20657 : else if(myShell)
318 : : {
319 [ # # ]: 0 : shellsms.append(myShell);
320 : 0 : return;
321 : : }
322 [ + - ]: 20657 : TopTools_IndexedMapOfShape M;
323 [ + - ]: 20657 : TopExp::MapShapes(*myTopoDSSolid, TopAbs_SHELL, M);
324 : : int ii;
325 [ + - ][ + + ]: 41734 : for (ii=1; ii<=M.Extent(); ii++) {
326 [ + - ][ + - ]: 21077 : TopologyBridge *shell = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
[ + - ]
327 [ + + ]: 21077 : if (shell)
328 [ + - ]: 20835 : shellsms.append_unique(shell);
329 [ + - ]: 20657 : }
330 : : }
331 : :
332 : :
333 : :
334 : 0 : CubitPointContainment OCCLump::point_containment( const CubitVector &point )
335 : : {
336 [ # # ][ # # ]: 0 : if (mySheetSurface || myShell)
337 : 0 : return CUBIT_PNT_UNKNOWN;
338 : :
339 [ # # ]: 0 : TopoDS_Solid * solid = get_TopoDS_Solid();
340 [ # # ][ # # ]: 0 : gp_Pnt pnt(point.x(), point.y(), point.z());
[ # # ][ # # ]
341 [ # # ]: 0 : BRepClass3d_SolidExplorer ex(*solid);
342 : :
343 : : //use face tolerance at the tolerence to see if the point is on.
344 [ # # ][ # # ]: 0 : TopExp_Explorer Ex;
345 [ # # ]: 0 : Ex.Init(*solid, TopAbs_FACE);
346 [ # # ][ # # ]: 0 : TopoDS_Face face = TopoDS::Face(Ex.Current());
[ # # ][ # # ]
347 : :
348 [ # # ]: 0 : double dtol = BRep_Tool::Tolerance(face);
349 [ # # ][ # # ]: 0 : BRepClass3d_SClassifier ps(ex, pnt, dtol);
350 : :
351 [ # # ]: 0 : TopAbs_State state = ps.State();
352 [ # # ]: 0 : if (state == TopAbs_IN)
353 : 0 : return CUBIT_PNT_INSIDE;
354 [ # # ]: 0 : else if (state == TopAbs_OUT)
355 : 0 : return CUBIT_PNT_OUTSIDE;
356 [ # # ]: 0 : else if (state == TopAbs_ON)
357 : 0 : return CUBIT_PNT_BOUNDARY;
358 : :
359 [ # # ]: 0 : return CUBIT_PNT_UNKNOWN;
360 : :
361 : : }
362 : :
363 : : //----------------------------------------------------------------
364 : : // Function: to update the core Solid
365 : : // for any movement of the lump.
366 : : // Author: Jane Hu
367 : : //----------------------------------------------------------------
368 : 744 : CubitStatus OCCLump::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
369 : : BRepAlgoAPI_BooleanOperation *op)
370 : : {
371 [ + - ][ - + ]: 744 : if(mySheetSurface || myShell)
372 : 0 : return CUBIT_FAILURE;
373 : :
374 [ - + ][ # # ]: 744 : assert(aBRepTrsf != NULL || op != NULL);
375 : :
376 [ + - ]: 744 : TopoDS_Shape shape;
377 [ + - ]: 744 : if(aBRepTrsf)
378 [ + - ][ + - ]: 744 : shape = aBRepTrsf->ModifiedShape(*get_TopoDS_Solid());
[ + - ]
379 : :
380 : : else
381 : : {
382 [ # # ]: 0 : TopTools_ListOfShape shapes;
383 [ # # ][ # # ]: 0 : shapes.Assign(op->Modified(*get_TopoDS_Solid()));
[ # # ]
384 [ # # ][ # # ]: 0 : if(shapes.Extent() == 0)
385 [ # # ][ # # ]: 0 : shapes.Assign(op->Generated(*get_TopoDS_Solid()));
[ # # ]
386 [ # # ][ # # ]: 0 : if(shapes.Extent() > 1)
387 : : {
388 : : //update all attributes first.
389 [ # # ]: 0 : TopTools_ListIteratorOfListOfShape it;
390 [ # # ]: 0 : it.Initialize(shapes);
391 [ # # ][ # # ]: 0 : for(; it.More(); it.Next())
[ # # ]
392 : : {
393 [ # # ][ # # ]: 0 : shape = it.Value();
394 [ # # ]: 0 : OCCQueryEngine::instance()->copy_attributes(*get_TopoDS_Solid(),
395 [ # # ][ # # ]: 0 : shape);
396 : : }
397 [ # # ][ # # ]: 0 : shape = shapes.First();
398 : : }
399 [ # # ][ # # ]: 0 : else if (shapes.Extent() == 1)
400 [ # # ][ # # ]: 0 : shape = shapes.First();
401 [ # # ][ # # ]: 0 : else if(op->IsDeleted(*get_TopoDS_Solid()))
[ # # ]
402 : : ;
403 : : else
404 [ # # ][ # # ]: 0 : return CUBIT_SUCCESS;
405 : : }
406 : :
407 [ + - ][ + - ]: 1488 : TopoDS_Solid solid;
408 [ - + ][ # # ]: 744 : if(aBRepTrsf || !op->IsDeleted(*get_TopoDS_Solid()))
[ # # ][ # # ]
[ + - ]
409 [ + - ][ + - ]: 744 : solid = TopoDS::Solid(shape);
410 : :
411 : : //set the lumps
412 [ + - ][ + - ]: 1488 : DLIList<TopologyBridge *> shells;
413 [ + - ]: 744 : this->get_children_virt(shells);
414 [ + - ][ + + ]: 1488 : for (int i = 1; i <= shells.size(); i++)
415 : : {
416 [ + - ][ - + ]: 744 : OCCShell *shell = CAST_TO(shells.get_and_step(), OCCShell);
417 [ + - ]: 744 : shell->update_OCC_entity(aBRepTrsf, op);
418 : : }
419 [ + - ][ + - ]: 744 : OCCQueryEngine::instance()->update_OCC_map(*myTopoDSSolid, solid);
420 : :
421 [ + - ]: 744 : return CUBIT_SUCCESS;
422 : : }
423 : :
424 : : //----------------------------------------------------------------
425 : : // Function: TopoDS_Shape level function to update the core Lump
426 : : // for any movement or Boolean operation of the body.
427 : : // Author: Jane Hu
428 : : //----------------------------------------------------------------
429 : 394 : CubitStatus OCCLump::update_OCC_entity(TopoDS_Solid& old_solid,
430 : : TopoDS_Shape& new_shape,
431 : : BRepBuilderAPI_MakeShape *op,
432 : : LocOpe_SplitShape* sp)
433 : : {
434 : : //set the Shells
435 [ + - ]: 394 : TopTools_IndexedMapOfShape M;
436 [ + - ][ + - ]: 788 : TopoDS_Shape shape, shape2;
[ + - ][ + - ]
437 [ + - ]: 394 : TopExp::MapShapes(new_shape, TopAbs_SOLID,M);
438 [ + - ][ + - ]: 788 : TopoDS_Solid new_solid;
439 : 394 : CubitBoolean isCompound = CUBIT_FALSE;
440 [ + - ][ + + ]: 394 : if(M.Extent() > 1 )
441 : 77 : isCompound = CUBIT_TRUE;
442 : :
443 [ + - ][ + + ]: 394 : if(M.Extent() == 1 )
444 [ + - ][ + - ]: 295 : new_solid = TopoDS::Solid(M(1));
[ + - ]
445 : :
446 [ + - ]: 394 : M.Clear();
447 [ + - ]: 394 : TopExp::MapShapes(old_solid, TopAbs_SHELL, M);
448 [ + - ][ + - ]: 788 : TopTools_ListOfShape shapes;
449 : :
450 [ + - ][ + + ]: 788 : for(int ii=1; ii<=M.Extent(); ii++)
451 : : {
452 [ + - ][ + - ]: 394 : TopoDS_Shell shell = TopoDS::Shell(M(ii));
[ + - ]
453 : :
454 [ + - ][ + - ]: 788 : TopTools_ListOfShape shapes;
[ + - ]
455 [ + - ][ + - ]: 788 : TopTools_IndexedMapOfShape M2;
[ + - ]
456 [ + - ]: 394 : if (op)
457 : : {
458 [ + - ][ + - ]: 394 : shapes.Assign(op->Modified(shell));
459 [ + - ][ + + ]: 394 : if(shapes.Extent() == 0)
460 [ + - ][ + - ]: 361 : shapes.Assign(op->Generated(shell));
461 : : // bug fix for hollow operation, in which a new shell is genearted
462 : : // but the shapes we get from old_shell->Generated() is still old_shell
463 : : // not the new one.
464 [ + - ][ + + ]: 394 : if(!new_solid.IsNull())
465 [ + - ]: 295 : TopExp::MapShapes(new_solid, TopAbs_SHELL, M2);
466 : : }
467 [ # # ]: 0 : else if(sp)
468 [ # # ][ # # ]: 0 : shapes.Assign(sp->DescendantShapes(shell));
469 : :
470 [ + - ][ + + ]: 394 : if (shapes.Extent() == 1)
471 : : {
472 [ + - ][ + - ]: 33 : shape = shapes.First();
473 [ + - ][ + - ]: 33 : if(M2.Extent() > 0)
474 [ + - ][ + - ]: 33 : shape2 = TopoDS::Shell(M2(1));
[ + - ]
475 [ + - ][ + - ]: 33 : if(M2.Extent() == 1 && !shape.IsSame(shape2))
[ + - ][ - + ]
[ - + ]
476 [ # # ]: 0 : shape = shape2;
477 [ + - ][ - + ]: 33 : else if(M2.Extent() > 1)
478 : : {
479 [ # # ]: 0 : shapes.Clear();
480 [ # # ][ # # ]: 33 : for(int jj = 1; jj <= M2.Extent(); jj++)
481 [ # # ][ # # ]: 0 : shapes.Append(M2(jj));
482 : : }
483 : : }
484 : :
485 [ + - ][ - + ]: 361 : else if(shapes.Extent() > 1)
486 : : {
487 : : //update all attributes first.
488 [ # # ]: 0 : TopTools_ListIteratorOfListOfShape it;
489 [ # # ]: 0 : it.Initialize(shapes);
490 [ # # ][ # # ]: 0 : for(; it.More(); it.Next())
[ # # ]
491 : : {
492 [ # # ][ # # ]: 0 : shape = it.Value();
493 [ # # ][ # # ]: 0 : OCCQueryEngine::instance()->copy_attributes(shell, shape);
494 : : }
495 [ # # ][ # # ]: 0 : shape = shapes.First();
496 : : }
497 [ + - ][ + - ]: 361 : else if(op->IsDeleted(shell))
498 : : {
499 [ + - ]: 361 : TopTools_IndexedMapOfShape M_new;
500 [ + - ]: 361 : TopExp::MapShapes(new_shape, TopAbs_SHELL, M_new);
501 [ + - ][ + + ]: 361 : if (M_new.Extent()== 1)
502 [ + - ][ + - ]: 262 : shape = M_new(1);
503 : : else
504 [ + - ][ + - ]: 361 : shape.Nullify();
505 : : }
506 : : else
507 : : {
508 [ # # ]: 0 : shape = shell;
509 : 0 : continue;
510 : : }
511 : :
512 [ + - ][ + + ]: 394 : if(shapes.Extent() > 0 || (op && op->IsDeleted(shell)))
[ + - ][ + - ]
[ + - ][ + - ]
513 [ + - ][ + - ]: 394 : OCCShell::update_OCC_entity(shell, shape, op, sp);
[ + - ]
514 : 394 : }
515 [ + - ][ + + ]: 394 : if(!new_solid.IsNull() && !old_solid.IsSame(new_solid))
[ + - ][ + - ]
[ + + ]
516 [ + - ][ + - ]: 295 : OCCQueryEngine::instance()->update_OCC_map(old_solid, new_solid);
517 [ + + ]: 99 : else if(isCompound)
518 [ + - ][ + - ]: 77 : OCCQueryEngine::instance()->update_OCC_map(old_solid, new_shape);
519 [ + - ]: 394 : return CUBIT_SUCCESS;
520 [ + - ][ + - ]: 6364 : }
|