1 // Created on: 2002-11-26
2 // Created by: Vladimir ANIKIN
3 // Copyright (c) 2002-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.
16 #include <DDocStd.hxx>
17 #include <TDocStd_MultiTransactionManager.hxx>
18 #include <DDocStd_DrawDocument.hxx>
19 #include <TDocStd_Document.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>
40 //=======================================================================
41 //function : mtmCreate
42 //purpose : creates new new multiple transactions' manager
43 //=======================================================================
45 static Handle(TDocStd_MultiTransactionManager) sMultiTransactionManager = 0;
47 static int mtmCreate (Draw_Interpretor& /*di*/, int n, const char** a)
49 if(!sMultiTransactionManager.IsNull())
50 sMultiTransactionManager->SetUndoLimit(0);
52 sMultiTransactionManager = new TDocStd_MultiTransactionManager();
54 sMultiTransactionManager->SetUndoLimit(Draw::Atoi(a[1]));
58 //=======================================================================
59 //function : mtmAddDocument
60 //purpose : adds a document to the transactions manager
61 //=======================================================================
63 static int mtmAddDocument (Draw_Interpretor& di, int n, const char** a)
65 if(sMultiTransactionManager.IsNull()) {
66 di << "Error : manager is not initialised\n";
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";
76 sMultiTransactionManager->AddDocument(aDrawDoc->GetDocument());
79 di << "Error : document name is not defined\n";
85 //=======================================================================
86 //function : mtmOpenTransaction
87 //purpose : opens new transaction
88 //=======================================================================
90 static int mtmOpenTransaction (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
92 if(sMultiTransactionManager.IsNull()) {
93 di << "Error : manager is not initialised\n";
96 sMultiTransactionManager->OpenCommand();
100 //=======================================================================
101 //function : mtmCommitTransaction
102 //purpose : commits last opened transaction
103 //=======================================================================
105 static int mtmCommitTransaction (Draw_Interpretor& di, int n, const char** a)
107 if(sMultiTransactionManager.IsNull()) {
108 di << "Error : manager is not initialised\n";
112 sMultiTransactionManager->CommitCommand(a[1]);
114 sMultiTransactionManager->CommitCommand();
118 //=======================================================================
119 //function : mtmAbortTransaction
120 //purpose : aborts last opened transaction
121 //=======================================================================
123 static int mtmAbortTransaction (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
125 if(sMultiTransactionManager.IsNull()) {
126 di << "Error : manager is not initialised\n";
129 sMultiTransactionManager->AbortCommand();
133 //=======================================================================
135 //purpose : dumps state of the multiple transaction manager
136 //=======================================================================
138 static int mtmDump (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
140 if(sMultiTransactionManager.IsNull()) {
141 di << "Error : manager is not initialised\n";
144 di << "*** Dump of MTM ***\n";
145 //sMultiTransactionManager->DumpTransaction(cout);
146 Standard_SStream aStream;
147 sMultiTransactionManager->DumpTransaction(aStream);
149 di << "\n*** End ***\n";
153 //=======================================================================
155 //purpose : undos last transaction
156 //=======================================================================
158 static int mtmUndo (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
160 if(sMultiTransactionManager.IsNull()) {
161 di << "Error : manager is not initialised\n";
164 sMultiTransactionManager->Undo();
168 //=======================================================================
170 //purpose : redos last transaction
171 //=======================================================================
173 static int mtmRedo (Draw_Interpretor& di, int /*n*/, const char** /*a*/)
175 if(sMultiTransactionManager.IsNull()) {
176 di << "Error : manager is not initialised\n";
179 sMultiTransactionManager->Redo();
183 //=======================================================================
184 //function : mtmNestedMode
185 //purpose : redos last transaction
186 //=======================================================================
188 static int mtmNestedMode (Draw_Interpretor& di, int n, const char** a)
190 if(sMultiTransactionManager.IsNull()) {
191 di << "Error : manager is not initialised\n";
194 Standard_Boolean aMode = Standard_False;
196 aMode = Draw::Atoi(a[1]) ? Standard_True : Standard_False;
198 sMultiTransactionManager->SetNestedTransactionMode(aMode);
202 //=======================================================================
203 //function : XAttributeValue
205 //=======================================================================
207 static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
209 if ( argc <4 ) { di << "ERROR: Too few args\n"; return 0; }
210 Handle(DDF_Browser) browser =
211 Handle(DDF_Browser)::DownCast (Draw::Get(argv[1], Standard_True));
212 if ( browser.IsNull() ) { di << "ERROR: Not a browser: " << argv[1] << "\n"; return 0; }
215 TDF_Tool::Label(browser->Data(),argv[2],lab);
216 if ( lab.IsNull() ) { di << "ERROR: label is Null: " << argv[2] << "\n"; return 0; }
218 Standard_Integer num = Draw::Atoi ( argv[3] );
219 TDF_AttributeIterator itr(lab,Standard_False);
220 for (Standard_Integer i=1; itr.More() && i < num; i++) itr.Next();
222 if ( ! itr.More() ) { di << "ERROR: Attribute #" << num << " not found\n"; return 0; }
224 const Handle(TDF_Attribute)& att = itr.Value();
225 if ( att->IsKind(STANDARD_TYPE(TDataStd_TreeNode)) )
227 Handle(TDataStd_TreeNode) TN = Handle(TDataStd_TreeNode)::DownCast(att);
228 TCollection_AsciiString ref;
229 if ( TN->HasFather() )
231 TDF_Tool::Entry ( TN->Father()->Label(), ref );
232 di << " ==> " << ref.ToCString();
236 di << " <== (" << ref.ToCString();
237 Handle(TDataStd_TreeNode) child = TN->First();
238 while ( ! child.IsNull() )
240 TDF_Tool::Entry ( child->Label(), ref );
241 if ( child != TN->First() ) di << ", ";
242 di << ref.ToCString();
243 child = child->Next();
248 else if ( att->IsKind(STANDARD_TYPE(TDF_Reference)) )
250 Handle(TDF_Reference) val = Handle(TDF_Reference)::DownCast ( att );
251 TCollection_AsciiString ref;
252 TDF_Tool::Entry ( val->Get(), ref );
253 di << "==> " << ref.ToCString();
255 else if ( att->IsKind(STANDARD_TYPE(TDataStd_Integer)) )
257 Handle(TDataStd_Integer) val = Handle(TDataStd_Integer)::DownCast ( att );
258 TCollection_AsciiString str ( val->Get() );
259 di << str.ToCString();
261 else if ( att->IsKind(STANDARD_TYPE(TDataStd_Real)) )
263 Handle(TDataStd_Real) val = Handle(TDataStd_Real)::DownCast ( att );
264 TCollection_AsciiString str ( val->Get() );
265 di << str.ToCString();
267 else if ( att->IsKind(STANDARD_TYPE(TDataStd_Name)) )
269 Handle(TDataStd_Name) val = Handle(TDataStd_Name)::DownCast ( att );
270 TCollection_AsciiString str ( val->Get(), '?' );
271 di << str.ToCString();
273 else if ( att->IsKind(STANDARD_TYPE(TDataStd_Comment)) )
275 Handle(TDataStd_Comment) val = Handle(TDataStd_Comment)::DownCast ( att );
276 TCollection_AsciiString str ( val->Get(), '?' );
277 di << str.ToCString();
279 else if ( att->IsKind(STANDARD_TYPE(TDataStd_AsciiString)) )
281 Handle(TDataStd_AsciiString) val = Handle(TDataStd_AsciiString)::DownCast ( att );
282 TCollection_AsciiString str ( val->Get(), '?' );
283 di << str.ToCString();
285 else if ( att->IsKind(STANDARD_TYPE(TDataStd_IntegerArray)) )
287 Handle(TDataStd_IntegerArray) val = Handle(TDataStd_IntegerArray)::DownCast ( att );
288 for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ )
290 if ( j > val->Lower() ) di << ", ";
291 TCollection_AsciiString str ( val->Value(j) );
292 di << str.ToCString();
295 else if ( att->IsKind(STANDARD_TYPE(TDataStd_RealArray)) )
297 Handle(TDataStd_RealArray) val = Handle(TDataStd_RealArray)::DownCast ( att );
298 for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ )
300 if ( j > val->Lower() ) di << ", ";
301 TCollection_AsciiString str ( val->Value(j) );
302 di << str.ToCString();
305 else if ( att->IsKind(STANDARD_TYPE(TDataStd_ByteArray)) )
307 Handle(TDataStd_ByteArray) val = Handle(TDataStd_ByteArray)::DownCast ( att );
308 for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ )
310 if ( j > val->Lower() ) di << ", ";
311 TCollection_AsciiString str ( val->Value(j) );
312 di << str.ToCString();
315 else if ( att->IsKind(STANDARD_TYPE(TNaming_NamedShape)) )
317 Handle(TNaming_NamedShape) val = Handle(TNaming_NamedShape)::DownCast ( att );
318 TopoDS_Shape S = val->Get();
319 di << S.TShape()->DynamicType()->Name();
320 if ( ! S.Location().IsIdentity() ) di << "(located)";
326 //=======================================================================
327 //function : mtmRemoveDocument
328 //purpose : removes a document from the transactions manager
329 //=======================================================================
331 static int mtmRemoveDocument (Draw_Interpretor& di, int n, const char** a)
333 if(sMultiTransactionManager.IsNull()) {
334 di << "Error : manager is not initialised\n";
338 Handle(DDocStd_DrawDocument) aDrawDoc =
339 Handle(DDocStd_DrawDocument)::DownCast(Draw::Get(a[1]));
340 if(aDrawDoc.IsNull()) {
341 di << "Error : wrong document name\n";
344 sMultiTransactionManager->RemoveDocument(aDrawDoc->GetDocument());
347 di << "Error : document name is not defined\n";
353 //=======================================================================
354 //function : MTMCommands
356 //=======================================================================
358 void DDocStd::MTMCommands(Draw_Interpretor& theCommands)
360 static Standard_Boolean done = Standard_False;
362 done = Standard_True;
364 const char* g = "MTM test commands";
366 theCommands.Add("mtmCreate",
367 "\t [undo limit] creates new new multiple transactions' manager",
368 __FILE__, mtmCreate, g);
370 theCommands.Add("mtmAdd",
371 "\t <document name> adds a document to the transactions' manager",
372 __FILE__, mtmAddDocument, g);
374 theCommands.Add("mtmRemove",
375 "\t <document name> removes a document from the transactions' manager",
376 __FILE__, mtmRemoveDocument, g);
378 theCommands.Add("mtmOpen",
379 "\t opens new transaction",
380 __FILE__, mtmOpenTransaction, g);
382 theCommands.Add("mtmCommit",
383 "\t [<transaction name>] commits last opened transaction",
384 __FILE__, mtmCommitTransaction, g);
386 theCommands.Add("mtmAbort",
387 "\t aborts last opened transaction",
388 __FILE__, mtmAbortTransaction, g);
390 theCommands.Add("mtmDump",
391 "\t dumps state of the multiple transactions' manager",
392 __FILE__, mtmDump, g);
394 theCommands.Add("mtmUndo",
395 "\t undos last transaction",
396 __FILE__, mtmUndo, g);
398 theCommands.Add("mtmRedo",
399 "\t redos last transaction",
400 __FILE__, mtmRedo, g);
402 theCommands.Add("mtmNestedMode",
403 "\t [0/1] sets nested mode if 1 and usets if 0 (default 0)",
404 __FILE__, mtmNestedMode, g);
406 theCommands.Add ("XAttributeValue", "Doc label #attribute: internal command for browser",
407 __FILE__, XAttributeValue, g);