]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix SigSegv problem asozinov/40648 68/head
authorasozinov <alexey.sozinov@opencascade.com>
Mon, 14 Oct 2024 17:12:53 +0000 (18:12 +0100)
committerasozinov <alexey.sozinov@opencascade.com>
Tue, 5 Nov 2024 13:55:54 +0000 (13:55 +0000)
Fix problem when export shape without triangulation

src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp
src/ExchangePlugin/doc/exportFeature.rst
src/GeomAlgoAPI/GeomAlgoAPI_STEPExport.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Tools.cpp
src/GeomAlgoAPI/GeomAlgoAPI_glTFExport.cpp

index edf05e4ab9ee463df10bd45c3ebcb254f4133593..21988278bece99288525d50740899c237f6acc8f 100644 (file)
@@ -35,9 +35,7 @@
 #include <GeomAlgoAPI_IGESExport.h>
 #include <GeomAlgoAPI_STEPExport.h>
 #include <GeomAlgoAPI_STLExport.h>
-//////////////////////////////////////
 #include <GeomAlgoAPI_glTFExport.h>
-//////////////////////////////////////
 #include <GeomAlgoAPI_Tools.h>
 #include <GeomAlgoAPI_XAOExport.h>
 
@@ -269,13 +267,9 @@ void ExchangePlugin_ExportFeature::exportFile(const std::string& theFileName,
     aResult = IGESExport(theFileName, aFormatName, aShape, anError);
   } else if (aFormatName == "GLTF") {
     aResult = GLTFExport(theFileName, aShapes, aContexts, false, anError);
-  }
-  else if (aFormatName == "GLB")
-  {
+  } else if (aFormatName == "GLB") {
     aResult = GLTFExport(theFileName, aShapes, aContexts, true, anError);
-  }
-  else
-  {
+  } else {
     anError = "Unsupported format: " + aFormatName;
   }
 
index 8f8d61be8c3aebfa3680b795c825575e72e860d5..729c8c7c8955b25fe2026e20735f47af6fe7deb2 100644 (file)
@@ -99,11 +99,11 @@ The following property panel will be opened:
 
    **Export property panel**
 
-In this panel, it is necessary to select desirable format of export file. It can be **'BREP, STEP, IGES'** , **'XAO'** or **'STL'** . 
+In this panel, it is necessary to select desirable format of export file. It can be **'BREP, STEP, IGES, GLTF'** , **'XAO'** or **'STL'** . 
 
 
-Export to BREP, STEP, IGES
-""""""""""""""""""""""""""
+Export to BREP, STEP, IGES, GLTF
+""""""""""""""""""""""""""""""""
 
 In case of first choice the format of exported file will be defined according to file extension. The file name and path can be defined in **Export file** field by direct input or browsing with **'...'** button, which opens **Export file** dialog box:
 
@@ -114,10 +114,19 @@ In case of first choice the format of exported file will be defined according to
 
 Selection list in the property panel contains a list of exported objects which can be selected in a viewer or object browser.
 
+
 **Apply** button exports the file.
   
 **Cancel** button cancels the operation.
 
+**GLTF**
+
+GLTF (GL Transmission Format) is a file format for 3D scenes and models using the JSON standard. It supports two formats: `.gltf` (JSON) and `.glb` (binary).
+
+For the GLTF format, triangulation is required. This is usually computed during the visualization of the result, but if result was not displayed (SHAPER not active), triangulation will be computed manually using predefined value.
+In this case triangulation can be different with case, when it computed automatically.
+
+
 **TUI Command**:
 
 .. py:function:: model.exportToFile(Part_doc, FileNameString, ObjectsList)
index c69dbed936a5264fda9f3717e0846b37ff6362a0..d362e0e29891fb12b250e0d848b0ca594e07af04 100644 (file)
@@ -57,7 +57,7 @@ bool STEPExport(const std::string& theFileName,
       GeomAlgoAPI_Tools::AttributeExport_Tools::putResult(*aResult, GeomShapePtr(), aNullLab, anAttrs);
     }
     else { // feature selection => export simple shape
-      exportShape(*aShape, anAttrs, GeomShapePtr(), aNullLab);
+      GeomAlgoAPI_Tools::AttributeExport_Tools::exportShape(*aShape, anAttrs, GeomShapePtr(), aNullLab);
     }
   }
   // store the XCAF document to STEP file
