0031851: Data Exchange, STEP - enable Unicode symbols in STEP export
[occt.git] / src / XDEDRAW / XDEDRAW_Layers.cxx
1 // Created on: 2000-08-04
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <DBRep.hxx>
18 #include <DDocStd.hxx>
19 #include <Draw.hxx>
20 #include <TCollection_AsciiString.hxx>
21 #include <TColStd_HSequenceOfExtendedString.hxx>
22 #include <TDF_Label.hxx>
23 #include <TDF_LabelSequence.hxx>
24 #include <TDF_Tool.hxx>
25 #include <TDocStd_Document.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <XCAFDoc.hxx>
28 #include <XCAFDoc_DocumentTool.hxx>
29 #include <XCAFDoc_GraphNode.hxx>
30 #include <XCAFDoc_LayerTool.hxx>
31 #include <XCAFDoc_ShapeTool.hxx>
32 #include <XDEDRAW_Layers.hxx>
33
34 //=======================================================================
35 // Section: Work with layers
36 //=======================================================================
37 static Standard_Integer addLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
38 {
39   if (argc!=3) {
40     di<<"Use: "<<argv[0]<<" DocName StringLayer \n";
41     return 1;
42   }
43   Handle(TDocStd_Document) Doc;
44   DDocStd::GetDocument(argv[1], Doc);
45   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
46   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
47   
48   TCollection_ExtendedString aLayer = argv[2];
49   TDF_Label aLabel = localLayerTool->AddLayer(aLayer);
50   TCollection_AsciiString Entry;
51   TDF_Tool::Entry(aLabel, Entry);
52   di << Entry.ToCString();
53   return 0;
54 }
55
56 static Standard_Integer findLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
57 {
58   if (argc!=3) {
59     di<<"Use: "<<argv[0]<<" DocName StringLayer \n";
60     return 1;
61   }
62   Handle(TDocStd_Document) Doc;
63   DDocStd::GetDocument(argv[1], Doc);
64   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
65   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
66   
67   TCollection_ExtendedString aLayer = argv[2];
68   TDF_Label aLabel = localLayerTool->FindLayer(aLayer);
69   TCollection_AsciiString Entry;
70   TDF_Tool::Entry(aLabel, Entry);
71   di << Entry.ToCString();
72   return 0;
73 }
74
75 static Standard_Integer removeLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
76 {
77   if (argc!=3) {
78     di<<"Use: "<<argv[0]<<" DocName {Label|string}\n";
79     return 1;
80   }
81   Handle(TDocStd_Document) Doc;
82   DDocStd::GetDocument(argv[1], Doc);
83   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
84   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
85
86   TDF_Label aLabel;
87   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
88   if ( aLabel.IsNull() ) {
89     TCollection_ExtendedString aLayer = argv[2];
90     aLabel = localLayerTool->FindLayer(aLayer);
91   }
92   if ( aLabel.IsNull() ) return 1;
93   localLayerTool->RemoveLayer( aLabel);
94   return 0;
95 }
96
97
98 static Standard_Integer setLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
99 {
100   if (argc<4) {
101     di<<"Use: "<<argv[0]<<" DocName {Shape|Label} StringLayer [shapeInOneLayer(0/1)]\n";
102     return 1;
103   }
104   Standard_Boolean shapeInOneLayer = Standard_False;
105   if ( (argc==5) && (Draw::Atoi(argv[4])==1) ) shapeInOneLayer = Standard_True;
106   Handle(TDocStd_Document) Doc;
107   DDocStd::GetDocument(argv[1], Doc);
108   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
109   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
110   TDF_Label aLabel;
111   TCollection_ExtendedString aLayer = argv[3];
112
113   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
114   if ( !aLabel.IsNull() ) {
115     localLayerTool->SetLayer(aLabel, aLayer, shapeInOneLayer);
116   }
117   else {
118     TopoDS_Shape aShape= DBRep::Get(argv[2]);
119     if ( !aShape.IsNull() ) {
120       localLayerTool->SetLayer(aShape, aLayer, shapeInOneLayer);
121     }
122   }
123   return 0;
124 }
125
126
127 static Standard_Integer getLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
128 {
129   if (argc!=3) {
130     di<<"Use: "<<argv[0]<<" DocName {Shape|Label} \n";
131     return 1;
132   }
133   //
134   Handle(TDocStd_Document) Doc;
135   DDocStd::GetDocument(argv[1], Doc);
136   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
137   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
138   TDF_Label aLabel;
139   Handle(TColStd_HSequenceOfExtendedString) aLayerS;
140   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
141   if ( !aLabel.IsNull() ) {
142     localLayerTool->GetLayers(aLabel, aLayerS);
143   }
144   else {
145     TopoDS_Shape aShape= DBRep::Get(argv[2]);
146     if ( !aShape.IsNull() ) {
147       localLayerTool->GetLayers(aShape, aLayerS);
148     }
149   }
150   Standard_Integer i = 1;
151   if (!aLayerS.IsNull() && aLayerS->Length()!=0)
152     for (; i <= aLayerS->Length(); i++) {
153       di << "\"" << aLayerS->Value(i) << "\" ";
154     }
155   return 0;
156 }
157
158
159 static Standard_Integer getLayerLabels (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
160 {
161   if (argc!=2) {
162     di<<"Use: "<<argv[0]<<" DocName\n";
163     return 1;
164   }
165   Handle(TDocStd_Document) Doc;
166   DDocStd::GetDocument(argv[1], Doc);
167   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
168   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
169   TDF_LabelSequence aLabs;
170   localLayerTool->GetLayerLabels(aLabs);
171   if (aLabs.Length() ==0 ) {
172     return 0;
173   }
174   Standard_Integer i = 1;
175   for (; i <= aLabs.Length(); i++) {
176     TDF_Label L = aLabs.Value(i);
177     if ( !L.IsNull() ) {
178       TCollection_AsciiString Entry;
179       TDF_Tool::Entry(L, Entry);
180       di << Entry.ToCString() << " ";
181     }
182   }
183   return 0;
184 }
185
186
187 static Standard_Integer getOneLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
188 {
189   if (argc!=3) {
190     di<<"Use: "<<argv[0]<<" DocName LayerLabel\n";
191     return 1;
192   }
193   Handle(TDocStd_Document) Doc;
194   DDocStd::GetDocument(argv[1], Doc);
195   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
196   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
197   TDF_Label aLabel;
198   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
199   if ( !aLabel.IsNull() ) {
200     TCollection_ExtendedString layerName;
201     localLayerTool->GetLayer(aLabel, layerName);
202     di << "\"" << layerName <<"\"";
203   }
204   return 0;
205 }
206
207
208 static Standard_Integer setLinkLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
209 {
210   if (argc<4) {
211     di<<"Use: "<<argv[0]<<" DocName {Shape|Label} LayerL [shapeInOneLayer(0/1)]\n";
212     return 1;
213   }
214   Standard_Boolean shapeInOneLayer = Standard_False;
215   if ( (argc==5) && (Draw::Atoi(argv[4])==1) ) shapeInOneLayer = Standard_True;
216   Handle(TDocStd_Document) Doc;
217   DDocStd::GetDocument(argv[1], Doc);
218   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
219   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
220   TDF_Label aLabel, layerLabel;
221   TDF_Tool::Label(Doc->GetData(), argv[3], layerLabel);
222
223   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
224   if ( !layerLabel.IsNull() ) {
225     if ( !aLabel.IsNull() ) {
226       localLayerTool->SetLayer(aLabel, layerLabel, shapeInOneLayer);
227     }
228     else {
229       TopoDS_Shape aShape= DBRep::Get(argv[2]);
230       if ( !aShape.IsNull() ) {
231         localLayerTool->SetLayer(aShape, layerLabel, shapeInOneLayer);
232       }
233     }
234   }
235   return 0;
236 }
237
238
239 static Standard_Integer getAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
240 {
241   if (argc!=2) {
242     di<<"Use: "<<argv[0]<<" DocName\n";
243     return 1;
244   }
245   Handle(TDocStd_Document) Doc;
246   DDocStd::GetDocument(argv[1], Doc);
247   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
248   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
249   TDF_LabelSequence aLabs;
250   localLayerTool->GetLayerLabels(aLabs);
251   if (aLabs.Length() ==0 ) {
252     return 0;
253   }
254   Standard_Integer i = 1;
255   TCollection_ExtendedString layerName;
256   
257   for (; i <= aLabs.Length(); i++) {
258     TDF_Label L = aLabs.Value(i);
259     if ( !L.IsNull() ) {
260       localLayerTool->GetLayer(L, layerName);
261       di << "\"" << layerName <<"\"";
262       di << " ";
263     }
264   }
265   return 0;
266 }
267
268
269 static Standard_Integer unSetLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
270 {
271   if (argc!=4) {
272     di<<"Use: "<<argv[0]<<" DocName {Shape|Label} stringL\n";
273     return 1;
274   }
275   Handle(TDocStd_Document) Doc;
276   DDocStd::GetDocument(argv[1], Doc);
277   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
278   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
279   TDF_Label aLabel;
280   TCollection_ExtendedString aLayer = argv[3];
281
282   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
283   if ( !aLabel.IsNull() ) {
284     localLayerTool->UnSetOneLayer(aLabel, aLayer);
285   }
286   else {
287     TopoDS_Shape aShape= DBRep::Get(argv[2]);
288     if ( !aShape.IsNull() ) {
289       localLayerTool->UnSetOneLayer(aShape, aLayer);
290     }
291   }
292   return 0;
293 }
294
295
296 static Standard_Integer unSetAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
297 {
298   if (argc!=3) {
299     di<<"Use: "<<argv[0]<<" DocName {Shape|Label}\n";
300     return 1;
301   }
302   Handle(TDocStd_Document) Doc;
303   DDocStd::GetDocument(argv[1], Doc);
304   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
305   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
306   TDF_Label aLabel;
307
308   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
309   if ( !aLabel.IsNull() ) {
310     localLayerTool->UnSetLayers(aLabel);
311   }
312   else {
313     TopoDS_Shape aShape= DBRep::Get(argv[2]);
314     if ( !aShape.IsNull() ) {
315       localLayerTool->UnSetLayers(aShape);
316     }
317   }
318   return 0;
319 }
320
321
322 static Standard_Integer removeAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
323 {
324   if (argc!=2) {
325     di<<"Use: "<<argv[0]<<" DocName\n";
326     return 1;
327   }
328   Handle(TDocStd_Document) Doc;
329   DDocStd::GetDocument(argv[1], Doc);
330   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
331   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
332   
333   TDF_LabelSequence aLabs;
334   localLayerTool->GetLayerLabels(aLabs);
335   if (aLabs.Length() ==0 ) {
336     return 0;
337   }
338   Standard_Integer i = 1;
339   for (; i <= aLabs.Length(); i++) {
340     TDF_Label L = aLabs.Value(i);
341     if ( !L.IsNull() ) {
342       localLayerTool->RemoveLayer(L);
343     }
344   }
345   return 0;
346 }
347
348 static Standard_Integer setVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
349 {
350   if (argc<3) {
351     di<<"Use: "<<argv[0]<<"DocName {layerLable|StringLayer} [isvisible(1/0)]\n";
352     return 1;
353   }
354   Handle(TDocStd_Document) Doc;
355   DDocStd::GetDocument(argv[1], Doc);
356   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
357   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
358   Standard_Boolean isvisible = Standard_False;
359   if ( (argc==4) && (Draw::Atoi(argv[3])==1) ) isvisible = Standard_True;
360   
361   TDF_Label aLabel;
362   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
363   if ( aLabel.IsNull() ) {
364     TCollection_ExtendedString aLayer = argv[2];
365     aLabel = localLayerTool->FindLayer(aLayer);
366   }
367   if ( aLabel.IsNull() ) return 1;
368   localLayerTool->SetVisibility(aLabel, isvisible);
369   return 0;
370 }
371
372
373 static Standard_Integer isVisible (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
374 {
375   if (argc!=3) {
376     di<<"Use: "<<argv[0]<<" DocName {layerLable|StringLayer}\n";
377     return 1;
378   }
379   Handle(TDocStd_Document) Doc;
380   DDocStd::GetDocument(argv[1], Doc);
381   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
382   Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
383
384   TDF_Label aLabel;
385   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
386   if ( aLabel.IsNull() ) {
387     TCollection_ExtendedString aLayer = argv[2];
388     aLabel = localLayerTool->FindLayer(aLayer);
389   }
390   if ( aLabel.IsNull() ) return 1;
391   if (localLayerTool->IsVisible( aLabel) ) di << 1;
392   else di << 0;
393   return 0;
394 }
395
396 static Standard_Integer getLayerRefs(Draw_Interpretor& theDI,
397                                      Standard_Integer theArgc,
398                                      const char** theArgv)
399 {
400   if (theArgc != 3)
401   {
402     theDI << "Use: " << theArgv[0] << "DocName Label\n";
403     return 1;
404   }
405
406   Handle(TDocStd_Document) aDoc;
407   DDocStd::GetDocument(theArgv[1], aDoc);
408   if (aDoc.IsNull())
409   {
410     theDI << "Error: \"" << theArgv[1] << "\" is not a document.\n";
411     return 1;
412   }
413
414   TDF_Label aLabel;
415   TDF_Tool::Label(aDoc->GetData(), theArgv[2], aLabel);
416   if (aLabel.IsNull())
417   {
418     theDI << "Error: Document \"" << theArgv[1] << "\" does not have a label \"" << theArgv[2] << "\".\n";
419     return 1;
420   }
421
422   Handle(XCAFDoc_GraphNode) aGraphNode;
423   aLabel.FindAttribute(XCAFDoc::LayerRefGUID(), aGraphNode);
424   if (aGraphNode.IsNull())
425   {
426     theDI << "Error: Label \"" << theArgv[2] << "\" does not have a layer ref.\n";
427     return 1;
428   }
429
430   if (aGraphNode->NbChildren() > 0)
431   {
432     theDI << "Label \"" << theArgv[2] << "\" childs:\n";
433     for (int anIndex = 1; anIndex <= aGraphNode->NbChildren(); ++anIndex)
434     {
435       Handle(XCAFDoc_GraphNode) aChild = aGraphNode->GetChild(anIndex);
436       TCollection_AsciiString anEntry;
437       TDF_Tool::Entry(aChild->Label(), anEntry);
438       theDI << anEntry << "\n";
439     }
440   }
441
442   if (aGraphNode->NbFathers() > 0)
443   {
444     theDI << "Label \"" << theArgv[2] << "\" fathers:\n";
445     for (int anIndex = 1; anIndex <= aGraphNode->NbFathers(); ++anIndex)
446     {
447       Handle(XCAFDoc_GraphNode) aFather = aGraphNode->GetFather(anIndex);
448       TCollection_AsciiString anEntry;
449       TDF_Tool::Entry(aFather->Label(), anEntry);
450       theDI << anEntry << "\n";
451     }
452   }
453
454   return 0;
455 }
456
457 //=======================================================================
458 //function : InitCommands
459 //purpose  : 
460 //=======================================================================
461
462 void XDEDRAW_Layers::InitCommands(Draw_Interpretor& di) 
463 {
464   static Standard_Boolean initactor = Standard_False;
465   if (initactor)
466   {
467     return;
468   }
469   initactor = Standard_True;
470
471   //=====================================
472   // Work with layers
473   //=====================================  
474   
475   Standard_CString g = "XDE layer's commands";
476   
477   di.Add ("XSetLayer","DocName {Shape|Label} StringLayer [shapeInOneLayer(0/1)] \t: Set reference between Shape and Layer (add layer if nesessary). shapeInOneLayer 0 is default",
478                    __FILE__, setLayer, g);
479
480   di.Add ("XGetLayers","DocName {Shape|Label} \t: Get layers of indicated shape",
481                    __FILE__, getLayers, g);
482
483   di.Add ("XGetOneLayer","DocName LayerLabel \t: Print name of layer.",
484                    __FILE__, getOneLayer, g);
485
486   di.Add ("XAddLayer","DocName StringLayer \t: Adding layer in XCAFDocument.",
487                    __FILE__, addLayer, g);
488
489   di.Add ("XSetLinkLayer","DocName {Shape|Label} LayerL [shapeInOneLayer(0/1)] \t: Set reference between shape and existing layer. shapeInOneLayer 0 is default",
490                    __FILE__, setLinkLayer, g);
491
492   di.Add ("XGetAllLayers","DocName \t: Get all layers in XCAFDocument.",
493                    __FILE__, getAllLayers, g);
494
495   di.Add ("XUnSetLayer","DocName {Shape|Label} stringL \t: unset shape from indicated layer.",
496                    __FILE__, unSetLayer, g);
497
498   di.Add ("XUnSetAllLayers","DocName {Shape|Label} \t: unset shape from all layers.",
499                    __FILE__, unSetAllLayers, g);
500
501   di.Add ("XRemoveLayer","DocName {Label|string} \t:remove layer from XCAFDocument.",
502                    __FILE__, removeLayer, g);
503
504   di.Add ("XRemoveAllLayers","DocName \t: remove all layers from XCAFDocument.",
505                    __FILE__, removeAllLayers, g);
506
507   di.Add ("XFindLayer","DocName string \t: Print label where are layer is situated.",
508                    __FILE__, findLayer, g);
509
510   di.Add ("XGetLayerLabels","DocName \t: Print labels from layertable.",
511                    __FILE__, getLayerLabels, g);
512
513   di.Add ("XSetVisibility","DocName {layerLable|StringLayer} [isvisible(1/0)] \t: Set visibility of layer",
514                    __FILE__, setVisibility, g);
515
516   di.Add ("XIsVisible","DocName {layerLable|StringLayer} \t: Return 1 if layer is visible, 0 if not",
517                    __FILE__, isVisible, g);
518
519   di.Add("XGetLayerRefs", "DocName Label \t: Prints layers labels which are referenced in passed label or prints labels which reference passed layer label.",
520          __FILE__, getLayerRefs, g);
521 }