// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //======================================================================= //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); TDF_Label aCompoundPartL = Shape; if (aShapeTool->IsReference(Shape)) aShapeTool->GetReferredShape(aCompoundPartL, aCompoundPartL); TopoDS_Shape aS = aShapeTool->GetShape(aCompoundPartL); if (aShapeTool->Expand(aCompoundPartL)) { //move attributes TDF_ChildIterator anIter(aCompoundPartL, 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(aCompoundPartL); 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; }