From 0aa9ea99b49854ec8be44d01de939c5461777cdc Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 24 Sep 2023 18:22:25 +0200 Subject: [PATCH] Import: move glTF writer to its own source files --- src/Mod/Import/App/AppImportPy.cpp | 24 ++-------- src/Mod/Import/App/CMakeLists.txt | 4 ++ src/Mod/Import/App/ReaderGltf.cpp | 32 +++++++++++++ src/Mod/Import/App/ReaderGltf.h | 32 +++++++++++++ src/Mod/Import/App/WriterGltf.cpp | 67 +++++++++++++++++++++++++++ src/Mod/Import/App/WriterGltf.h | 47 +++++++++++++++++++ src/Mod/Import/Gui/AppImportGuiPy.cpp | 23 ++------- 7 files changed, 188 insertions(+), 41 deletions(-) create mode 100644 src/Mod/Import/App/ReaderGltf.cpp create mode 100644 src/Mod/Import/App/ReaderGltf.h create mode 100644 src/Mod/Import/App/WriterGltf.cpp create mode 100644 src/Mod/Import/App/WriterGltf.h diff --git a/src/Mod/Import/App/AppImportPy.cpp b/src/Mod/Import/App/AppImportPy.cpp index ac1957e29d..861d97af23 100644 --- a/src/Mod/Import/App/AppImportPy.cpp +++ b/src/Mod/Import/App/AppImportPy.cpp @@ -51,7 +51,6 @@ #include #if OCC_VERSION_HEX >= 0x070500 #include -#include #endif #if defined(__clang__) #pragma clang diagnostic pop @@ -74,7 +73,7 @@ #include #include "ImportOCAF2.h" - +#include "WriterGltf.h" namespace Import { @@ -434,25 +433,8 @@ private: } } else if (file.hasExtension({"glb", "gltf"})) { -#if OCC_VERSION_HEX >= 0x070500 - TColStd_IndexedDataMapOfStringString aMetadata; - RWGltf_CafWriter aWriter(name8bit.c_str(), file.hasExtension("glb")); - aWriter.SetTransformationFormat(RWGltf_WriterTrsfFormat_Compact); - // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#coordinate-system-and-units - aWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit(0.001); - aWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem( - RWMesh_CoordinateSystem_Zup); -#if OCC_VERSION_HEX >= 0x070700 - aWriter.SetParallel(true); -#endif - Standard_Boolean ret = aWriter.Perform(hDoc, aMetadata, Message_ProgressRange()); - if (!ret) { - PyErr_Format(PyExc_IOError, "Cannot save to file '%s'", Utf8Name.c_str()); - throw Py::Exception(); - } -#else - throw Py::RuntimeError("gITF support requires OCCT 7.5.0 or later"); -#endif + Import::WriterGltf writer(name8bit, file); + writer.write(hDoc); } hApp->Close(hDoc); diff --git a/src/Mod/Import/App/CMakeLists.txt b/src/Mod/Import/App/CMakeLists.txt index 4ad568f2a6..ded2ae2886 100644 --- a/src/Mod/Import/App/CMakeLists.txt +++ b/src/Mod/Import/App/CMakeLists.txt @@ -35,12 +35,16 @@ SET(Import_SRCS ImportOCAF2.h #ImportOCAFAssembly.cpp #ImportOCAFAssembly.h + ReaderGltf.cpp + ReaderGltf.h StepShapePy.xml StepShape.h StepShape.cpp StepShapePyImp.cpp PreCompiled.cpp PreCompiled.h + WriterGltf.cpp + WriterGltf.h dxf/ImpExpDxf.cpp dxf/ImpExpDxf.h dxf/dxf.cpp diff --git a/src/Mod/Import/App/ReaderGltf.cpp b/src/Mod/Import/App/ReaderGltf.cpp new file mode 100644 index 0000000000..81fdc35264 --- /dev/null +++ b/src/Mod/Import/App/ReaderGltf.cpp @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2023 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#endif + +#include "ReaderGltf.h" + +using namespace Import; diff --git a/src/Mod/Import/App/ReaderGltf.h b/src/Mod/Import/App/ReaderGltf.h new file mode 100644 index 0000000000..7269351d46 --- /dev/null +++ b/src/Mod/Import/App/ReaderGltf.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2023 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef IMPORT_READER_GLTF_H +#define IMPORT_READER_GLTF_H + +namespace Import +{ + +} + +#endif // IMPORT_READER_GLTF_H diff --git a/src/Mod/Import/App/WriterGltf.cpp b/src/Mod/Import/App/WriterGltf.cpp new file mode 100644 index 0000000000..e6cb037fd0 --- /dev/null +++ b/src/Mod/Import/App/WriterGltf.cpp @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2023 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#include +#include +#if OCC_VERSION_HEX >= 0x070500 +#include +#include +#endif +#endif + +#include "WriterGltf.h" +#include + +using namespace Import; + +WriterGltf::WriterGltf(std::string name8bit, const Base::FileInfo& file) // NOLINT + : name8bit {std::move(name8bit)} + , file {file} +{} + +void WriterGltf::write(Handle(TDocStd_Document) hDoc) const // NOLINT +{ +#if OCC_VERSION_HEX >= 0x070500 + TColStd_IndexedDataMapOfStringString aMetadata; + RWGltf_CafWriter aWriter(name8bit.c_str(), file.hasExtension("glb")); + aWriter.SetTransformationFormat(RWGltf_WriterTrsfFormat_Compact); + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#coordinate-system-and-units + aWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit(0.001); // NOLINT + aWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem(RWMesh_CoordinateSystem_Zup); +#if OCC_VERSION_HEX >= 0x070700 + aWriter.SetParallel(true); +#endif + Standard_Boolean ret = aWriter.Perform(hDoc, aMetadata, Message_ProgressRange()); + if (!ret) { + std::stringstream str; + str << "Cannot save to file '" + << "" << file.filePath() << "'"; + } +#else + throw Base::RuntimeError("gITF support requires OCCT 7.5.0 or later"); +#endif +} diff --git a/src/Mod/Import/App/WriterGltf.h b/src/Mod/Import/App/WriterGltf.h new file mode 100644 index 0000000000..8ab4cba5e4 --- /dev/null +++ b/src/Mod/Import/App/WriterGltf.h @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2023 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef IMPORT_WRITER_GLTF_H +#define IMPORT_WRITER_GLTF_H + +#include +#include +#include + +namespace Import +{ + +class ImportExport WriterGltf +{ +public: + WriterGltf(std::string name8bit, const Base::FileInfo& file); + + void write(Handle(TDocStd_Document) hDoc) const; + +private: + std::string name8bit; + Base::FileInfo file; +}; +} // namespace Import + +#endif // IMPORT_WRITER_GLTF_H diff --git a/src/Mod/Import/Gui/AppImportGuiPy.cpp b/src/Mod/Import/Gui/AppImportGuiPy.cpp index 4173739cd0..58fa4ba5ca 100644 --- a/src/Mod/Import/Gui/AppImportGuiPy.cpp +++ b/src/Mod/Import/Gui/AppImportGuiPy.cpp @@ -88,7 +88,6 @@ #if OCC_VERSION_HEX >= 0x070500 #include -#include #endif #if defined(__clang__) #pragma clang diagnostic pop @@ -105,6 +104,7 @@ #include #include #include +#include #include #include #include @@ -769,25 +769,8 @@ private: } } else if (file.hasExtension({"glb", "gltf"})) { -#if OCC_VERSION_HEX >= 0x070500 - TColStd_IndexedDataMapOfStringString aMetadata; - RWGltf_CafWriter aWriter(name8bit.c_str(), file.hasExtension("glb")); - aWriter.SetTransformationFormat(RWGltf_WriterTrsfFormat_Compact); - // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#coordinate-system-and-units - aWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit(0.001); - aWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem( - RWMesh_CoordinateSystem_Zup); -#if OCC_VERSION_HEX >= 0x070700 - aWriter.SetParallel(true); -#endif - Standard_Boolean ret = aWriter.Perform(hDoc, aMetadata, Message_ProgressRange()); - if (!ret) { - PyErr_Format(PyExc_IOError, "Cannot save to file '%s'", Utf8Name.c_str()); - throw Py::Exception(); - } -#else - throw Py::RuntimeError("gITF support requires OCCT 7.5.0 or later"); -#endif + Import::WriterGltf writer(name8bit, file); + writer.write(hDoc); } hApp->Close(hDoc);