]> OCCT Git - occt.git/commitdiff
0032819: Data Exchange - VrmlAPI_Writer does not write all colors CR32819
authorkgv <kgv@opencascade.com>
Mon, 7 Feb 2022 12:02:42 +0000 (15:02 +0300)
committerkgv <kgv@opencascade.com>
Wed, 9 Feb 2022 20:33:47 +0000 (23:33 +0300)
VrmlData_ShapeConvert::addShape() - fixed handling of colors assigned to Compound instead of a Face.
RWMesh_FaceIterator is now used to dispatch colors and skip Faces without triangulation.

src/TKVRML/EXTERNLIB
src/VrmlData/VrmlData_ShapeConvert.cxx

index b659b109c86e9866d561033a0426871b6b8251b0..26ff769c2aec9f8eedb3f68c09bb7279ffc9c626 100755 (executable)
@@ -13,3 +13,4 @@ TKGeomAlgo
 TKV3d
 TKLCAF
 TKXCAF
+TKRWMesh
index 1dc31a3d37f402769100a9b6bf7c09eb9de11b3c..b388ae8d12347c919cbe5e27321308eea7241f65 100644 (file)
 // commercial license or contractual agreement.
 
 #include <VrmlData_ShapeConvert.hxx>
-#include <VrmlData_Scene.hxx>
-#include <VrmlData_Group.hxx>
+
+#include <VrmlData_Appearance.hxx>
 #include <VrmlData_Coordinate.hxx>
+#include <VrmlData_Group.hxx>
 #include <VrmlData_IndexedFaceSet.hxx>
 #include <VrmlData_IndexedLineSet.hxx>
+#include <VrmlData_Scene.hxx>
 #include <VrmlData_ShapeNode.hxx>
+
 #include <BRep_Builder.hxx>
 #include <BRep_Tool.hxx>
+#include <BRepAdaptor_Curve.hxx>
 #include <Geom_Surface.hxx>
+#include <GeomLib.hxx>
+#include <GCPnts_TangentialDeflection.hxx>
 #include <NCollection_DataMap.hxx>
 #include <Poly_Triangulation.hxx>
 #include <Poly_Connect.hxx>
@@ -33,7 +39,6 @@
 #include <TColgp_Array1OfPnt2d.hxx>
 #include <TDataStd_Name.hxx>
 #include <TDF_Label.hxx>
-//#include <TDF_LabelSequence.hxx>
 #include <TDocStd_Document.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopoDS.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Wire.hxx>
-#include <GCPnts_TangentialDeflection.hxx>
-#include <BRepAdaptor_Curve.hxx>
 #include <TColStd_Array1OfReal.hxx>
 #include <TColStd_HArray1OfReal.hxx>
 #include <TShort_Array1OfShortReal.hxx>
-#include <GeomLib.hxx>
 #include <TShort_HArray1OfShortReal.hxx>
-#include <VrmlData_Appearance.hxx>
+#include <RWMesh_FaceIterator.hxx>
 #include <XCAFDoc_ColorTool.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
 #include <XCAFDoc_ShapeTool.hxx>
@@ -575,7 +577,6 @@ Handle(VrmlData_Appearance) VrmlData_ShapeConvert::defaultMaterialEdge () const
   return anAppearance;
 }
 
-
 //=======================================================================
 //function : addShape
 //purpose  : Adds the shape from the document
@@ -584,33 +585,18 @@ void VrmlData_ShapeConvert::addShape (const Handle(VrmlData_Group)& theParent,
                                       const TDF_Label& theLabel,
                                       const Handle(TDocStd_Document)& theDoc)
 {
-  Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(theDoc->Main());
+  const TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theLabel);
   Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theDoc->Main());
-  Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool(theDoc->Main());
-
-  NCollection_DataMap<TopoDS_Shape, TDF_Label> aChildShapeToLabels;
-  TDF_LabelSequence aChildLabels;
-  aShapeTool->GetSubShapes(theLabel, aChildLabels);
-  for (TDF_LabelSequence::Iterator aChildIter(aChildLabels); aChildIter.More(); aChildIter.Next())
+  Handle(VrmlData_Group) aGroup;
+  Standard_Integer aNbFaces = 0;
+  for (RWMesh_FaceIterator aFaceIter (theLabel, TopLoc_Location(), true); aFaceIter.More(); aFaceIter.Next())
   {
-    const TDF_Label& aChildLabel = aChildIter.Value();
-    TopoDS_Shape aChildShape;
-    if (aShapeTool->GetShape(aChildLabel, aChildShape))
-    {
-      aChildShapeToLabels.Bind(aChildShape, aChildLabel);
-    }
+    ++aNbFaces;
   }
 
