Added option to use Mesh name as fallback, enabled by default.
// 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);
aDoc.SetMetadata (myMetadata);
aDoc.SetErrorPrefix (anErrPrefix);
aDoc.SetCoordinateSystemConverter (myCoordSysConverter);
+ aDoc.SetSkipEmptyNodes (myToSkipEmptyNodes);
+ aDoc.SetMeshNameAsFallback (myUseMeshNameAsFallback);
if (!theToProbe)
{
aDoc.SetAttributeMap (myAttribMap);
//! 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.
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
};
myIsBinary (false),
myIsGltf1 (false),
myToSkipEmptyNodes (true),
+ myUseMeshNameAsFallback (true),
myToProbeHeader (false)
{
myCSTrsf.SetInputLengthUnit (1.0); // meters
{
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);
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);
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
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())
{