From f4593ba5e907d9e1eb81b311bab276397b3d9309 Mon Sep 17 00:00:00 2001 From: Christophe Bourcier Date: Mon, 11 Jul 2016 14:58:12 +0200 Subject: [PATCH] Adding the preprocessor option remove_tiny_uv_edges to the user interface. We set it to off by default in Salome so that the cleanup is done only if the user explicitly asks to. Otherwise, this option is on by default when calling CADSurf. --- .../images/blsurf_parameters_advanced.png | Bin 27833 -> 34740 bytes .../gui/BLSURFPLUGIN/input/blsurf_hypo.doc | 30 ++++++++++-------- idl/BLSURFPlugin_Algorithm.idl | 6 ++++ src/BLSURFPlugin/BLSURFPluginBuilder.py | 20 ++++-------- src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx | 3 ++ src/BLSURFPlugin/BLSURFPlugin_Hypothesis.cxx | 19 +++++++++-- src/BLSURFPlugin/BLSURFPlugin_Hypothesis.hxx | 5 +++ .../BLSURFPlugin_Hypothesis_i.cxx | 28 ++++++++++++++++ .../BLSURFPlugin_Hypothesis_i.hxx | 3 ++ src/GUI/BLSURFPluginGUI_AdvWidget_QTD.ui | 17 ++++++++-- src/GUI/BLSURFPluginGUI_HypothesisCreator.cxx | 6 ++++ src/GUI/BLSURFPluginGUI_HypothesisCreator.h | 2 +- src/GUI/BLSURFPlugin_msg_en.ts | 6 +++- src/GUI/BLSURFPlugin_msg_fr.ts | 6 +++- tests/CMakeLists.txt | 4 --- 15 files changed, 116 insertions(+), 39 deletions(-) diff --git a/doc/salome/gui/BLSURFPLUGIN/images/blsurf_parameters_advanced.png b/doc/salome/gui/BLSURFPLUGIN/images/blsurf_parameters_advanced.png index c7cc0d3896e401412581df40aa97270a16117aba..7f5757c5d9758027ec440919ac71bd4a421d543e 100644 GIT binary patch literal 34740 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�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 literal 27833 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 m6wc#>w)eTdAIotkbpGBWLVjs1dGH+}2-$~diag used in the descriptions means the diagonal of the bou \image html blsurf_parameters_advanced.png -- PreCAD options -if checked, the PreCAD module will be used. This module has -two main goals: +- CAD preprocessor options. The CAD preprocessor (formerly known as PreCAD) has two main goals: - Complete missing or inadequate CAD descriptions. - Perform topology reconstruction and specific geometry enhancement for mesh generation. - \n This module requires a specific licence. The following PreCAD - options are the most significant and important ones: + \n The following preprocessor options are the most significant and important ones. + All options are unchecked by default. No cleanup is made by default so that the mesh matches the shape. + If the user has a bad shape (e.g. imported shape), he can activate some options to improve the mesh. - - Merge Edges - allows PreCAD to optimize the geometry by merging some - edges. This option is checked by default. + - Merge Edges - optimize the geometry by merging some + edges. This option is unchecked by default. - - Process 3D topology - allows PreCAD to perform the cleanup processing. - This option is checked by default. + - Remove tiny UV edges - optimize the geometry by removing small + tiny edges on the UV face. This option is unchecked by default. - - Discard input topology - computes the CAD topology from scratch, + - Process 3D topology - perform the cleanup processing. + This option is unchecked by default. + + - Discard input topology - compute the CAD topology from scratch, without considering the topological information contained in the original CAD (useful for iges files). This option is unchecked by default. + - Remove duplicate CAD faces - optimize the geometry by merging the + duplicate CAD faces. This option is unchecked by default. + - Verbosity level - defines the percentage of "verbosity" of -MeshGems-CADSurf and MeshGems-PreCAD [0-10]. +MeshGems-CADSurf [0-10]. - ExportGMF - saves the computed mesh into a GMF file (.mesh or .meshb). @@ -155,10 +161,6 @@ edges (defined by the option tiny edge optimisation length) from the generated m the local mesh quality, without taking into account the tags (attributes) specifications. By default this option is 0. -- \b remove_duplicate_cad_faces (bool) - Defines the behavior of MeshGems-PreCAD regarding the duplicate -CAD faces. By default, MG-PreCAD merges the duplicate CAD faces. This behavior can be deactivated by using this option. -By default this option is 1. - - \b tiny_edge_avoid_surface_intersections (bool) - This option defines the priority between the tiny feature suppression and the surface intersection prevention. By default, MeshGems-CADSurf gives the priority to the surface intersection prevention rather than to tiny edge or bad surface element removal. These diff --git a/idl/BLSURFPlugin_Algorithm.idl b/idl/BLSURFPlugin_Algorithm.idl index aaeb540..e865c2f 100644 --- a/idl/BLSURFPlugin_Algorithm.idl +++ b/idl/BLSURFPlugin_Algorithm.idl @@ -277,6 +277,12 @@ module BLSURFPlugin void SetPreCADMergeEdges(in boolean toMergeEdges); boolean GetPreCADMergeEdges(); + /*! + * To remove tiny UV edges edges. + */ + void SetPreCADRemoveTinyUVEdges(in boolean toRemoveTinyUVEdges); + boolean GetPreCADRemoveTinyUVEdges(); + /*! * To remove duplicate CAD faces. */ diff --git a/src/BLSURFPlugin/BLSURFPluginBuilder.py b/src/BLSURFPlugin/BLSURFPluginBuilder.py index 44a8a24..3b443a9 100644 --- a/src/BLSURFPlugin/BLSURFPluginBuilder.py +++ b/src/BLSURFPlugin/BLSURFPluginBuilder.py @@ -194,24 +194,24 @@ class BLSURF_Algorithm(Mesh_Algorithm): ## To optimize merges edges. # @param toMergeEdges "merge edges" flag value def SetPreCADMergeEdges(self, toMergeEdges=False): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().SetPreCADMergeEdges(toMergeEdges) pass + ## To remove tiny UV edges. + # @param toRemoveTinyUVEdges "remove_tiny_uv_edges" flag value + def SetPreCADRemoveTinyUVEdges(self, toRemoveTinyUVEdges=False): + self.Parameters().SetPreCADRemoveTinyUVEdges(toRemoveTinyUVEdges) + pass + ## To remove duplicate CAD Faces - # @param toRemoveDuplicateCADFaces "merge edges" flag value + # @param toRemoveDuplicateCADFaces "remove_duplicate_cad_faces" flag value def SetPreCADRemoveDuplicateCADFaces(self, toRemoveDuplicateCADFaces=False): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().SetPreCADRemoveDuplicateCADFaces(toRemoveDuplicateCADFaces) pass ## To process 3D topology. # @param toProcess "PreCAD process 3D" flag value def SetPreCADProcess3DTopology(self, toProcess=False): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().SetPreCADProcess3DTopology(toProcess) pass @@ -227,8 +227,6 @@ class BLSURF_Algorithm(Mesh_Algorithm): ## To compute topology from scratch # @param toDiscardInput "discard input" flag value def SetPreCADDiscardInput(self, toDiscardInput=False): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().SetPreCADDiscardInput(toDiscardInput) pass @@ -250,8 +248,6 @@ class BLSURF_Algorithm(Mesh_Algorithm): # @param optionName name of the option # @param optionValue value of the option def SetPreCADOptionValue(self, optionName, optionValue): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().SetPreCADOptionValue(optionName,optionValue) pass @@ -266,8 +262,6 @@ class BLSURF_Algorithm(Mesh_Algorithm): # @param optionName custom name of the option # @param optionValue value of the option def AddPreCADOption(self, optionName, optionValue): - if self.Parameters().GetTopology() != PreCAD: - self.SetTopology(PreCAD) self.Parameters().AddPreCADOption(optionName,optionValue) pass diff --git a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx index 521f127..bc6ba82 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx +++ b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx @@ -857,6 +857,7 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, // PreCAD int _precadMergeEdges = BLSURFPlugin_Hypothesis::GetDefaultPreCADMergeEdges(); + int _precadRemoveTinyUVEdges = BLSURFPlugin_Hypothesis::GetDefaultPreCADRemoveTinyUVEdges(); int _precadRemoveDuplicateCADFaces = BLSURFPlugin_Hypothesis::GetDefaultPreCADRemoveDuplicateCADFaces(); int _precadProcess3DTopology = BLSURFPlugin_Hypothesis::GetDefaultPreCADProcess3DTopology(); int _precadDiscardInput = BLSURFPlugin_Hypothesis::GetDefaultPreCADDiscardInput(); @@ -903,6 +904,7 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, _topology = (int) hyp->GetTopology(); // PreCAD _precadMergeEdges = hyp->GetPreCADMergeEdges(); + _precadRemoveTinyUVEdges = hyp->GetPreCADRemoveTinyUVEdges(); _precadRemoveDuplicateCADFaces = hyp->GetPreCADRemoveDuplicateCADFaces(); _precadProcess3DTopology = hyp->GetPreCADProcess3DTopology(); _precadDiscardInput = hyp->GetPreCADDiscardInput(); @@ -950,6 +952,7 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, // PreProcessor (formerly PreCAD) set_param(css, "merge_edges", _precadMergeEdges ? "yes" : "no"); + set_param(css, "remove_tiny_uv_edges", _precadRemoveTinyUVEdges ? "yes" : "no"); set_param(css, "remove_duplicate_cad_faces", _precadRemoveDuplicateCADFaces ? "yes" : "no"); set_param(css, "process_3d_topology", _precadProcess3DTopology ? "1" : "0"); set_param(css, "discard_input_topology", _precadDiscardInput ? "1" : "0"); diff --git a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.cxx b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.cxx index aad7b60..1d59f69 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.cxx +++ b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.cxx @@ -65,6 +65,7 @@ BLSURFPlugin_Hypothesis::BLSURFPlugin_Hypothesis(int hypId, int studyId, SMESH_G _verb(GetDefaultVerbosity()), _topology(GetDefaultTopology()), _preCADMergeEdges(GetDefaultPreCADMergeEdges()), + _preCADRemoveTinyUVEdges(GetDefaultPreCADRemoveTinyUVEdges()), _preCADRemoveDuplicateCADFaces(GetDefaultPreCADRemoveDuplicateCADFaces()), _preCADProcess3DTopology(GetDefaultPreCADProcess3DTopology()), _preCADDiscardInput(GetDefaultPreCADDiscardInput()), @@ -98,7 +99,6 @@ BLSURFPlugin_Hypothesis::BLSURFPlugin_Hypothesis(int hypId, int studyId, SMESH_G "rectify_jacobian", // default = 1 "respect_geometry", // default = 1 "optimise_tiny_edges", // default = 0 - "remove_duplicate_cad_faces", // default = 1 "tiny_edge_avoid_surface_intersections", // default = 1 "tiny_edge_respect_geometry", // default = 0 "" // mark of end @@ -392,6 +392,15 @@ void BLSURFPlugin_Hypothesis::SetPreCADMergeEdges(bool theVal) { } } +//============================================================================= +void BLSURFPlugin_Hypothesis::SetPreCADRemoveTinyUVEdges(bool theVal) { + if (theVal != _preCADRemoveTinyUVEdges) { +// SetTopology(PreCAD); + _preCADRemoveTinyUVEdges = theVal; + NotifySubMeshesHypothesisModification(); + } +} + //============================================================================= void BLSURFPlugin_Hypothesis::SetPreCADRemoveDuplicateCADFaces(bool theVal) { if (theVal != _preCADRemoveDuplicateCADFaces) { @@ -1407,7 +1416,7 @@ std::ostream & BLSURFPlugin_Hypothesis::SaveTo(std::ostream & save) { save << " " << (int) _phySizeRel << " " << (int) _minSizeRel << " " << (int) _maxSizeRel << " " << _chordalError ; save << " " << (int) _anisotropic << " " << _anisotropicRatio << " " << (int) _removeTinyEdges << " " << _tinyEdgeLength ; save << " " << (int) _badElementRemoval << " " << _badElementAspectRatio << " " << (int) _optimizeMesh << " " << (int) _quadraticMesh ; - save << " " << (int) _preCADProcess3DTopology << " " << (int) _preCADRemoveDuplicateCADFaces; + save << " " << (int) _preCADProcess3DTopology << " " << (int) _preCADRemoveDuplicateCADFaces << " " << (int) _preCADRemoveTinyUVEdges; op_val = _option2value.begin(); if (op_val != _option2value.end()) { @@ -1951,6 +1960,12 @@ std::istream & BLSURFPlugin_Hypothesis::LoadFrom(std::istream & load) { else load.clear(std::ios::badbit | load.rdstate()); + isOK = static_cast(load >> i); + if (isOK) + _preCADRemoveTinyUVEdges = (bool) i; + else + load.clear(std::ios::badbit | load.rdstate()); + } diff --git a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.hxx b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.hxx index 0988a6e..bee70c6 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.hxx +++ b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis.hxx @@ -134,6 +134,9 @@ public: void SetPreCADMergeEdges(bool theVal); bool GetPreCADMergeEdges() const { return _preCADMergeEdges; } + void SetPreCADRemoveTinyUVEdges(bool theVal); + bool GetPreCADRemoveTinyUVEdges() const { return _preCADRemoveTinyUVEdges; } + void SetPreCADRemoveDuplicateCADFaces(bool theVal); bool GetPreCADRemoveDuplicateCADFaces() const { return _preCADRemoveDuplicateCADFaces; } @@ -369,6 +372,7 @@ public: static Topology GetDefaultTopology() { return FromCAD; } // PreCAD static bool GetDefaultPreCADMergeEdges() { return false; } + static bool GetDefaultPreCADRemoveTinyUVEdges() { return false; } static bool GetDefaultPreCADRemoveDuplicateCADFaces() { return false; } static bool GetDefaultPreCADProcess3DTopology() { return false; } static bool GetDefaultPreCADDiscardInput() { return false; } @@ -496,6 +500,7 @@ private: Topology _topology; bool _preCADMergeEdges; + bool _preCADRemoveTinyUVEdges; bool _preCADRemoveDuplicateCADFaces; bool _preCADProcess3DTopology; bool _preCADDiscardInput; diff --git a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.cxx b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.cxx index a8f3cd0..f335309 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.cxx +++ b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.cxx @@ -644,6 +644,34 @@ CORBA::Boolean BLSURFPlugin_Hypothesis_i::GetPreCADMergeEdges() { return this->GetImpl()->GetPreCADMergeEdges(); } +//============================================================================= +/*! + * BLSURFPlugin_Hypothesis_i::SetPreCADRemoveTinyUVEdges + * + * Set true or false + */ +//============================================================================= +void BLSURFPlugin_Hypothesis_i::SetPreCADRemoveTinyUVEdges(CORBA::Boolean theValue) { + // MESSAGE("BLSURFPlugin_Hypothesis_i::SetPreCADRemoveTinyUVEdges"); + ASSERT(myBaseImpl); + this->GetImpl()->SetPreCADRemoveTinyUVEdges(theValue); + std::string theValueStr = theValue ? "True" : "False"; + SMESH::TPythonDump() << _this() << ".SetPreCADRemoveTinyUVEdges( " << theValueStr.c_str() << " )"; +} + +//============================================================================= +/*! + * BLSURFPlugin_Hypothesis_i::GetPreCADRemoveTinyUVEdges + * + * Get true or false + */ +//============================================================================= +CORBA::Boolean BLSURFPlugin_Hypothesis_i::GetPreCADRemoveTinyUVEdges() { + // MESSAGE("BLSURFPlugin_Hypothesis_i::GetPreCADRemoveTinyUVEdges"); + ASSERT(myBaseImpl); + return this->GetImpl()->GetPreCADRemoveTinyUVEdges(); +} + //============================================================================= /*! * BLSURFPlugin_Hypothesis_i::SetPreCADRemoveDuplicateCADFaces diff --git a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.hxx b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.hxx index 2d7de6c..1994391 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.hxx +++ b/src/BLSURFPlugin/BLSURFPlugin_Hypothesis_i.hxx @@ -111,6 +111,9 @@ public: void SetPreCADMergeEdges(CORBA::Boolean theValue); CORBA::Boolean GetPreCADMergeEdges(); + void SetPreCADRemoveTinyUVEdges(CORBA::Boolean theValue); + CORBA::Boolean GetPreCADRemoveTinyUVEdges(); + void SetPreCADRemoveDuplicateCADFaces(CORBA::Boolean theValue); CORBA::Boolean GetPreCADRemoveDuplicateCADFaces(); diff --git a/src/GUI/BLSURFPluginGUI_AdvWidget_QTD.ui b/src/GUI/BLSURFPluginGUI_AdvWidget_QTD.ui index 76d3935..c83d77d 100644 --- a/src/GUI/BLSURFPluginGUI_AdvWidget_QTD.ui +++ b/src/GUI/BLSURFPluginGUI_AdvWidget_QTD.ui @@ -97,7 +97,17 @@ - + + + + BLSURF_PRECAD_REMOVE_TINY_UV_EDGES + + + true + + + + BLSURF_PRECAD_PROCESS_3D_TOPOLOGY @@ -107,14 +117,14 @@ - + BLSURF_PRECAD_DISCARD_INPUT - + BLSURF_PRECAD_REMOVE_DUPLICATE_CAD_FACES @@ -179,6 +189,7 @@ rmBtn myPreCADGroupBox myPreCADMergeEdges + myPreCADRemoveTinyUVEdges myPreCADRemoveDuplicateCADFaces myPreCADProcess3DTopology myPreCADDiscardInput diff --git a/src/GUI/BLSURFPluginGUI_HypothesisCreator.cxx b/src/GUI/BLSURFPluginGUI_HypothesisCreator.cxx index 18eec64..549ab62 100644 --- a/src/GUI/BLSURFPluginGUI_HypothesisCreator.cxx +++ b/src/GUI/BLSURFPluginGUI_HypothesisCreator.cxx @@ -1835,6 +1835,7 @@ void BLSURFPluginGUI_HypothesisCreator::retrieveParams() const myAdvWidget->myVerbosity->setValue( data.myVerbosity ); myAdvWidget->myPreCADGroupBox->setChecked(data.myTopology == PreCAD); myAdvWidget->myPreCADMergeEdges->setChecked( data.myPreCADMergeEdges ); + myAdvWidget->myPreCADRemoveTinyUVEdges->setChecked( data.myPreCADRemoveTinyUVEdges ); myAdvWidget->myPreCADRemoveDuplicateCADFaces->setChecked( data.myPreCADRemoveDuplicateCADFaces ); myAdvWidget->myPreCADProcess3DTopology->setChecked( data.myPreCADProcess3DTopology ); myAdvWidget->myPreCADDiscardInput->setChecked( data.myPreCADDiscardInput ); @@ -2066,6 +2067,7 @@ bool BLSURFPluginGUI_HypothesisCreator::readParamsFromHypo( BlsurfHypothesisData h_data.myVerbosity = h->GetVerbosity(); h_data.myTopology = (int) h->GetTopology(); h_data.myPreCADMergeEdges = h->GetPreCADMergeEdges(); + h_data.myPreCADRemoveTinyUVEdges = h->GetPreCADRemoveTinyUVEdges(); h_data.myPreCADRemoveDuplicateCADFaces = h->GetPreCADRemoveDuplicateCADFaces(); h_data.myPreCADProcess3DTopology = h->GetPreCADProcess3DTopology(); h_data.myPreCADDiscardInput = h->GetPreCADDiscardInput(); @@ -2334,6 +2336,8 @@ bool BLSURFPluginGUI_HypothesisCreator::storeParamsToHypo( const BlsurfHypothesi h->SetTopology( (int) h_data.myTopology ); if ( h->GetPreCADMergeEdges() != h_data.myPreCADMergeEdges ) h->SetPreCADMergeEdges( h_data.myPreCADMergeEdges ); + if ( h->GetPreCADRemoveTinyUVEdges() != h_data.myPreCADRemoveTinyUVEdges ) + h->SetPreCADRemoveTinyUVEdges( h_data.myPreCADRemoveTinyUVEdges ); if ( h->GetPreCADRemoveDuplicateCADFaces() != h_data.myPreCADRemoveDuplicateCADFaces ) h->SetPreCADRemoveDuplicateCADFaces( h_data.myPreCADRemoveDuplicateCADFaces ); if ( h->GetPreCADProcess3DTopology() != h_data.myPreCADProcess3DTopology ) @@ -2532,6 +2536,7 @@ QString BLSURFPluginGUI_HypothesisCreator::readParamsFromWidgets( BlsurfHypothes h_data.myVerbosity = myAdvWidget->myVerbosity->value(); h_data.myTopology = myAdvWidget->myPreCADGroupBox->isChecked() ? PreCAD : FromCAD; h_data.myPreCADMergeEdges = myAdvWidget->myPreCADMergeEdges->isChecked(); + h_data.myPreCADRemoveTinyUVEdges = myAdvWidget->myPreCADRemoveTinyUVEdges->isChecked(); h_data.myPreCADRemoveDuplicateCADFaces = myAdvWidget->myPreCADRemoveDuplicateCADFaces->isChecked(); h_data.myPreCADProcess3DTopology = myAdvWidget->myPreCADProcess3DTopology->isChecked(); h_data.myPreCADDiscardInput = myAdvWidget->myPreCADDiscardInput->isChecked(); @@ -2563,6 +2568,7 @@ QString BLSURFPluginGUI_HypothesisCreator::readParamsFromWidgets( BlsurfHypothes guiHyp += tr("BLSURF_TOPOLOGY") + " = " + QString::number( h_data.myTopology ) + "; "; guiHyp += tr("BLSURF_PRECAD_MERGE_EDGES") + " = " + QString(h_data.myPreCADMergeEdges ? "yes" : "no") + "; "; + guiHyp += tr("BLSURF_PRECAD_REMOVE_TINY_UV_EDGES") + " = " + QString(h_data.myPreCADRemoveTinyUVEdges ? "yes" : "no") + "; "; guiHyp += tr("BLSURF_PRECAD_REMOVE_DUPLICATE_CAD_FACES") + " = " + QString(h_data.myPreCADRemoveDuplicateCADFaces ? "yes" : "no") + "; "; guiHyp += tr("BLSURF_PRECAD_REMOVE_NANO_EDGES") + " = " + QString(h_data.myPreCADProcess3DTopology ? "yes" : "no") + "; "; guiHyp += tr("BLSURF_PRECAD_DISCARD_INPUT") + " = " + QString(h_data.myPreCADDiscardInput ? "yes" : "no") + "; "; diff --git a/src/GUI/BLSURFPluginGUI_HypothesisCreator.h b/src/GUI/BLSURFPluginGUI_HypothesisCreator.h index f2dc0ed..b120ac9 100644 --- a/src/GUI/BLSURFPluginGUI_HypothesisCreator.h +++ b/src/GUI/BLSURFPluginGUI_HypothesisCreator.h @@ -169,7 +169,7 @@ typedef struct double myAnisotropicRatio, myTinyEdgeLength, myBadElementAspectRatio; bool myOptimizeMesh, myQuadraticMesh; bool myAllowQuadrangles, mySmpsurface,mySmpedge,mySmppoint,myEnforcedVertex,myInternalEnforcedVerticesAllFaces; - bool myPreCADMergeEdges, myPreCADRemoveDuplicateCADFaces, myPreCADProcess3DTopology, myPreCADDiscardInput; + bool myPreCADMergeEdges, myPreCADRemoveTinyUVEdges, myPreCADRemoveDuplicateCADFaces, myPreCADProcess3DTopology, myPreCADDiscardInput; // bool myGMFFileMode; std::string myGMFFileName, myInternalEnforcedVerticesAllFacesGroup; TEnfVertexList enfVertexList; diff --git a/src/GUI/BLSURFPlugin_msg_en.ts b/src/GUI/BLSURFPlugin_msg_en.ts index 4c51af9..ebfa0fc 100644 --- a/src/GUI/BLSURFPlugin_msg_en.ts +++ b/src/GUI/BLSURFPlugin_msg_en.ts @@ -244,12 +244,16 @@ The smaller this distance is, the closer the mesh is to the exact surface (only BLSURF_PRECAD_GROUP - PreCAD options + CAD preprocessor options BLSURF_PRECAD_MERGE_EDGES Merge edges + + BLSURF_PRECAD_REMOVE_TINY_UV_EDGES + Remove tiny UV edges + BLSURF_PRECAD_REMOVE_DUPLICATE_CAD_FACES Remove duplicate CAD Faces diff --git a/src/GUI/BLSURFPlugin_msg_fr.ts b/src/GUI/BLSURFPlugin_msg_fr.ts index e8e71d5..c7a535d 100755 --- a/src/GUI/BLSURFPlugin_msg_fr.ts +++ b/src/GUI/BLSURFPlugin_msg_fr.ts @@ -248,12 +248,16 @@ Plus la distance est petite, plus le maillage sera proche de la surface (disponi BLSURF_PRECAD_GROUP - Options PreCAD + Options du préprocesseur CAO BLSURF_PRECAD_MERGE_EDGES Fusionner des arêtes + + BLSURF_PRECAD_REMOVE_TINY_UV_EDGES + Supprime les petites arêtes UV + BLSURF_PRECAD_REMOVE_DUPLICATE_CAD_FACES Supprime les faces CAO en double diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index df9d500..b2849cd 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -21,13 +21,9 @@ SET(BLSURFPLUGIN_TEST_FILES test_enforced_internal_vertex.py test_enforced_vertex.py test_periodicity_2D_precad.py - test_periodicity_2D.py test_periodicity_precad.py - test_periodicity.py test_periodicity_reflexion_2D_precad.py - test_periodicity_reflexion_2D.py test_periodicity_reflexion_precad.py - test_periodicity_reflexion.py test_periodicity_with_points_2D_precad.py test_precad_intersections.py test_sphere.py -- 2.39.2