Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : OCCShell.cpp
3 : : //
4 : : // Purpose :
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : David White
9 : : //
10 : : // Creation Date : 7/18/2000
11 : : //
12 : : //-------------------------------------------------------------------------
13 : :
14 : : // ********** BEGIN STANDARD INCLUDES **********
15 : : #include <stddef.h>
16 : : // ********** END STANDARD INCLUDES **********
17 : : // ********** BEGIN CUBIT INCLUDES **********
18 : : #include "CastTo.hpp"
19 : : #include "CubitUtil.hpp"
20 : :
21 : : #include "OCCQueryEngine.hpp"
22 : : #include "OCCShell.hpp"
23 : : #include "ShellSM.hpp"
24 : : #include "Lump.hpp"
25 : : #include "Surface.hpp"
26 : :
27 : : #include "OCCBody.hpp"
28 : : #include "OCCLump.hpp"
29 : : #include "OCCSurface.hpp"
30 : : #include "GfxDebug.hpp"
31 : :
32 : : #include <TopExp.hxx>
33 : : #include <TopTools_IndexedMapOfShape.hxx>
34 : : #include "TopExp_Explorer.hxx"
35 : : #include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
36 : : #include "TopoDS.hxx"
37 : : #include "TopTools_ListIteratorOfListOfShape.hxx"
38 : : #include "GProp_GProps.hxx"
39 : : #include "BRepGProp.hxx"
40 : : #include "TopTools_DataMapOfShapeInteger.hxx"
41 : : #include "TopTools_ListOfShape.hxx"
42 : : #include "BRepAlgoAPI_BooleanOperation.hxx"
43 : : #include "BRepBuilderAPI_MakeShape.hxx"
44 : : #include "BRepBuilderAPI_ModifyShape.hxx"
45 : : #include "BRepBuilderAPI_Transform.hxx"
46 : : #include "BRepBuilderAPI_GTransform.hxx"
47 : : #include "LocOpe_SplitShape.hxx"
48 : : #include "TopoDS_Compound.hxx"
49 : : // ********** END CUBIT INCLUDES **********
50 : :
51 : : // ********** BEGIN STATIC DECLARATIONS **********
52 : : // ********** END STATIC DECLARATIONS **********
53 : :
54 : : // ********** BEGIN PUBLIC FUNCTIONS **********
55 : :
56 : :
57 : : //-------------------------------------------------------------------------
58 : : // Purpose : A constructor with a pointer to an OCC SHELL.
59 : : //
60 : : // Special Notes :
61 : : //
62 : : //-------------------------------------------------------------------------
63 [ + - ]: 5834 : OCCShell::OCCShell(TopoDS_Shell *theShell, OCCSurface* surface)
64 : : {
65 : 2917 : myTopoDSShell = theShell;
66 : 2917 : mySheetSurface = surface;
67 [ + + ][ + - ]: 2917 : if(myTopoDSShell && !myTopoDSShell->IsNull())
[ + - ][ + + ]
68 [ + - ][ - + ]: 2298 : assert (myTopoDSShell->ShapeType() == TopAbs_SHELL);
69 : 2917 : }
70 : :
71 : : //-------------------------------------------------------------------------
72 : : // Purpose : The destructor.
73 : : //
74 : : // Special Notes :
75 : : //
76 : : //-------------------------------------------------------------------------
77 [ + - ]: 5367 : OCCShell::~OCCShell()
78 : : {
79 [ + + ]: 1789 : if(myTopoDSShell)
80 : : {
81 [ + - ]: 1514 : myTopoDSShell->Nullify();
82 [ + - ][ + - ]: 1514 : delete (TopoDS_Shell*)myTopoDSShell;
[ + - ]
83 : 1514 : myTopoDSShell = NULL;
84 : : }
85 [ - + ]: 3578 : }
86 : :
87 : 1246 : void OCCShell::set_TopoDS_Shell(TopoDS_Shell shell)
88 : : {
89 [ + - ][ + + ]: 1246 : if(myTopoDSShell && shell.IsEqual(*myTopoDSShell))
[ + + ]
90 : 295 : return;
91 : :
92 [ + - ]: 951 : if (myTopoDSShell)
93 : 951 : myTopoDSShell->Nullify();
94 : :
95 : 951 : *myTopoDSShell = shell;
96 : : }
97 : :
98 : : //-------------------------------------------------------------------------
99 : : // Purpose : Get geometry modeling engine: OCCQueryEngine
100 : : //
101 : : // Special Notes :
102 : : //
103 : : //-------------------------------------------------------------------------
104 : : GeometryQueryEngine*
105 : 11 : OCCShell::get_geometry_query_engine() const
106 : : {
107 : 11 : return OCCQueryEngine::instance();
108 : : }
109 : :
110 : 0 : void OCCShell::append_simple_attribute_virt(const CubitSimpleAttrib&)
111 : : {
112 : 0 : }
113 : 0 : void OCCShell::remove_simple_attribute_virt(const CubitSimpleAttrib& )
114 : : {
115 : 0 : }
116 : 0 : void OCCShell::remove_all_simple_attribute_virt()
117 : : {
118 : 0 : }
119 : 0 : CubitStatus OCCShell::get_simple_attribute(DLIList<CubitSimpleAttrib>&)
120 : : {
121 : 0 : return CUBIT_FAILURE;
122 : : }
123 : 0 : CubitStatus OCCShell::get_simple_attribute(const CubitString&,
124 : : DLIList<CubitSimpleAttrib>&)
125 : 0 : { return CUBIT_FAILURE; }
126 : :
127 : : //-------------------------------------------------------------------------
128 : : // Purpose : Query solid modeler topology
129 : : //
130 : : // Special Notes :
131 : : //
132 : : // Author : Jane Hu
133 : : //
134 : : // Creation Date : 11/28/07
135 : : //-------------------------------------------------------------------------
136 : 22 : void OCCShell::get_parents_virt( DLIList<TopologyBridge*>& parents )
137 : : {
138 [ + + ]: 22 : if(mySheetSurface)
139 : : {
140 [ + - ][ + - ]: 11 : parents.append(mySheetSurface->my_lump());
141 : 22 : return;
142 : : }
143 : :
144 [ + - ]: 11 : OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
145 : 11 : OCCBody * body = NULL;
146 : 11 : DLIList <OCCBody* > *bodies = oqe->BodyList;
147 [ + - ]: 11 : TopTools_IndexedDataMapOfShapeListOfShape M;
148 [ + - ][ + + ]: 22 : for(int i = 0; i < bodies->size(); i++)
149 : : {
150 [ + - ]: 11 : body = bodies->get_and_step();
151 : : TopoDS_Shape* shape ;
152 [ + - ]: 11 : body->get_TopoDS_Shape(shape);
153 [ - + ]: 11 : assert(shape != NULL);
154 : : TopExp::MapShapesAndAncestors(*shape,
155 [ + - ]: 11 : TopAbs_SHELL, TopAbs_SOLID, M);
156 [ + - ]: 11 : TopoDS_Shell *shell = get_TopoDS_Shell();
157 [ + - ][ - + ]: 11 : if (!M.Contains(*shell))
158 : 0 : continue;
159 : :
160 : : const TopTools_ListOfShape& ListOfShapes =
161 [ + - ][ + - ]: 11 : M.FindFromKey(*(get_TopoDS_Shell()));
162 [ + - ][ + - ]: 11 : if (!ListOfShapes.IsEmpty())
163 : : {
164 [ + - ]: 11 : TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
165 [ + - ][ + - ]: 22 : for (;it.More(); it.Next())
[ + + ]
166 : : {
167 [ + - ][ + - ]: 11 : TopoDS_Solid Solid = TopoDS::Solid(it.Value());
[ + - ]
168 [ + - ]: 11 : int k = oqe->OCCMap->Find(Solid);
169 [ + - ][ + - ]: 11 : parents.append((OCCLump*)(oqe->OccToCGM->find(k))->second);
[ + - ]
170 [ + - ]: 11 : }
171 : : }
172 [ + - ]: 11 : }
173 : : }
174 : :
175 : :
176 : 23665 : void OCCShell::get_children_virt( DLIList<TopologyBridge*>& children )
177 : : {
178 [ + + ]: 23665 : if(mySheetSurface)
179 : : {
180 [ + - ]: 4223 : children.append(mySheetSurface);
181 : 23665 : return;
182 : : }
183 [ + - ]: 19442 : TopTools_IndexedMapOfShape M;
184 [ + - ]: 19442 : TopExp::MapShapes(*myTopoDSShell, TopAbs_FACE, M);
185 : : int ii;
186 [ + - ][ + + ]: 152685 : for (ii=1; ii<=M.Extent(); ii++) {
187 [ + - ][ + - ]: 133243 : TopologyBridge *surface = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
[ + - ]
188 [ + - ]: 133243 : if(surface)
189 [ + - ]: 133243 : children.append_unique(surface);
190 [ + - ]: 19442 : }
191 : : }
192 : :
193 : : //----------------------------------------------------------------
194 : : // Function: to update the core Shell
195 : : // for any movement of the body.
196 : : // Author: Jane Hu
197 : : //----------------------------------------------------------------
198 : 744 : CubitStatus OCCShell::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
199 : : BRepAlgoAPI_BooleanOperation *op)
200 : : {
201 [ - + ][ # # ]: 744 : if(mySheetSurface && op == NULL)
202 : 0 : return CUBIT_FAILURE;
203 : :
204 [ - + ][ # # ]: 744 : assert (aBRepTrsf != NULL || op != NULL);
205 : :
206 [ + - ]: 744 : TopoDS_Shape shape;
207 [ + - ]: 744 : if(aBRepTrsf)
208 [ + - ][ + - ]: 744 : shape = aBRepTrsf->ModifiedShape(*get_TopoDS_Shell());
[ + - ]
209 : :
210 [ # # ]: 0 : else if(!mySheetSurface)
211 : : {
212 [ # # ]: 0 : TopTools_ListOfShape shapes;
213 [ # # ][ # # ]: 0 : shapes.Assign(op->Modified(*get_TopoDS_Shell()));
[ # # ]
214 [ # # ][ # # ]: 0 : if(shapes.Extent() == 0)
215 [ # # ][ # # ]: 0 : shapes.Assign(op->Generated(*get_TopoDS_Shell()));
[ # # ]
216 [ # # ][ # # ]: 0 : if (shapes.Extent())
217 [ # # ][ # # ]: 0 : shape = shapes.First();
218 : :
219 [ # # ][ # # ]: 0 : else if(op->IsDeleted(*get_TopoDS_Shell()))
[ # # ]
220 : : ;
221 : : else
222 [ # # ][ # # ]: 0 : return CUBIT_SUCCESS;
223 : : }
224 [ + - ][ + - ]: 1488 : TopoDS_Shell shell;
225 [ + - ][ + - ]: 744 : if (!shape.IsNull())
226 [ + - ][ + - ]: 744 : shell = TopoDS::Shell(shape);
227 : :
228 : : //set the surfaces
229 [ + - ][ + - ]: 1488 : DLIList<TopologyBridge *> surfaces;
230 [ + - ]: 744 : this->get_children_virt(surfaces);
231 [ + - ][ + + ]: 4334 : for (int i = 1; i <= surfaces.size(); i++)
232 : : {
233 [ + - ][ - + ]: 3590 : OCCSurface *surface = CAST_TO(surfaces.get_and_step(), OCCSurface);
234 [ + - ]: 3590 : surface->update_OCC_entity(aBRepTrsf, op);
235 : : }
236 [ + - ][ + - ]: 744 : OCCQueryEngine::instance()->update_OCC_map(*myTopoDSShell, shell);
237 [ + - ]: 744 : return CUBIT_SUCCESS;
238 : : }
239 : :
240 : : //-------------------------------------------------------------------------
241 : : // Purpose : Returns the area of the Shell
242 : : //
243 : : //-------------------------------------------------------------------------
244 : 0 : double OCCShell::measure()
245 : : {
246 [ # # ]: 0 : GProp_GProps myProps;
247 [ # # ]: 0 : BRepGProp::SurfaceProperties(*myTopoDSShell, myProps);
248 [ # # ]: 0 : return myProps.Mass();
249 : : }
250 : :
251 : : //----------------------------------------------------------------
252 : : // Function: TopoDS_Shape level function to update the core Shell
253 : : // for any boolean operation of the body.
254 : : // Author: Jane Hu
255 : : //----------------------------------------------------------------
256 : 394 : CubitStatus OCCShell::update_OCC_entity(TopoDS_Shell& old_shell,
257 : : TopoDS_Shape& new_shell,
258 : : BRepBuilderAPI_MakeShape *op,
259 : : LocOpe_SplitShape* sp)
260 : : {
261 : : //set the surfaces
262 [ + - ]: 394 : TopTools_IndexedMapOfShape M;
263 [ + - ][ + - ]: 788 : TopoDS_Shape shape;
264 [ + - ]: 394 : TopExp::MapShapes(old_shell, TopAbs_FACE, M);
265 [ + - ][ + - ]: 788 : TopTools_ListOfShape shapes;
266 [ + - ][ + + ]: 2615 : for(int ii=1; ii<=M.Extent(); ii++)
267 : : {
268 [ + - ][ + - ]: 2221 : TopoDS_Face face = TopoDS::Face(M(ii));
[ + - ]
269 [ + - ]: 2221 : if (op)
270 : : {
271 [ + - ][ + - ]: 2221 : shapes.Assign(op->Modified(face));
272 [ + - ][ + + ]: 2221 : if(shapes.Extent() == 0)
273 [ + - ][ + - ]: 971 : shapes.Assign(op->Generated(face));
274 : : }
275 [ # # ]: 0 : else if(sp)
276 [ # # ][ # # ]: 0 : shapes.Assign(sp->DescendantShapes(face));
277 : :
278 [ + - ][ + + ]: 2221 : if(shapes.Extent() == 1)
279 [ + - ][ + - ]: 997 : shape = shapes.First();
280 [ + - ][ + + ]: 1224 : else if(shapes.Extent() > 1)
281 : : {
282 [ + - ][ + - ]: 253 : shape = shapes.First() ;
283 : : }
284 : : else
285 : : {
286 [ + - ]: 971 : TopoDS_Face nullFace;
287 [ + - ][ + - ]: 971 : shape = nullFace;
288 : : }
289 [ + - ][ + + ]: 2221 : if(shapes.Extent() > 0 || (op && op->IsDeleted(face)))
[ + - ][ + - ]
[ + + ][ + + ]
290 [ + - ]: 1525 : OCCSurface::update_OCC_entity(face,shape, op, NULL, sp);
291 [ + - ]: 2221 : }
292 [ + - ][ + - ]: 394 : if(!old_shell.IsSame(new_shell))
293 [ + - ][ + - ]: 394 : OCCQueryEngine::instance()->update_OCC_map(old_shell, new_shell);
294 [ + - ]: 394 : return CUBIT_SUCCESS;
295 [ + - ][ + - ]: 6364 : }
296 : : // ********** END PUBLIC FUNCTIONS **********
297 : :
298 : : // ********** BEGIN PROTECTED FUNCTIONS **********
299 : : // ********** END PROTECTED FUNCTIONS **********
300 : :
301 : : // ********** BEGIN PRIVATE FUNCTIONS **********
302 : : // ********** END PRIVATE FUNCTIONS **********
303 : :
304 : : // ********** BEGIN HELPER CLASSES **********
305 : : // ********** END HELPER CLASSES **********
306 : :
307 : : // ********** BEGIN EXTERN FUNCTIONS **********
308 : : // ********** END EXTERN FUNCTIONS **********
309 : :
310 : : // ********** BEGIN STATIC FUNCTIONS **********
311 : : // ********** END STATIC FUNCTIONS **********
312 : :
|