// SPDX-License-Identifier: LGPL-2.1-or-later /**************************************************************************** * Copyright (c) 2018 Zheng, Lei (realthunder) * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ****************************************************************************/ #include #include #include #include #include #include "Tools.h" #include #include // See https://dev.opencascade.org/content/occt-3d-viewer-becomes-srgb-aware #define OCC_COLOR_SPACE Quantity_TOC_sRGB FC_LOG_LEVEL_INIT("Import", true, true) using namespace Import; Base::Color Tools::convertColor(const Quantity_ColorRGBA& rgba) { Standard_Real red, green, blue; rgba.GetRGB().Values(red, green, blue, OCC_COLOR_SPACE); return Base::Color( static_cast(red), static_cast(green), static_cast(blue), static_cast(rgba.Alpha()) ); } Quantity_ColorRGBA Tools::convertColor(const Base::Color& col) { return Quantity_ColorRGBA(Quantity_Color(col.r, col.g, col.b, OCC_COLOR_SPACE), col.a); } static inline std::ostream& operator<<(std::ostream& os, const Quantity_ColorRGBA& rgba) { Base::Color color = Tools::convertColor(rgba); auto toHex = [](float v) { return boost::format("%02X") % static_cast(v * 255); }; return os << "#" << toHex(color.r) << toHex(color.g) << toHex(color.b) << toHex(color.a); } std::string Tools::labelName(TDF_Label label) { std::string txt; Handle(TDataStd_Name) name; if (!label.IsNull() && label.FindAttribute(TDataStd_Name::GetID(), name)) { TCollection_ExtendedString extstr = name->Get(); char* str = new char[extstr.LengthOfCString() + 1]; extstr.ToUTF8CString(str); txt = str; delete[] str; boost::trim(txt); } return txt; } void Tools::printLabel( TDF_Label label, Handle(XCAFDoc_ShapeTool) aShapeTool, Handle(XCAFDoc_ColorTool) aColorTool, const char* msg ) { if (label.IsNull() || !FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG)) { return; } if (!msg) { msg = "Label: "; } TCollection_AsciiString entry; TDF_Tool::Entry(label, entry); std::ostringstream ss; ss << msg << entry << ", " << labelName(label) << (aShapeTool->IsShape(label) ? ", shape" : "") << (aShapeTool->IsTopLevel(label) ? ", topLevel" : "") << (aShapeTool->IsFree(label) ? ", free" : "") << (aShapeTool->IsAssembly(label) ? ", assembly" : "") << (aShapeTool->IsSimpleShape(label) ? ", simple" : "") << (aShapeTool->IsCompound(label) ? ", compound" : "") << (aShapeTool->IsReference(label) ? ", reference" : "") << (aShapeTool->IsComponent(label) ? ", component" : "") << (aShapeTool->IsSubShape(label) ? ", subshape" : ""); if (aShapeTool->IsSubShape(label)) { auto shape = aShapeTool->GetShape(label); if (!shape.IsNull()) { ss << ", " << Part::TopoShape::shapeName(shape.ShapeType(), true); } } if (aShapeTool->IsShape(label)) { Quantity_ColorRGBA c; if (aColorTool->GetColor(label, XCAFDoc_ColorGen, c)) { ss << ", gc: " << c; } if (aColorTool->GetColor(label, XCAFDoc_ColorSurf, c)) { ss << ", sc: " << c; } if (aColorTool->GetColor(label, XCAFDoc_ColorCurv, c)) { ss << ", cc: " << c; } } ss << std::endl; Base::Console().notify("ImportOCAF2", ss.str().c_str()); } void Tools::dumpLabels( TDF_Label label, Handle(XCAFDoc_ShapeTool) aShapeTool, Handle(XCAFDoc_ColorTool) aColorTool, int depth ) { std::string indent(depth * 2, ' '); printLabel(label, aShapeTool, aColorTool, indent.c_str()); TDF_ChildIterator it; for (it.Initialize(label); it.More(); it.Next()) { dumpLabels(it.Value(), aShapeTool, aColorTool, depth + 1); } }