0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / DDocStd / DDocStd_MTMCommands.cxx
1 // Created on: 2002-11-26
2 // Created by: Vladimir ANIKIN
3 // Copyright (c) 2002-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 #include <DDocStd.hxx>
17 #include <TDocStd_MultiTransactionManager.hxx>
18 #include <DDocStd_DrawDocument.hxx>
19 #include <TDocStd_Document.hxx>
20 #include <Draw.hxx>
21 #include <DDF_Browser.hxx>
22 #include <TDF_Label.hxx>
23 #include <TDF_Tool.hxx>
24 #include <TDF_AttributeIterator.hxx>
25 #include <TDataStd_TreeNode.hxx>
26 #include <TDataStd_Integer.hxx>
27 #include <TDataStd_Real.hxx>
28 #include <TDataStd_Name.hxx>
29 #include <TDataStd_Comment.hxx>
30 #include <TDataStd_AsciiString.hxx>
31 #include <TDataStd_IntegerArray.hxx>
32 #include <TDataStd_RealArray.hxx>
33 #include <TDataStd_ByteArray.hxx>
34 #include <TNaming_NamedShape.hxx>
35 #include <TDataStd_UAttribute.hxx>
36 #include <TopoDS_Shape.hxx>
37 #include <Draw_Interpretor.hxx>
38 #include <TDF_Reference.hxx>
39
40 //=======================================================================
41 //function : mtmCreate
42 //purpose  : creates new new multiple transactions' manager
43 //=======================================================================
44
45 static Handle(TDocStd_MultiTransactionManager) sMultiTransactionManager = 0;
46
47 static int mtmCreate (Draw_Interpretor& /*di*/, int n, const char** a)
48 {
49   if(!sMultiTransactionManager.IsNull())
50     sMultiTransactionManager->SetUndoLimit(0);
51
52   sMultiTransactionManager = new TDocStd_MultiTransactionManager();
53   if(n > 1)
54     sMultiTransactionManager->SetUndoLimit(Draw::Atoi(a[1]));
55   return 0;
56 }
57
58 //=======================================================================
59 //function : mtmAddDocument
60 //purpose  : adds a document to the transactions manager
61 //=======================================================================
62
63 static int mtmAddDocument (Draw_Interpretor& di, int n, const char** a)
64 {
65   if(sMultiTransactionManager.IsNull()) {
66     di << "Error   : manager is not initialised\n";
67     return 1;
68   }
69   if(n > 1) {
70     Handle(DDocStd_DrawDocument) aDrawDoc =
71       Handle(DDocStd_DrawDocument)::DownCast(Draw::Get(a[1]));
72     if(aDrawDoc.IsNull()) {
73       di << "Error   : wrong document name\n";
74       return 1;
75     }
76     sMultiTransactionManager->AddDocument(aDrawDoc->GetDocument());
77   }
78   else {
79     di << "Error   : document name is not defined\n";
80     return 1;
81   }
82   return 0;
83 }
84
85 //=======================================================================
86 //function : mtmOpenTransaction
87 //purpose  : opens new transaction
88 //=======================================================================
89
90 static int mtmOpenTransaction (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
91 {
92   if(sMultiTransactionManager.IsNull()) {
93     di << "Error   : manager is not initialised\n";
94     return 1;
95   }
96   sMultiTransactionManager->OpenCommand();
97   return 0;
98 }
99
100 //=======================================================================
101 //function : mtmCommitTransaction
102 //purpose  : commits last opened transaction
103 //=======================================================================
104
105 static int mtmCommitTransaction (Draw_Interpretor& di, int n, const char** a)
106 {
107   if(sMultiTransactionManager.IsNull()) {
108     di << "Error   : manager is not initialised\n";
109     return 1;
110   }
111   if(n > 1)
112     sMultiTransactionManager->CommitCommand(a[1]);
113   else
114     sMultiTransactionManager->CommitCommand();
115   return 0;
116 }
117
118 //=======================================================================
119 //function : mtmAbortTransaction
120 //purpose  : aborts last opened transaction
121 //=======================================================================
122
123 static int mtmAbortTransaction (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
124 {
125   if(sMultiTransactionManager.IsNull()) {
126     di << "Error   : manager is not initialised\n";
127     return 1;
128   }
129   sMultiTransactionManager->AbortCommand();
130   return 0;
131 }
132
133 //=======================================================================
134 //function : mtmDump
135 //purpose  : dumps state of the multiple transaction manager
136 //=======================================================================
137
138 static int mtmDump (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
139 {
140   if(sMultiTransactionManager.IsNull()) {
141     di << "Error   : manager is not initialised\n";
142     return 1;
143   }
144   di <<         "*** Dump of MTM ***\n";
145   //sMultiTransactionManager->DumpTransaction(std::cout);
146   Standard_SStream aStream;
147   sMultiTransactionManager->DumpTransaction(aStream);
148   di << aStream;
149   di << "\n***     End     ***\n";
150   return 0;
151 }
152
153 //=======================================================================
154 //function : mtmUndo
155 //purpose  : undos last transaction
156 //=======================================================================
157
158 static int mtmUndo (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
159 {
160   if(sMultiTransactionManager.IsNull()) {
161     di << "Error   : manager is not initialised\n";
162     return 1;
163   }
164   sMultiTransactionManager->Undo();
165   return 0;
166 }
167
168 //=======================================================================
169 //function : mtmRedo
170 //purpose  : redos last transaction
171 //=======================================================================
172
173 static int mtmRedo (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
174 {
175   if(sMultiTransactionManager.IsNull()) {
176     di << "Error   : manager is not initialised\n";
177     return 1;
178   }
179   sMultiTransactionManager->Redo();
180   return 0;
181 }
182
183 //=======================================================================
184 //function : mtmNestedMode
185 //purpose  : redos last transaction
186 //=======================================================================
187
188 static int mtmNestedMode (Draw_Interpretor& di, int n, const char** a)
189 {
190   if(sMultiTransactionManager.IsNull()) {
191     di << "Error   : manager is not initialised\n";
192     return 1;
193   }
194   Standard_Boolean aMode = Standard_False;
195   if(n > 1) {
196     aMode = Draw::Atoi(a[1]) ? Standard_True : Standard_False;
197   }
198   sMultiTransactionManager->SetNestedTransactionMode(aMode);
199   return 0;
200 }
201
202 //=======================================================================
203 //function : XAttributeValue
204 //purpose  : 
205 //=======================================================================
206
207 static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
208 {
209   if ( argc < 4 ) { di << "ERROR: Too few args\n"; return 1; }
210   Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (argv[1]));
211   if ( browser.IsNull() ) { std::cout << "Syntax error: Not a browser: " << argv[1] << "\n"; return 1; }
212
213   TDF_Label lab;
214   TDF_Tool::Label(browser->Data(),argv[2],lab);
215   if ( lab.IsNull() ) { di << "Syntax error: label is Null: " << argv[2] << "\n"; return 1; }
216   
217   Standard_Integer num = Draw::Atoi ( argv[3] );
218   TDF_AttributeIterator itr(lab,Standard_False);
219   for (Standard_Integer i=1; itr.More() && i < num; i++) itr.Next();
220   
221   if ( ! itr.More() ) { di << "Syntax error: Attribute #" << num << " not found\n"; return 1; }
222     
223   const Handle(TDF_Attribute)& att = itr.Value();
224   if ( att->IsKind(STANDARD_TYPE(TDataStd_TreeNode)) )
225   {
226     Handle(TDataStd_TreeNode) TN = Handle(TDataStd_TreeNode)::DownCast(att);
227     TCollection_AsciiString ref;
228     if ( TN->HasFather() ) 
229     {
230       TDF_Tool::Entry ( TN->Father()->Label(), ref );
231       di << " ==> " << ref.ToCString();
232     }
233     else 
234     {
235       di << " <== (" << ref.ToCString();
236       Handle(TDataStd_TreeNode) child = TN->First();
237       while ( ! child.IsNull() ) 
238       {
239         TDF_Tool::Entry ( child->Label(), ref );
240         if ( child != TN->First() ) di << ", ";
241         di << ref.ToCString();
242         child = child->Next();
243       }
244       di << ")";
245     }
246   }
247   else if ( att->IsKind(STANDARD_TYPE(TDF_Reference)) )
248   {
249     Handle(TDF_Reference) val = Handle(TDF_Reference)::DownCast ( att );
250     TCollection_AsciiString ref;
251     TDF_Tool::Entry ( val->Get(), ref );
252     di << "==> " << ref.ToCString();
253   }
254   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Integer)) ) 
255   {
256     Handle(TDataStd_Integer) val = Handle(TDataStd_Integer)::DownCast ( att );
257     TCollection_AsciiString str ( val->Get() );
258     di << str.ToCString();
259   }
260   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Real)) ) 
261   {
262     Handle(TDataStd_Real) val = Handle(TDataStd_Real)::DownCast ( att );
263     TCollection_AsciiString str ( val->Get() );
264     di << str.ToCString();
265   }
266   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Name)) )
267   {
268     Handle(TDataStd_Name) val = Handle(TDataStd_Name)::DownCast ( att );
269     TCollection_AsciiString str ( val->Get(), '?' );
270     di << str.ToCString();
271   }
272   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Comment)) )
273   {
274     Handle(TDataStd_Comment) val = Handle(TDataStd_Comment)::DownCast ( att );
275     TCollection_AsciiString str ( val->Get(), '?' );
276     di << str.ToCString();
277   }
278   else if ( att->IsKind(STANDARD_TYPE(TDataStd_AsciiString)) )
279   {
280     Handle(TDataStd_AsciiString) val = Handle(TDataStd_AsciiString)::DownCast ( att );
281     TCollection_AsciiString str ( val->Get(), '?' );
282     di << str.ToCString();
283   }
284   else if ( att->IsKind(STANDARD_TYPE(TDataStd_IntegerArray)) )
285   {
286     Handle(TDataStd_IntegerArray) val = Handle(TDataStd_IntegerArray)::DownCast ( att );
287     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ )
288     {
289       if ( j > val->Lower() ) di << ", ";
290       TCollection_AsciiString str ( val->Value(j) );
291       di << str.ToCString();
292     }
293   }
294   else if ( att->IsKind(STANDARD_TYPE(TDataStd_RealArray)) )
295   {
296     Handle(TDataStd_RealArray) val = Handle(TDataStd_RealArray)::DownCast ( att );
297     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) 
298     {
299       if ( j > val->Lower() ) di << ", ";
300       TCollection_AsciiString str ( val->Value(j) );
301       di << str.ToCString();
302     }
303   }
304   else if ( att->IsKind(STANDARD_TYPE(TDataStd_ByteArray)) )
305   {
306     Handle(TDataStd_ByteArray) val = Handle(TDataStd_ByteArray)::DownCast ( att );
307     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) 
308     {
309       if ( j > val->Lower() ) di << ", ";
310       TCollection_AsciiString str ( val->Value(j) );
311       di << str.ToCString();
312     }
313   }
314   else if ( att->IsKind(STANDARD_TYPE(TNaming_NamedShape)) )
315   {
316     Handle(TNaming_NamedShape) val = Handle(TNaming_NamedShape)::DownCast ( att );
317     TopoDS_Shape S = val->Get();
318     di << S.TShape()->DynamicType()->Name();
319     if ( ! S.Location().IsIdentity() ) di << "(located)";
320   }
321     
322   return 0;
323 }
324
325 //=======================================================================
326 //function : mtmRemoveDocument
327 //purpose  : removes a document from the transactions manager
328 //=======================================================================
329
330 static int mtmRemoveDocument (Draw_Interpretor& di, int n, const char** a)
331 {
332   if(sMultiTransactionManager.IsNull()) {
333     di << "Error   : manager is not initialised\n";
334     return 1;
335   }
336   if(n > 1) {
337     Handle(DDocStd_DrawDocument) aDrawDoc =
338        Handle(DDocStd_DrawDocument)::DownCast(Draw::Get(a[1]));
339     if(aDrawDoc.IsNull()) {
340       di << "Error   : wrong document name\n";
341       return 1;
342     }
343     sMultiTransactionManager->RemoveDocument(aDrawDoc->GetDocument());
344   }
345   else {
346     di << "Error   : document name is not defined\n";
347     return 1;
348   }
349   return 0;
350 }
351
352 //=======================================================================
353 //function : MTMCommands
354 //purpose  : 
355 //=======================================================================
356
357 void DDocStd::MTMCommands(Draw_Interpretor& theCommands)
358 {
359   static Standard_Boolean done = Standard_False;
360   if (done) return;
361   done = Standard_True;
362
363   const char* g = "MTM test commands";
364
365   theCommands.Add("mtmCreate",
366                   "\t [undo limit]         creates new new multiple transactions' manager",
367                   __FILE__, mtmCreate, g);
368
369   theCommands.Add("mtmAdd",
370                   "\t <document name>      adds a document to the transactions' manager",
371                   __FILE__, mtmAddDocument, g);
372
373   theCommands.Add("mtmRemove",
374                   "\t <document name>      removes a document from the transactions' manager",
375                   __FILE__, mtmRemoveDocument, g);
376
377   theCommands.Add("mtmOpen",
378                   "\t                      opens new transaction",
379                   __FILE__, mtmOpenTransaction, g);
380
381   theCommands.Add("mtmCommit",
382                   "\t [<transaction name>] commits last opened transaction",
383                   __FILE__, mtmCommitTransaction, g);
384
385   theCommands.Add("mtmAbort",
386                   "\t                      aborts last opened transaction",
387                   __FILE__, mtmAbortTransaction, g);
388
389   theCommands.Add("mtmDump",
390                   "\t                      dumps state of the multiple transactions' manager",
391                   __FILE__, mtmDump, g);
392
393   theCommands.Add("mtmUndo",
394                   "\t                      undos last transaction",
395                   __FILE__, mtmUndo, g);
396
397   theCommands.Add("mtmRedo",
398                   "\t                      redos last transaction",
399                   __FILE__, mtmRedo, g);
400
401   theCommands.Add("mtmNestedMode",
402                   "\t [0/1]                sets nested mode if 1 and usets if 0 (default 0)",
403                   __FILE__, mtmNestedMode, g);
404
405   theCommands.Add ("XAttributeValue", "Doc label #attribute: internal command for browser",
406                    __FILE__, XAttributeValue, g);
407   
408 }