0028567: Get rid of the unused DRAW commands based on old Boolean Operations (BRepAlgo)
[occt.git] / src / QANewDBRepNaming / QANewDBRepNaming_FeatureCommands.cxx
1 // Created on: 1999-12-23
2 // Created by: Vladislav ROMASHKO
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 under
9 // the terms of the GNU Lesser General Public License 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
18 #include <BRep_Tool.hxx>
19 #include <BRepAdaptor_Curve.hxx>
20 #include <BRepAdaptor_Surface.hxx>
21 #include <BRepAlgoAPI_Common.hxx>
22 #include <BRepAlgoAPI_Cut.hxx>
23 #include <BRepAlgoAPI_Fuse.hxx>
24 #include <BRepAlgoAPI_Section.hxx>
25 #include <BRepBuilderAPI_MakeEdge.hxx>
26 #include <BRepBuilderAPI_MakeFace.hxx>
27 #include <BRepBuilderAPI_MakeWire.hxx>
28 #include <BRepLib.hxx>
29 #include <BRepTools.hxx>
30 #include <DBRep.hxx>
31 #include <DDF.hxx>
32 #include <DDocStd.hxx>
33 #include <Draw.hxx>
34 #include <Draw_Interpretor.hxx>
35 #include <GCE2d_MakeLine.hxx>
36 #include <gp_Ax1.hxx>
37 #include <gp_Dir.hxx>
38 #include <gp_Pnt.hxx>
39 #include <gp_Vec.hxx>
40 #include <QANewBRepNaming_Common.hxx>
41 #include <QANewBRepNaming_Cut.hxx>
42 #include <QANewBRepNaming_Fuse.hxx>
43 #include <QANewBRepNaming_Gluing.hxx>
44 #include <QANewBRepNaming_Intersection.hxx>
45 #include <QANewBRepNaming_Limitation.hxx>
46 #include <QANewDBRepNaming.hxx>
47 #include <QANewModTopOpe_Glue.hxx>
48 #include <QANewModTopOpe_Intersection.hxx>
49 #include <QANewModTopOpe_Limitation.hxx>
50 #include <Standard_Assert.hxx>
51 #include <TColgp_Array1OfPnt.hxx>
52 #include <TDataXtd_Geometry.hxx>
53 #include <TDF_LabelMap.hxx>
54 #include <TDocStd_Document.hxx>
55 #include <TNaming_Builder.hxx>
56 #include <TNaming_NamedShape.hxx>
57 #include <TNaming_Tool.hxx>
58 #include <TopExp.hxx>
59 #include <TopExp_Explorer.hxx>
60 #include <TopoDS.hxx>
61 #include <TopoDS_Edge.hxx>
62 #include <TopoDS_Face.hxx>
63 #include <TopoDS_Iterator.hxx>
64 #include <TopoDS_Shape.hxx>
65 #include <TopoDS_Wire.hxx>
66 #include <TopTools_MapIteratorOfMapOfShape.hxx>
67 #include <TopTools_MapOfShape.hxx>
68
69 //==============================================================
70 //function : QANewDBRepNaming_NameBooleanOperation
71 //purpose  : NameBooleanOperation Doc Label Op = 1(Fuse), 2(Cut), 3(Common), 4(Inserction) 5(Limitation) DrawShape1 DrawShape2 [Forward = 0 || Reversed = 1 || BothSides = 2] 
72 //==============================================================
73 static Standard_Integer QANewDBRepNaming_NameBooleanOperation (Draw_Interpretor& di,
74                                                               Standard_Integer nb, 
75                                                               const char ** arg)
76 {
77   if (nb != 6 && nb != 7) {
78     di <<  "QANewDBRepNaming_NameBooleanOperation : Error"  << "\n";
79     return 1;
80   }
81
82   Handle(TDocStd_Document) D;
83   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
84   TDF_Label L;
85   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
86   
87   const Standard_Integer Op = (Standard_Integer)Draw::Atoi(arg[3]);
88   const TopoDS_Shape& S1 = DBRep::Get(arg[4]);
89   const TopoDS_Shape& S2 = DBRep::Get(arg[5]);
90
91   Standard_Integer Orientation = 0;
92   if (nb == 7) Orientation = Draw::Atoi(arg[6]);
93
94   switch (Op) {
95   case 1: {
96     di <<  "BRepAlgoAPI_Fuse"  << "\n";
97     BRepAlgoAPI_Fuse mkFuse(S1, S2);
98
99     Standard_ASSERT_RAISE(mkFuse.IsDone(), "Fuse failed");
100     QANewBRepNaming_Fuse nameBool(L);
101     nameBool.Load(mkFuse);
102     break;
103   }
104   case 2: {
105     di <<  "BRepAlgoAPI_Cut"  << "\n";
106     BRepAlgoAPI_Cut mkCut(S1, S2);
107
108     Standard_ASSERT_RAISE(mkCut.IsDone(), "Cut failed");
109     QANewBRepNaming_Cut nameBool(L);
110     nameBool.Load(mkCut);
111     break; 
112   }
113   case 3: {
114     di <<  "BRepAlgoAPI_Common"  << "\n";
115     BRepAlgoAPI_Common mkCommon(S1, S2);
116
117     Standard_ASSERT_RAISE(mkCommon.IsDone(), "Common failed");
118     QANewBRepNaming_Common nameBool(L);
119     nameBool.Load(mkCommon);
120     break;
121   }
122   case 4: {
123     QANewModTopOpe_Intersection mkSection(S1, S2);
124     Standard_ASSERT_RAISE(mkSection.IsDone(), "Section failed");
125     QANewBRepNaming_Intersection nameBool(L);
126     nameBool.Load(mkSection);
127     break;
128   }    
129   case 5: {
130     QANewModTopOpe_Limitation mkLimit(S1, S2);
131     const QANewModTopOpe_ModeOfLimitation aMode = (QANewModTopOpe_ModeOfLimitation) Orientation;
132     mkLimit.SetMode(aMode);
133     mkLimit.Cut();
134 //     if (Orientation = 0) mkLimit.CutForward();
135 //     else if (Orientation = 1) mkLimit.CutReversed();
136 //     else if (Orientation = 2) mkLimit.CutBothSides();
137     Standard_ASSERT_RAISE(mkLimit.IsDone(),"Limit failed");
138     QANewBRepNaming_Limitation nameBool(L);
139     nameBool.Load(mkLimit);
140     break;
141   }  
142   default:
143     di<<"QANewDBRepNaming_NameBooleanOperation The type of operation must be 1 - fuse, 2 - cut or 3 - common\n";
144   }
145
146   return 0;
147 }    
148
149 //==============================================================
150 //function : QANewDBRepNaming_NameFuse
151 //purpose  : NameFuse Doc Label DrawShape1 DrawShape2
152 //==============================================================
153
154 static Standard_Integer QANewDBRepNaming_NameFuse (Draw_Interpretor& di,
155                                               Standard_Integer nb, 
156                                               const char ** arg)
157 {
158   if (nb != 5) {
159     di <<  "QANewDBRepNaming_NameFuse : Error"  << "\n";
160     return 1;
161   }
162
163   Handle(TDocStd_Document) D;
164   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
165   TDF_Label L;
166   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
167   const TopoDS_Shape& S1 = DBRep::Get(arg[3]);
168   const TopoDS_Shape& S2 = DBRep::Get(arg[4]);
169   QANewBRepNaming_Fuse nameBool(L);
170
171   di <<  "BRepAlgoAPI_Fuse"  << "\n";
172   BRepAlgoAPI_Fuse mkFuse(S1, S2);
173
174   Standard_ASSERT_RAISE(mkFuse.IsDone(), "Fuse failed");
175   nameBool.Load(mkFuse);
176   return 0;
177 }    
178
179 //==============================================================
180 //function : QANewDBRepNaming_NameCut
181 //purpose  : NameCut Doc Label DrawShape1 DrawShape2
182 //==============================================================
183
184 static Standard_Integer QANewDBRepNaming_NameCut (Draw_Interpretor& di,
185                                              Standard_Integer nb, 
186                                              const char ** arg)
187 {
188   if (nb != 5) {
189     di <<  "QANewDBRepNaming_NameCut : Error"  << "\n";
190     return 1;
191   }
192
193   Handle(TDocStd_Document) D;
194   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
195   TDF_Label L;
196   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
197   const TopoDS_Shape& S1 = DBRep::Get(arg[3]);
198   const TopoDS_Shape& S2 = DBRep::Get(arg[4]);
199 // DBRep::Set("aShape", S1);
200   QANewBRepNaming_Cut nameBool(L);
201 // DBRep::Set("S1", S1);
202 // DBRep::Set("S2", S2);
203
204   di <<  "BRepAlgoAPI_Cut"  << "\n";
205   BRepAlgoAPI_Cut mkCut(S1, S2);
206
207 // DBRep::Set("CutRes", mkCut.Shape());
208 // DBRep::Set("Shape1", mkCut.Shape1());
209 // DBRep::Set("Shape2", mkCut.Shape2());
210 // BRepTools::Write(mkCut.Shape1(), "/dn04/OS/SAMTECH/env/S1.brep");
211   Standard_ASSERT_RAISE(mkCut.IsDone(), "Cut failed");
212   nameBool.Load(mkCut);
213 // BRepTools::Write(mkCut.Shape1(), "/dn04/OS/SAMTECH/env/S2.brep");
214   return 0;
215 }    
216
217 //==============================================================
218 //function : QANewDBRepNaming_NameCommon
219 //purpose  : NameCommon Doc Label DrawShape1 DrawShape2
220 //==============================================================
221
222 static Standard_Integer QANewDBRepNaming_NameCommon (Draw_Interpretor& di,
223                                                 Standard_Integer nb, 
224                                                 const char ** arg)
225 {
226   if (nb != 5) {
227     di <<  "QANewDBRepNaming_NameCommon : Error"  << "\n";
228     return 1;
229   }
230
231   Handle(TDocStd_Document) D;
232   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
233   TDF_Label L;
234   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
235   const TopoDS_Shape& S1 = DBRep::Get(arg[3]);
236   const TopoDS_Shape& S2 = DBRep::Get(arg[4]);
237   QANewBRepNaming_Common nameBool(L);
238
239   di <<  "BRepAlgoAPI_Common"  << "\n";
240   BRepAlgoAPI_Common mkCommon(S1, S2);
241
242   Standard_ASSERT_RAISE(mkCommon.IsDone(), "Common failed");
243   nameBool.Load(mkCommon);
244   return 0;
245 }    
246
247 //==============================================================
248 //function : QANewDBRepNaming_NameIntersection
249 //purpose  : NameIntersection Doc Label DrawShape1 DrawShape2
250 //==============================================================
251
252 static Standard_Integer QANewDBRepNaming_NameIntersection (Draw_Interpretor& di,
253                                                       Standard_Integer nb, 
254                                                       const char ** arg)
255 {
256   if (nb != 5) {
257     di <<  "QANewDBRepNaming_NameIntersection : Error"  << "\n";
258     return 1;
259   }
260
261   Handle(TDocStd_Document) D;
262   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
263   TDF_Label L;
264   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
265   const TopoDS_Shape& S1 = DBRep::Get(arg[3]);
266   const TopoDS_Shape& S2 = DBRep::Get(arg[4]);
267   QANewBRepNaming_Intersection nameBool(L);
268   QANewModTopOpe_Intersection mkIntersection(S1, S2);
269   Standard_ASSERT_RAISE(mkIntersection.IsDone(), "Section failed");
270   nameBool.Load(mkIntersection);
271   return 0;
272 }    
273
274 //==============================================================
275 //function : QANewDBRepNaming_NameLimit
276 //purpose  : NameLimit Doc Label DrawShape1 DrawShape2 [Orientation (Forward - 0, Reversed - 1 or BothSise - 2)]
277 //==============================================================
278
279 static Standard_Integer QANewDBRepNaming_NameLimit (Draw_Interpretor& di,
280                                                Standard_Integer nb, 
281                                                const char ** arg)
282 {
283   if (nb != 5 && nb != 6) {
284     di <<  "QANewDBRepNaming_NameLimit : Error"  << "\n";
285     return 1;
286   }
287
288   Handle(TDocStd_Document) D;
289   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
290   TDF_Label L;
291   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
292   const TopoDS_Shape& S1 = DBRep::Get(arg[3]);
293   const TopoDS_Shape& S2 = DBRep::Get(arg[4]);
294   Standard_Integer Orientation = 0;
295   if (nb == 6) {
296     Orientation = Draw::Atoi(arg[5]);
297   }
298   QANewBRepNaming_Limitation nameBool(L);
299   const QANewModTopOpe_ModeOfLimitation aMode = (QANewModTopOpe_ModeOfLimitation) Orientation;
300   QANewModTopOpe_Limitation mkLimit(S1, S2, aMode);
301   mkLimit.Cut();
302  //  if (Orientation == 0) mkLimit.CutForward();
303 //   else if (Orientation == 1) mkLimit.CutReversed();
304 //   else if (Orientation == 2) mkLimit.CutBothSides();
305   Standard_ASSERT_RAISE(mkLimit.IsDone(), "Limit failed");
306   nameBool.Load(mkLimit);
307   return 0;
308 }    
309
310 //==============================================================
311 //function : QANewDBRepNaming_NameGlue
312 //purpose  : NameGlue Doc Label ObjectLabel ToolLabel [auxiliary valid labels]
313 //==============================================================
314
315 static Standard_Integer QANewDBRepNaming_NameGlue (Draw_Interpretor& di,
316                                               Standard_Integer nb, 
317                                               const char ** arg)
318 {
319   if (nb < 5) {
320     di <<  "QANewDBRepNaming_NameGlue : Error"  << "\n";
321     return 1;
322   }
323
324   Handle(TDocStd_Document) D;
325   if (!DDocStd::GetDocument(arg[1],D)) return 1;   
326   TDF_Label L,OL,TL;
327   if (!DDF::AddLabel(D->GetData(), arg[2], L)) return 1;  
328   if (!DDF::AddLabel(D->GetData(), arg[3], OL)) return 1;  
329   if (!DDF::AddLabel(D->GetData(), arg[4], TL)) return 1;  
330   TDF_LabelMap aLog;
331   for(Standard_Integer i=5;i<nb;i++) {
332     TDF_Label aLabel;
333     if (!DDF::AddLabel(D->GetData(), arg[i], aLabel)) return 1;
334     aLog.Add(aLabel);
335   }
336   Handle(TNaming_NamedShape) anObjectNS,aToolNS;
337   if (!OL.FindAttribute(TNaming_NamedShape::GetID(),anObjectNS)) return 1;
338   if (!TL.FindAttribute(TNaming_NamedShape::GetID(),aToolNS)) return 1;
339
340   QANewModTopOpe_Glue aMKGlue(TNaming_Tool::CurrentShape(anObjectNS),TNaming_Tool::CurrentShape(aToolNS));
341   if (!aMKGlue.IsDone()) return 1;
342   aMKGlue.Build();
343   if (!aMKGlue.IsDone()) return 1;
344
345   QANewBRepNaming_Gluing aGlue(L);
346   aGlue.SetContext(TNaming_Tool::CurrentShape(anObjectNS),TNaming_Tool::CurrentShape(aToolNS));
347   aGlue.SetLog(aLog);
348   aGlue.Load(aMKGlue);
349   return 0;
350 }    
351
352 //=======================================================================
353 //function : FeatureCommands
354 //purpose  : 
355 //=======================================================================
356
357 void QANewDBRepNaming::FeatureCommands (Draw_Interpretor& theCommands)
358 {  
359   static Standard_Boolean done = Standard_False;
360   if (done) return;
361   done = Standard_True;
362   const char* g = "Naming algorithm commands for Booleans";
363
364
365   theCommands.Add ("NameBooleanOperation", 
366                    "NameBooleanOperation Doc Label Operation(1, 2, 3, 4 or 5) DrawShape1 DrawShape2 [Forward = 0 || Reversed = 1 || BothSides = 2] ",
367                    __FILE__, QANewDBRepNaming_NameBooleanOperation, g);
368
369   theCommands.Add ("NameFuse", 
370                    "NameFuse Doc Label DrawShape1 DrawShape2",
371                    __FILE__, QANewDBRepNaming_NameFuse, g);
372
373   theCommands.Add ("NameCut", 
374                    "NameCut Doc Label DrawShape1 DrawShape2",
375                    __FILE__, QANewDBRepNaming_NameCut, g);
376
377   theCommands.Add ("NameCommon", 
378                    "NameCommon Doc Label DrawShape1 DrawShape2",
379                    __FILE__, QANewDBRepNaming_NameCommon, g);
380
381   theCommands.Add ("NameIntersection", 
382                    "NameIntersection Doc Label DrawShape1 DrawShape2",
383                    __FILE__, QANewDBRepNaming_NameIntersection, g);
384
385   theCommands.Add ("NameLimit", 
386                    "NameLimit Doc Label DrawShape1 DrawShape2 [Orientation (Forward - 0, Reversed - 1 or BothSise - 2)]",
387                    __FILE__, QANewDBRepNaming_NameLimit, g);
388
389   theCommands.Add ("NameGlue", 
390                    "NameGlue Doc Label ObjectLabel ToolLabel [auxiliary valid labels]",
391                    __FILE__, QANewDBRepNaming_NameGlue, g);
392
393 }