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