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 TCollection_AsciiString Entry(aLayerS->Value(i),'?');
154 di << "\"" << Entry.ToCString() << "\" ";
160 static Standard_Integer getLayerLabels (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
163 di<<"Use: "<<argv[0]<<" DocName\n";
166 Handle(TDocStd_Document) Doc;
167 DDocStd::GetDocument(argv[1], Doc);
168 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
169 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
170 TDF_LabelSequence aLabs;
171 localLayerTool->GetLayerLabels(aLabs);
172 if (aLabs.Length() ==0 ) {
175 Standard_Integer i = 1;
176 for (; i <= aLabs.Length(); i++) {
177 TDF_Label L = aLabs.Value(i);
179 TCollection_AsciiString Entry;
180 TDF_Tool::Entry(L, Entry);
181 di << Entry.ToCString() << " ";
188 static Standard_Integer getOneLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
191 di<<"Use: "<<argv[0]<<" DocName LayerLabel\n";
194 Handle(TDocStd_Document) Doc;
195 DDocStd::GetDocument(argv[1], Doc);
196 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
197 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
199 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
200 if ( !aLabel.IsNull() ) {
201 TCollection_ExtendedString layerName;
202 localLayerTool->GetLayer(aLabel, layerName);
203 TCollection_AsciiString Entry(layerName,'?');
204 di << "\"" << Entry.ToCString() <<"\"";
210 static Standard_Integer setLinkLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
213 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} LayerL [shapeInOneLayer(0/1)]\n";
216 Standard_Boolean shapeInOneLayer = Standard_False;
217 if ( (argc==5) && (Draw::Atoi(argv[4])==1) ) shapeInOneLayer = Standard_True;
218 Handle(TDocStd_Document) Doc;
219 DDocStd::GetDocument(argv[1], Doc);
220 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
221 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
222 TDF_Label aLabel, layerLabel;
223 TDF_Tool::Label(Doc->GetData(), argv[3], layerLabel);
225 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
226 if ( !layerLabel.IsNull() ) {
227 if ( !aLabel.IsNull() ) {
228 localLayerTool->SetLayer(aLabel, layerLabel, shapeInOneLayer);
231 TopoDS_Shape aShape= DBRep::Get(argv[2]);
232 if ( !aShape.IsNull() ) {
233 localLayerTool->SetLayer(aShape, layerLabel, shapeInOneLayer);
241 static Standard_Integer getAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
244 di<<"Use: "<<argv[0]<<" DocName\n";
247 Handle(TDocStd_Document) Doc;
248 DDocStd::GetDocument(argv[1], Doc);
249 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
250 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
251 TDF_LabelSequence aLabs;
252 localLayerTool->GetLayerLabels(aLabs);
253 if (aLabs.Length() ==0 ) {
256 Standard_Integer i = 1;
257 TCollection_ExtendedString layerName;
259 for (; i <= aLabs.Length(); i++) {
260 TDF_Label L = aLabs.Value(i);
262 localLayerTool->GetLayer(L, layerName);
263 TCollection_AsciiString Entry(layerName,'?');
264 di << "\"" << Entry.ToCString() <<"\"";
272 static Standard_Integer unSetLayer (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
275 di<<"Use: "<<argv[0]<<" DocName {Shape|Label} stringL\n";
278 Handle(TDocStd_Document) Doc;
279 DDocStd::GetDocument(argv[1], Doc);
280 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
281 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
283 TCollection_ExtendedString aLayer = argv[3];
285 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
286 if ( !aLabel.IsNull() ) {
287 localLayerTool->UnSetOneLayer(aLabel, aLayer);
290 TopoDS_Shape aShape= DBRep::Get(argv[2]);
291 if ( !aShape.IsNull() ) {
292 localLayerTool->UnSetOneLayer(aShape, aLayer);
299 static Standard_Integer unSetAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
302 di<<"Use: "<<argv[0]<<" DocName {Shape|Label}\n";
305 Handle(TDocStd_Document) Doc;
306 DDocStd::GetDocument(argv[1], Doc);
307 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
308 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
311 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
312 if ( !aLabel.IsNull() ) {
313 localLayerTool->UnSetLayers(aLabel);
316 TopoDS_Shape aShape= DBRep::Get(argv[2]);
317 if ( !aShape.IsNull() ) {
318 localLayerTool->UnSetLayers(aShape);
325 static Standard_Integer removeAllLayers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
328 di<<"Use: "<<argv[0]<<" DocName\n";
331 Handle(TDocStd_Document) Doc;
332 DDocStd::GetDocument(argv[1], Doc);
333 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
334 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
336 TDF_LabelSequence aLabs;
337 localLayerTool->GetLayerLabels(aLabs);
338 if (aLabs.Length() ==0 ) {
341 Standard_Integer i = 1;
342 for (; i <= aLabs.Length(); i++) {
343 TDF_Label L = aLabs.Value(i);
345 localLayerTool->RemoveLayer(L);
351 static Standard_Integer setVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
354 di<<"Use: "<<argv[0]<<"DocName {layerLable|StringLayer} [isvisible(1/0)]\n";
357 Handle(TDocStd_Document) Doc;
358 DDocStd::GetDocument(argv[1], Doc);
359 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
360 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
361 Standard_Boolean isvisible = Standard_False;
362 if ( (argc==4) && (Draw::Atoi(argv[3])==1) ) isvisible = Standard_True;
365 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
366 if ( aLabel.IsNull() ) {
367 TCollection_ExtendedString aLayer = argv[2];
368 aLabel = localLayerTool->FindLayer(aLayer);
370 if ( aLabel.IsNull() ) return 1;
371 localLayerTool->SetVisibility(aLabel, isvisible);
376 static Standard_Integer isVisible (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
379 di<<"Use: "<<argv[0]<<" DocName {layerLable|StringLayer}\n";
382 Handle(TDocStd_Document) Doc;
383 DDocStd::GetDocument(argv[1], Doc);
384 if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
385 Handle(XCAFDoc_LayerTool) localLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
388 TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
389 if ( aLabel.IsNull() ) {
390 TCollection_ExtendedString aLayer = argv[2];
391 aLabel = localLayerTool->FindLayer(aLayer);
393 if ( aLabel.IsNull() ) return 1;
394 if (localLayerTool->IsVisible( aLabel) ) di << 1;
399 static Standard_Integer getLayerRefs(Draw_Interpretor& theDI,
400 Standard_Integer theArgc,
401 const char** theArgv)
405 theDI << "Use: " << theArgv[0] << "DocName Label\n";
409 Handle(TDocStd_Document) aDoc;
410 DDocStd::GetDocument(theArgv[1], aDoc);
413 theDI << "Error: \"" << theArgv[1] << "\" is not a document.\n";
418 TDF_Tool::Label(aDoc->GetData(), theArgv[2], aLabel);
421 theDI << "Error: Document \"" << theArgv[1] << "\" does not have a label \"" << theArgv[2] << "\".\n";
425 Handle(XCAFDoc_GraphNode) aGraphNode;
426 aLabel.FindAttribute(XCAFDoc::LayerRefGUID(), aGraphNode);
427 if (aGraphNode.IsNull())
429 theDI << "Error: Label \"" << theArgv[2] << "\" does not have a layer ref.\n";
433 if (aGraphNode->NbChildren() > 0)
435 theDI << "Label \"" << theArgv[2] << "\" childs:\n";
436 for (int anIndex = 1; anIndex <= aGraphNode->NbChildren(); ++anIndex)
438 Handle(XCAFDoc_GraphNode) aChild = aGraphNode->GetChild(anIndex);
439 TCollection_AsciiString anEntry;
440 TDF_Tool::Entry(aChild->Label(), anEntry);
441 theDI << anEntry << "\n";
445 if (aGraphNode->NbFathers() > 0)
447 theDI << "Label \"" << theArgv[2] << "\" fathers:\n";
448 for (int anIndex = 1; anIndex <= aGraphNode->NbFathers(); ++anIndex)
450 Handle(XCAFDoc_GraphNode) aFather = aGraphNode->GetFather(anIndex);
451 TCollection_AsciiString anEntry;
452 TDF_Tool::Entry(aFather->Label(), anEntry);
453 theDI << anEntry << "\n";
460 //=======================================================================
461 //function : InitCommands
463 //=======================================================================
465 void XDEDRAW_Layers::InitCommands(Draw_Interpretor& di)
467 static Standard_Boolean initactor = Standard_False;
472 initactor = Standard_True;
474 //=====================================
476 //=====================================
478 Standard_CString g = "XDE layer's commands";
480 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",
481 __FILE__, setLayer, g);
483 di.Add ("XGetLayers","DocName {Shape|Label} \t: Get layers of indicated shape",
484 __FILE__, getLayers, g);
486 di.Add ("XGetOneLayer","DocName LayerLabel \t: Print name of layer.",
487 __FILE__, getOneLayer, g);
489 di.Add ("XAddLayer","DocName StringLayer \t: Adding layer in XCAFDocument.",
490 __FILE__, addLayer, g);
492 di.Add ("XSetLinkLayer","DocName {Shape|Label} LayerL [shapeInOneLayer(0/1)] \t: Set reference between shape and existing layer. shapeInOneLayer 0 is default",
493 __FILE__, setLinkLayer, g);
495 di.Add ("XGetAllLayers","DocName \t: Get all layers in XCAFDocument.",
496 __FILE__, getAllLayers, g);
498 di.Add ("XUnSetLayer","DocName {Shape|Label} stringL \t: unset shape from indicated layer.",
499 __FILE__, unSetLayer, g);
501 di.Add ("XUnSetAllLayers","DocName {Shape|Label} \t: unset shape from all layers.",
502 __FILE__, unSetAllLayers, g);
504 di.Add ("XRemoveLayer","DocName {Label|string} \t:remove layer from XCAFDocument.",
505 __FILE__, removeLayer, g);
507 di.Add ("XRemoveAllLayers","DocName \t: remove all layers from XCAFDocument.",
508 __FILE__, removeAllLayers, g);
510 di.Add ("XFindLayer","DocName string \t: Print label where are layer is situated.",
511 __FILE__, findLayer, g);
513 di.Add ("XGetLayerLabels","DocName \t: Print labels from layertable.",
514 __FILE__, getLayerLabels, g);
516 di.Add ("XSetVisibility","DocName {layerLable|StringLayer} [isvisible(1/0)] \t: Set visibility of layer",
517 __FILE__, setVisibility, g);
519 di.Add ("XIsVisible","DocName {layerLable|StringLayer} \t: Return 1 if layer is visible, 0 if not",
520 __FILE__, isVisible, g);
522 di.Add("XGetLayerRefs", "DocName Label \t: Prints layers labels which are referenced in passed label or prints labels which reference passed layer label.",
523 __FILE__, getLayerRefs, g);