0030821: Data Exchange, RWGltf_CafReader - fallback to Mesh name in case of Node...
authorkgv <kgv@opencascade.com>
Mon, 1 Jul 2019 08:56:41 +0000 (11:56 +0300)
committerkgv <kgv@opencascade.com>
Mon, 1 Jul 2019 10:31:58 +0000 (13:31 +0300)
Added option to use Mesh name as fallback, enabled by default.

src/RWGltf/RWGltf_CafReader.cxx
src/RWGltf/RWGltf_CafReader.hxx
src/RWGltf/RWGltf_GltfJsonParser.cxx
src/RWGltf/RWGltf_GltfJsonParser.pxx
src/RWMesh/RWMesh_CafReader.cxx

index 635b2a5..c7aa7b6 100644 (file)
@@ -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);
index ba335c1..3e50c89 100644 (file)
@@ -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
 
 };
 
index 3eda428..25af368 100644 (file)
@@ -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);
index 29f985d..a152f7c 100644 (file)
@@ -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
index cfb8f20..9f198d6 100644 (file)
@@ -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())
     {