0029670: Draw Harness - vtrihedron xaxis zaxis is wrong
[occt.git] / samples / ocafsamples / TNaming_Sample.cxx
1 // Created on: 1999-12-29
2 // Created by: Sergey RUIN
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and / or modify it
9 // under the terms of the GNU Lesser General Public version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <gp_Vec.hxx>
18 #include <gp_Trsf.hxx>
19 #include <gp_Pnt.hxx>
20
21 #include <TopoDS.hxx>
22 #include <TopoDS_Shape.hxx>
23 #include <TopoDS_Face.hxx>
24 #include <TopTools_ListOfShape.hxx>
25 #include <TopTools_MapOfShape.hxx>
26 #include <TopTools_ListIteratorOfListOfShape.hxx>
27 #include <TopExp_Explorer.hxx>
28
29 #include <TopOpeBRepBuild_HBuilder.hxx>
30
31 #include <BRepPrimAPI_MakeBox.hxx>
32 #include <BRepFilletAPI_MakeFillet.hxx>
33
34 #include <BRepAlgo_Cut.hxx>
35 #include <BRepAlgo.hxx>
36
37 #include <TDF_Data.hxx>
38 #include <TDF_Label.hxx>
39 #include <TDF_LabelMap.hxx>
40 #include <TDF_ChildIterator.hxx>
41 #include <TDF_MapIteratorOfLabelMap.hxx>
42
43 #include <TNaming_NamedShape.hxx>
44 #include <TNaming_Selector.hxx>
45 #include <TNaming_Tool.hxx>
46 #include <TNaming_Builder.hxx>
47 #include <TNaming.hxx>
48
49 // =======================================================================================
50 // This sample contains template for typical actions with OCAF Topologigal Naming services
51 // =======================================================================================
52
53 #ifdef DEB
54
55 #define Box1POS          1
56 #define Box2POS          2
57 #define SelectedEdgesPOS 3
58 #define FilletPOS        4
59 #define CutPOS           5
60
61 void Sample()
62 {
63   // Starting with data framework 
64   Handle(TDF_Data) DF = new TDF_Data();
65   TDF_Label aLabel = DF->Root();
66
67   TopoDS_Shape Shape, Context;
68
69   // ======================================================
70   // Creating  NamedShapes with different type of Evolution
71   // Scenario:
72   // 1.Create Box1 and push it as PRIMITIVE in DF
73   // 2.Create Box2 and push it as PRIMITIVE in DF
74   // 3.Move Box2 (applying a transformation)
75   // 4.Push a selected edges of top face of Box1 in DF,
76   //   create Fillet (using selected edges) and push result as modification of Box1
77   // 5.Create a Cut (Box1, Box2) as modification of Box1 and push it in DF
78   // 6.Recover result from DF
79   // ======================================================
80
81   // =====================================
82   // 1.Box1, TNaming_Evolution == PRIMITIVE
83   // =====================================
84   BRepPrimAPI_MakeBox MKBOX1( 100, 100, 100); // creating Box1
85
86  //Load the faces of the box in DF
87   TDF_Label Box1Label = aLabel.FindChild(Box1POS);
88   TDF_Label Top1      = Box1Label.FindChild(1);
89   TDF_Label Bottom1   = Box1Label.FindChild(2);
90   TDF_Label Right1    = Box1Label.FindChild(3);
91   TDF_Label Left1     = Box1Label.FindChild(4);
92   TDF_Label Front1    = Box1Label.FindChild(5);
93   TDF_Label Back1     = Box1Label.FindChild(6);
94
95   TNaming_Builder Box1Ins (Box1Label);
96   Box1Ins.Generated (MKBOX1.Shape());
97   
98   TNaming_Builder Top1FaceIns (Top1);
99   TopoDS_Face Top1Face = MKBOX1.TopFace ();
100   Top1FaceIns.Generated (Top1Face);  
101
102   TopoDS_Face Bottom1Face = MKBOX1.BottomFace ();
103   TNaming_Builder Bottom1FaceIns (Bottom1); 
104   Bottom1FaceIns.Generated (Bottom1Face);
105  
106   TopoDS_Face Right1Face = MKBOX1.RightFace ();
107   TNaming_Builder Right1FaceIns (Right1); 
108   Right1FaceIns.Generated (Right1Face); 
109
110   TopoDS_Face Left1Face = MKBOX1.LeftFace ();
111   TNaming_Builder Left1FaceIns (Left1); 
112   Left1FaceIns.Generated (Left1Face); 
113
114   TopoDS_Face Front1Face = MKBOX1.FrontFace ();
115   TNaming_Builder Front1FaceIns (Front1);
116   Front1FaceIns.Generated (Front1Face); 
117
118   TopoDS_Face Back1Face = MKBOX1.BackFace ();
119   TNaming_Builder Back1FaceIns (Back1); 
120   Back1FaceIns.Generated (Back1Face); 
121
122   // =====================================
123   // 2.Box2, TNaming_Evolution == PRIMITIVE
124   // =====================================
125   BRepPrimAPI_MakeBox MKBOX2( 150, 150, 150); // creating Box2
126
127  //Load the faces of the box2 in DF
128   TDF_Label Box2Label = aLabel.FindChild(Box2POS);
129   TDF_Label Top2      = Box2Label.FindChild(1);
130   TDF_Label Bottom2   = Box2Label.FindChild(2);
131   TDF_Label Right2    = Box2Label.FindChild(3);
132   TDF_Label Left2     = Box2Label.FindChild(4);
133   TDF_Label Front2    = Box2Label.FindChild(5);
134   TDF_Label Back2     = Box2Label.FindChild(6);
135
136   TNaming_Builder Box2Ins (Box2Label);
137   Box2Ins.Generated (MKBOX2.Shape());
138   
139   TNaming_Builder Top2FaceIns (Top2);
140   TopoDS_Face Top2Face = MKBOX2.TopFace ();
141   Top2FaceIns.Generated (Top2Face);  
142
143   TopoDS_Face Bottom2Face = MKBOX2.BottomFace ();
144   TNaming_Builder Bottom2FaceIns (Bottom2); 
145   Bottom2FaceIns.Generated (Bottom2Face);
146  
147   TopoDS_Face Right2Face = MKBOX2.RightFace ();
148   TNaming_Builder Right2FaceIns (Right2); 
149   Right2FaceIns.Generated (Right2Face); 
150
151   TopoDS_Face Left2Face = MKBOX2.LeftFace ();
152   TNaming_Builder Left2FaceIns (Left2); 
153   Left2FaceIns.Generated (Left2Face); 
154
155   TopoDS_Face Front2Face = MKBOX2.FrontFace ();
156   TNaming_Builder Front2FaceIns (Front2);
157   Front2FaceIns.Generated (Front2Face); 
158
159   TopoDS_Face Back2Face = MKBOX2.BackFace ();
160   TNaming_Builder Back2FaceIns (Back2); 
161   Back2FaceIns.Generated (Back2Face); 
162
163   // ====================================
164   // 3.Applying a transformation to Box2
165   // ====================================
166   gp_Vec vec1(gp_Pnt(0.,0.,0.),gp_Pnt(50.,50.,20.));
167   gp_Trsf TRSF;
168   TRSF.SetTranslation(vec1);
169   TopLoc_Location loc(TRSF);
170   TDF_LabelMap scope;
171   TDF_ChildIterator itchild;
172   for (itchild.Initialize(Box2Label,Standard_True); itchild.More();itchild.Next()) {
173     if (itchild.Value().IsAttribute(TNaming_NamedShape::GetID())) scope.Add(itchild.Value());
174   }
175   if (Box2Label.IsAttribute(TNaming_NamedShape::GetID())) scope.Add(Box2Label);
176   TDF_MapIteratorOfLabelMap it(scope);
177   for (;it.More();it.Next()) 
178     TNaming::Displace(it.Key(), loc, Standard_True);//with oldshapes
179
180
181   //============================================================================
182   // 4.Push a selected edges of top face of Box1 in DF,
183   // create Fillet (using selected edges) and push result as modification of Box1
184   //=============================================================================
185   Handle(TNaming_NamedShape) B1NS;
186   Box1Label.FindAttribute(TNaming_NamedShape::GetID(), B1NS);
187   const TopoDS_Shape& box1  = TNaming_Tool::GetShape(B1NS);
188   Handle(TNaming_NamedShape) Top1NS;
189   Top1.FindAttribute(TNaming_NamedShape::GetID(), Top1NS);
190   const TopoDS_Shape& top1face  = TNaming_Tool::GetShape(Top1NS);
191
192   BRepFilletAPI_MakeFillet MKFILLET(box1);// fillet's algo
193   TDF_Label SelectedEdgesLabel = aLabel.FindChild(SelectedEdgesPOS); //Label for selected edges
194   TopExp_Explorer exp(top1face, TopAbs_EDGE);
195   Standard_Integer i=1;
196   for(;exp.More();exp.Next(),i++) {
197     const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
198     const TDF_Label& SelEdge  = SelectedEdgesLabel.FindChild(i);
199     // Creating TNaming_Selector on label
200     TNaming_Selector Selector(SelEdge);
201
202     // Inserting shape into data framework, we need the context to find neighbourhood of shape
203     // For example the context for a lateral face of cone is cone itself
204     // If a shape is standalone the context will be the shape itself
205
206     // Selector.Select(Shape, Context);
207     // TNaming_Evolution == SELECTED
208     Selector.Select(E, box1);
209     // Recover selected edge from DF, only for example
210     const TopoDS_Edge& FE  = TopoDS::Edge(Selector.NamedShape()->Get());
211     MKFILLET.Add(5., FE);
212   }
213
214   MKFILLET.Build();
215   if(!MKFILLET.IsDone()) return; //Algorithm failed
216
217   // ...put fillet in the DataFramework as modification of Box1
218   TDF_Label FilletLabel       = aLabel.FindChild(FilletPOS);
219   TDF_Label DeletedFaces      = FilletLabel.FindChild(i++);
220   TDF_Label ModifiedFaces     = FilletLabel.FindChild(i++);
221   TDF_Label FacesFromEdges    = FilletLabel.FindChild(i++);
222   TDF_Label FacesFromVertices = FilletLabel.FindChild(i);
223
224   // TNaming_Evolution == MODIFY
225   TNaming_Builder bFillet(FilletLabel);
226   bFillet.Modify(box1, MKFILLET.Shape());
227
228  //New faces generated from edges
229   TopTools_MapOfShape View;
230   TNaming_Builder FaceFromEdgeBuilder(FacesFromEdges);  
231   TopExp_Explorer ShapeExplorer (box1, TopAbs_EDGE);
232   for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
233     const TopoDS_Shape& Root = ShapeExplorer.Current ();
234     if (!View.Add(Root)) continue;
235     const TopTools_ListOfShape& Shapes = MKFILLET.Generated (Root);
236     TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
237     for (;ShapesIterator.More (); ShapesIterator.Next ()) {
238       const TopoDS_Shape& newShape = ShapesIterator.Value ();
239       // TNaming_Evolution == GENERATED
240       if (!Root.IsSame (newShape)) FaceFromEdgeBuilder.Generated (Root,newShape );
241     }
242   }
243
244   //Faces of the initial shape modified by MKFILLET
245   View.Clear();
246   TNaming_Builder ModFacesBuilder(ModifiedFaces);
247   ShapeExplorer.Init(box1,TopAbs_FACE);
248   for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
249     const TopoDS_Shape& Root = ShapeExplorer.Current ();
250     if (!View.Add(Root)) continue;
251     const TopTools_ListOfShape& Shapes = MKFILLET.Modified (Root);
252     TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
253     for (;ShapesIterator.More (); ShapesIterator.Next ()) {
254       const TopoDS_Shape& newShape = ShapesIterator.Value ();
255       // TNaming_Evolution == MODIFY
256       if (!Root.IsSame (newShape)) ModFacesBuilder.Modify (Root,newShape );
257     }
258   }
259
260   //Deleted faces of the initial shape
261   View.Clear();
262   TNaming_Builder DelFacesBuilder(DeletedFaces);
263   ShapeExplorer.Init(box1, TopAbs_FACE);
264   for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
265     const TopoDS_Shape& Root = ShapeExplorer.Current ();
266     if (!View.Add(Root)) continue;
267     // TNaming_Evolution == DELETE
268     if (MKFILLET.IsDeleted (Root)) DelFacesBuilder.Delete (Root);
269   }
270
271  //New faces generated from vertices
272   View.Clear();
273   TNaming_Builder FaceFromVertexBuilder(FacesFromVertices);
274   ShapeExplorer.Init(box1, TopAbs_VERTEX);
275   for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
276     const TopoDS_Shape& Root = ShapeExplorer.Current ();
277     if (!View.Add(Root)) continue;
278     const TopTools_ListOfShape& Shapes = MKFILLET.Generated (Root);
279     TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
280     for (;ShapesIterator.More (); ShapesIterator.Next ()) {
281       const TopoDS_Shape& newShape = ShapesIterator.Value ();
282       // TNaming_Evolution == GENERATED
283       if (!Root.IsSame (newShape)) FaceFromVertexBuilder.Generated (Root,newShape );
284     }
285   }
286   // =====================================================================
287   // 5.Create a Cut (Box1, Box2) as modification of Box1 and push it in DF
288   // Boolean operation - CUT Object=Box1, Tool=Box2
289   // =====================================================================
290
291   TDF_Label CutLabel = aLabel.FindChild(CutPOS);
292
293   // recover Object
294   Handle(TNaming_NamedShape) ObjectNS;
295   FilletLabel.FindAttribute(TNaming_NamedShape::GetID(), ObjectNS);
296   TopoDS_Shape OBJECT = ObjectNS->Get();
297
298   // Select Tool
299   TDF_Label ToolLabel = CutLabel.FindChild(1);
300   TNaming_Selector ToolSelector(ToolLabel);
301   Handle(TNaming_NamedShape) ToolNS;
302   Box2Label.FindAttribute(TNaming_NamedShape::GetID(), ToolNS);
303   const TopoDS_Shape& Tool = ToolNS->Get();
304   //TNaming_Evolution == SELECTED
305   ToolSelector.Select(Tool, Tool);
306   const TopoDS_Shape& TOOL = ToolSelector.NamedShape()->Get();
307
308   BRepAlgo_Cut mkCUT (OBJECT, TOOL);
309
310   if (!mkCUT.IsDone()) {
311     cout << "CUT: Algorithm failed" << endl;
312     return; 
313   } else 
314     {
315       TopTools_ListOfShape Larg;
316       Larg.Append(OBJECT);
317       Larg.Append(TOOL);
318
319       if (!BRepAlgo::IsValid(Larg, mkCUT.Shape(), Standard_True, Standard_False)) {
320
321         cout << "CUT: Result is not valid" << endl;
322         return;
323       } else 
324         {
325          // push CUT results in DF as modification of Box1
326           TDF_Label Modified      = CutLabel.FindChild(2);
327           TDF_Label Deleted       = CutLabel.FindChild(3);
328           TDF_Label Intersections = CutLabel.FindChild(4);
329           TDF_Label NewFaces      = CutLabel.FindChild(5);
330
331           TopoDS_Shape newS1 = mkCUT.Shape();
332           const TopoDS_Shape& ObjSh = mkCUT.Shape1();
333
334           //push in the DF result of CUT
335           TNaming_Builder CutBuilder (CutLabel);
336           // TNaming_Evolution == MODIFY
337           CutBuilder.Modify (ObjSh, newS1);
338
339           //push in the DF modified faces
340           View.Clear();
341           TNaming_Builder ModBuilder(Modified);
342           ShapeExplorer.Init(ObjSh, TopAbs_FACE);
343           for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
344             const TopoDS_Shape& Root = ShapeExplorer.Current ();
345             if (!View.Add(Root)) continue;
346             const TopTools_ListOfShape& Shapes = mkCUT.Modified (Root);
347             TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
348             for (;ShapesIterator.More (); ShapesIterator.Next ()) {
349               const TopoDS_Shape& newShape = ShapesIterator.Value ();
350               // TNaming_Evolution == MODIFY
351               if (!Root.IsSame (newShape)) ModBuilder.Modify (Root,newShape );
352             }
353           }
354
355           //push in the DF deleted faces
356           View.Clear();
357           TNaming_Builder DelBuilder(Deleted);
358           ShapeExplorer.Init (ObjSh,TopAbs_FACE);
359           for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
360             const TopoDS_Shape& Root = ShapeExplorer.Current ();
361             if (!View.Add(Root)) continue;
362             // TNaming_Evolution == DELETE
363             if (mkCUT.IsDeleted (Root)) DelBuilder.Delete (Root);
364           }
365
366           // push in the DF section edges
367           TNaming_Builder IntersBuilder(Intersections);
368           Handle(TopOpeBRepBuild_HBuilder) build = mkCUT.Builder();  
369           TopTools_ListIteratorOfListOfShape its = build->Section();
370           for (; its.More(); its.Next()) {
371             // TNaming_Evolution == SELECTED
372             IntersBuilder.Select(its.Value(),its.Value());
373           }
374
375           // push in the DF new faces added to the object:
376           const TopoDS_Shape& ToolSh = mkCUT.Shape2();
377           TNaming_Builder newBuilder (NewFaces);
378           ShapeExplorer.Init(ToolSh, TopAbs_FACE);
379           for (; ShapeExplorer.More(); ShapeExplorer.Next()) {
380             const TopoDS_Shape& F = ShapeExplorer.Current();
381             const TopTools_ListOfShape& modified = mkCUT.Modified(F);
382             if (!modified.IsEmpty()) {
383               TopTools_ListIteratorOfListOfShape itr(modified);
384               for (; itr.More (); itr.Next ()) {
385                 const TopoDS_Shape& newShape = itr.Value();
386                 Handle(TNaming_NamedShape) NS = TNaming_Tool::NamedShape(newShape, NewFaces);
387                 if (NS.IsNull() || NS->Evolution() != TNaming_MODIFY) {
388                   // TNaming_Evolution == GENERATED
389                   newBuilder.Generated(F, newShape);    
390                 }
391               }
392             }
393           }
394         } 
395     }
396   // end of CUT
397
398   // =================================================
399   // 6.Recover result from DF
400   // get final result - Box1 shape after CUT operation
401   // =================================================
402   Handle(TNaming_NamedShape) ResultNS;
403   CutLabel.FindAttribute(TNaming_NamedShape::GetID(), ResultNS);
404   const TopoDS_Shape& Result_1 = ResultNS->Get(); // here is result of cut operation
405   ResultNS.Nullify();
406   Box1Label.FindAttribute(TNaming_NamedShape::GetID(), ResultNS);
407   const TopoDS_Shape& Result_2 = TNaming_Tool::CurrentShape(ResultNS);//here is also result of cut operation
408
409   //
410   //Result_1 and Result_2 are the same shapes
411   //=========================================
412 }
413 #endif