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 under
9 // the terms of the GNU Lesser General Public License 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.
18 #include <DDataStd.hxx>
19 #include <DDataStd_TreeBrowser.hxx>
22 #include <Draw_Appli.hxx>
23 #include <Draw_Drawable3D.hxx>
24 #include <Draw_Interpretor.hxx>
25 #include <Standard_GUID.hxx>
26 #include <TCollection_AsciiString.hxx>
27 #include <TCollection_ExtendedString.hxx>
28 #include <TDataStd_ChildNodeIterator.hxx>
29 #include <TDataStd_TreeNode.hxx>
30 #include <TDataXtd_Constraint.hxx>
32 #include <TDF_Data.hxx>
33 #include <TDF_Label.hxx>
34 #include <TDF_Tool.hxx>
37 //=======================================================================
39 //purpose : SetNode (DOC Entry [ID])
40 //=======================================================================
41 static Standard_Integer DDataStd_SetNode (Draw_Interpretor& di,
46 if (!DDF::GetDF(a[1],DF)) return 1;
48 Handle(TDataStd_TreeNode) TN;
49 DDF::AddLabel(DF,a[2],L);
51 TN = TDataStd_TreeNode::Set(L);
52 DDF::ReturnLabel(di,TN->Label());
55 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
56 di<<"DDataStd_SetNode: The format of GUID is invalid\n";
59 const Standard_GUID ID(a[3]);
60 TN = TDataStd_TreeNode::Set(L, ID);
61 DDF::ReturnLabel(di,TN->Label());
64 di << "DDataStd_SetNode : Error\n";
68 //=======================================================================
69 //TreeNode : AppendNode
70 //purpose : AppendNode (DOC FatherEntry childEntry [fatherID])
71 //=======================================================================
73 static Standard_Integer DDataStd_AppendNode (Draw_Interpretor& di,
79 if (!DDF::GetDF(a[1],DF))return 1;
80 Handle(TDataStd_TreeNode) father, child;
84 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
86 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
87 di<<"DDataStd_AppendNode: The format of GUID is invalid\n";
90 const Standard_GUID varID(a[4]);
94 if (!DDF::Find(DF,a[2],ID,father)) return 1;
97 DDF::AddLabel(DF,a[3],L);
98 if ( (L.FindAttribute(ID,child))
99 &&(!child->IsRoot()) ){
100 di << "DDataStd_AppendNode : Error : childTreeNode don't detach\n";
103 child = TDataStd_TreeNode::Set(L,ID);
104 if (!father->Append(child)) return 1;
106 di<<"AppendNode: OK\n";
110 di << "DDataStd_AppendNode : Error\n";
114 //=======================================================================
115 //TreeNode : PrependNode
116 //purpose : PrependNode (DOC FatherEntry childEntry [fatherID])
117 //=======================================================================
119 static Standard_Integer DDataStd_PrependNode (Draw_Interpretor& di,
125 if (!DDF::GetDF(a[1],DF))return 1;
126 Handle(TDataStd_TreeNode) father, child;
130 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
132 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
133 di<<"DDataStd_PrependNode: The format of GUID is invalid\n";
136 const Standard_GUID varID(a[4]);
140 if (!DDF::Find(DF,a[2],ID,father)) return 1;
143 DDF::AddLabel(DF,a[3],L);
144 if ( (L.FindAttribute(ID,child))
145 &&(!child->IsRoot()) ){
146 di << "DDataStd_PrependNode : Error : childTreeNode don't detach\n";
149 child = TDataStd_TreeNode::Set(L,ID);
150 if (!father->Prepend(child)) return 1;
152 di<<"PrependNode: OK\n";
156 di << "DDataStd_PrependNode : Error\n";
160 //=======================================================================
161 //TreeNode : RootNode
162 //purpose : RootNode (DOC TreeNodeEntry [ID])
163 //=======================================================================
165 static Standard_Integer DDataStd_RootNode (Draw_Interpretor& di,
171 if (!DDF::GetDF(a[1],DF)) return 1;
172 Handle(TDataStd_TreeNode) TN;
176 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
178 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
179 di<<"DDataStd_RootNode: The format of GUID is invalid\n";
182 const Standard_GUID varID(a[3]);
186 if (!DDF::Find(DF,a[2],ID,TN)) return 1;
187 DDF::ReturnLabel(di,TN->Root()->Label());
190 di << "DDataStd_RootNode : Error\n";
194 //=======================================================================
195 //TreeNode : InsertNodeBefore
196 //purpose : InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [ID])
197 //=======================================================================
199 static Standard_Integer DDataStd_InsertNodeBefore(Draw_Interpretor& di,
205 if (!DDF::GetDF(a[1],DF)) return 1;
206 Handle(TDataStd_TreeNode) current, TN;
210 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
212 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
213 di<<"DDataStd_InsertNodeBefore: The format of GUID is invalid\n";
216 const Standard_GUID varID(a[4]);
220 if (!DDF::Find(DF,a[2],ID,current)) return 1;
221 // if (!DDF::Find(DF,a[3],ID,TN)) return 1;
224 if (!DDF::FindLabel(DF,a[3],L)) return 1;
225 TN = TDataStd_TreeNode::Set(L,ID);
226 if (!current->InsertBefore(TN)) return 1;
229 di << "DDataStd_InsertBefore : Error\n";
233 //=======================================================================
234 //TreeNode : InsertNodeAfter
235 //purpose : InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [ID])
236 //=======================================================================
238 static Standard_Integer DDataStd_InsertNodeAfter(Draw_Interpretor& di,
244 if (!DDF::GetDF(a[1],DF)) return 1;
245 Handle(TDataStd_TreeNode) current, TN;
249 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
251 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
252 di<<"DDataStd_InsertNodeAfter: The format of GUID is invalid\n";
255 const Standard_GUID varID(a[4]);
259 if (!DDF::Find(DF,a[2],ID,current)) return 1;
260 //if (!DDF::Find(DF,a[3],TDataStd_TreeNode::GetDefaultTreeID(),TN)) return 1;
262 if (!DDF::FindLabel(DF,a[3],L)) return 1;
263 TN = TDataStd_TreeNode::Set(L);
264 if (!current->InsertAfter(TN)) return 1;
267 di << "DDataStd_InsertNodeAfter : Error\n";
271 //=======================================================================
272 //TreeNode : DetachNode
273 //purpose : DetachNode (DOC TreeNodeEntry [ID])
274 //=======================================================================
276 static Standard_Integer DDataStd_DetachNode (Draw_Interpretor& di,Standard_Integer n, const char** a)
280 if (!DDF::GetDF(a[1],DF)) return 1;
281 Handle(TDataStd_TreeNode) TN;
285 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
287 if (!Standard_GUID::CheckGUIDFormat(a[3])) {
288 di<<"DDataStd_DetachNode: The format of GUID is invalid\n";
291 const Standard_GUID varID(a[3]);
295 if (!DDF::Find(DF,a[2],ID,TN)) return 1;
297 di << "Can't Detach the TreeNode\n";
300 di << "DDataStd_DetachNode : Error\n";
304 //=======================================================================
305 //function : TreeBrowse
309 // [arg 3] : Browser name
310 //=======================================================================
312 static Standard_Integer DDataStd_TreeBrowse (Draw_Interpretor& di,
319 if (!DDF::GetDF (a[1], DF)) return 1;
322 TDF_Tool::Label(DF,a[2],lab);
324 Handle(DDataStd_TreeBrowser) NewTreeNode = new DDataStd_TreeBrowser (lab);
325 char *name = new char[50];
326 if (n == 4) Sprintf(name,"treebrowser_%s",a[3]);
327 else Sprintf(name,"treebrowser_%s",a[1]);
329 Draw::Set(name, NewTreeNode);
330 TCollection_AsciiString inst1("treebrowser ");
331 inst1.AssignCat(name);
332 di.Eval(inst1.ToCString());
337 //=======================================================================
338 //function : OpenNode
340 // arg 1 : Browser name
341 // [arg 2] : Label entry
342 //=======================================================================
344 static Standard_Integer DDataStd_OpenNode (Draw_Interpretor& di,
350 Handle(DDataStd_TreeBrowser) browser = Handle(DDataStd_TreeBrowser)::DownCast (Draw::GetExisting (a[1]));
351 if (browser.IsNull())
353 std::cout << "Syntax error: browser '" << a[1] << "' not found\n";
358 if (n == 3) TDF_Tool::Label(browser->Label().Data(),a[2],lab);
360 if (n == 2 || lab.IsNull()) {
361 TCollection_AsciiString list = browser->OpenRoot();
362 di<<list.ToCString();
365 TCollection_AsciiString list = browser->OpenNode(lab);
366 di<<list.ToCString();
371 //=======================================================================
372 //TreeNode : ChildNodeIterate
373 //purpose : ChildNodeIterate Doc TreeNode AllLevels [ID]
374 //=======================================================================
376 static Standard_Integer DDataStd_ChildNodeIterate (Draw_Interpretor& di,
382 if (!DDF::GetDF(a[1],DF)) return 1;
383 const Standard_Boolean AllLevels = (Draw::Atoi(a[3]) != 0);
384 Handle(TDataStd_TreeNode) TN, Value;
388 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
390 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
391 di<<"DDataStd_ChildNodeIterate: The format of GUID is invalid\n";
394 const Standard_GUID varID(a[4]);
398 if (!DDF::Find(DF, a[2], ID, TN)) return 1;
399 //di<<"TDataStd_ChildNodeIterator: \n";
400 TDataStd_ChildNodeIterator itr(TN, AllLevels);
401 for (; itr.More(); itr.Next()) {
403 TCollection_AsciiString entry;
404 TDF_Tool::Entry(Value->Label(), entry);
407 //if(itr.More()==Standard_True)
413 di << "DDataStd_ChildNodeIterate : Error\n";
417 static TDataStd_ChildNodeIterator cni;
419 //=======================================================================
420 //TreeNode : InitChildNodeIterator
421 //purpose : InitChildNodeIterator Doc TreeNode AllLevels [ID]
422 //=======================================================================
424 static Standard_Integer DDataStd_InitChildNodeIterator (Draw_Interpretor& di,
430 if (!DDF::GetDF(a[1],DF)) return 1;
431 Handle(TDataStd_TreeNode) TN, Value;
435 ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
437 if (!Standard_GUID::CheckGUIDFormat(a[4])) {
438 di<<"DDataStd_ChildNodeIterator: The format of GUID is invalid\n";
441 const Standard_GUID varID(a[4]);
445 if (!DDF::Find(DF, a[2], ID, TN)) return 1;
446 const Standard_Boolean AllLevels = (Draw::Atoi(a[3]) != 0);
447 cni.Initialize(TN, AllLevels);
450 di << "DDataStd_InitChildNodeIterator : Error\n";
454 //=======================================================================
455 //TreeNode : ChildNodeMore
456 //purpose : ChildNodeMore
457 //=======================================================================
459 static Standard_Integer DDataStd_ChildNodeMore (Draw_Interpretor& di,
460 Standard_Integer /*n*/,
464 //std::cout<<"TRUE"<<std::endl;
468 //std::cout<<"FALSE"<<std::endl;
474 //=======================================================================
475 //TreeNode : ChildNodeNext
476 //purpose : ChildNodeNext
477 //=======================================================================
479 static Standard_Integer DDataStd_ChildNodeNext (Draw_Interpretor& /*di*/,
480 Standard_Integer /*n*/,
487 //=======================================================================
488 //TreeNode : ChildNodeNextBrother
489 //purpose : ChildNodeNext Brother
490 //=======================================================================
492 static Standard_Integer DDataStd_ChildNodeNextBrother (Draw_Interpretor& /*di*/,
493 Standard_Integer /*n*/,
500 //=======================================================================
501 //TreeNode : ChildNodeValue
502 //purpose : ChildNodeValue
503 //=======================================================================
505 static Standard_Integer DDataStd_ChildNodeValue (Draw_Interpretor& di,
506 Standard_Integer /*n*/,
509 TCollection_AsciiString entry;
510 TDF_Tool::Entry(cni.Value()->Label(), entry);
511 //std::cout<<entry<<std::endl;
516 //=======================================================================
517 //TreeNode : TreeCommands
519 //=======================================================================
521 void DDataStd::TreeCommands (Draw_Interpretor& theCommands)
523 static Standard_Boolean done = Standard_False;
525 done = Standard_True;
527 const char* g = "DData : Standard Attribute Commands";
531 theCommands.Add ("SetNode",
532 "SetNode (DOC Entry [GUID])",
533 __FILE__, DDataStd_SetNode, g);
537 theCommands.Add ("AppendNode",
538 "AppendNode (DOC FatherEntry childEntry [fatherGUID])",
539 __FILE__, DDataStd_AppendNode, g);
541 theCommands.Add ("PrependNode",
542 "PrependNode (DOC FatherEntry childEntry [fatherGUID])",
543 __FILE__, DDataStd_PrependNode, g);
545 theCommands.Add ("InsertNodeBefore",
546 "InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [GUID])",
547 __FILE__, DDataStd_InsertNodeBefore, g);
549 theCommands.Add ("InsertNodeAfter",
550 "InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [GUID])",
551 __FILE__, DDataStd_InsertNodeAfter, g);
553 theCommands.Add ("DetachNode",
554 "DetachNode (DOC TreeNodeEntry [GUID])",
555 __FILE__, DDataStd_DetachNode, g);
557 theCommands.Add ("RootNode",
558 "RootNode (DOC TreeNodeEntry [GUID])",
559 __FILE__, DDataStd_RootNode, g);
564 theCommands.Add ("TreeBrowse",
565 "TreeBrowse dfname entry [browsername]",
566 __FILE__, DDataStd_TreeBrowse, g);
568 theCommands.Add ("OpenNode",
569 "PRIVATE COMMAND FOR TREE BROWSER!\nReturns the list of sub-TreeNodes : OpenTreeNode browsername [entry]",
570 __FILE__, DDataStd_OpenNode, g);
576 theCommands.Add ("ChildNodeIterate",
577 "ChildNodeIterate Doc TreeNode AllLevels [GUID]",
578 __FILE__, DDataStd_ChildNodeIterate, g);
580 theCommands.Add ("InitChildNodeIterator",
581 "InitChildNodeIterator Doc TreeNode AllLevels [GUID]",
582 __FILE__, DDataStd_InitChildNodeIterator, g);
584 theCommands.Add ("ChildNodeMore",
586 __FILE__, DDataStd_ChildNodeMore, g);
588 theCommands.Add ("ChildNodeNext",
590 __FILE__, DDataStd_ChildNodeNext, g);
592 theCommands.Add ("ChildNodeNextBrother",
593 "ChildNodeNextBrother",
594 __FILE__, DDataStd_ChildNodeNextBrother, g);
596 theCommands.Add ("ChildNodeValue",
598 __FILE__, DDataStd_ChildNodeValue, g);