1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/XCAFDoc/XCAFDoc_Editor.cxx
ika f277ba3771 0029821: Data Exchange - Wrong processing of subshapes in ShapeTool
Improve FindSubShape method in ShapeTool.
Update Expand compounds, according to changes in ShapeTool.
Add FindSubShape and AddSubShape commands for Draw.
2018-06-14 14:03:07 +03:00

235 lines
8.1 KiB
C++

// Created on: 2015-05-14
// Created by: data exchange team
// Copyright (c) 2000-2015 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 <XCAFDoc_Editor.hxx>
#include <XCAFDoc.hxx>
#include <TDF_Label.hxx>
#include <TDF_LabelSequence.hxx>
#include <TDF_ChildIterator.hxx>
#include <TDataStd_Name.hxx>
#include <TDataStd_UAttribute.hxx>
#include <TopLoc_Location.hxx>
#include <TopoDS_Shape.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_ColorTool.hxx>
#include <XCAFDoc_LayerTool.hxx>
#include <XCAFDoc_ShapeTool.hxx>
#include <XCAFDoc_ShapeMapTool.hxx>
#include <XCAFDoc_Location.hxx>
#include <TNaming_NamedShape.hxx>
//=======================================================================
//function : Expand
//purpose : Convert Shape to assembly
//=======================================================================
Standard_Boolean XCAFDoc_Editor::Expand (const TDF_Label& Doc, const TDF_Label& Shape,
const Standard_Boolean recursively)
{
if(Doc.IsNull() || Shape.IsNull())
return Standard_False;
Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(Doc);
Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc);
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc);
Standard_Boolean isAutoNaming = aShapeTool->AutoNaming();
aShapeTool->SetAutoNaming(Standard_False);
TopoDS_Shape aS = aShapeTool->GetShape(Shape);
if (aShapeTool->Expand(Shape))
{
//move attributes
TDF_ChildIterator anIter(Shape, Standard_True);
for(; anIter.More(); anIter.Next())
{
TDF_Label aChild = anIter.Value();
TDF_LabelSequence aLayers;
TDF_LabelSequence aColors;
Handle(TDataStd_Name) aName;
getParams(Doc, aChild, aColors, aLayers, aName);
//get part
TDF_Label aPart;
if(aShapeTool->GetReferredShape(aChild, aPart))
{
setParams(Doc, aPart, aColors, aLayers, aName);
//remove unnecessary links
TopoDS_Shape aShape = aShapeTool->GetShape(aChild);
if(!aShapeTool->GetShape(aPart.Father()).IsNull())
{
TopLoc_Location nulloc;
aPart.ForgetAttribute(XCAFDoc::ShapeRefGUID());
if (aShapeTool->GetShape(aPart.Father()).ShapeType() == TopAbs_COMPOUND)
{
aShapeTool->SetShape(aPart, aShape);
}
aPart.ForgetAttribute(XCAFDoc_ShapeMapTool::GetID());
aChild.ForgetAllAttributes(Standard_False);
}
aChild.ForgetAttribute(TNaming_NamedShape::GetID());
aChild.ForgetAttribute(XCAFDoc_ShapeMapTool::GetID());
}
else
{
// If new original shape is not created, try to process this child
// as subshape of new part
TDF_LabelSequence aUsers;
if (aShapeTool->GetUsers(aChild, aUsers) > 0)
{
for (Standard_Integer i = 1; i <= aUsers.Length(); i++)
{
TDF_Label aSubLabel = aUsers.Value(i);
//remove unnecessary links
aSubLabel.ForgetAttribute(XCAFDoc::ShapeRefGUID());
aSubLabel.ForgetAttribute(XCAFDoc_ShapeMapTool::GetID());
setParams(Doc, aSubLabel, aColors, aLayers, aName);
}
aChild.ForgetAllAttributes(Standard_False);
}
}
}
//if assembly contains compound, expand it recursively(if flag recursively is true)
if(recursively)
{
anIter.Initialize(Shape);
for(; anIter.More(); anIter.Next())
{
TDF_Label aChild = anIter.Value();
TDF_Label aPart;
if(aShapeTool->GetReferredShape(aChild, aPart))
{
TopoDS_Shape aPartShape = aShapeTool->GetShape(aPart);
if (!aPartShape.IsNull() && aPartShape.ShapeType() == TopAbs_COMPOUND)
Expand(Doc, aPart, recursively);
}
}
}
aShapeTool->SetAutoNaming(isAutoNaming);
return Standard_True;
}
aShapeTool->SetAutoNaming(isAutoNaming);
return Standard_False;
}
//=======================================================================
//function : Expand
//purpose : Convert all compounds in Doc to assembly
//=======================================================================
Standard_Boolean XCAFDoc_Editor::Expand (const TDF_Label& Doc, const Standard_Boolean recursively)
{
Standard_Boolean result = Standard_False;
TDF_LabelSequence aLabels;
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc);
aShapeTool->GetFreeShapes(aLabels);
for(Standard_Integer i = 1; i <= aLabels.Length(); i++)
{
TopoDS_Shape aS = aShapeTool->GetShape(aLabels(i));
if (!aS.IsNull() && aS.ShapeType() == TopAbs_COMPOUND && !aShapeTool->IsAssembly(aLabels(i)))
if (Expand(Doc, aLabels(i), recursively))
{
result = Standard_True;
}
}
return result;
}
//=======================================================================
//function : getParams
//purpose : Get colors layers and name
//=======================================================================
Standard_Boolean XCAFDoc_Editor::getParams (const TDF_Label& Doc, const TDF_Label& Label,
TDF_LabelSequence& Colors, TDF_LabelSequence& Layers,
Handle(TDataStd_Name)& Name)
{
if(Doc.IsNull() || Label.IsNull())
return Standard_False;
Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(Doc);
Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc);
//get colors
XCAFDoc_ColorType aTypeColor = XCAFDoc_ColorGen;
for(;;)
{
TDF_Label aColor;
aColorTool->GetColor(Label, aTypeColor, aColor);
Colors.Append(aColor);
if(aTypeColor == XCAFDoc_ColorCurv)
break;
aTypeColor = (XCAFDoc_ColorType)(aTypeColor + 1);
}
//get layers
aLayerTool->GetLayers(Label, Layers);
//get name
Label.FindAttribute(TDataStd_Name::GetID(), Name);
return Standard_True;
}
//=======================================================================
//function : setParams
//purpose : set colors layers and name
//=======================================================================
Standard_Boolean XCAFDoc_Editor::setParams (const TDF_Label& Doc, const TDF_Label& Label,
const TDF_LabelSequence& Colors, const TDF_LabelSequence& Layers,
const Handle(TDataStd_Name)& Name)
{
if(Doc.IsNull() || Label.IsNull())
return Standard_False;
Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(Doc);
Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool(Doc);
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc);
//set layers
if(!Layers.IsEmpty())
{
for(Standard_Integer i = 1; i <= Layers.Length(); i++)
{
aLayerTool->SetLayer(Label, Layers.Value(i));
}
}
//set colors
if(!Colors.IsEmpty())
{
XCAFDoc_ColorType aTypeColor = XCAFDoc_ColorGen;
for(Standard_Integer i = 1; i <= Colors.Length(); i++)
{
if(!Colors.Value(i).IsNull())
aColorTool->SetColor(Label, Colors.Value(i), aTypeColor);
aTypeColor = (XCAFDoc_ColorType)(aTypeColor + 1);
}
}
//set name
if(!Name.IsNull())
{
if(Name->Get().Search("=>") < 0)
TDataStd_Name::Set(Label, Name->Get());
}
else
{
Standard_SStream Stream;
TopoDS_Shape aShape = aShapeTool->GetShape(Label);
TopAbs::Print(aShape.ShapeType(), Stream);
TCollection_AsciiString aName (Stream.str().c_str());
TDataStd_Name::Set(Label, TCollection_ExtendedString(aName));
}
return Standard_True;
}