0027772: Foundation Classes - define Standard_Boolean using C++ type "bool" instead...
[occt.git] / src / DNaming / DNaming_SelectionCommands.cxx
1 // Created on: 1997-10-20
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1997-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 #include <DNaming.hxx>
18
19 #include <DDF.hxx>
20
21 #include <TNaming_NamedShape.hxx>
22 #include <TNaming_ListOfNamedShape.hxx>
23 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
24 #include <TNaming_Tool.hxx>
25 #include <TDF_Label.hxx>
26 #include <TDF_AttributeMap.hxx>
27 #include <TDF_MapIteratorOfAttributeMap.hxx>
28 #include <TDF_ChildIterator.hxx>
29 #include <TDF_Tool.hxx>
30 #include <TNaming_Name.hxx>
31 #include <TNaming.hxx>
32 #include <TNaming_Naming.hxx>
33 #include <TNaming_NamingTool.hxx>
34 #include <TNaming_MapOfNamedShape.hxx>
35 #include <TNaming_MapIteratorOfMapOfNamedShape.hxx>
36 #include <TDF_ChildIterator.hxx>
37 #include <TNaming_Selector.hxx>
38 #include <TopoDS_Shape.hxx>
39 #include <TopAbs.hxx>
40 #include <TCollection_AsciiString.hxx>
41 #include <TDF_LabelMap.hxx>
42 #include <TDF_MapIteratorOfLabelMap.hxx>
43
44 #include <DBRep.hxx>
45 #include <Draw_Appli.hxx>
46 #include <Draw.hxx>
47 #include <Draw_Interpretor.hxx>
48 #include <Draw_Drawable3D.hxx>
49 #include <DBRep.hxx>
50 #include <DBRep_DrawableShape.hxx>
51 #include <stdio.h>
52
53 //=======================================================================
54 //function : Display
55 //purpose  : 
56 //=======================================================================
57
58 static void Display (const Standard_CString Name, const TopoDS_Shape& S)
59 {  
60   //char* name = Name;
61   static Standard_Integer nbIsos  = 2;
62   static Standard_Real size    = 100.;
63   static Standard_Integer discret = 30;
64
65   Handle(DBRep_DrawableShape) D = new DBRep_DrawableShape(S,
66                                                           Draw_jaune,
67                                                           Draw_vert,
68                                                           Draw_bleu,
69                                                           Draw_rouge,
70                                                           size,
71                                                           nbIsos,
72                                                           discret);
73   Draw::Set(Name,D);
74 }
75
76 //=======================================================================
77 //function : DumpNaming
78 //purpose  : 
79 //=======================================================================
80
81 //static void DumpNaming (const Handle(TNaming_Naming)& naming) 
82 static void DumpNaming (const Handle(TNaming_Naming)& naming, Draw_Interpretor& di) 
83 {
84   TCollection_AsciiString Entry;
85   const TNaming_Name& AName = naming->GetName();
86   //TNaming::Print(AName.Type(),cout);
87   Standard_SStream aStream1;
88   TNaming::Print(AName.Type(),aStream1);
89   di << aStream1;
90   di << " ";
91   //TopAbs::Print(AName.ShapeType(),cout);
92   Standard_SStream aStream2;
93   TopAbs::Print(AName.ShapeType(),aStream2);
94   di << aStream2;
95   const TNaming_ListOfNamedShape& NSS = AName.Arguments();
96   for (TNaming_ListIteratorOfListOfNamedShape it(NSS); it.More(); it.Next()) {
97     TDF_Tool::Entry(it.Value()->Label(),Entry); 
98     di << " " << Entry.ToCString();
99   }
100   if(!AName.StopNamedShape().IsNull()) {
101     TDF_Tool::Entry(AName.StopNamedShape()->Label(),Entry); 
102     di << " Stop " << Entry.ToCString();
103   }
104 }
105
106 //=======================================================================
107 //function : SelectShape ou SelectGeometry
108 //purpose  : "Select DF entry shape [context [orient]]", 
109 //=======================================================================
110
111 static Standard_Integer DNaming_Select (Draw_Interpretor& di, Standard_Integer n, const char** a)
112 {
113   if (n > 3) {
114     Standard_Boolean geometry = !(strcmp(a[0],"SelectGeometry")); 
115     Handle(TDF_Data) DF;
116     if(!DDF::GetDF(a[1], DF))  return 1;
117     TDF_Label L;
118     DDF::AddLabel(DF,a[2],L);
119     TNaming_Selector SL (L);
120     if (n == 4) {
121       TopoDS_Shape S = DBRep::Get(a[3], TopAbs_SHAPE);  
122       SL.Select (S, geometry); 
123     }
124     if (n > 4) {  
125       Standard_Boolean Orient(Standard_False);
126       if(n == 6) Orient = (Draw::Atoi(a[5]) != 0);
127       TopoDS_Shape S = DBRep::Get(a[3], TopAbs_SHAPE);
128       TopoDS_Shape C = DBRep::Get(a[4], TopAbs_SHAPE);
129       SL.Select (S, C, geometry, Orient);       
130     }
131     return 0;  
132   }
133   di << "DNaming_Select : Error\n";
134   return 1;
135 }
136 // #define DEB_SELN 1
137 //=======================================================================
138 //function : FillValidMap
139 //purpose  : 
140 //=======================================================================
141
142 Standard_Boolean FillValidMap(const TDF_Label& theLabel, TDF_LabelMap& theValidMap)
143 {
144   Standard_Boolean extRefFound = Standard_False;
145   TDF_AttributeMap anExtMap;
146 #ifdef OCCT_DEBUG_SELN
147           TCollection_AsciiString entr1;
148       TDF_Tool::Entry(theLabel, entr1);  
149       cout<<"\tNaming Attribute at = "<< entr1 <<endl;
150 #endif
151   TDF_ChildIterator itr(theLabel, Standard_True);
152   for ( ;itr.More(); itr.Next()) {
153           const TDF_Label& aLabel = itr.Value();
154           Handle(TNaming_Naming) aNaming;
155           if(!aLabel.IsNull()) 
156                   aLabel.FindAttribute(TNaming_Naming::GetID(), aNaming);
157           if(aNaming.IsNull()) continue;
158 #ifdef OCCT_DEBUG_SELN    
159       TDF_Tool::Entry(aLabel, entr1);  
160       cout<<"\tNaming Attribute at = "<< entr1 <<endl;
161 #endif
162           TDF_Tool::OutReferences(aLabel,anExtMap);
163           for (TDF_MapIteratorOfAttributeMap attMItr(anExtMap);attMItr.More(); attMItr.Next()) {
164         Handle(TDF_Attribute) att = attMItr.Key();
165 #ifdef OCCT_DEBUG_SELN
166         TDF_Tool::Entry(att->Label(), entr1);
167             cout<<"## References attribute dynamic type = "<<att->DynamicType()<<" at Label = "<<entr1 <<endl;
168 #endif  
169             if (att->Label().IsDifferent(aLabel) && !att->Label().IsDescendant(theLabel)) {
170         theValidMap.Add(att->Label());
171                 Handle(TNaming_NamedShape) aNS;
172                 att->Label().FindAttribute(TNaming_NamedShape::GetID(), aNS);
173                 if(!aNS.IsNull())
174                   TNaming_NamingTool::BuildDescendants(aNS, theValidMap);
175         extRefFound = Standard_True;
176            }     
177         }
178   }
179   return extRefFound;
180 }
181
182 //=======================================================================
183 //function : SolveSelection
184 //purpose  : "SolveSelection DF entry", 
185 //=======================================================================
186
187 static Standard_Integer DNaming_SolveSelection (Draw_Interpretor& di, Standard_Integer n, const char** a)
188 {
189   if (n == 3) {
190     char name[100];
191     Handle(TDF_Data) DF;
192     if(!DDF::GetDF(a[1], DF))  return 1;
193     TDF_Label L;
194     DDF::AddLabel(DF,a[2],L);
195
196     Handle(TNaming_Naming) naming;    
197     if (!L.FindAttribute(TNaming_Naming::GetID(),naming)) {  
198       cout <<"DNaming__SolveSelection  : not a selection" << endl;
199       return 1;
200     }
201         TDF_LabelMap aValidMap;
202     if(!FillValidMap(L,aValidMap)) 
203                 di << "Valid map is empty\n";
204 #ifdef OCCT_DEBUG_SELN
205         cout<<"== Valid Label map =="<<endl;
206         for (TDF_MapIteratorOfLabelMap mapItr(aValidMap);mapItr.More(); mapItr.Next()) {
207       const TDF_Label& aLab = mapItr.Key();
208
209        TCollection_AsciiString entr1;
210        TDF_Tool::Entry(aLab, entr1);
211            cout<<"  Label = "<<entr1 <<endl;
212         }
213 #endif
214
215     TNaming_Selector SL (L);
216     Standard_Boolean isSolved = SL.Solve(aValidMap);
217         if(!isSolved)
218                 di << "!!! Solver is failed\n";
219     TopoDS_Shape Res = TNaming_Tool::CurrentShape(SL.NamedShape());
220     Sprintf (name,"%s_%s","new",a[2]);
221     Display (name,Res);
222     return 0;
223   }
224   di << "DNaming_SolveSelection : Error\n";
225   return 1;
226 }
227
228
229 //=======================================================================
230 //function : DumpSelection
231 //purpose  : DumpSelection DF entry (R)"
232 //=======================================================================
233 static Standard_Integer DNaming_DumpSelection (Draw_Interpretor& di, 
234                                               Standard_Integer n, const char** a)
235 {
236   if (n == 3 || n == 4) { 
237     Handle(TDF_Data) DF;
238     if (!DDF::GetDF(a[1],DF)) return 1;  
239     TDF_Label L;
240     if (!DDF::FindLabel(DF,a[2],L)) return 1;
241     Handle(TNaming_Naming) naming;
242     if (!L.FindAttribute(TNaming_Naming::GetID(),naming)) {  
243       di <<"DNaming_DumpSelection : not a selection\n";
244       return 1;
245     }
246     DumpNaming(naming, di);
247     di << "\n";
248     if (n == 4) { 
249       Standard_Integer depth = L.Depth();  
250       Standard_Integer curdepth = 0;
251       TCollection_AsciiString Entry;
252       TDF_ChildIterator it (naming->Label(),Standard_True);
253       for (;it.More();it.Next()) {
254         if (it.Value().FindAttribute(TNaming_Naming::GetID(),naming)) { 
255           curdepth = (naming->Label().Depth()- depth);
256           for (Standard_Integer i = 1; i <= curdepth; i++) di << " ";    
257           TDF_Tool::Entry (naming->Label(),Entry); 
258           di << Entry.ToCString() << " "; 
259           DumpNaming(naming, di);
260           di << "\n";
261         }
262       }
263     }
264     return 0;
265   }
266   di << "DNaming_DumpSelection : Error\n";
267   return 1;  
268 }
269
270
271 //=======================================================================
272 //function : ArgsSelection
273 //purpose  : ArgsSelection DF entry"
274 //=======================================================================
275 static Standard_Integer DNaming_ArgsSelection (Draw_Interpretor& di, 
276                                               Standard_Integer n, const char** a)
277 {
278   if (n == 3) { 
279     Handle(TDF_Data) DF;
280     if (!DDF::GetDF(a[1],DF)) return 1;  
281     TDF_Label L;
282     if (!DDF::FindLabel(DF,a[2],L)) return 1;
283     Handle(TNaming_Naming) naming;
284     if (!L.FindAttribute(TNaming_Naming::GetID(),naming)) {  
285       di <<"DNaming_DumpSelection : not a selection\n";
286       return 1;
287     }  
288     TCollection_AsciiString Entry;
289     TNaming_Selector SL (L);
290     di <<" Selection Arguments : ";
291     TDF_AttributeMap args;
292     SL.Arguments(args);
293     for (TDF_MapIteratorOfAttributeMap it(args); it.More(); it.Next()) {
294       TDF_Tool::Entry(it.Key()->Label(),Entry); 
295       di << Entry.ToCString() << " ";
296     }
297     di << "\n";
298     return 0;
299   }
300   di << "DNaming_ArgsSelection : Error\n";
301   return 1;  
302 }
303
304
305 //=======================================================================
306 //function : CollectAttachment
307 //purpose  : 
308 //=======================================================================
309
310 static void CollectAttachment (const TDF_Label& root,
311                                const Handle(TNaming_Naming)& naming, 
312                                TNaming_MapOfNamedShape& attachment)
313 {
314   TNaming_ListIteratorOfListOfNamedShape itarg;
315   const TNaming_ListOfNamedShape& args = naming->GetName().Arguments();
316   for (itarg.Initialize(args);itarg.More();itarg.Next()) {
317     if (!itarg.Value()->Label().IsDescendant(root)) attachment.Add(itarg.Value());
318   }  
319   Handle(TNaming_Naming) subnaming; 
320   for (TDF_ChildIterator it(naming->Label(),Standard_True);it.More();it.Next()) {
321     if (it.Value().FindAttribute(TNaming_Naming::GetID(),subnaming)) {   
322       const TNaming_ListOfNamedShape& subargs = subnaming->GetName().Arguments();
323       for (itarg.Initialize(subargs);itarg.More();itarg.Next()) {
324         if (!itarg.Value()->Label().IsDescendant(root)) attachment.Add(itarg.Value());
325       }
326     }
327   }
328 }  
329
330
331
332 //=======================================================================
333 //function : Attachment
334 //purpose  : Attachment DF entry"
335 //=======================================================================
336
337 static Standard_Integer DNaming_Attachment (Draw_Interpretor& di, 
338                                             Standard_Integer n, 
339                                             const char** a)
340 {
341   if (n == 3) { 
342     Handle(TDF_Data) DF;
343     if (!DDF::GetDF(a[1],DF)) return 1;  
344     TDF_Label L;
345     if (!DDF::FindLabel(DF,a[2],L)) return 1;  
346     Handle(TNaming_Naming) naming; 
347     TNaming_MapOfNamedShape attachment;
348     if (L.FindAttribute(TNaming_Naming::GetID(),naming)) {
349       CollectAttachment (L,naming,attachment);
350     }
351     else {
352       for (TDF_ChildIterator it (L,Standard_True); it.More();it.Next()) {
353         if (it.Value().FindAttribute(TNaming_Naming::GetID(),naming)) {
354           CollectAttachment (L,naming,attachment);
355           it.NextBrother();
356         }
357       }
358     }
359     TCollection_AsciiString Entry;   
360     TDF_Tool::Entry(L,Entry); 
361     di << " Attachment of " << Entry.ToCString();
362     di << "\n";
363     for (TNaming_MapIteratorOfMapOfNamedShape ita (attachment); ita.More(); ita.Next()) {
364       TDF_Tool::Entry (ita.Key()->Label(),Entry); 
365       di << Entry.ToCString() << " ";
366     }
367     di << "\n";
368     return 0;
369   }
370   di << "DNaming_Attachment : Error\n";
371   return 1;  
372 }
373
374 //=======================================================================
375 //function : SelectionCommands
376 //purpose  : 
377 //=======================================================================
378
379 void DNaming::SelectionCommands(Draw_Interpretor& theCommands) 
380 {
381   
382   static Standard_Boolean done = Standard_False;
383   if (done) return;
384   done = Standard_True;
385   
386   const char* g = "Naming data commands";
387
388   theCommands.Add("SelectShape",
389                   "SelectShape DF entry shape [context [Orient]]", 
390                   __FILE__, DNaming_Select, g);
391   
392   theCommands.Add("SelectGeometry",
393                   "SelectGeometry DF entry shape [context]", 
394                   __FILE__, DNaming_Select, g);
395   
396   theCommands.Add("DumpSelection",         
397                   "DumpSelected DF entry", 
398                   __FILE__, DNaming_DumpSelection, g);    
399
400   theCommands.Add("ArgsSelection",         
401                   "ArgsSelection DF entry", 
402                   __FILE__, DNaming_ArgsSelection, g);  
403
404   theCommands.Add("SolveSelection",         
405                   "DumpSelection DF entry", 
406                   __FILE__, DNaming_SolveSelection, g);  
407
408   theCommands.Add("Attachment",         
409                   "Attachment DF entry", 
410                   __FILE__, DNaming_Attachment, g);
411 }