1 // Created on: 2000-08-04
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
18 #include <DDocStd.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>
34 //=======================================================================
35 // Section: Work with layers
36 //=======================================================================
37 static Standard_Integer addLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
40 di<<"Use: "<<argv[0]<<" DocName StringLayer \n";
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());
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();
56 static Standard_Integer findLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
59 di<<"Use: "<<argv[0]<<" DocName StringLayer \n";
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());
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();
75 static Standard_Integer removeLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
78 di<<"Use: "<<argv[0]<<" DocName {Label|string}\n";
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());
87 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
88 if ( aLabel.IsNull() ) {
89 TCollection_ExtendedString aLayer = argv[2];
90 aLabel = localLayerTool->FindLayer(aLayer);
92 if ( aLabel.IsNull() ) return 1;
93 localLayerTool->RemoveLayer( aLabel);
98 static Standard_Integer setLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
101 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} StringLayer [shapeInOneLayer(0/1)]\n";
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());
111 TCollection_ExtendedString aLayer = argv[3];
113 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
114 if ( !aLabel.IsNull() ) {
115 localLayerTool->SetLayer(aLabel, aLayer, shapeInOneLayer);
118 TopoDS_Shape aShape= DBRep::Get(argv[2]);
119 if ( !aShape.IsNull() ) {
120 localLayerTool->SetLayer(aShape, aLayer, shapeInOneLayer);
127 static Standard_Integer getLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
130 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} \n";
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());
139 Handle(TColStd_HSequenceOfExtendedString) aLayerS;
140 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
141 if ( !aLabel.IsNull() ) {
142 localLayerTool->GetLayers(aLabel, aLayerS);
145 TopoDS_Shape aShape= DBRep::Get(argv[2]);
146 if ( !aShape.IsNull() ) {
147 localLayerTool->GetLayers(aShape, aLayerS);
150 Standard_Integer i = 1;
151 if (!aLayerS.IsNull() && aLayerS->Length()!=0)
152 for (; i <= aLayerS->Length(); i++) {
153 di << "\"" << aLayerS->Value(i) << "\" ";
159 static Standard_Integer getLayerLabels (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
162 di<<"Use: "<<argv[0]<<" DocName\n";
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 ) {
174 Standard_Integer i = 1;
175 for (; i <= aLabs.Length(); i++) {
176 TDF_Label L = aLabs.Value(i);
178 TCollection_AsciiString Entry;
179 TDF_Tool::Entry(L, Entry);
180 di << Entry.ToCString() << " ";
187 static Standard_Integer getOneLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
190 di<<"Use: "<<argv[0]<<" DocName LayerLabel\n";
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());
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 <<"\"";
208 static Standard_Integer setLinkLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
211 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} LayerL [shapeInOneLayer(0/1)]\n";
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);
223 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
224 if ( !layerLabel.IsNull() ) {
225 if ( !aLabel.IsNull() ) {
226 localLayerTool->SetLayer(aLabel, layerLabel, shapeInOneLayer);
229 TopoDS_Shape aShape= DBRep::Get(argv[2]);
230 if ( !aShape.IsNull() ) {
231 localLayerTool->SetLayer(aShape, layerLabel, shapeInOneLayer);
239 static Standard_Integer getAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
242 di<<"Use: "<<argv[0]<<" DocName\n";
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 ) {
254 Standard_Integer i = 1;
255 TCollection_ExtendedString layerName;
257 for (; i <= aLabs.Length(); i++) {
258 TDF_Label L = aLabs.Value(i);
260 localLayerTool->GetLayer(L, layerName);
261 di << "\"" << layerName <<"\"";
269 static Standard_Integer unSetLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
272 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} stringL\n";
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());
280 TCollection_ExtendedString aLayer = argv[3];
282 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
283 if ( !aLabel.IsNull() ) {
284 localLayerTool->UnSetOneLayer(aLabel, aLayer);
287 TopoDS_Shape aShape= DBRep::Get(argv[2]);
288 if ( !aShape.IsNull() ) {
289 localLayerTool->UnSetOneLayer(aShape, aLayer);
296 static Standard_Integer unSetAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
299 di<<"Use: "<<argv[0]<<" DocName {Shape|Label}\n";
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());
308 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
309 if ( !aLabel.IsNull() ) {
310 localLayerTool->UnSetLayers(aLabel);
313 TopoDS_Shape aShape= DBRep::Get(argv[2]);
314 if ( !aShape.IsNull() ) {
315 localLayerTool->UnSetLayers(aShape);
322 static Standard_Integer removeAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
325 di<<"Use: "<<argv[0]<<" DocName\n";
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());
333 TDF_LabelSequence aLabs;
334 localLayerTool->GetLayerLabels(aLabs);
335 if (aLabs.Length() ==0 ) {
338 Standard_Integer i = 1;
339 for (; i <= aLabs.Length(); i++) {
340 TDF_Label L = aLabs.Value(i);
342 localLayerTool->RemoveLayer(L);
348 static Standard_Integer setVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
351 di<<"Use: "<<argv[0]<<"DocName {layerLable|StringLayer} [isvisible(1/0)]\n";
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;
362 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
363 if ( aLabel.IsNull() ) {
364 TCollection_ExtendedString aLayer = argv[2];
365 aLabel = localLayerTool->FindLayer(aLayer);
367 if ( aLabel.IsNull() ) return 1;
368 localLayerTool->SetVisibility(aLabel, isvisible);
373 static Standard_Integer isVisible (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
376 di<<"Use: "<<argv[0]<<" DocName {layerLable|StringLayer}\n";
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());
385 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
386 if ( aLabel.IsNull() ) {
387 TCollection_ExtendedString aLayer = argv[2];
388 aLabel = localLayerTool->FindLayer(aLayer);
390 if ( aLabel.IsNull() ) return 1;
391 if (localLayerTool->IsVisible( aLabel) ) di << 1;
396 static Standard_Integer getLayerRefs(Draw_Interpretor& theDI,
397 Standard_Integer theArgc,
398 const char** theArgv)
402 theDI << "Use: " << theArgv[0] << "DocName Label\n";
406 Handle(TDocStd_Document) aDoc;
407 DDocStd::GetDocument(theArgv[1], aDoc);
410 theDI << "Error: \"" << theArgv[1] << "\" is not a document.\n";
415 TDF_Tool::Label(aDoc->GetData(), theArgv[2], aLabel);
418 theDI << "Error: Document \"" << theArgv[1] << "\" does not have a label \"" << theArgv[2] << "\".\n";
422 Handle(XCAFDoc_GraphNode) aGraphNode;
423 aLabel.FindAttribute(XCAFDoc::LayerRefGUID(), aGraphNode);
424 if (aGraphNode.IsNull())
426 theDI << "Error: Label \"" << theArgv[2] << "\" does not have a layer ref.\n";
430 if (aGraphNode->NbChildren() > 0)
432 theDI << "Label \"" << theArgv[2] << "\" childs:\n";
433 for (int anIndex = 1; anIndex <= aGraphNode->NbChildren(); ++anIndex)
435 Handle(XCAFDoc_GraphNode) aChild = aGraphNode->GetChild(anIndex);
436 TCollection_AsciiString anEntry;
437 TDF_Tool::Entry(aChild->Label(), anEntry);
438 theDI << anEntry << "\n";
442 if (aGraphNode->NbFathers() > 0)
444 theDI << "Label \"" << theArgv[2] << "\" fathers:\n";
445 for (int anIndex = 1; anIndex <= aGraphNode->NbFathers(); ++anIndex)
447 Handle(XCAFDoc_GraphNode) aFather = aGraphNode->GetFather(anIndex);
448 TCollection_AsciiString anEntry;
449 TDF_Tool::Entry(aFather->Label(), anEntry);
450 theDI << anEntry << "\n";
457 //=======================================================================
458 //function : InitCommands
460 //=======================================================================
462 void XDEDRAW_Layers::InitCommands(Draw_Interpretor& di)
464 static Standard_Boolean initactor = Standard_False;
469 initactor = Standard_True;
471 //=====================================
473 //=====================================
475 Standard_CString g = "XDE layer's commands";
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);
480 di.Add ("XGetLayers","DocName {Shape|Label} \t: Get layers of indicated shape",
481 __FILE__, getLayers, g);
483 di.Add ("XGetOneLayer","DocName LayerLabel \t: Print name of layer.",
484 __FILE__, getOneLayer, g);
486 di.Add ("XAddLayer","DocName StringLayer \t: Adding layer in XCAFDocument.",
487 __FILE__, addLayer, g);
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);
492 di.Add ("XGetAllLayers","DocName \t: Get all layers in XCAFDocument.",
493 __FILE__, getAllLayers, g);
495 di.Add ("XUnSetLayer","DocName {Shape|Label} stringL \t: unset shape from indicated layer.",
496 __FILE__, unSetLayer, g);
498 di.Add ("XUnSetAllLayers","DocName {Shape|Label} \t: unset shape from all layers.",
499 __FILE__, unSetAllLayers, g);
501 di.Add ("XRemoveLayer","DocName {Label|string} \t:remove layer from XCAFDocument.",
502 __FILE__, removeLayer, g);
504 di.Add ("XRemoveAllLayers","DocName \t: remove all layers from XCAFDocument.",
505 __FILE__, removeAllLayers, g);
507 di.Add ("XFindLayer","DocName string \t: Print label where are layer is situated.",
508 __FILE__, findLayer, g);
510 di.Add ("XGetLayerLabels","DocName \t: Print labels from layertable.",
511 __FILE__, getLayerLabels, g);
513 di.Add ("XSetVisibility","DocName {layerLable|StringLayer} [isvisible(1/0)] \t: Set visibility of layer",
514 __FILE__, setVisibility, g);
516 di.Add ("XIsVisible","DocName {layerLable|StringLayer} \t: Return 1 if layer is visible, 0 if not",
517 __FILE__, isVisible, g);
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);