index 90bfbeee271cc845ccedda23d150547649615095..68df8bb938180dc27436b949b85fa1ad07d04f76 100644 (file)
 #include "GeomAlgoAPI_Tools.h"
 #include "GeomAlgoAPI_MakeShape.h"
 
+#include <TopExp_Explorer.hxx>
+#include <Poly_Triangulation.hxx>
+#include <BRep_Tool.hxx>
+#include <TopoDS.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+
 #include <clocale>
 
 #include <TCollection_AsciiString.hxx>
 #include <OSD_Path.hxx>
 
+#include <GeomAlgoAPI_ShapeTools.h>
 #include <GeomAPI_Shape.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_AttributeIntArray.h>
 
 using namespace GeomAlgoAPI_Tools;
 
+namespace {
+
+  // This function computes the triangulation of the given shape if it is not already tessellated.
+  static void computeTriangulation(const TopoDS_Shape& theShape)
+  {
+    Standard_Boolean isTessellate = Standard_False;
+    TopLoc_Location aLoc;
+    for (TopExp_Explorer anExp(theShape, TopAbs_FACE); anExp.More() && !isTessellate; anExp.Next()) {
+      Handle(Poly_Triangulation) aTria = BRep_Tool::Triangulation(TopoDS::Face(anExp.Value()), aLoc);
+      isTessellate = aTria.IsNull();
+    }
+
+    if (isTessellate) {
+      BRepMesh_IncrementalMesh aMesher(theShape, 0.1);
+      Standard_ProgramError_Raise_if(!aMesher.IsDone(), "Meshing failed");
+    }
+  }
+}
+
 Localizer::Localizer()
 {
   myCurLocale = std::setlocale(LC_NUMERIC, 0);
@@ -159,6 +185,8 @@ void GeomAlgoAPI_Tools::AttributeExport_Tools::getAttributes(const ResultPtr& th
 void GeomAlgoAPI_Tools::AttributeExport_Tools::putResult(const ResultPtr& theResult, const GeomShapePtr theFatherShape, TDF_Label& theFaterID, GeomAlgoAPI_Attributes& theAttrs)
 {
   GeomShapePtr aShape = theResult->shape();
+  computeTriangulation(aShape->impl<TopoDS_Shape>());
+
   if (!aShape.get() || aShape->isNull())
     return;
   ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(theResult);
index 891a3213fa0ddb079c6ac94b7beac2f4680befc0..a2bf72a5698c9512060858cf4f47e74b9a70d940 100644 (file)
@@ -47,24 +47,22 @@ bool GLTFExport(const std::string& theFileName,
   std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aResult = theResults.cbegin();
   for (; aShape != theShapes.cend(); aShape++, aResult++) {
     TDF_Label aNullLab;
-    if (aResult->get() && !(*aShape)->isSame((*aResult)->shape()))
-    { // simple sub-shape
+    if (aResult->get() && !(*aShape)->isSame((*aResult)->shape())) { // simple sub-shape
       GeomAlgoAPI_Tools::AttributeExport_Tools::getAttributes(*aResult, anAttrs);
       GeomAlgoAPI_Tools::AttributeExport_Tools::exportShape(*aShape, anAttrs, GeomShapePtr(), aNullLab);
-    }
-    else { // whole result selection
+    } else if (aResult->get()) { // whole result selection
       GeomAlgoAPI_Tools::AttributeExport_Tools::putResult(*aResult, GeomShapePtr(), aNullLab, anAttrs);
     }
+    else { // feature selection => export simple shape
+      GeomAlgoAPI_Tools::AttributeExport_Tools::exportShape(*aShape, anAttrs, GeomShapePtr(), aNullLab);
+    }
   }
 
   TColStd_IndexedDataMapOfStringString aMetadata;
   RWGltf_CafWriter aWriter(theFileName.c_str(), theIsBin);
-  //RWGltf_CafWriter aWriter(theFileName.c_str(), false);
   aWriter.SetTransformationFormat(RWGltf_WriterTrsfFormat_Compact);
   aWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit(0.001);
   aWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem(RWMesh_CoordinateSystem_Zup);
   Standard_Boolean ret = aWriter.Perform(aDoc, aMetadata, Message_ProgressRange());
-
-
   return theError.empty();
 }