1 // Created on: 1999-11-05
2 // Created by: Denis PASCAL
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and / or modify it
9 // under the terms of the GNU Lesser General Public version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <DDataStd.ixx>
21 #include <Draw_Appli.hxx>
22 #include <Draw_Drawable3D.hxx>
23 #include <Draw_Interpretor.hxx>
25 #include <TDF_Data.hxx>
27 #include <TDF_Tool.hxx>
28 #include <TDF_Label.hxx>
30 #include <DDataStd_TreeBrowser.hxx>
31 #include <TDataStd_TreeNode.hxx>
32 #include <TDataStd_ChildNodeIterator.hxx>
34 #include <Standard_GUID.hxx>
35 #include <TCollection_AsciiString.hxx>
36 #include <TCollection_ExtendedString.hxx>
41 //=======================================================================
43 //purpose : SetNode (DOC Entry [ID])
44 //=======================================================================
46 static Standard_Integer DDataStd_SetNode (Draw_Interpretor& di,
51 if (!DDF::GetDF(a[1],DF)) return 1;
53 Handle(TDataStd_TreeNode) TN;
54 DDF::AddLabel(DF,a[2],L);
56 TN = TDataStd_TreeNode::Set(L);
57 DDF::ReturnLabel(di,TN->Label());
60 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
61 di<<"DDataStd_SetNode: The format of GUID is invalid"<<"\n";
64 const Standard_GUID ID(a[3]);
65 TN = TDataStd_TreeNode::Set(L, ID);
66 DDF::ReturnLabel(di,TN->Label());
69 di << "DDataStd_SetNode : Error" << "\n";
73 //=======================================================================
74 //TreeNode : AppendNode
75 //purpose : AppendNode (DOC FatherEntry childEntry [fatherID])
76 //=======================================================================
78 static Standard_Integer DDataStd_AppendNode (Draw_Interpretor& di,
84 if (!DDF::GetDF(a[1],DF))return 1;
85 Handle(TDataStd_TreeNode) father, child;
89 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
91 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
92 di<<"DDataStd_AppendNode: The format of GUID is invalid"<<"\n";
95 const Standard_GUID varID(a[4]);
99 if (!DDF::Find(DF,a[2],ID,father)) return 1;
102 DDF::AddLabel(DF,a[3],L);
103 if ( (L.FindAttribute(ID,child))
104 &&(!child->IsRoot()) ){
105 di << "DDataStd_AppendNode : Error : childTreeNode don't detach" << "\n";
108 child = TDataStd_TreeNode::Set(L,ID);
109 if (!father->Append(child)) return 1;
111 di<<"AppendNode: OK"<<"\n";
115 di << "DDataStd_AppendNode : Error" << "\n";
119 //=======================================================================
120 //TreeNode : PrependNode
121 //purpose : PrependNode (DOC FatherEntry childEntry [fatherID])
122 //=======================================================================
124 static Standard_Integer DDataStd_PrependNode (Draw_Interpretor& di,
130 if (!DDF::GetDF(a[1],DF))return 1;
131 Handle(TDataStd_TreeNode) father, child;
135 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
137 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
138 di<<"DDataStd_PrependNode: The format of GUID is invalid"<<"\n";
141 const Standard_GUID varID(a[4]);
145 if (!DDF::Find(DF,a[2],ID,father)) return 1;
148 DDF::AddLabel(DF,a[3],L);
149 if ( (L.FindAttribute(ID,child))
150 &&(!child->IsRoot()) ){
151 di << "DDataStd_PrependNode : Error : childTreeNode don't detach" << "\n";
154 child = TDataStd_TreeNode::Set(L,ID);
155 if (!father->Prepend(child)) return 1;
157 di<<"PrependNode: OK"<<"\n";
161 di << "DDataStd_PrependNode : Error" << "\n";
165 //=======================================================================
166 //TreeNode : RootNode
167 //purpose : RootNode (DOC TreeNodeEntry [ID])
168 //=======================================================================
170 static Standard_Integer DDataStd_RootNode (Draw_Interpretor& di,
176 if (!DDF::GetDF(a[1],DF)) return 1;
177 Handle(TDataStd_TreeNode) TN;
181 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
183 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
184 di<<"DDataStd_RootNode: The format of GUID is invalid"<<"\n";
187 const Standard_GUID varID(a[3]);
191 if (!DDF::Find(DF,a[2],ID,TN)) return 1;
192 DDF::ReturnLabel(di,TN->Root()->Label());
195 di << "DDataStd_RootNode : Error" << "\n";
199 //=======================================================================
200 //TreeNode : InsertNodeBefore
201 //purpose : InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [ID])
202 //=======================================================================
204 static Standard_Integer DDataStd_InsertNodeBefore(Draw_Interpretor& di,
210 if (!DDF::GetDF(a[1],DF)) return 1;
211 Handle(TDataStd_TreeNode) current, TN;
215 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
217 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
218 di<<"DDataStd_InsertNodeBefore: The format of GUID is invalid"<<"\n";
221 const Standard_GUID varID(a[4]);
225 if (!DDF::Find(DF,a[2],ID,current)) return 1;
226 // if (!DDF::Find(DF,a[3],ID,TN)) return 1;
229 if (!DDF::FindLabel(DF,a[3],L)) return 1;
230 TN = TDataStd_TreeNode::Set(L,ID);
231 if (!current->InsertBefore(TN)) return 1;
234 di << "DDataStd_InsertBefore : Error" << "\n";
238 //=======================================================================
239 //TreeNode : InsertNodeAfter
240 //purpose : InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [ID])
241 //=======================================================================
243 static Standard_Integer DDataStd_InsertNodeAfter(Draw_Interpretor& di,
249 if (!DDF::GetDF(a[1],DF)) return 1;
250 Handle(TDataStd_TreeNode) current, TN;
254 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
256 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
257 di<<"DDataStd_InsertNodeAfter: The format of GUID is invalid"<<"\n";
260 const Standard_GUID varID(a[4]);
264 if (!DDF::Find(DF,a[2],ID,current)) return 1;
265 //if (!DDF::Find(DF,a[3],TDataStd_TreeNode::GetDefaultTreeID(),TN)) return 1;
267 if (!DDF::FindLabel(DF,a[3],L)) return 1;
268 TN = TDataStd_TreeNode::Set(L);
269 if (!current->InsertAfter(TN)) return 1;
272 di << "DDataStd_InsertNodeAfter : Error" << "\n";
276 //=======================================================================
277 //TreeNode : DetachNode
278 //purpose : DetachNode (DOC TreeNodeEntry [ID])
279 //=======================================================================
281 static Standard_Integer DDataStd_DetachNode (Draw_Interpretor& di,Standard_Integer n, const char** a)
285 if (!DDF::GetDF(a[1],DF)) return 1;
286 Handle(TDataStd_TreeNode) TN;
290 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
292 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
293 di<<"DDataStd_DetachNode: The format of GUID is invalid"<<"\n";
296 const Standard_GUID varID(a[3]);
300 if (!DDF::Find(DF,a[2],ID,TN)) return 1;
302 di << "Can't Detach the TreeNode" << "\n";
305 di << "DDataStd_DetachNode : Error" << "\n";
309 //=======================================================================
310 //function : TreeBrowse
314 // [arg 3] : Browser name
315 //=======================================================================
317 static Standard_Integer DDataStd_TreeBrowse (Draw_Interpretor& di,
324 if (!DDF::GetDF (a[1], DF)) return 1;
327 TDF_Tool::Label(DF,a[2],lab);
329 Handle(DDataStd_TreeBrowser) NewTreeNode = new DDataStd_TreeBrowser (lab);
330 char *name = new char[50];
331 if (n == 4) Sprintf(name,"treebrowser_%s",a[3]);
332 else Sprintf(name,"treebrowser_%s",a[1]);
334 Draw::Set(name, NewTreeNode);
335 TCollection_AsciiString inst1("treebrowser ");
336 inst1.AssignCat(name);
337 di.Eval(inst1.ToCString());
342 //=======================================================================
343 //function : OpenNode
345 // arg 1 : Browser name
346 // [arg 2] : Label entry
347 //=======================================================================
349 static Standard_Integer DDataStd_OpenNode (Draw_Interpretor& di,
355 Handle(DDataStd_TreeBrowser) browser =
356 Handle(DDataStd_TreeBrowser)::DownCast (Draw::Get(a[1], Standard_True));
359 if (n == 3) TDF_Tool::Label(browser->Label().Data(),a[2],lab);
361 if (n == 2 || lab.IsNull()) {
362 TCollection_AsciiString list = browser->OpenRoot();
363 di<<list.ToCString();
366 TCollection_AsciiString list = browser->OpenNode(lab);
367 di<<list.ToCString();
372 //=======================================================================
373 //TreeNode : ChildNodeIterate
374 //purpose : ChildNodeIterate Doc TreeNode AllLevels [ID]
375 //=======================================================================
377 static Standard_Integer DDataStd_ChildNodeIterate (Draw_Interpretor& di,
383 if (!DDF::GetDF(a[1],DF)) return 1;
384 const Standard_Boolean AllLevels(Draw::Atoi(a[3]));
385 Handle(TDataStd_TreeNode) TN, Value;
389 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
391 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
392 di<<"DDataStd_ChildNodeIterate: The format of GUID is invalid"<<"\n";
395 const Standard_GUID varID(a[4]);
399 if (!DDF::Find(DF, a[2], ID, TN)) return 1;
400 //di<<"TDataStd_ChildNodeIterator: "<<"\n";
401 TDataStd_ChildNodeIterator itr(TN, AllLevels);
402 for (; itr.More(); itr.Next()) {
404 TCollection_AsciiString entry;
405 TDF_Tool::Entry(Value->Label(), entry);
408 //if(itr.More()==Standard_True)
414 di << "DDataStd_ChildNodeIterate : Error" << "\n";
418 static TDataStd_ChildNodeIterator cni;
420 //=======================================================================
421 //TreeNode : InitChildNodeIterator
422 //purpose : InitChildNodeIterator Doc TreeNode AllLevels [ID]
423 //=======================================================================
425 static Standard_Integer DDataStd_InitChildNodeIterator (Draw_Interpretor& di,
431 if (!DDF::GetDF(a[1],DF)) return 1;
432 Handle(TDataStd_TreeNode) TN, Value;
436 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
438 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
439 di<<"DDataStd_ChildNodeIterator: The format of GUID is invalid"<<"\n";
442 const Standard_GUID varID(a[4]);
446 if (!DDF::Find(DF, a[2], ID, TN)) return 1;
447 const Standard_Boolean AllLevels(Draw::Atoi(a[3]));
448 cni.Initialize(TN, AllLevels);
451 di << "DDataStd_InitChildNodeIterator : Error" << "\n";
455 //=======================================================================
456 //TreeNode : ChildNodeMore
457 //purpose : ChildNodeMore
458 //=======================================================================
460 static Standard_Integer DDataStd_ChildNodeMore (Draw_Interpretor& di,
461 Standard_Integer /*n*/,
465 //cout<<"TRUE"<<endl;
469 //cout<<"FALSE"<<endl;
475 //=======================================================================
476 //TreeNode : ChildNodeNext
477 //purpose : ChildNodeNext
478 //=======================================================================
480 static Standard_Integer DDataStd_ChildNodeNext (Draw_Interpretor& /*di*/,
481 Standard_Integer /*n*/,
488 //=======================================================================
489 //TreeNode : ChildNodeNextBrother
490 //purpose : ChildNodeNext Brother
491 //=======================================================================
493 static Standard_Integer DDataStd_ChildNodeNextBrother (Draw_Interpretor& /*di*/,
494 Standard_Integer /*n*/,
501 //=======================================================================
502 //TreeNode : ChildNodeValue
503 //purpose : ChildNodeValue
504 //=======================================================================
506 static Standard_Integer DDataStd_ChildNodeValue (Draw_Interpretor& di,
507 Standard_Integer /*n*/,
510 TCollection_AsciiString entry;
511 TDF_Tool::Entry(cni.Value()->Label(), entry);
517 //=======================================================================
518 //TreeNode : TreeCommands
520 //=======================================================================
522 void DDataStd::TreeCommands (Draw_Interpretor& theCommands)
524 static Standard_Boolean done = Standard_False;
526 done = Standard_True;
528 const char* g = "DData : Standard Attribute Commands";
532 theCommands.Add ("SetNode",
533 "SetNode (DOC Entry [GUID])",
534 __FILE__, DDataStd_SetNode, g);
538 theCommands.Add ("AppendNode",
539 "AppendNode (DOC FatherEntry childEntry [fatherGUID])",
540 __FILE__, DDataStd_AppendNode, g);
542 theCommands.Add ("PrependNode",
543 "PrependNode (DOC FatherEntry childEntry [fatherGUID])",
544 __FILE__, DDataStd_PrependNode, g);
546 theCommands.Add ("InsertNodeBefore",
547 "InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [GUID])",
548 __FILE__, DDataStd_InsertNodeBefore, g);
550 theCommands.Add ("InsertNodeAfter",
551 "InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [GUID])",
552 __FILE__, DDataStd_InsertNodeAfter, g);
554 theCommands.Add ("DetachNode",
555 "DetachNode (DOC TreeNodeEntry [GUID])",
556 __FILE__, DDataStd_DetachNode, g);
558 theCommands.Add ("RootNode",
559 "RootNode (DOC TreeNodeEntry [GUID])",
560 __FILE__, DDataStd_RootNode, g);
565 theCommands.Add ("TreeBrowse",
566 "TreeBrowse dfname entry [browsername]",
567 __FILE__, DDataStd_TreeBrowse, g);
569 theCommands.Add ("OpenNode",
570 "PRIVATE COMMAND FOR TREE BROWSER!\nReturns the list of sub-TreeNodes : OpenTreeNode browsername [entry]",
571 __FILE__, DDataStd_OpenNode, g);
577 theCommands.Add ("ChildNodeIterate",
578 "ChildNodeIterate Doc TreeNode AllLevels [GUID]",
579 __FILE__, DDataStd_ChildNodeIterate, g);
581 theCommands.Add ("InitChildNodeIterator",
582 "InitChildNodeIterator Doc TreeNode AllLevels [GUID]",
583 __FILE__, DDataStd_InitChildNodeIterator, g);
585 theCommands.Add ("ChildNodeMore",
587 __FILE__, DDataStd_ChildNodeMore, g);
589 theCommands.Add ("ChildNodeNext",
591 __FILE__, DDataStd_ChildNodeNext, g);
593 theCommands.Add ("ChildNodeNextBrother",
594 "ChildNodeNextBrother",
595 __FILE__, DDataStd_ChildNodeNextBrother, g);
597 theCommands.Add ("ChildNodeValue",
599 __FILE__, DDataStd_ChildNodeValue, g);