0028643: Coding rules - eliminate GCC compiler warnings -Wmisleading-indentation
[occt.git] / src / XDEDRAW / XDEDRAW_Shapes.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 <BRep_Builder.hxx>
18 #include <DBRep.hxx>
19 #include <DDocStd.hxx>
20 #include <Draw.hxx>
21 #include <gp_Trsf.hxx>
22 #include <TCollection_AsciiString.hxx>
23 #include <TDF_AttributeSequence.hxx>
24 #include <TDF_Label.hxx>
25 #include <TDF_LabelSequence.hxx>
26 #include <TDF_Tool.hxx>
27 #include <TDocStd_Document.hxx>
28 #include <TopoDS_Compound.hxx>
29 #include <TopoDS_Shape.hxx>
30 #include <TopTools_SequenceOfShape.hxx>
31 #include <XCAFDoc_DocumentTool.hxx>
32 #include <XCAFDoc_GraphNode.hxx>
33 #include <XCAFDoc_Location.hxx>
34 #include <XCAFDoc_ShapeTool.hxx>
35 #include <XDEDRAW_Shapes.hxx>
36
37 #include <stdio.h>
38 //=======================================================================
39 // Section: Work with shapes
40 //=======================================================================
41 static Standard_Integer addShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
42 {
43   if (argc<3) {
44     di<<"Use: "<<argv[0]<<" DocName Shape [int makeAssembly (1/0)]\n";
45     return 1;
46   }
47   Handle(TDocStd_Document) Doc;   
48   DDocStd::GetDocument(argv[1], Doc);
49   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
50
51   TopoDS_Shape aShape;
52   aShape = DBRep::Get(argv[2]);
53   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
54   Standard_Boolean makeAssembly = Standard_True;
55   if ( argc==4 && Draw::Atoi(argv[3]) == 0 ) makeAssembly = Standard_False;
56   TDF_Label aLabel;
57   aLabel = myAssembly->AddShape(aShape, makeAssembly);
58   if (aLabel.IsNull()) di<<"Null Label\n";
59   TCollection_AsciiString Entry;
60   TDF_Tool::Entry(aLabel, Entry);
61   di << Entry.ToCString();
62   return 0;
63 }
64
65 static Standard_Integer newShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
66 {
67   if (argc!=2) {
68     di<<"Use: "<<argv[0]<<" DocName \n";
69     return 1;
70   }
71   Handle(TDocStd_Document) Doc;
72   TDF_Label aLabel;
73   DDocStd::GetDocument(argv[1], Doc);
74   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
75
76   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
77 //XCAFDoc_ShapeTool myAssembly;
78 //  myAssembly.Init(Doc);
79   aLabel=myAssembly->NewShape();
80   //  di<<"New Shape at ChildTag"<<aLabel.Tag()<<"\n";
81   TCollection_AsciiString Entry;
82   TDF_Tool::Entry(aLabel, Entry);
83   di << Entry.ToCString();
84   return 0;
85 }
86
87 static Standard_Integer setShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
88 {
89   if (argc!=4) {
90     di<<"Use: "<<argv[0]<<" DocName Label Shape \n";
91     return 1;
92   }
93   Handle(TDocStd_Document) Doc;   
94   DDocStd::GetDocument(argv[1], Doc);
95   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
96
97   TDF_Label aLabel;
98   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
99   TopoDS_Shape aShape;
100   //   if (aLabel.IsNull()) di<<"Null Label\n";
101   aShape = DBRep::Get(argv[3]);
102 //  XCAFDoc_ShapeTool myAssembly;
103 //  myAssembly.Init(Doc);
104   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
105   myAssembly->SetShape(aLabel, aShape);
106   return 0;
107 }
108
109 static Standard_Integer getShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
110 {
111   if (argc!=4) {
112     di<<"Use: "<<argv[0]<<" Result DocName Label\n";
113     return 1;
114   }
115   Handle(TDocStd_Document) Doc;   
116   DDocStd::GetDocument(argv[2], Doc);
117   if ( Doc.IsNull() ) { di << argv[2] << " is not a document\n"; return 1; }
118
119   TDF_Label aLabel;
120   TDF_Tool::Label(Doc->GetData(), argv[3], aLabel);
121   if (aLabel.IsNull()) {di<<"No such Label\n"; return 1;}
122   TopoDS_Shape aShape;
123 //  XCAFDoc_ShapeTool myAssembly;
124 //  myAssembly.Init(Doc);
125   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
126   aShape = myAssembly->GetShape(aLabel);
127   Standard_CString name1 = argv[1];
128   DBRep::Set(name1, aShape);
129   
130   return 0;
131 }
132
133 static Standard_Integer removeShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
134 {
135   if (argc != 3 && argc != 4)
136   {
137     di<<"Use: "<<argv[0]<<" DocName Label [int removeCompletely (1/0)]\n";
138     return 1;
139   }
140   Handle(TDocStd_Document) Doc;   
141   DDocStd::GetDocument(argv[1], Doc);
142   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
143
144   TDF_Label aLabel;
145   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
146   if (aLabel.IsNull()) {di<<"No such Label\n"; return 1;}
147   TopoDS_Shape aShape;
148 //  XCAFDoc_ShapeTool myAssembly;
149 //  myAssembly.Init(Doc);
150   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
151   Standard_Boolean removeCompletely = Standard_True;
152   if ( argc == 4 && Draw::Atoi(argv[3]) == 0 ) 
153     removeCompletely = Standard_False;
154   myAssembly->RemoveShape(aLabel, removeCompletely);
155   
156   return 0;
157 }
158
159 static Standard_Integer findShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
160 {
161   if (argc!=3) {
162     di<<"Use: "<<argv[0]<<" DocName Shape\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
169   TDF_Label aLabel;
170   TopoDS_Shape aShape;
171   aShape = DBRep::Get(argv[2]);
172 //  XCAFDoc_ShapeTool myAssembly;
173 //  myAssembly.Init(Doc);
174   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
175   aLabel = myAssembly->FindShape(aShape);
176   TCollection_AsciiString Entry;
177   TDF_Tool::Entry(aLabel, Entry);
178   di << Entry.ToCString();
179   //di<<"Label with Shape is "<<Entry<<"\n";
180   return 0;
181 }
182
183 static Standard_Integer labelInfo (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
184 {
185   if (argc!=3) {
186     di<<"Use: "<<argv[0]<<" DocName Label \n";
187     return 1;
188   }
189   Handle(TDocStd_Document) Doc;   
190   DDocStd::GetDocument(argv[1], Doc);
191   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
192
193   TDF_Label aLabel;
194   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
195 //  XCAFDoc_ShapeTool myAssembly;
196 //  myAssembly.Init(Doc);
197   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
198   TCollection_AsciiString Entry;
199
200   if ( myAssembly->IsShape(aLabel) ) {
201     //di<<"There are a TopLevelShape\n";
202     Entry="There are a TopLevelShape";
203     di << Entry.ToCString();
204   }
205   if ( myAssembly->IsComponent(aLabel) ) {
206     //di<<"There are a Component\n";
207     Entry="There are a Component";
208     di << Entry.ToCString();
209   }
210   if ( myAssembly->IsAssembly(aLabel) ) {
211     //di<<"There are an Assembly\n";
212     Entry="There are an Assembly";
213     di << Entry.ToCString();
214   }
215   if ( myAssembly->IsFree(aLabel) ) {
216     //di<<"This Shape don't used\n";
217     Entry="This Shape don't used";
218     di << Entry.ToCString();
219   }
220   return 0;
221 }
222
223 static Standard_Integer getUsers (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
224 {
225   if (argc<3) {
226     di<<"Use: "<<argv[0]<<" Doc Label [withSubChilds(int)]\n";
227     return 1;
228   }
229   Standard_Boolean getsubchilds = Standard_False;
230   if ( (argc==4) && ( Draw::Atoi(argv[3])==1 ) ) getsubchilds = Standard_True;
231   
232   Handle(TDocStd_Document) Doc;   
233   DDocStd::GetDocument(argv[1], Doc);
234   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
235
236   TDF_Label aLabel;
237   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
238   TDF_LabelSequence labseq;
239   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
240   TCollection_AsciiString Entry;
241   Entry=myAssembly->GetUsers(aLabel, labseq, getsubchilds);
242   di << Entry.ToCString();
243   //di<<myAssembly->GetUsers(aLabel, labseq, getsubchilds)<<" assemblies use this component\n";
244   return 0;
245 }
246
247 static Standard_Integer nbComponents (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
248 {
249   if (argc<3) {
250     di<<"Use: "<<argv[0]<<" Doc Label [withSubChilds(int)]\n";
251     return 1;
252   }
253   Standard_Boolean getsubchilds = Standard_False;
254   if ( (argc==4) && ( Draw::Atoi(argv[3])==1 ) ) getsubchilds = Standard_True;
255   Handle(TDocStd_Document) Doc;   
256   DDocStd::GetDocument(argv[1], Doc);
257   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
258
259   TDF_Label aLabel;
260   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
261   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
262 //  XCAFDoc_ShapeTool myAssembly->
263 //  myAssembly->Init(Doc);
264   //di<<"This assembly has ";
265   TCollection_AsciiString Entry;
266   Entry=myAssembly->NbComponents( aLabel, getsubchilds);
267   di << Entry.ToCString();
268   //di<<" components\n";
269   //di<<"This assembly has "<<myAssembly->NbComponents( aLabel, getsubchilds )<<" components\n";
270
271   return 0;
272 }
273
274 static Standard_Integer addComponent (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
275 {
276   if (argc!=4) {
277     di<<"Use: "<<argv[0]<<" DocName Label Shape \n";
278     return 1;
279   }
280   Handle(TDocStd_Document) Doc;   
281   DDocStd::GetDocument(argv[1], Doc);
282   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
283
284   TDF_Label aLabel;
285   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
286   TopoDS_Shape aShape;
287   aShape = DBRep::Get(argv[3]);
288   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
289 //  XCAFDoc_ShapeTool myAssembly->
290 //  myAssembly->Init(Doc);
291   myAssembly->AddComponent(aLabel, aShape);
292   TCollection_AsciiString Entry;
293   TDF_Tool::Entry(aLabel, Entry);
294   di << Entry.ToCString();
295   
296   return 0;
297 }
298
299 static Standard_Integer removeComponent (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
300 {
301   if (argc!=3) {
302     di<<"Use: "<<argv[0]<<" DocName Label \n";
303     return 1;
304   }
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
309   TDF_Label aLabel;
310   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
311   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
312 //  XCAFDoc_ShapeTool myAssembly->
313 //  myAssembly->Init(Doc);
314   myAssembly->RemoveComponent(aLabel);
315   return 0;
316 }
317
318 static Standard_Integer getReferredShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
319 {
320   if (argc!=3) {
321     di<<"Use: "<<argv[0]<<" DocName Label \n";
322     return 1;
323   }
324   Handle(TDocStd_Document) Doc;   
325   DDocStd::GetDocument(argv[1], Doc);
326   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
327
328   TDF_Label aLabel, RootLabel;
329   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
330   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
331 //  XCAFDoc_ShapeTool myAssembly->
332 //  myAssembly->Init(Doc);
333   myAssembly->GetReferredShape(aLabel, RootLabel);
334   
335   TCollection_AsciiString Entry;
336   TDF_Tool::Entry(RootLabel, Entry);
337   //di<<"Label with Shape is ";
338   di << Entry.ToCString();
339   return 0;
340 }
341
342 static Standard_Integer getTopLevelShapes (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
343 {
344   if (argc!=2) {
345     di<<"Use: "<<argv[0]<<" DocName \n";
346     return 1;
347   }
348   Handle(TDocStd_Document) Doc;   
349   DDocStd::GetDocument(argv[1], Doc);
350   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
351
352   TDF_Label aLabel;
353   TDF_LabelSequence Labels;
354   
355   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
356 //  XCAFDoc_ShapeTool myAssembly->
357 //  myAssembly->Init(Doc);
358   myAssembly->GetShapes(Labels);
359   TCollection_AsciiString Entry;
360   if (Labels.Length() >= 1) {
361     for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
362       aLabel = Labels.Value(i);
363       TDF_Tool::Entry( aLabel, Entry);
364       di << Entry.ToCString() << " ";
365     }
366   }
367   return 0;
368 }
369
370 static Standard_Integer getFreeShapes (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
371 {
372   if (argc <2) {
373     di<<"Use: "<<argv[0]<<" DocName [shape_prefix]\n";
374     return 1;
375   }
376   
377   Handle(TDocStd_Document) Doc;   
378   DDocStd::GetDocument(argv[1], Doc);
379   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
380
381   TDF_LabelSequence Labels;
382   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
383   STool->GetFreeShapes(Labels);
384   if ( Labels.Length() <=0 ) {
385     di << "Document " << argv[1] << " contain no shapes\n";
386     return 0;
387   }
388   
389   if ( argc ==2 ) {
390     for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
391       TCollection_AsciiString Entry;
392       TDF_Tool::Entry( Labels.Value(i), Entry);
393       di << Entry.ToCString() << " ";
394     }
395   }
396   else if ( Labels.Length() ==1 ) {
397     TopoDS_Shape S = STool->GetShape ( Labels.Value(1) );
398     DBRep::Set ( argv[2], S );
399     di << argv[2];
400   }
401   else {
402     for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
403       TopoDS_Shape S = STool->GetShape ( Labels.Value(i) );
404       char string[260];
405       Sprintf ( string, "%s_%d", argv[2], i );
406       DBRep::Set ( string, S );
407       di << string << " ";
408     }
409   }
410   return 0;
411 }
412
413 static Standard_Integer getOneShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
414 {
415   if (argc!=3) {
416     di<<"Use: "<<argv[0]<<" shape DocName \n";
417     return 1;
418   }
419   
420   Handle(TDocStd_Document) Doc;   
421   DDocStd::GetDocument(argv[2], Doc);
422   if ( Doc.IsNull() ) { di << argv[2] << " is not a document\n"; return 1; }
423
424   TDF_LabelSequence Labels;
425   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
426   STool->GetFreeShapes(Labels);
427   if ( Labels.Length() <=0 ) {
428     di << "Document " << argv[2] << " contain no shapes\n";
429     return 0;
430   }
431   
432   if ( Labels.Length() ==1 ) {
433     TopoDS_Shape S = STool->GetShape ( Labels.Value(1) );
434     DBRep::Set ( argv[1], S );
435   }
436   else {
437     TopoDS_Compound C;
438     BRep_Builder B;
439     B.MakeCompound ( C );
440     for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
441       TopoDS_Shape S = STool->GetShape ( Labels.Value(i) );
442       B.Add ( C, S );
443     }
444     DBRep::Set ( argv[1], C );
445   }
446   di << argv[1];
447   return 0;
448 }
449
450 //=======================================================================
451 //function : XDumpLocation
452 //purpose  : Dump Transformation() of XCAFDoc_Location attribute
453 //=======================================================================
454 static Standard_Integer XDumpLocation (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
455 {
456   if (argc != 3)
457   {
458     di << "Use: " << argv[0] << " Doc Label \n";
459     return 1;
460   }
461   Handle(TDocStd_Document) Doc;   
462   DDocStd::GetDocument(argv[1], Doc);
463   if (Doc.IsNull())
464   {
465     di << argv[1] << " is not a document\n";
466     return 1;
467   }
468
469   TDF_Label aLabel;
470   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
471
472   Handle(XCAFDoc_Location) aLoc;
473   if (!aLabel.FindAttribute(XCAFDoc_Location::GetID(), aLoc))
474   {
475     di << "Label " << argv[2] << " doesn't contain XCAFDoc_Location attribute\n";
476     return 1;
477   }
478   
479   TopLoc_Location aTopLoc = aLoc->Get();
480   gp_Trsf aTrsf = aTopLoc.Transformation();
481
482   di << "Transformation (3 rows * 4 columns matrix):";
483   for (int i = 1; i <= 3; i++) // row number
484   {
485     di << " (";
486     for (int j = 1; j <= 4; j++) // column number
487     {
488       if (j > 1) di << ",";
489       di << TCollection_AsciiString(aTrsf.Value(i,j)).ToCString();
490     }
491     di << ")";
492   }
493
494   return 0;
495 }
496
497 static Standard_Integer setSHUO (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
498 {
499   if (argc < 4)
500   {
501     di << "Use: " << argv[0] << " Doc UU_Label NU_Label \n";
502     return 1;
503   }
504   Handle(TDocStd_Document) Doc;   
505   DDocStd::GetDocument(argv[1], Doc);
506   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
507   
508   TDF_LabelSequence aLabSeq;
509   for (Standard_Integer i = 3; i <= argc; i++) {
510     TDF_Label L;
511     TDF_Tool::Label(Doc->GetData(), argv[i - 1], L);
512     if (!L.IsNull())
513       aLabSeq.Append( L );
514     else
515       di << argv[i - 1] << " is null label"  << "\n";
516   }
517   if (aLabSeq.Length() < 2) {
518     di << "Error: couldnot set SHUO between on less then 2 labels\n";
519   }
520   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
521   Handle(XCAFDoc_GraphNode) aMainSHUO;
522   myAssembly->SetSHUO( aLabSeq, aMainSHUO );
523   if (aMainSHUO.IsNull()) {
524     di << "Error: cannot set the SHUO\n";
525     return 1;
526   }
527     
528   return 0;
529 }
530
531 static Standard_Integer getSHUOUpperUsage (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
532 {
533   if (argc < 3)
534   {
535     di << "Use: " << argv[0] << " Doc NU_Label \n";
536     return 1;
537   }
538   Handle(TDocStd_Document) Doc;   
539   DDocStd::GetDocument(argv[1], Doc);
540   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
541   TDF_Label NL;
542   TDF_Tool::Label(Doc->GetData(), argv[2], NL);
543   if (NL.IsNull()) {
544     di << argv[2] << " is null label"  << "\n";
545     return 1;
546   }
547   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
548   TDF_LabelSequence labseq;
549   myAssembly->GetSHUOUpperUsage( NL, labseq );
550   TCollection_AsciiString Entry;
551   if (labseq.Length() >= 1) {
552     for ( Standard_Integer i = 1; i<= labseq.Length(); i++) {
553       TDF_Label aLabel = labseq.Value(i);
554       TDF_Tool::Entry( aLabel, Entry);
555       di << Entry.ToCString() << " ";
556     }
557   }
558   return 0;
559 }
560
561 static Standard_Integer getSHUONextUsage (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
562 {
563   if (argc < 3)
564   {
565     di << "Use: " << argv[0] << " Doc UU_Label \n";
566     return 1;
567   }
568   Handle(TDocStd_Document) Doc;   
569   DDocStd::GetDocument(argv[1], Doc);
570   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
571   TDF_Label UL;
572   TDF_Tool::Label(Doc->GetData(), argv[2], UL);
573   if (UL.IsNull()) {
574     di << argv[2] << " is null label"  << "\n";
575     return 1;
576   }
577   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
578   TDF_LabelSequence labseq;
579   myAssembly->GetSHUONextUsage( UL, labseq );
580   TCollection_AsciiString Entry;
581   if (labseq.Length() >= 1) {
582     for ( Standard_Integer i = 1; i<= labseq.Length(); i++) {
583       TDF_Label aLabel = labseq.Value(i);
584       TDF_Tool::Entry( aLabel, Entry);
585       di << Entry.ToCString() << " ";
586     }
587   }
588   return 0;
589 }
590
591 static Standard_Integer removeSHUO (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
592 {
593   if (argc < 3)
594   {
595     di << "Use: " << argv[0] << " Doc SHUOComponent_Label \n";
596     return 1;
597   }
598   Handle(TDocStd_Document) Doc;   
599   DDocStd::GetDocument(argv[1], Doc);
600   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
601   TDF_Label UL;
602   TDF_Tool::Label(Doc->GetData(), argv[2], UL);
603   if (UL.IsNull()) {
604     di << argv[2] << " is null label"  << "\n";
605     return 1;
606   }
607   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
608   myAssembly->RemoveSHUO( UL );
609     
610   return 0;
611 }
612
613 static Standard_Integer hasSHUO (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
614 {
615   if (argc < 3)
616   {
617     di << "Use: " << argv[0] << " Doc SHUO_Label \n";
618     return 1;
619   }
620   Handle(TDocStd_Document) Doc;   
621   DDocStd::GetDocument(argv[1], Doc);
622   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
623   TDF_Label UL;
624   TDF_Tool::Label(Doc->GetData(), argv[2], UL);
625   if (UL.IsNull()) {
626     di << argv[2] << " is null label"  << "\n";
627     return 1;
628   }
629   Handle(XCAFDoc_GraphNode) anAttrSHUO;
630   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
631   if (myAssembly->GetSHUO( UL, anAttrSHUO ))
632     di << 1; 
633   else
634     di << 0;
635   
636   return 0;
637 }
638
639 static Standard_Integer getAllSHUO (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
640 {
641   if (argc < 3)
642   {
643     di << "Use: " << argv[0] << " Doc SHUO_Label \n";
644     return 1;
645   }
646   Handle(TDocStd_Document) Doc;   
647   DDocStd::GetDocument(argv[1], Doc);
648   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
649   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
650   TDF_Label UL;
651   TDF_Tool::Label(Doc->GetData(), argv[2], UL);
652   if (UL.IsNull()) {
653     di << argv[2] << " is null label"  << "\n";
654     return 1;
655   }
656   TDF_AttributeSequence SHUOAttrs;
657   myAssembly->GetAllComponentSHUO( UL, SHUOAttrs );
658   TCollection_AsciiString Entry;
659   if (SHUOAttrs.Length() >= 1) {
660     for ( Standard_Integer i = 1; i<= SHUOAttrs.Length(); i++) {
661       TDF_Label aLabel = SHUOAttrs.Value(i)->Label();
662       TDF_Tool::Entry( aLabel, Entry);
663       di << Entry.ToCString() << " ";
664     }
665   }
666   return 0;
667 }
668
669 static Standard_Integer findComponent (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
670 {
671   if (argc < 3)
672   {
673     di << "Use: " << argv[0] << " Doc shape \n";
674     return 1;
675   }
676   Handle(TDocStd_Document) Doc;   
677   DDocStd::GetDocument(argv[1], Doc);
678   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
679   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
680   TopoDS_Shape aShape;
681   aShape = DBRep::Get(argv[2]);
682   TDF_LabelSequence labseq;
683   myAssembly->FindComponent( aShape, labseq );
684   TCollection_AsciiString Entry;
685   if (labseq.Length() >= 1) {
686     for ( Standard_Integer i = 1; i<= labseq.Length(); i++) {
687       TDF_Label aLabel = labseq.Value(i);
688       TDF_Tool::Entry( aLabel, Entry);
689       di << Entry.ToCString() << " ";
690     }
691   }
692   return 0;
693 }
694
695 static Standard_Integer getStyledComponent (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
696 {
697   if (argc < 4)
698   {
699     di << "Use: " << argv[0] << " Doc res SHUO_label \n";
700     return 1;
701   }
702   Handle(TDocStd_Document) Doc;   
703   DDocStd::GetDocument(argv[1], Doc);
704   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
705   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
706   TopoDS_Shape aShape;
707   TDF_Label aLabel;
708   TDF_Tool::Label(Doc->GetData(), argv[3], aLabel);
709   Handle(XCAFDoc_GraphNode) SHUO;
710   if (myAssembly->GetSHUO( aLabel, SHUO ))
711     aShape = myAssembly->GetSHUOInstance( SHUO );
712   
713   if (aShape.IsNull()) {
714     di << "cannot get component\n";
715     return 1;
716   }
717   DBRep::Set ( argv[2], aShape );
718   di << argv[2];
719   return 0;
720 }
721
722 static Standard_Integer getAllStyledComponents (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
723 {
724   if (argc < 4)
725   {
726     di << "Use: " << argv[0] << " Doc res SHUO_label \n";
727     return 1;
728   }
729   Handle(TDocStd_Document) Doc;   
730   DDocStd::GetDocument(argv[1], Doc);
731   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
732   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
733   TopTools_SequenceOfShape aShapes;
734   TDF_Label aLabel;
735   TDF_Tool::Label(Doc->GetData(), argv[3], aLabel);
736   Handle(XCAFDoc_GraphNode) SHUO;
737   if (myAssembly->GetSHUO( aLabel, SHUO ))
738     if (myAssembly->GetAllSHUOInstances(SHUO, aShapes)) {
739       TopoDS_Compound aShape;
740       BRep_Builder B;
741       B.MakeCompound(aShape);
742       for (Standard_Integer jj = 1; jj <= aShapes.Length(); jj++) {
743         TopoDS_Shape aCurShape = aShapes.Value(jj);
744         B.Add( aShape, aCurShape );
745       }
746       DBRep::Set ( argv[2], aShape );
747       di << argv[2];
748     }
749       
750   return 0;
751 }
752
753 static Standard_Integer findSHUO (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
754 {
755   if (argc < 4)
756   {
757     di << "Use: " << argv[0] << " Doc labels \n";
758     return 1;
759   }
760   Handle(TDocStd_Document) Doc;   
761   DDocStd::GetDocument(argv[1], Doc);
762   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
763   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
764   TDF_LabelSequence aLabSeq;
765   for (Standard_Integer i = 3; i <= argc; i++) {
766     TDF_Label L;
767     TDF_Tool::Label(Doc->GetData(), argv[i - 1], L);
768     if (!L.IsNull())
769       aLabSeq.Append( L );
770     else
771       di << argv[i - 1] << " is null label"  << "\n";
772   }
773   if (aLabSeq.Length() < 2) {
774     di << "Error: couldnot find SHUO between on less then 2 labels\n";
775   }
776   Handle(XCAFDoc_GraphNode) SHUO;
777   myAssembly->FindSHUO( aLabSeq, SHUO );
778   if (SHUO.IsNull()) {
779     di << "cannot find SHUO\n";
780     return 1;
781   }
782   TCollection_AsciiString Entry;
783   TDF_Tool::Entry( SHUO->Label(), Entry);
784   di << Entry.ToCString() << " ";
785   
786   return 0;
787 }
788
789 static Standard_Integer setStyledComponent (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
790 {
791   if (argc < 3)
792   {
793     di << "Use: " << argv[0] << " Doc shape \n";
794     return 1;
795   }
796   Handle(TDocStd_Document) Doc;   
797   DDocStd::GetDocument(argv[1], Doc);
798   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
799   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
800   TopoDS_Shape aShape;
801   aShape = DBRep::Get(argv[2]);
802   if (aShape.IsNull()) {
803     di << "Shape " << argv[2] << " is null\n";
804     return 1;
805   }
806   Handle(XCAFDoc_GraphNode) aSHUOAttr;
807   aSHUOAttr = myAssembly->SetInstanceSHUO( aShape );
808   if (aSHUOAttr.IsNull()) {
809     di << "Error: cannot set a SHUO structure for indicated component"  << "\n";
810     return 1;
811   }
812   TCollection_AsciiString Entry;
813   TDF_Tool::Entry( aSHUOAttr->Label(), Entry);
814   di << Entry.ToCString() << " ";
815   
816   return 0;
817 }
818
819 static Standard_Integer updateAssemblies(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
820 {
821   if (argc != 2)
822   {
823     di << "Use: " << argv[0] << " Doc\n";
824     return 1;
825   }
826
827   // Get XDE document
828   Handle(TDocStd_Document) aDoc;
829   DDocStd::GetDocument(argv[1], aDoc);
830   if ( aDoc.IsNull() )
831     return 1;
832
833   // Get XDE shape tool
834   Handle(XCAFDoc_ShapeTool)
835     aShapeTool = XCAFDoc_DocumentTool::ShapeTool( aDoc->Main() );
836
837   // Update assemblies
838   aShapeTool->UpdateAssemblies();
839
840   return 0;
841 }
842
843 //=======================================================================
844 //function : InitCommands
845 //purpose  : 
846 //=======================================================================
847
848 void XDEDRAW_Shapes::InitCommands(Draw_Interpretor& di) 
849 {
850   static Standard_Boolean initactor = Standard_False;
851   if (initactor)
852   {
853     return;
854   }
855   initactor = Standard_True;
856
857   //=====================================
858   // Work with shapes
859   //=====================================  
860   
861   Standard_CString g = "XDE shape's commands";
862
863   di.Add ("XAddShape","Doc Shape [makeAssembly = 1]\t: Add shape (or assembly) to Document",
864                    __FILE__, addShape, g);
865
866   di.Add ("XNewShape","Doc \t: Create new empty top-level shape",
867                    __FILE__, newShape, g);
868
869   di.Add ("XSetShape","Doc Label Shape \t: Set shape at indicated label",
870                    __FILE__, setShape, g);
871
872   di.Add ("XGetShape","Result Doc Label \t: Put shape from tree to Result",
873                    __FILE__, getShape, g);
874
875   di.Add ("XRemoveShape","Doc Label \t: Remove shape from document",
876                    __FILE__, removeShape, g);
877
878   di.Add ("XFindShape","Doc Shape \t: Find and print label with indicated top-level shape",
879                    __FILE__, findShape, g);
880
881   di.Add ("XLabelInfo","Doc Label \t: Print information about object at following label",
882                    __FILE__, labelInfo, g);
883
884   di.Add ("XGetUsers","Doc Label [withSubChilds(int)] \t: Print number of assemblies that use shape at following label",
885                    __FILE__, getUsers, g);
886
887   di.Add ("XNbComponents","Doc Label [withSubChilds(int)] \t: Print number of component of assembly ",
888                    __FILE__, nbComponents, g);
889
890   di.Add ("XAddComponent","Doc Label Shape \t: Add component shape to assembly",
891                    __FILE__, addComponent, g);
892
893   di.Add ("XRemoveComponent","Doc Label \t: Remove component from components label",
894                    __FILE__, removeComponent, g);
895
896   di.Add ("XGetReferredShape","Doc Label \t: Print label, that contain a top-level shape, that corresponds shape at following label",
897                    __FILE__, getReferredShape, g);
898
899   di.Add ("XGetTopLevelShapes","Doc \t: Print labels, that contain a top-level shapes",
900                    __FILE__, getTopLevelShapes, g);
901
902   di.Add ("XGetFreeShapes","Doc [shape_prefix]\t: Print labels or create DRAW shapes for all free shapes in the Doc",
903                    __FILE__, getFreeShapes, g);
904
905   di.Add ("XGetOneShape","shape Doc \t: Put all free shapes of the Doc into signle DRAW shape",
906                    __FILE__, getOneShape, g);
907
908   di.Add ("XDumpLocation","Doc Label \t: Dump Transformation() of XCAFDoc_Location attribute",
909                    __FILE__, XDumpLocation, g);
910
911   di.Add ("XSetSHUO","Doc UU_Label [ multi-level labels ] NU_Label \t: sets the SHUO structure between UpperUsage and NextUsage",
912                    __FILE__, setSHUO, g);
913
914   di.Add ("XGetUU_SHUO","Doc NU_Label \t: prints the UpperUsages of indicated NextUsage",
915                    __FILE__, getSHUOUpperUsage, g);
916
917   di.Add ("XGetNU_SHUO","Doc UU_Label \t: prints the NextUsages of indicated UpperUsage",
918                    __FILE__, getSHUONextUsage, g);
919
920   di.Add ("XRemoveSHUO","Doc SHUO_Label \t: remove SHUO of indicated component",
921                    __FILE__, removeSHUO, g);
922
923   di.Add ("XIsHasSHUO","Doc SHUO_Label \t: remove SHUO of indicated component",
924                    __FILE__, hasSHUO, g);
925
926   di.Add ("XGetAllSHUO","Doc Comp_Label \t: remove SHUO of indicated component",
927                    __FILE__, getAllSHUO, g);
928
929   di.Add ("XFindComponent","Doc Shape \t: prints sequence of labels of assembly path",
930                    __FILE__, findComponent, g);
931   
932   di.Add ("XGetSHUOInstance","Doc res SHUO_Label \t: returns SHUO_styled shape",
933                    __FILE__, getStyledComponent, g);
934   
935   di.Add ("XGetAllSHUOInstances","Doc res SHUO_Label \t: returns SHUO_styled shapes as compound",
936                    __FILE__, getAllStyledComponents, g);
937   
938   di.Add ("XFindSHUO","Doc labels of SHUO structure \t: prints label of SHUO that found by labels structure",
939                    __FILE__, findSHUO, g);
940
941   di.Add ("XSetInstanceSHUO","Doc shape \t: sets the SHUO structure for indicated component",
942                    __FILE__, setStyledComponent, g);
943   
944   di.Add ("XUpdateAssemblies","Doc \t: updates assembly compounds",
945                    __FILE__, updateAssemblies, g);
946 }