-  const TopoDS_Shape aShape = aShapeTool->GetShape(theLabel);
-  Handle(VrmlData_Group) aGroup = 0L;
-  TopExp_Explorer anExp(aShape, TopAbs_FACE);
-  Standard_Integer nbFaces = 0;
-  for (; anExp.More(); anExp.Next()) {
-    nbFaces++;
-  }
   Handle(TDataStd_Name) aNameAttribute;
   theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttribute);
-  if (nbFaces > 1)
+  if (aNbFaces > 1)
   {
     if (!aNameAttribute.IsNull())
     {
@@ -630,111 +616,87 @@ void VrmlData_ShapeConvert::addShape (const Handle(VrmlData_Group)& theParent,
     }
   }
 
-  anExp.Init(aShape, TopAbs_FACE);
-  for (; anExp.More(); anExp.Next()) {
+  for (RWMesh_FaceIterator aFaceIter (theLabel, TopLoc_Location(), true); aFaceIter.More(); aFaceIter.Next())
+  {
     TopLoc_Location aLoc;
-    Handle(VrmlData_Geometry) aTShapeNode =
-      makeTShapeNode(anExp.Current(), TopAbs_FACE, aLoc);
-    if (!aTShapeNode.IsNull())
+    const TopoDS_Face& aFace = aFaceIter.Face();
+    Handle(VrmlData_Geometry) aTShapeNode = makeTShapeNode (aFace, TopAbs_FACE, aLoc);
+    if (aTShapeNode.IsNull())
     {
-      Handle(VrmlData_ShapeNode) aShapeNode = 0L;
-      if (aGroup.IsNull() && !aNameAttribute.IsNull())
-      {
-        TCollection_AsciiString aName = aNameAttribute->Get();
-        aName.ChangeAll(' ', '_');
-        aName.ChangeAll('#', '_');
-        aShapeNode = new VrmlData_ShapeNode(myScene, aName.ToCString());
-      }
-      else
-      {
-        aShapeNode = new VrmlData_ShapeNode(myScene, 0L);
-      }
+      continue;
+    }
 
-      // set color
-      XCAFPrs_Style aStyle;
-      Quantity_ColorRGBA aColor;
-      TDF_Label aLabel, anAttribLab;
-      if (aChildShapeToLabels.Find (anExp.Current(), aLabel))
-      {
-        Handle(XCAFDoc_VisMaterial) aVisMat = aMatTool->GetShapeMaterial (aLabel);
-        if (!aVisMat.IsNull()
-         && !aVisMat->IsEmpty())
-        {
-          anAttribLab = aVisMat->Label();
-          aStyle.SetMaterial (aVisMat);
-        }
-        else if (aColorTool->GetColor (aLabel, XCAFDoc_ColorSurf, anAttribLab)
-              || aColorTool->GetColor (aLabel, XCAFDoc_ColorGen,  anAttribLab))
-        {
-          aColorTool->GetColor (anAttribLab, aColor);
-          aStyle.SetColorSurf (aColor);
-        }
-      }
-      if (!aStyle.IsSetColorSurf()
-        && aStyle.Material().IsNull())
+    Handle(VrmlData_ShapeNode) aShapeNode = 0L;
+    if (aGroup.IsNull() && !aNameAttribute.IsNull())
+    {
+      TCollection_AsciiString aName = aNameAttribute->Get();
+      aName.ChangeAll(' ', '_');
+      aName.ChangeAll('#', '_');
+      aShapeNode = new VrmlData_ShapeNode(myScene, aName.ToCString());
+    }
+    else
+    {
+      aShapeNode = new VrmlData_ShapeNode(myScene, 0L);
+    }
+
+    // set color
+    const XCAFPrs_Style& aStyle = aFaceIter.FaceStyle();
+    TDF_Label anAttribLab;
+    if (!aStyle.Material().IsNull()
+     && !aStyle.Material()->IsEmpty())
+    {
+      anAttribLab = aStyle.Material()->Label();
+    }
+    else if (aStyle.IsSetColorSurf())
+    {
+      aColorTool->FindColor (aStyle.GetColorSurfRGBA(), anAttribLab);
+    }
+    if (!aStyle.IsSetColorSurf()
+      && aStyle.Material().IsNull())
+    {
+      aShapeNode->SetAppearance (defaultMaterialFace());
+    }
+    else
+    {
+      aShapeNode->SetAppearance (makeMaterialFromStyle (aStyle, anAttribLab));
+    }
+
+    myScene.AddNode(aShapeNode, theParent.IsNull() && aGroup.IsNull());
+    aShapeNode->SetGeometry(aTShapeNode);
+    if (aLoc.IsIdentity())
+    {
+      // Store the shape node directly into the main Group.
+      if (!aGroup.IsNull())
       {
-        Handle(XCAFDoc_VisMaterial) aVisMat = aMatTool->GetShapeMaterial (theLabel);
-        if (!aVisMat.IsNull()
-         && !aVisMat->IsEmpty())
-        {
-          anAttribLab = aVisMat->Label();
-          aStyle.SetMaterial (aVisMat);
-        }
-        if (aColorTool->GetColor (theLabel, XCAFDoc_ColorSurf, anAttribLab)
-         || aColorTool->GetColor (theLabel, XCAFDoc_ColorGen,  anAttribLab))
-        {
-          aColorTool->GetColor (anAttribLab, aColor);
-          aStyle.SetColorSurf (aColor);
-        }
+        aGroup->AddNode(aShapeNode);
       }
-      if (!aStyle.IsSetColorSurf()
-        && aStyle.Material().IsNull())
+      else if (!theParent.IsNull())
       {
-        aShapeNode->SetAppearance(defaultMaterialFace());
+        theParent->AddNode(aShapeNode);
       }
-      else
+    }
+    else
+    {
+      // Create a Transform grouping node
+      Handle(VrmlData_Group) aTrans = new VrmlData_Group (myScene, 0L, Standard_True);
+      gp_Trsf aTrsf(aLoc);
+      if (fabs(myScale - 1.) > Precision::Confusion())
       {
-        aShapeNode->SetAppearance (makeMaterialFromStyle (aStyle, anAttribLab));
+        const gp_XYZ aTransl = aTrsf.TranslationPart() * myScale;
+        aTrsf.SetTranslationPart(aTransl);
       }
-
-      myScene.AddNode(aShapeNode, theParent.IsNull() && aGroup.IsNull());
-      aShapeNode->SetGeometry(aTShapeNode);
-      if (aLoc.IsIdentity())
+      aTrans->SetTransform(aTrsf);
+      myScene.AddNode(aTrans, theParent.IsNull() && aGroup.IsNull());
+      if (!aGroup.IsNull())
       {
-        // Store the shape node directly into the main Group.
-        if (!aGroup.IsNull())
-        {
-          aGroup->AddNode(aShapeNode);
-        }
-        else if (!theParent.IsNull())
-        {
-          theParent->AddNode(aShapeNode);
-        }
+        aGroup->AddNode(aTrans);
       }
-      else
+      else if (!theParent.IsNull())
       {
-        // Create a Transform grouping node
-        Handle(VrmlData_Group) aTrans = new VrmlData_Group(myScene, 0L,
-          Standard_True);
-        gp_Trsf aTrsf(aLoc);
-        if (fabs(myScale - 1.) > Precision::Confusion())
-        {
-            const gp_XYZ aTransl = aTrsf.TranslationPart() * myScale;
-            aTrsf.SetTranslationPart(aTransl);
-        }
-        aTrans->SetTransform(aTrsf);
-        myScene.AddNode(aTrans, theParent.IsNull() && aGroup.IsNull());
-        if (!aGroup.IsNull())
-        {
-          aGroup->AddNode(aTrans);
-        }
-        else if (!theParent.IsNull())
-        {
-          theParent->AddNode(aTrans);
-        }
-        // Store the shape node under the transform.
-        aTrans->AddNode(aShapeNode);
+        theParent->AddNode(aTrans);
       }
+      // Store the shape node under the transform.
+      aTrans->AddNode(aShapeNode);
     }
   }
 }