1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/DDataStd/DDataStd_TreeCommands.cxx
abv 42cf5bc1ca 0024002: Overall code and build procedure refactoring -- automatic
Automatic upgrade of OCCT code by command "occt_upgrade . -nocdl":
- WOK-generated header files from inc and sources from drv are moved to src
- CDL files removed
- All packages are converted to nocdlpack
2015-07-12 07:42:38 +03:00

597 lines
17 KiB
C++

// Created on: 1999-11-05
// Created by: Denis PASCAL
// Copyright (c) 1999-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DDataStd.hxx>
#include <DDataStd_TreeBrowser.hxx>
#include <DDF.hxx>
#include <Draw.hxx>
#include <Draw_Appli.hxx>
#include <Draw_Drawable3D.hxx>
#include <Draw_Interpretor.hxx>
#include <Standard_GUID.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TDataStd_ChildNodeIterator.hxx>
#include <TDataStd_TreeNode.hxx>
#include <TDataXtd_Constraint.hxx>
#include <TDF.hxx>
#include <TDF_Data.hxx>
#include <TDF_Label.hxx>
#include <TDF_Tool.hxx>
#include <stdio.h>
//=======================================================================
//TreeNode : SetNode
//purpose : SetNode (DOC Entry [ID])
//=======================================================================
static Standard_Integer DDataStd_SetNode (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
TDF_Label L;
Handle(TDataStd_TreeNode) TN;
DDF::AddLabel(DF,a[2],L);
if (n == 3) {
TN = TDataStd_TreeNode::Set(L);
DDF::ReturnLabel(di,TN->Label());
return 0;
} else if (n == 4) {
if (!Standard_GUID::CheckGUIDFormat(a[3])) {
di<<"DDataStd_SetNode: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID ID(a[3]);
TN = TDataStd_TreeNode::Set(L, ID);
DDF::ReturnLabel(di,TN->Label());
return 0;
}
di << "DDataStd_SetNode : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : AppendNode
//purpose : AppendNode (DOC FatherEntry childEntry [fatherID])
//=======================================================================
static Standard_Integer DDataStd_AppendNode (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF))return 1;
Handle(TDataStd_TreeNode) father, child;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_AppendNode: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,father)) return 1;
TDF_Label L;
DDF::AddLabel(DF,a[3],L);
if ( (L.FindAttribute(ID,child))
&&(!child->IsRoot()) ){
di << "DDataStd_AppendNode : Error : childTreeNode don't detach" << "\n";
return 1;
}
child = TDataStd_TreeNode::Set(L,ID);
if (!father->Append(child)) return 1;
#ifdef OCCT_DEBUG
di<<"AppendNode: OK"<<"\n";
#endif
return 0;
}
di << "DDataStd_AppendNode : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : PrependNode
//purpose : PrependNode (DOC FatherEntry childEntry [fatherID])
//=======================================================================
static Standard_Integer DDataStd_PrependNode (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF))return 1;
Handle(TDataStd_TreeNode) father, child;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_PrependNode: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,father)) return 1;
TDF_Label L;
DDF::AddLabel(DF,a[3],L);
if ( (L.FindAttribute(ID,child))
&&(!child->IsRoot()) ){
di << "DDataStd_PrependNode : Error : childTreeNode don't detach" << "\n";
return 1;
}
child = TDataStd_TreeNode::Set(L,ID);
if (!father->Prepend(child)) return 1;
#ifdef OCCT_DEBUG
di<<"PrependNode: OK"<<"\n";
#endif
return 0;
}
di << "DDataStd_PrependNode : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : RootNode
//purpose : RootNode (DOC TreeNodeEntry [ID])
//=======================================================================
static Standard_Integer DDataStd_RootNode (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 3) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
Handle(TDataStd_TreeNode) TN;
Standard_GUID ID;
if (n==3)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[3])) {
di<<"DDataStd_RootNode: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[3]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,TN)) return 1;
DDF::ReturnLabel(di,TN->Root()->Label());
return 0;
}
di << "DDataStd_RootNode : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : InsertNodeBefore
//purpose : InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [ID])
//=======================================================================
static Standard_Integer DDataStd_InsertNodeBefore(Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
Handle(TDataStd_TreeNode) current, TN;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_InsertNodeBefore: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,current)) return 1;
// if (!DDF::Find(DF,a[3],ID,TN)) return 1;
TDF_Label L;
if (!DDF::FindLabel(DF,a[3],L)) return 1;
TN = TDataStd_TreeNode::Set(L,ID);
if (!current->InsertBefore(TN)) return 1;
return 0;
}
di << "DDataStd_InsertBefore : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : InsertNodeAfter
//purpose : InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [ID])
//=======================================================================
static Standard_Integer DDataStd_InsertNodeAfter(Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
Handle(TDataStd_TreeNode) current, TN;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_InsertNodeAfter: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,current)) return 1;
//if (!DDF::Find(DF,a[3],TDataStd_TreeNode::GetDefaultTreeID(),TN)) return 1;
TDF_Label L;
if (!DDF::FindLabel(DF,a[3],L)) return 1;
TN = TDataStd_TreeNode::Set(L);
if (!current->InsertAfter(TN)) return 1;
return 0;
}
di << "DDataStd_InsertNodeAfter : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : DetachNode
//purpose : DetachNode (DOC TreeNodeEntry [ID])
//=======================================================================
static Standard_Integer DDataStd_DetachNode (Draw_Interpretor& di,Standard_Integer n, const char** a)
{
if (n >= 3) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
Handle(TDataStd_TreeNode) TN;
Standard_GUID ID;
if (n==3)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[3])) {
di<<"DDataStd_DetachNode: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[3]);
ID=varID;
}
if (!DDF::Find(DF,a[2],ID,TN)) return 1;
if (!TN->Remove())
di << "Can't Detach the TreeNode" << "\n";
return 0;
}
di << "DDataStd_DetachNode : Error" << "\n";
return 1;
}
//=======================================================================
//function : TreeBrowse
//purpose :
// arg 1 : DF name
// arg 2 : Entry
// [arg 3] : Browser name
//=======================================================================
static Standard_Integer DDataStd_TreeBrowse (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n<3) return 1;
Handle(TDF_Data) DF;
if (!DDF::GetDF (a[1], DF)) return 1;
TDF_Label lab;
TDF_Tool::Label(DF,a[2],lab);
Handle(DDataStd_TreeBrowser) NewTreeNode = new DDataStd_TreeBrowser (lab);
char *name = new char[50];
if (n == 4) Sprintf(name,"treebrowser_%s",a[3]);
else Sprintf(name,"treebrowser_%s",a[1]);
Draw::Set(name, NewTreeNode);
TCollection_AsciiString inst1("treebrowser ");
inst1.AssignCat(name);
di.Eval(inst1.ToCString());
return 0;
}
//=======================================================================
//function : OpenNode
//purpose :
// arg 1 : Browser name
// [arg 2] : Label entry
//=======================================================================
static Standard_Integer DDataStd_OpenNode (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n < 2) return 1;
Handle(DDataStd_TreeBrowser) browser =
Handle(DDataStd_TreeBrowser)::DownCast (Draw::Get(a[1], Standard_True));
TDF_Label lab;
if (n == 3) TDF_Tool::Label(browser->Label().Data(),a[2],lab);
if (n == 2 || lab.IsNull()) {
TCollection_AsciiString list = browser->OpenRoot();
di<<list.ToCString();
}
else {
TCollection_AsciiString list = browser->OpenNode(lab);
di<<list.ToCString();
}
return 0;
}
//=======================================================================
//TreeNode : ChildNodeIterate
//purpose : ChildNodeIterate Doc TreeNode AllLevels [ID]
//=======================================================================
static Standard_Integer DDataStd_ChildNodeIterate (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
const Standard_Boolean AllLevels(Draw::Atoi(a[3]));
Handle(TDataStd_TreeNode) TN, Value;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_ChildNodeIterate: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF, a[2], ID, TN)) return 1;
//di<<"TDataStd_ChildNodeIterator: "<<"\n";
TDataStd_ChildNodeIterator itr(TN, AllLevels);
for (; itr.More(); itr.Next()) {
Value = itr.Value();
TCollection_AsciiString entry;
TDF_Tool::Entry(Value->Label(), entry);
di<<entry<<"\n";
//di<<entry;
//if(itr.More()==Standard_True)
//di<<" ";
}
di<<"\n";
return 0;
}
di << "DDataStd_ChildNodeIterate : Error" << "\n";
return 1;
}
static TDataStd_ChildNodeIterator cni;
//=======================================================================
//TreeNode : InitChildNodeIterator
//purpose : InitChildNodeIterator Doc TreeNode AllLevels [ID]
//=======================================================================
static Standard_Integer DDataStd_InitChildNodeIterator (Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n >= 4) {
Handle(TDF_Data) DF;
if (!DDF::GetDF(a[1],DF)) return 1;
Handle(TDataStd_TreeNode) TN, Value;
Standard_GUID ID;
if (n==4)
ID=Standard_GUID(TDataStd_TreeNode::GetDefaultTreeID());
else{
if (!Standard_GUID::CheckGUIDFormat(a[4])) {
di<<"DDataStd_ChildNodeIterator: The format of GUID is invalid"<<"\n";
return 1;
}
const Standard_GUID varID(a[4]);
ID=varID;
}
if (!DDF::Find(DF, a[2], ID, TN)) return 1;
const Standard_Boolean AllLevels(Draw::Atoi(a[3]));
cni.Initialize(TN, AllLevels);
return 0;
}
di << "DDataStd_InitChildNodeIterator : Error" << "\n";
return 1;
}
//=======================================================================
//TreeNode : ChildNodeMore
//purpose : ChildNodeMore
//=======================================================================
static Standard_Integer DDataStd_ChildNodeMore (Draw_Interpretor& di,
Standard_Integer /*n*/,
const char** /*a*/)
{
if (cni.More()) {
//cout<<"TRUE"<<endl;
di<<"TRUE"<<"\n";
}
else {
//cout<<"FALSE"<<endl;
di<<"FALSE"<<"\n";
}
return 0;
}
//=======================================================================
//TreeNode : ChildNodeNext
//purpose : ChildNodeNext
//=======================================================================
static Standard_Integer DDataStd_ChildNodeNext (Draw_Interpretor& /*di*/,
Standard_Integer /*n*/,
const char** /*a*/)
{
cni.Next();
return 0;
}
//=======================================================================
//TreeNode : ChildNodeNextBrother
//purpose : ChildNodeNext Brother
//=======================================================================
static Standard_Integer DDataStd_ChildNodeNextBrother (Draw_Interpretor& /*di*/,
Standard_Integer /*n*/,
const char** /*a*/)
{
cni.NextBrother();
return 0;
}
//=======================================================================
//TreeNode : ChildNodeValue
//purpose : ChildNodeValue
//=======================================================================
static Standard_Integer DDataStd_ChildNodeValue (Draw_Interpretor& di,
Standard_Integer /*n*/,
const char** /*a*/)
{
TCollection_AsciiString entry;
TDF_Tool::Entry(cni.Value()->Label(), entry);
//cout<<entry<<endl;
di <<entry<<"\n";
return 0;
}
//=======================================================================
//TreeNode : TreeCommands
//purpose :
//=======================================================================
void DDataStd::TreeCommands (Draw_Interpretor& theCommands)
{
static Standard_Boolean done = Standard_False;
if (done) return;
done = Standard_True;
const char* g = "DData : Standard Attribute Commands";
// SET
theCommands.Add ("SetNode",
"SetNode (DOC Entry [GUID])",
__FILE__, DDataStd_SetNode, g);
// EDIT
theCommands.Add ("AppendNode",
"AppendNode (DOC FatherEntry childEntry [fatherGUID])",
__FILE__, DDataStd_AppendNode, g);
theCommands.Add ("PrependNode",
"PrependNode (DOC FatherEntry childEntry [fatherGUID])",
__FILE__, DDataStd_PrependNode, g);
theCommands.Add ("InsertNodeBefore",
"InsertNodeBefore (DOC TreeNodeEntry TreeNodeWhichHasToBeBefore [GUID])",
__FILE__, DDataStd_InsertNodeBefore, g);
theCommands.Add ("InsertNodeAfter",
"InsertNodeAfter (DOC TreeNodeEntry TreeNodeWhichHasToBeAfter [GUID])",
__FILE__, DDataStd_InsertNodeAfter, g);
theCommands.Add ("DetachNode",
"DetachNode (DOC TreeNodeEntry [GUID])",
__FILE__, DDataStd_DetachNode, g);
theCommands.Add ("RootNode",
"RootNode (DOC TreeNodeEntry [GUID])",
__FILE__, DDataStd_RootNode, g);
// TREE BROWSER
theCommands.Add ("TreeBrowse",
"TreeBrowse dfname entry [browsername]",
__FILE__, DDataStd_TreeBrowse, g);
theCommands.Add ("OpenNode",
"PRIVATE COMMAND FOR TREE BROWSER!\nReturns the list of sub-TreeNodes : OpenTreeNode browsername [entry]",
__FILE__, DDataStd_OpenNode, g);
// TREE ITERATOR
theCommands.Add ("ChildNodeIterate",
"ChildNodeIterate Doc TreeNode AllLevels [GUID]",
__FILE__, DDataStd_ChildNodeIterate, g);
theCommands.Add ("InitChildNodeIterator",
"InitChildNodeIterator Doc TreeNode AllLevels [GUID]",
__FILE__, DDataStd_InitChildNodeIterator, g);
theCommands.Add ("ChildNodeMore",
"ChildNodeMore",
__FILE__, DDataStd_ChildNodeMore, g);
theCommands.Add ("ChildNodeNext",
"ChildNodeNext",
__FILE__, DDataStd_ChildNodeNext, g);
theCommands.Add ("ChildNodeNextBrother",
"ChildNodeNextBrother",
__FILE__, DDataStd_ChildNodeNextBrother, g);
theCommands.Add ("ChildNodeValue",
"ChildNodeValue",
__FILE__, DDataStd_ChildNodeValue, g);
}