From 803bdcdf2b1cddb9552fd892968b5fc11a73b392 Mon Sep 17 00:00:00 2001 From: kgv Date: Mon, 1 Jul 2019 11:56:41 +0300 Subject: [PATCH] 0030821: Data Exchange, RWGltf_CafReader - fallback to Mesh name in case of Node name is empty Added option to use Mesh name as fallback, enabled by default. --- src/RWGltf/RWGltf_CafReader.cxx | 6 ++++- src/RWGltf/RWGltf_CafReader.hxx | 16 +++++++++++- src/RWGltf/RWGltf_GltfJsonParser.cxx | 38 ++++++++++++++++++++++++++++ src/RWGltf/RWGltf_GltfJsonParser.pxx | 7 +++++ src/RWMesh/RWMesh_CafReader.cxx | 3 --- 5 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/RWGltf/RWGltf_CafReader.cxx b/src/RWGltf/RWGltf_CafReader.cxx index 635b2a5e65..c7aa7b6499 100644 --- a/src/RWGltf/RWGltf_CafReader.cxx +++ b/src/RWGltf/RWGltf_CafReader.cxx @@ -103,7 +103,9 @@ private: // Purpose : //================================================================ RWGltf_CafReader::RWGltf_CafReader() -: myToParallel (false) +: myToParallel (false), + myToSkipEmptyNodes (true), + myUseMeshNameAsFallback (true) { myCoordSysConverter.SetInputLengthUnit (1.0); // glTF defines model in meters myCoordSysConverter.SetInputCoordinateSystem (RWMesh_CoordinateSystem_glTF); @@ -218,6 +220,8 @@ Standard_Boolean RWGltf_CafReader::performMesh (const TCollection_AsciiString& t aDoc.SetMetadata (myMetadata); aDoc.SetErrorPrefix (anErrPrefix); aDoc.SetCoordinateSystemConverter (myCoordSysConverter); + aDoc.SetSkipEmptyNodes (myToSkipEmptyNodes); + aDoc.SetMeshNameAsFallback (myUseMeshNameAsFallback); if (!theToProbe) { aDoc.SetAttributeMap (myAttribMap); diff --git a/src/RWGltf/RWGltf_CafReader.hxx b/src/RWGltf/RWGltf_CafReader.hxx index ba335c1d75..3e50c89ee9 100644 --- a/src/RWGltf/RWGltf_CafReader.hxx +++ b/src/RWGltf/RWGltf_CafReader.hxx @@ -36,6 +36,18 @@ public: //! Setup multithreaded execution. void SetParallel (bool theToParallel) { myToParallel = theToParallel; } + //! Return TRUE if Nodes without Geometry should be ignored, TRUE by default. + bool ToSkipEmptyNodes() { return myToSkipEmptyNodes; } + + //! Set flag to ignore nodes without Geometry. + void SetSkipEmptyNodes (bool theToSkip) { myToSkipEmptyNodes = theToSkip; } + + //! Set flag to use Mesh name in case if Node name is empty, TRUE by default. + bool ToUseMeshNameAsFallback() { return myUseMeshNameAsFallback; } + + //! Set flag to use Mesh name in case if Node name is empty. + void SetMeshNameAsFallback (bool theToFallback) { myUseMeshNameAsFallback = theToFallback; } + protected: //! Read the mesh from specified file. @@ -58,7 +70,9 @@ protected: protected: - Standard_Boolean myToParallel; //!< flag to use multithreading; FALSE by default + Standard_Boolean myToParallel; //!< flag to use multithreading; FALSE by default + Standard_Boolean myToSkipEmptyNodes; //!< ignore nodes without Geometry; TRUE by default + Standard_Boolean myUseMeshNameAsFallback; //!< flag to use Mesh name in case if Node name is empty, TRUE by default }; diff --git a/src/RWGltf/RWGltf_GltfJsonParser.cxx b/src/RWGltf/RWGltf_GltfJsonParser.cxx index 3eda428c15..25af368e55 100644 --- a/src/RWGltf/RWGltf_GltfJsonParser.cxx +++ b/src/RWGltf/RWGltf_GltfJsonParser.cxx @@ -171,6 +171,7 @@ RWGltf_GltfJsonParser::RWGltf_GltfJsonParser (TopTools_SequenceOfShape& theRootS myIsBinary (false), myIsGltf1 (false), myToSkipEmptyNodes (true), + myUseMeshNameAsFallback (true), myToProbeHeader (false) { myCSTrsf.SetInputLengthUnit (1.0); // meters @@ -1587,6 +1588,43 @@ void RWGltf_GltfJsonParser::bindNamedShape (TopoDS_Shape& theShape, { aShapeAttribs.Style.SetColorSurf (aLateData->BaseColor()); } + if (aShapeAttribs.Name.IsEmpty() + && myUseMeshNameAsFallback) + { + // fallback using Mesh name + aShapeAttribs.Name = aLateData->Name(); + } + } + } + else if (aShapeAttribs.Name.IsEmpty() + && myUseMeshNameAsFallback) + { + // fallback using Mesh name + TopLoc_Location aDummy; + TCollection_AsciiString aMeshName; + for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next()) + { + if (Handle(RWGltf_GltfLatePrimitiveArray) aLateData = Handle(RWGltf_GltfLatePrimitiveArray)::DownCast (BRep_Tool::Triangulation (TopoDS::Face (aFaceIter.Value()), aDummy))) + { + if (aLateData->Name().IsEmpty()) + { + aMeshName.Clear(); + break; + } + else if (aMeshName.IsEmpty()) + { + aMeshName = aLateData->Name(); + } + else if (!aMeshName.IsEqual (aLateData->Name())) + { + aMeshName.Clear(); + break; + } + } + } + if (!aMeshName.IsEmpty()) + { + aShapeAttribs.Name = aMeshName; } } myAttribMap->Bind (theShape, aShapeAttribs); diff --git a/src/RWGltf/RWGltf_GltfJsonParser.pxx b/src/RWGltf/RWGltf_GltfJsonParser.pxx index 29f985de4f..a152f7c821 100644 --- a/src/RWGltf/RWGltf_GltfJsonParser.pxx +++ b/src/RWGltf/RWGltf_GltfJsonParser.pxx @@ -105,6 +105,12 @@ public: myBinBodyLen = theBinBodyLen; } + //! Set flag to ignore nodes without Geometry, TRUE by default. + void SetSkipEmptyNodes (bool theToSkip) { myToSkipEmptyNodes = theToSkip; } + + //! Set flag to use Mesh name in case if Node name is empty, TRUE by default. + void SetMeshNameAsFallback (bool theToFallback) { myUseMeshNameAsFallback = theToFallback; } + //! Parse glTF document. Standard_EXPORT bool Parse (const Handle(Message_ProgressIndicator)& theProgress); @@ -405,6 +411,7 @@ protected: bool myIsBinary; //!< binary document bool myIsGltf1; //!< obsolete glTF 1.0 version format bool myToSkipEmptyNodes; //!< ignore nodes without Geometry + bool myUseMeshNameAsFallback; //!< flag to use Mesh name in case if Node name is empty, TRUE by default bool myToProbeHeader; //!< flag to probe header without full reading, FALSE by default #ifdef HAVE_RAPIDJSON diff --git a/src/RWMesh/RWMesh_CafReader.cxx b/src/RWMesh/RWMesh_CafReader.cxx index cfb8f20ee9..9f198d6d91 100644 --- a/src/RWMesh/RWMesh_CafReader.cxx +++ b/src/RWMesh/RWMesh_CafReader.cxx @@ -186,14 +186,11 @@ Standard_Boolean RWMesh_CafReader::addShapeIntoDoc (const TopoDS_Shape& theShape Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main()); - TopLoc_Location aDummyLoc; - const TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); TopoDS_Shape aShapeToAdd = theShape; Standard_Boolean toMakeAssembly = Standard_False; if (theShape.ShapeType() == TopAbs_COMPOUND) { - TCollection_AsciiString aFirstName; RWMesh_NodeAttributes aSubFaceAttribs; for (TopoDS_Iterator aSubShapeIter (theShape, Standard_True, Standard_False); !toMakeAssembly && aSubShapeIter.More(); aSubShapeIter.Next()) {