0023948: Wrong intersection between a surface of revolution and a plane.
[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(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 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; }
213
214   TDF_Label lab;
215   TDF_Tool::Label(browser->Data(),argv[2],lab);
216   if ( lab.IsNull() ) { di << "ERROR: label is Null: " << argv[2] << "\n"; return 0; }
217   
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();
221   
222   if ( ! itr.More() ) { di << "ERROR: Attribute #" << num << " not found" << "\n"; return 0; }
223     
224   const Handle(TDF_Attribute)& att = itr.Value();
225   if ( att->IsKind(STANDARD_TYPE(TDataStd_TreeNode)) )
226   {
227     Handle(TDataStd_TreeNode) TN = Handle(TDataStd_TreeNode)::DownCast(att);
228     TCollection_AsciiString ref;
229     if ( TN->HasFather() ) 
230     {
231       TDF_Tool::Entry ( TN->Father()->Label(), ref );
232       di << " ==> " << ref.ToCString();
233     }
234     else 
235     {
236       di << " <== (" << ref.ToCString();
237       Handle(TDataStd_TreeNode) child = TN->First();
238       while ( ! child.IsNull() ) 
239       {
240         TDF_Tool::Entry ( child->Label(), ref );
241         if ( child != TN->First() ) di << ", ";
242         di << ref.ToCString();
243         child = child->Next();
244       }
245       di << ")";
246     }
247   }
248   else if ( att->IsKind(STANDARD_TYPE(TDF_Reference)) )
249   {
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();
254   }
255   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Integer)) ) 
256   {
257     Handle(TDataStd_Integer) val = Handle(TDataStd_Integer)::DownCast ( att );
258     TCollection_AsciiString str ( val->Get() );
259     di << str.ToCString();
260   }
261   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Real)) ) 
262   {
263     Handle(TDataStd_Real) val = Handle(TDataStd_Real)::DownCast ( att );
264     TCollection_AsciiString str ( val->Get() );
265     di << str.ToCString();
266   }
267   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Name)) )
268   {
269     Handle(TDataStd_Name) val = Handle(TDataStd_Name)::DownCast ( att );
270     TCollection_AsciiString str ( val->Get(), '?' );
271     di << str.ToCString();
272   }
273   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Comment)) )
274   {
275     Handle(TDataStd_Comment) val = Handle(TDataStd_Comment)::DownCast ( att );
276     TCollection_AsciiString str ( val->Get(), '?' );
277     di << str.ToCString();
278   }
279   else if ( att->IsKind(STANDARD_TYPE(TDataStd_AsciiString)) )
280   {
281     Handle(TDataStd_AsciiString) val = Handle(TDataStd_AsciiString)::DownCast ( att );
282     TCollection_AsciiString str ( val->Get(), '?' );
283     di << str.ToCString();
284   }
285   else if ( att->IsKind(STANDARD_TYPE(TDataStd_IntegerArray)) )
286   {
287     Handle(TDataStd_IntegerArray) val = Handle(TDataStd_IntegerArray)::DownCast ( att );
288     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ )
289     {
290       if ( j > val->Lower() ) di << ", ";
291       TCollection_AsciiString str ( val->Value(j) );
292       di << str.ToCString();
293     }
294   }
295   else if ( att->IsKind(STANDARD_TYPE(TDataStd_RealArray)) )
296   {
297     Handle(TDataStd_RealArray) val = Handle(TDataStd_RealArray)::DownCast ( att );
298     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) 
299     {
300       if ( j > val->Lower() ) di << ", ";
301       TCollection_AsciiString str ( val->Value(j) );
302       di << str.ToCString();
303     }
304   }
305   else if ( att->IsKind(STANDARD_TYPE(TDataStd_ByteArray)) )
306   {
307     Handle(TDataStd_ByteArray) val = Handle(TDataStd_ByteArray)::DownCast ( att );
308     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) 
309     {
310       if ( j > val->Lower() ) di << ", ";
311       TCollection_AsciiString str ( val->Value(j) );
312       di << str.ToCString();
313     }
314   }
315   else if ( att->IsKind(STANDARD_TYPE(TNaming_NamedShape)) )
316   {
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)";
321   }
322     
323   return 0;
324 }
325
326 //=======================================================================
327 //function : mtmRemoveDocument
328 //purpose  : removes a document from the transactions manager
329 //=======================================================================
330
331 static int mtmRemoveDocument (Draw_Interpretor& di, int n, const char** a)
332 {
333   if(sMultiTransactionManager.IsNull()) {
334     di << "Error   : manager is not initialised" << "\n";
335     return 1;
336   }
337   if(n > 1) {
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";
342       return 1;
343     }
344     sMultiTransactionManager->RemoveDocument(aDrawDoc->GetDocument());
345   }
346   else {
347     di << "Error   : document name is not defined" << "\n";
348     return 1;
349   }
350   return 0;
351 }
352
353 //=======================================================================
354 //function : MTMCommands
355 //purpose  : 
356 //=======================================================================
357
358 void DDocStd::MTMCommands(Draw_Interpretor& theCommands)
359 {
360   static Standard_Boolean done = Standard_False;
361   if (done) return;
362   done = Standard_True;
363
364   const char* g = "MTM test commands";
365
366   theCommands.Add("mtmCreate",
367                   "\t [undo limit]         creates new new multiple transactions' manager",
368                   __FILE__, mtmCreate, g);
369
370   theCommands.Add("mtmAdd",
371                   "\t <document name>      adds a document to the transactions' manager",
372                   __FILE__, mtmAddDocument, g);
373
374   theCommands.Add("mtmRemove",
375                   "\t <document name>      removes a document from the transactions' manager",
376                   __FILE__, mtmRemoveDocument, g);
377
378   theCommands.Add("mtmOpen",
379                   "\t                      opens new transaction",
380                   __FILE__, mtmOpenTransaction, g);
381
382   theCommands.Add("mtmCommit",
383                   "\t [<transaction name>] commits last opened transaction",
384                   __FILE__, mtmCommitTransaction, g);
385
386   theCommands.Add("mtmAbort",
387                   "\t                      aborts last opened transaction",
388                   __FILE__, mtmAbortTransaction, g);
389
390   theCommands.Add("mtmDump",
391                   "\t                      dumps state of the multiple transactions' manager",
392                   __FILE__, mtmDump, g);
393
394   theCommands.Add("mtmUndo",
395                   "\t                      undos last transaction",
396                   __FILE__, mtmUndo, g);
397
398   theCommands.Add("mtmRedo",
399                   "\t                      redos last transaction",
400                   __FILE__, mtmRedo, g);
401
402   theCommands.Add("mtmNestedMode",
403                   "\t [0/1]                sets nested mode if 1 and usets if 0 (default 0)",
404                   __FILE__, mtmNestedMode, g);
405
406   theCommands.Add ("XAttributeValue", "Doc label #attribute: internal command for browser",
407                    __FILE__, XAttributeValue, g);
408   
409 }