0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / samples / mfc / occtdemo / Glue / Glue_Presentation.cpp
CommitLineData
7fd59977 1// Glue_Presentation.cpp: implementation of the Glue_Presentation class.
2// Glue two solid shapes with contiguous faces
3//////////////////////////////////////////////////////////////////////
4
5#include "stdafx.h"
6#include "Glue_Presentation.h"
7#include <OCCDemoDoc.h>
8
9#include <TopoDS_Solid.hxx>
10#include <BRepPrimAPI_MakeBox.hxx>
11#include <BRepFeat_Gluer.hxx>
12#include <TopExp.hxx>
13#include <TopTools_IndexedMapOfShape.hxx>
14#include <TopoDS.hxx>
15#include <BRepBuilderAPI_MakeEdge.hxx>
16#include <Geom_Circle.hxx>
17#include <Geom_TrimmedCurve.hxx>
18#include <BRepBuilderAPI_MakeWire.hxx>
19#include <BRepPrimAPI_MakePrism.hxx>
20#include <BRepBuilderAPI_MakeFace.hxx>
21#include <BRepPrimAPI_MakeCylinder.hxx>
22#include <BRepAlgoAPI_Cut.hxx>
23#include <TopTools_ListOfShape.hxx>
24#include <TopTools_ListIteratorOfListOfShape.hxx>
25
26
27// Initialization of global variable with an instance of this class
28OCCDemo_Presentation* OCCDemo_Presentation::Current = new Glue_Presentation;
29
30// Initialization of array of samples
31const Glue_Presentation::PSampleFuncType Glue_Presentation::SampleFuncs[] =
32{
33 //&Glue_Presentation::sampleBoxes1,
34 &Glue_Presentation::sampleBoxes,
35 &Glue_Presentation::sampleCylinder,
36 //&Glue_Presentation::sampleMoreBoxes
37};
38
39#ifdef WNT
40 #define EOL "\r\n"
41#else
42 #define EOL "\n"
43#endif
44
45#define RESULT_SHAPE_COLOR Quantity_NOC_ORANGE
46
47//////////////////////////////////////////////////////////////////////
48// Construction/Destruction
49//////////////////////////////////////////////////////////////////////
50
51Glue_Presentation::Glue_Presentation()
52{
53 myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
54 setName ("Glue shapes");
55}
56
57//////////////////////////////////////////////////////////////////////
58// Sample execution
59//////////////////////////////////////////////////////////////////////
60
61void Glue_Presentation::DoSample()
62{
63 getAISContext()->EraseAll();
64 if (myIndex >=0 && myIndex < myNbSamples)
65 (this->*SampleFuncs[myIndex])();
66}
67
68//////////////////////////////////////////////////////////////////////
69// Sample functions
70//////////////////////////////////////////////////////////////////////
71//================================================================
72// Function : Glue_Presentation::sampleBoxes
73// Purpose :
74//================================================================
75void Glue_Presentation::sampleBoxes()
76{
77 setResultTitle("Glue two solids");
78 setResultText(
79 " // Create shapes" EOL
80 " TopoDS_Solid aShape1;" EOL
81 " TopoDS_Solid aShape2; " EOL
82 " //aShape1 = ..." EOL
83 " //aShape2 = ..." EOL
84 "" EOL
85 " // Define same domain faces on aShape1 and aShape2" EOL
86 " TopoDS_Face aFace1;" EOL
87 " TopoDS_Face aFace2;" EOL
88 " //aFace1 = ..." EOL
89 " //aFace2 = ..." EOL
90 "" EOL
91 " // Define same domain edges on aShape1 and aShape2" EOL
92 " TopoDS_Edge aEdge1;" EOL
93 " TopoDS_Edge aEdge2;" EOL
94 " //aEdge1 = ..." EOL
95 " //aEdge2 = ..." EOL
96 "" EOL
97 " BRepFeat_Gluer aGluer(aShape2, aShape1);" EOL
98 " aGluer.Bind(aFace2, aFace1);" EOL
99 " aGluer.Bind(aEdge2, aEdge1);" EOL
100 " aGluer.Build();" EOL
101 "" EOL
102 " TopoDS_Shape aGluedShape;" EOL
103 " if (aGluer.IsDone())" EOL
104 " aGluedShape = aGluer;" EOL);
105
106 Standard_Real a = 10.0;
107 TopoDS_Solid aShape1 = BRepPrimAPI_MakeBox(a,a,a);
108 TopoDS_Solid aShape2 = BRepPrimAPI_MakeBox(gp_Pnt(a,a/2,a/4),a/2,a/2,a/2);
109
110 TopTools_IndexedMapOfShape aShape1Faces, aShape2Faces;
111 TopTools_IndexedMapOfShape aShape1Edges, aShape2Edges;
112 TopExp::MapShapes(aShape1, TopAbs_FACE, aShape1Faces);
113 TopExp::MapShapes(aShape2, TopAbs_FACE, aShape2Faces);
114 TopExp::MapShapes(aShape1, TopAbs_EDGE, aShape1Edges);
115 TopExp::MapShapes(aShape2, TopAbs_EDGE, aShape2Edges);
116 Standard_Integer fi1 = 2, fi2 = 1, ei1 = 7, ei2 = 3;
117 TopoDS_Face aFace1 = TopoDS::Face(aShape1Faces(fi1));
118 TopoDS_Face aFace2 = TopoDS::Face(aShape2Faces(fi2));
119 TopoDS_Edge aEdge1 = TopoDS::Edge(aShape1Edges(ei1));
120 TopoDS_Edge aEdge2 = TopoDS::Edge(aShape2Edges(ei2));
121
122 BRepFeat_Gluer aGluer(aShape2, aShape1);
123 aGluer.Bind(aFace2, aFace1);
124 aGluer.Bind(aEdge2, aEdge1);
125 aGluer.Build();
126
127 TopoDS_Shape aGluedShape;
128 if (aGluer.IsDone())
129 aGluedShape = aGluer;
130
131 TopTools_ListOfShape aEdges1,aEdges2,aFaces1,aFaces2;
132 aEdges1.Append(aEdge1); aEdges2.Append(aEdge2);
133 aFaces1.Append(aFace1); aFaces2.Append(aFace2);
134
135 displayShapesFaces(aShape1,aShape2,aGluedShape,aFaces1,aFaces2,aEdges1,aEdges2);
136}
137
138//================================================================
139// Function : Glue_Presentation::sampleCylinder
140// Purpose :
141//================================================================
142void Glue_Presentation::sampleCylinder()
143{
144 setResultTitle("Glue two solids");
145 setResultText(
146 " // Create shapes" EOL
147 " TopoDS_Solid aShape1;" EOL
148 " TopoDS_Solid aShape2; " EOL
149 " //aShape1 = ..." EOL
150 " //aShape2 = ..." EOL
151 "" EOL
152 " // Define same domain faces on aShape1 and aShape2" EOL
153 " TopoDS_Face aFace1;" EOL
154 " TopoDS_Face aFace2;" EOL
155 " //aFace1 = ..." EOL
156 " //aFace2 = ..." EOL
157 "" EOL
158 " BRepFeat_Gluer aGluer(aShape2, aShape1);" EOL
159 " aGluer.Bind(aFace2, aFace1);" EOL
160 " aGluer.Build();" EOL
161 "" EOL
162 " TopoDS_Shape aGluedShape;" EOL
163 " if (aGluer.IsDone())" EOL
164 " aGluedShape = aGluer;" EOL);
165
166 TopoDS_Edge e1 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,0,0),gp_Pnt(5,0,0));
167 TopoDS_Edge e3 = BRepBuilderAPI_MakeEdge(gp_Pnt(19,0,0),gp_Pnt(24,0,0));
168 TopoDS_Edge e4 = BRepBuilderAPI_MakeEdge(gp_Pnt(24,0,0),gp_Pnt(24,15,0));
169 TopoDS_Edge e5 = BRepBuilderAPI_MakeEdge(gp_Pnt(24,15,0),gp_Pnt(0,15,0));
170 TopoDS_Edge e6 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,15,0),gp_Pnt(0,0,0));
92efcf78 171 Handle(Geom_Circle) e2C = new Geom_Circle(gp_Ax2(gp_Pnt(12,0,0), gp_Dir(0,0,1)), 7);
7fd59977 172 e2C->Rotate(gp_Ax1(gp_Pnt(12,0,0),gp_Dir(0,0,1)),PI);
92efcf78 173 Handle(Geom_TrimmedCurve) e2A = new Geom_TrimmedCurve(e2C, PI, 2*PI);
7fd59977 174 TopoDS_Edge e2 = BRepBuilderAPI_MakeEdge(e2A);
175
176 BRepBuilderAPI_MakeWire wireMaker(e1,e2,e3,e4);
177 wireMaker.Add(e5);
178 wireMaker.Add(e6);
179
180 TopoDS_Face aFace = BRepBuilderAPI_MakeFace(wireMaker);
181
182 TopoDS_Shape aShape1 = BRepPrimAPI_MakePrism(aFace, gp_Vec(gp_Pnt(0,0,0),gp_Pnt(0,0,30)));
183
184 TopoDS_Shape aShape2 = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(12,0,-10),gp_Dir(0,0,1), gp_Dir(-0.5,-0.5,0)), 7, 50);
185
186 TopTools_IndexedMapOfShape aShape1Faces, aShape2Faces;
187 TopExp::MapShapes(aShape1, TopAbs_FACE, aShape1Faces);
188 TopExp::MapShapes(aShape2, TopAbs_FACE, aShape2Faces);
189 Standard_Integer fi1 = 2;
190 Standard_Integer fi2 = 1;
191 TopoDS_Face aFace1 = TopoDS::Face(aShape1Faces(fi1));
192 TopoDS_Face aFace2 = TopoDS::Face(aShape2Faces(fi2));
193
194 BRepFeat_Gluer aGluer(aShape1, aShape2);
195 aGluer.Bind(aFace1, aFace2);
196 aGluer.Build();
197
198 TopoDS_Shape aGluedShape;
199 if (aGluer.IsDone())
200 aGluedShape = aGluer;
201
202 TopTools_ListOfShape aEdges1,aEdges2,aFaces1,aFaces2;
203 aFaces1.Append(aFace1); aFaces2.Append(aFace2);
204
205 displayShapesFaces(aShape1, aShape2, aGluedShape, aFaces1, aFaces2, aEdges1, aEdges2);
206}
207
208//================================================================
209// Function : Glue_Presentation::sampleMoreBoxes
210// Purpose :
211//================================================================
212void Glue_Presentation::sampleMoreBoxes()
213{
214 setResultTitle("Glue two solids");
215 setResultText(
216 " // Create shapes" EOL
217 " TopoDS_Solid aShape1;" EOL
218 " TopoDS_Solid aShape2; " EOL
219 " //aShape1 = ..." EOL
220 " //aShape2 = ..." EOL
221 "" EOL
222 " // Define same domain faces on aShape1 and aShape2" EOL
223 " TopoDS_Face aFace11,aFace12,aFace13;" EOL
224 " TopoDS_Face aFace21,aFace22,aFace23;" EOL
225 " //aFace11 = ..." EOL
226 " //aFace21 = ..." EOL
227 "" EOL
228 " // Define same domain edges on aShape1 and aShape2" EOL
229 " TopoDS_Edge aEdge11,aEdge12,aEdge13;" EOL
230 " TopoDS_Edge aEdge21,aEdge22,aEdge23;" EOL
231 " //aEdge11 = ..." EOL
232 " //aEdge21 = ..." EOL
233 "" EOL
234 " BRepFeat_Gluer aGluer(aShape2, aShape1);" EOL
235 " aGluer.Bind(aFace21, aFace11);" EOL
236 " aGluer.Bind(aFace22, aFace12);" EOL
237 " aGluer.Bind(aFace23, aFace13);" EOL
238 " aGluer.Bind(aEdge21, aEdge11);" EOL
239 " aGluer.Bind(aEdge22, aEdge12);" EOL
240 " aGluer.Bind(aEdge23, aEdge13);" EOL
241 " aGluer.Build();" EOL
242 "" EOL
243 " TopoDS_Shape aGluedShape;" EOL
244 " if (aGluer.IsDone())" EOL
245 " aGluedShape = aGluer;" EOL);
246
247 TopoDS_Shape aShape1;
248 TopoDS_Shape aShape2;
249
250 Standard_Real a = 10.0;
251 TopoDS_Solid aBox1 = BRepPrimAPI_MakeBox(a,a,a);
252 TopoDS_Solid aBox2 = BRepPrimAPI_MakeBox(gp_Pnt(a/2,a/2,a/2),a,a,a);
253
254 BRepAlgoAPI_Cut aCutter(aBox1,aBox2);
255 aCutter.Build();
256 if (aCutter.IsDone())
257 aShape1 = aCutter.Shape();
258
259 aShape2 = aBox2;
260
261 TopTools_IndexedMapOfShape aShape1Faces, aShape2Faces;
262 TopTools_IndexedMapOfShape aShape1Edges, aShape2Edges;
263 TopExp::MapShapes(aShape1, TopAbs_FACE, aShape1Faces);
264 TopExp::MapShapes(aShape2, TopAbs_FACE, aShape2Faces);
265 TopExp::MapShapes(aShape1, TopAbs_EDGE, aShape1Edges);
266 TopExp::MapShapes(aShape2, TopAbs_EDGE, aShape2Edges);
267 Standard_Integer ei11 = 15, ei12 = 14, ei13 = 18;
268 Standard_Integer ei21 = 1, ei22 = 9, ei23 = 4;
269 Standard_Integer fi11 = 9, fi12 = 4, fi13 = 6;
270 Standard_Integer fi21 = 1, fi22 = 3, fi23 = 5;
271 TopoDS_Face f11 = TopoDS::Face(aShape1Faces(fi11));
272 TopoDS_Face f12 = TopoDS::Face(aShape1Faces(fi12));
273 TopoDS_Face f13 = TopoDS::Face(aShape1Faces(fi13));
274 TopoDS_Edge e11 = TopoDS::Edge(aShape1Edges(ei11));
275 TopoDS_Edge e12 = TopoDS::Edge(aShape1Edges(ei12));
276 TopoDS_Edge e13 = TopoDS::Edge(aShape1Edges(ei13));
277 TopoDS_Face f21 = TopoDS::Face(aShape2Faces(fi21));
278 TopoDS_Face f22 = TopoDS::Face(aShape2Faces(fi22));
279 TopoDS_Face f23 = TopoDS::Face(aShape2Faces(fi23));
280 TopoDS_Edge e21 = TopoDS::Edge(aShape2Edges(ei21));
281 TopoDS_Edge e22 = TopoDS::Edge(aShape2Edges(ei22));
282 TopoDS_Edge e23 = TopoDS::Edge(aShape2Edges(ei23));
283
284 BRepFeat_Gluer aGluer(aShape1, aShape2);
285 aGluer.Bind(e11, e21);
286 aGluer.Bind(e12, e22);
287 aGluer.Bind(e13, e23);
288 aGluer.Bind(f11, f21);
289 aGluer.Bind(f12, f22);
290 aGluer.Bind(f13, f23);
291 aGluer.Build();
292
293 TopoDS_Shape aGluedShape;
294 if (aGluer.IsDone())
295 aGluedShape = aGluer;
296
297 TopTools_ListOfShape aEdges1,aEdges2,aFaces1,aFaces2;
298 aEdges1.Append(e11); aEdges1.Append(e12);
299 aEdges1.Append(e13); aEdges2.Append(e21);
300 aEdges2.Append(e22); aEdges2.Append(e23);
301 aFaces1.Append(f11); aFaces1.Append(f12);
302 aFaces1.Append(f13); aFaces2.Append(f21);
303 aFaces2.Append(f22); aFaces2.Append(f23);
304
305 displayShapesFaces(aShape1,aShape2,aGluedShape,aFaces1,aFaces2,aEdges1,aEdges2);
306}
307
308
309//================================================================
310// Function : Glue_Presentation::drawShapeWf
311// Purpose : display a shape in wire frame mode
312//================================================================
313Standard_Boolean Glue_Presentation::drawShapeWf(TopoDS_Shape& aShape,
92efcf78 314 Handle(AIS_InteractiveObject)& io)
7fd59977 315{
316 io = drawShape(aShape, Graphic3d_NOM_BRASS, Standard_False);
317 getAISContext()->SetDisplayMode(io, AIS_WireFrame, Standard_False);
318 getAISContext()->Display(io);
319 return !WAIT_A_LITTLE;
320}
321
322
323//================================================================
324// Function : Glue_Presentation::drawShapeSh
325// Purpose : display a shape in shaded mode
326//================================================================
327Standard_Boolean Glue_Presentation::drawShapeSh(TopoDS_Shape& aShape,
92efcf78 328 Handle(AIS_InteractiveObject)& io)
7fd59977 329{
330 io = drawShape(aShape, Graphic3d_NOM_BRASS, Standard_False);
331 getAISContext()->SetDisplayMode(io, AIS_Shaded, Standard_False);
332 getAISContext()->Display(io, Standard_False);
333 COCCDemoDoc::Fit();
334 return !WAIT_A_LITTLE;
335}
336
337//================================================================
338// Function : Glue_Presentation::displayShapesFaces
339// Purpose : displays shapes, same domain faces and edges if given
340//================================================================
341Standard_Boolean Glue_Presentation::displayShapesFaces(TopoDS_Shape& aShape1,
342 TopoDS_Shape& aShape2,
343 TopoDS_Shape& aGluedShape,
344 TopTools_ListOfShape& aFaces1,
345 TopTools_ListOfShape& aFaces2,
346 TopTools_ListOfShape& aEdges1,
347 TopTools_ListOfShape& aEdges2)
348{
92efcf78 349 Handle(AIS_Shape) io1,io2,io3,io4,io5,io6;
7fd59977 350 if (!drawShapeSh(aShape1, io1)) return Standard_False;
351 if (!drawShapeSh(aShape2, io2)) return Standard_False;
352
353 getAISContext()->SetDisplayMode(io1, AIS_WireFrame, Standard_False);
354 getAISContext()->SetDisplayMode(io2, AIS_WireFrame);
355 if (WAIT_A_LITTLE) return Standard_False;
356
357 TopTools_ListIteratorOfListOfShape it1,it2;
358 for (it1.Initialize(aEdges1),it2.Initialize(aEdges2);
359 it1.More() && it2.More();
360 it1.Next(),it2.Next())
361 {
362 if (!drawShapeWf(it2.Value(), io6)) return Standard_False;
363 getAISContext()->Erase(io6);
364 if (WAIT_A_LITTLE) return Standard_False;
365
366 if (!drawShapeWf(it1.Value(), io6)) return Standard_False;
367 getAISContext()->Erase(io6);
368 if (WAIT_A_LITTLE) return Standard_False;
369 }
370
371 for (it1.Initialize(aFaces1),it2.Initialize(aFaces2);
372 it1.More() && it2.More();
373 it1.Next(),it2.Next())
374 {
375 if (!drawShapeSh(it2.Value(), io6)) return Standard_False;
376 getAISContext()->Erase(io6);
377 if (WAIT_A_LITTLE) return Standard_False;
378
379 if (!drawShapeSh(it1.Value(), io6)) return Standard_False;
380 getAISContext()->Erase(io6);
381 if (WAIT_A_LITTLE) return Standard_False;
382 }
383
384 getAISContext()->Erase(io1, Standard_False);
385 getAISContext()->Erase(io2, Standard_False);
386
387 io1 = drawShape(aGluedShape, RESULT_SHAPE_COLOR, Standard_False);
388 getAISContext()->SetDisplayMode(io1, AIS_WireFrame, Standard_False);
389 getAISContext()->Display(io1);
390 if (WAIT_A_LITTLE) return Standard_False;
391
392 getAISContext()->SetDisplayMode(io1, AIS_Shaded);
393
394 return Standard_True;
395}