From fe533dd568f76e943056ef52b0f5747a9d911489 Mon Sep 17 00:00:00 2001 From: pnoyret Date: Thu, 11 Oct 2012 07:56:03 +0000 Subject: [PATCH] Yams Plugin --- configure.ac | 1 + src/Tools/Makefile.am | 2 +- src/Tools/YamsPlug/Makefile.am | 41 + src/Tools/YamsPlug/ViewText.ui | 38 + src/Tools/YamsPlug/YamsPlugDialog.ui | 1054 +++++++++++++++++++++++ src/Tools/YamsPlug/monViewText.py | 86 ++ src/Tools/YamsPlug/monYamsPlugDialog.py | 318 +++++++ src/Tools/YamsPlug/select1.png | Bin 0 -> 1143 bytes src/Tools/YamsPlug/yamsplug_plugin.py | 44 + 9 files changed, 1583 insertions(+), 1 deletion(-) create mode 100644 src/Tools/YamsPlug/Makefile.am create mode 100644 src/Tools/YamsPlug/ViewText.ui create mode 100644 src/Tools/YamsPlug/YamsPlugDialog.ui create mode 100644 src/Tools/YamsPlug/monViewText.py create mode 100644 src/Tools/YamsPlug/monYamsPlugDialog.py create mode 100644 src/Tools/YamsPlug/select1.png create mode 100644 src/Tools/YamsPlug/yamsplug_plugin.py diff --git a/configure.ac b/configure.ac index 7947e5db6..bbc18f64f 100644 --- a/configure.ac +++ b/configure.ac @@ -574,6 +574,7 @@ AC_OUTPUT([ \ src/SMESH_PY/Makefile \ src/Tools/Makefile \ src/Tools/MeshCut/Makefile \ + src/Tools/YamsPlug/Makefile \ src/Tools/padder/Makefile \ src/Tools/padder/meshjob/Makefile \ src/Tools/padder/meshjob/idl/Makefile \ diff --git a/src/Tools/Makefile.am b/src/Tools/Makefile.am index cae255b85..15af73669 100644 --- a/src/Tools/Makefile.am +++ b/src/Tools/Makefile.am @@ -25,7 +25,7 @@ # include $(top_srcdir)/adm_local/unix/make_common_starter.am -SUBDIRS = MeshCut padder +SUBDIRS = MeshCut padder YamsPlug salomeplugins_PYTHON = \ smesh_plugins.py diff --git a/src/Tools/YamsPlug/Makefile.am b/src/Tools/YamsPlug/Makefile.am new file mode 100644 index 000000000..a94bf7153 --- /dev/null +++ b/src/Tools/YamsPlug/Makefile.am @@ -0,0 +1,41 @@ +# Copyright (C) 2007-2012 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + + +salomeplugins_PYTHON = \ + YamsPlugDialog.py\ + monYamsPlugDialog.py\ + ViewText.py\ + monViewText.py\ + yamsplug_plugin.py + +UIPY_FILES = YamsPlugDialog.py ViewText.py + +if SMESH_ENABLE_GUI + nodist_salomescript_SCRIPTS = $(UIPY_FILES) +endif + +CLEANFILES = $(UIPY_FILES) + +EXTRA_DIST += $(UIPY_FILES:%.py=%.ui) + +%.py : %.ui + $(PYUIC) $< -o $@ diff --git a/src/Tools/YamsPlug/ViewText.ui b/src/Tools/YamsPlug/ViewText.ui new file mode 100644 index 000000000..18fa63e46 --- /dev/null +++ b/src/Tools/YamsPlug/ViewText.ui @@ -0,0 +1,38 @@ + + + ViewExe + + + + 0 + 0 + 469 + 489 + + + + Run Yams + + + + + + + + + Ok + + + + + + + Save + + + + + + + + diff --git a/src/Tools/YamsPlug/YamsPlugDialog.ui b/src/Tools/YamsPlug/YamsPlugDialog.ui new file mode 100644 index 000000000..0113a1bb1 --- /dev/null +++ b/src/Tools/YamsPlug/YamsPlugDialog.ui @@ -0,0 +1,1054 @@ + + + YamsPlugDialog + + + + 0 + 0 + 799 + 602 + + + + Yams : Remeshing tool + + + false + + + + + + + + Compute + + + + + + + Close + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 60 + 20 + + + + + + + + Save Params + + + + + + + Load Params + + + + + + + Default Params + + + + + + + Qt::Horizontal + + + + 338 + 25 + + + + + + + + + 10 + + + + Help + + + + + + + + + + 10 + + + + 0 + + + + Simple Remeshing Options + + + + + 20 + 140 + 741 + 271 + + + + Optimisation + + + + + 10 + 30 + 611 + 209 + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Quality improvement</span> is done by point smoothing and edge swapping</p></td></tr></table></body></html> + + + Quality improvement Only (0) + + + true + + + + + + + the given surface triangulation is enriched (no coarsening at all) in such away that the distance +between the elements in the final mesh and those of the initial one is bounded by auser specified tolerance value. +One should use this option, to enrich the mesh where purely +geometrical features may be insuficiently fine, i.e. the resulting mesh will be least as fine as the input. +Mesh and the geometric features will be refined if needed as specified by the other program parameters. +The meshes obtained with those settings may not be suitable for computation. + + + Pure Geometry Enrichment (G) + + + false + + + + + + + a uniform subdivision of the given surface triangulation is performed : +each triangle of the given surface triangulation is considered at and +is divided into identical triangles. + + + Uniform Subdivision(U) + + + false + + + + + + + a surface sandpapering without shrinkage of the given surface +triangulation is performed, i.e., the high curvature variations of the +given surface will be smoothed out without shrinking the volume in +doing so. If ridges are defined, they will be kept as they are in the +resulting mesh. +This option modifies the goemetry. + + + Smoothing (S) + + + false + + + + + + + The given surface triangulation is modified in such a way that the distance between +the elements in the final mesh and those of the initial one is bounded by a user specfied tolerance value. +One should use this option, to coarsen when a purely geometrical mesh is needed. (a mesh that keeps +and obeys its geometric features only.) The meshes obtained with this option are usually not suitable +for computation because anisotropic elements may be generated + + + Geometrical Mesh : Coarsening(-2) + + + + + + + The given surface triangulation is modified in such a way that the distance between +the elements in the final mesh and those of the initial one is bounded by a user specfied tolerance value. +One should use this option, to coarsen and enrich when a purely geometrical mesh is needed. (a mesh that keeps +and obeys its geometric features only.) The meshes obtained with this setting are usually not suitable +for computation because anisotropic elements may be generated + + + Geometrical Mesh :Coarsening and Enrichment (2) + + + + + + + The given surface triangulation is modfied in accordance to a size map. +The latter can be either the intrinsic size map (computed automatically +and based on the surface properties, i.e. the local curvatures), +or on a given size map (which is then combined to the intrinsic size map). +One should use this option to coarsen the mesh, when a regular mesh +for computation purposes is desired, i.e. a mesh with good aspect ratios or +good quality elements. + + + Mesh for finite element computation : Coarsening (-1) + + + + + + + The given surface triangulation is modfied in accordance to a size map. +The latter can be either the intrinsic size map (computed automatically +and based on the surface properties, i.e. the local curvatures), +or on a given size map (which is then combined to the intrinsic size map). +One should use this option to coarsen and enrich the mesh, when a regular mesh +for computation purposes is desired, i.e. a mesh with good aspect ratios or +good quality elements + + + Mesh for finite element computation : Coarsening and Enrichment (1) + + + + + + + + + + 20 + 420 + 301 + 71 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> + + + Units + + + + + 10 + 30 + 110 + 24 + + + + Values are expressed in the model units. + + + Absolute + + + false + + + + + + 160 + 30 + 110 + 24 + + + + Values are relative to the bounding box size. + + + Relative + + + true + + + + + + + 410 + 430 + 351 + 71 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set chordal deviation tolerance:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This parameter enables the user to bound the maximal chordal deviation allowed,</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">that is, the maximal distance allowed between the detected curve and the plane P</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of the corresponding mesh face.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">il faut mettre ici le png</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Definitions: chordal deviation epsilon; curvature r; bounding box s; angles alpha and beta</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In other words, it avoids having faces too far away from the curve </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">they represent (or should represent).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This parameter enables the user to specify the maximal chordal deviation epsilon max.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Following that criterion:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- if the chordal deviation epsilon is smaller than epsilon max, it is acceptable </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> to remove the considered point.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- if the chordal deviation epsilon is greater than epsilon max, the considered mesh face should be </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> redifined by adding a point on the curve.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> + + + Chordal deviation Tolerance + + + + + 40 + 30 + 81 + 23 + + + + + PreferDefault + + + + true + + + If the Units parameter is relative epsilon max correspond to 0.0001x s x tolerance parameter where s is the size of the bounding box of the domain. +If the Units parameter is absolute, the tolerance parameter is expressed in model units : +if P=2 and point coordinaters are givin in millimetre, it menas that the maximal chordal deviation is 2 mm + + + 10000.000000000000000 + + + 1.000000000000000 + + + 1.000000000000000 + + + + + + + 10 + 10 + 741 + 121 + + + + + 12 + + + + Original Mesh + + + + + 40 + 70 + 191 + 33 + + + + + 10 + + + + Mesh File (GMF format) + + + + + + 240 + 70 + 481 + 31 + + + + + 10 + + + + + + + 190 + 30 + 41 + 31 + + + + + + + + ../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png + + + + 18 + 18 + + + + false + + + + + + 240 + 30 + 481 + 31 + + + + + 10 + + + + + + + 40 + 30 + 141 + 31 + + + + + 10 + false + + + + QFrame::Box + + + Smesh mesh + + + false + + + 0 + + + + + + 10 + 80 + 31 + 18 + + + + or + + + + GBUnit + GBTolerance_2 + groupBox + GBOptim + + + + Advanced Remeshing Options + + + + + 10 + 10 + 761 + 71 + + + + You can disable : + + + + + 100 + 20 + 271 + 23 + + + + if not set (ridge detection disabled), Yams will not try to detect any new ridge edge by its own mechanism : +it will consider as ridge only the ridges given in the mesh. +All non-ridge edges that would have been detected as ridge by the Ridge angle paramaeter +(see below) will be considered as part of the same continuous patch. +This option should not be checked when all the known ridges of the mesh are given and +when all other possible ridges are not geometric ridges to take into account. + + + ridge detection + + + true + + + + + + 100 + 40 + 271 + 23 + + + + When not set (point smoothing is disabled), Yams will not try to move the initial given vertices +(along an edge, a ridge or onto the surface), hence Yams will only swap edges, remove vertices +or add vertices (refines) to change the mesh. + + + point smoothing + + + true + + + + + + + 10 + 100 + 761 + 321 + + + + You can control + + + + + 10 + 30 + 91 + 23 + + + + 0.890000000000000 + + + 0.010000000000000 + + + 0.040000000000000 + + + + + + 120 + 20 + 631 + 61 + + + + This field (as well as tolerance) enables the user to control the accuracy of the +piecewise linear approximation of the surface. This parameter enables the user to +control the maximal angle allowed between two adjacent faces. It can be used to +bound the maximal deviation of the mesh faces from the tangent planes at mesh vertices. +In other words, it avoids having sharp angles between faces representing a smooth curve. +This parameter enables the user to specify the maximal chordal deviation "max relatively to the curvature. +Following that criterion: +- if the chordal deviation epsilon is smaller than epsilon max *r, it is acceptable to remove the considered point; +- if the chordal deviation epsilon is greater than epsiolon max*r, the considered mesh face should be redefined +by adding a point on the curve. +One can see that the smaller the radius r, the harder it is to satisfy this criterion: +epsilon max is a real value corresponding to a percentage, the ratio between the chordal deviation to +the local curvature. This field is used only for optimisation style -O values of -1, 0 and 1. +The default value for "max is set to 0:04 which leads to angles of less than 33 degrees between two adjacent +faces . + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Geometrical approximation : Maximum angle allowed between a face and a curve </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">(not separated by a ridge). </span>0.04 corresponds to 16.26 degrees (arccos(1-0.04))</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> + + + + + + 120 + 70 + 581 + 71 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ridge angle:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if the angle between the normal vectors of two adjacent faces exceeds</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">this value, the edge common to the faces is a ridge</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> + + + + + + 10 + 90 + 91 + 23 + + + + 90.000000000000000 + + + 45.000000000000000 + + + + + + 120 + 140 + 521 + 41 + + + + This parameter allows the user to prescribe a maximal size hmax +for the mesh elements i.e., the lengths of the edges with respect to the specified + size map. The corresponding values are either relative or absolute depending on the choosen parameter. +The default values are automatically set based on the surface geometry (curvature dependent) and its +bounding box size. +Please note that, as it is not strictly possible to obey the given or computed size map, the actual maximal +size may be slightly bigger than the prescribed ones. + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximal size allowed around vertices:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the lengths of the edges with respect to the specified size map.</p></td></tr></table></body></html> + + + + + + 120 + 240 + 591 + 61 + + + + This parameter enables the user to control the element size variation in the triangulation. +Yams will avoid getting two adjacent edges which sizes differ by a factor bigger than this parameter. +To avoid rapid size variations, a size correction procedure is applied to the size map. +In other words: if two adjacent edges are respectively e1 and e2 long +if e2 > parameter * e1 then e02 the new size for the second edge will be set to parameter* e1. +This procedure is de-activated if yams computes a mesh for finite element with only coarsening. +The default value is 1.3, which is the usual value set for computational meshes. + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mesh Gradation ie the element size variation in the triangulation:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Yams will avoid having two adjacent edges which sizes </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vary more than the given gradation.</p></td></tr></table></body></html> + + + + + + 10 + 250 + 91 + 23 + + + + 0.010000000000000 + + + 1.300000000000000 + + + + + + 10 + 150 + 91 + 23 + + + + -100.000000000000000 + + + 0.010000000000000 + + + -2.000000000000000 + + + + + + 120 + 190 + 521 + 41 + + + + This parameter allows the user to prescribe a maximal size hmax +for the mesh elements i.e., the lengths of the edges with respect to the specified + size map. The corresponding values are either relative or absolute depending on the choosen parameter. +The default values are automatically set based on the surface geometry (curvature dependent) and its +bounding box size. +Please note that, as it is not strictly possible to obey the given or computed size map, the actual maximal +size may be slightly bigger than the prescribed ones. + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimal size allowed around vertices:</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the lengths of the edges with respect to the specified size map.</p></td></tr></table></body></html> + + + + + + 10 + 200 + 91 + 23 + + + + -100.000000000000000 + + + 0.010000000000000 + + + -2.000000000000000 + + + + + + + 10 + 440 + 751 + 61 + + + + You can enable : + + + + + 100 + 20 + 271 + 23 + + + + if set, Yams creates new vertices placed on the curved surface and adds them to elements. +It means one extra vertex on edge (P2 or quadratic triangles). +New created vertices are saved in the .mesh file under keyword section Vertices + + + split edge + + + false + + + + + + + Generic Options + + + + + 40 + 160 + 441 + 27 + + + + + + + Verbosity Level + + + + + + + Qt::Horizontal + + + + 28 + 20 + + + + + + + + 10 + + + 3 + + + + + + + + + 40 + 210 + 441 + 27 + + + + + + + + 225 + 25 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory size (in Mbytes)</p></td></tr></table></body></html> + + + + + + + Qt::Horizontal + + + + 28 + 20 + + + + + + + + The program requires roughly about 370 bytes per point. It is thus possible to estimate a priori +the required memory size to complete a job. As an example of memory space needed, a mesh +of 543,652 points (1,087,716 triangles) requires 182 Mbytes (about 351 bytes per point). Conversely, +a workstation having 512 Mbytes of memory can handle a mesh of about 2,750,000 points. +The memory needed for mesh modification is allocated dynamically at the beginning of the procedure +(data reading), based on the initial triangulation size. When the program reaches the amount of maximal +memory allowed, it will stop inserting points and, if possible, the current mesh will be saved as it is, +valid and conformal, provided the input mesh was valid and conformal. +Specify the memory if: +- the automatically allocated memory reveals insufficient when the user asked to enrich the given mesh; +- you want to limit the amount of memory used by the program. +If the input mesh size requires more memory than requested or if the allocated memory (user defined or not) +exceeds the machine capabilities, the tool will stop because of insufficient memory. + + + 100000 + + + 0 + + + + + + + + + 40 + 40 + 30 + 31 + + + + + + + + ../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png + + + + + + 80 + 40 + 661 + 31 + + + + + + + 40 + 10 + 391 + 18 + + + + File used to save Yams Params : + + + + + + + + + + diff --git a/src/Tools/YamsPlug/monViewText.py b/src/Tools/YamsPlug/monViewText.py new file mode 100644 index 000000000..19dcd3ea2 --- /dev/null +++ b/src/Tools/YamsPlug/monViewText.py @@ -0,0 +1,86 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2012 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# Modules Python +import string,types,os +import traceback + +from PyQt4 import * +from PyQt4.QtGui import * +from PyQt4.QtCore import * + +# Import des panels + +# ------------------------------- # +from ViewText import Ui_ViewExe +class MonViewText(Ui_ViewExe,QDialog): +# ------------------------------- # + """ + Classe permettant la visualisation de texte + """ + def __init__(self,parent,txt): + QDialog.__init__(self,parent) + self.setupUi(self) + self.resize( QSize(600,600).expandedTo(self.minimumSizeHint()) ) + self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") ) + self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile ) + self.monExe=QProcess(self) + + + self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut ) + self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr ) + + # Je n arrive pas a utiliser le setEnvironment du QProcess + # fonctionne hors Salome mais pas dans Salome ??? + LICENCE=os.environ['DISTENE_LICENCE_FILE_FOR_YAMS'] + txt='export DISTENE_LICENSE_FILE='+LICENCE+';'+ txt + pid=self.monExe.pid() + nomFichier='/tmp/yam_'+str(pid)+'.py' + f=open(nomFichier,'w') + f.write(txt) + f.close() + + maBidouille='sh ' + nomFichier + self.monExe.start(maBidouille) + self.monExe.closeWriteChannel() + self.show() + + + def saveFile(self): + #recuperation du nom du fichier + savedir=os.environ['HOME'] + fn = QFileDialog.getSaveFileName(None, self.trUtf8("Save File"),savedir) + if fn.isNull() : return + ulfile = os.path.abspath(unicode(fn)) + try: + f = open(fn, 'wb') + f.write(str(self.TB_Exe.toPlainText())) + f.close() + except IOError, why: + QMessageBox.critical(self, self.trUtf8('Save File'), + self.trUtf8('The file %1 could not be saved.
Reason: %2') + .arg(unicode(fn)).arg(str(why))) + + def readFromStdErr(self): + a=self.monExe.readAllStandardError() + self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ; + + def readFromStdOut(self) : + a=self.monExe.readAllStandardOutput() + self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ; diff --git a/src/Tools/YamsPlug/monYamsPlugDialog.py b/src/Tools/YamsPlug/monYamsPlugDialog.py new file mode 100644 index 000000000..3e995c21a --- /dev/null +++ b/src/Tools/YamsPlug/monYamsPlugDialog.py @@ -0,0 +1,318 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2012 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# Modules Python +# Modules Eficas + +import os +from YamsPlugDialog import Ui_YamsPlugDialog +from monViewText import MonViewText +from PyQt4.QtGui import * +from PyQt4.QtCore import * + + +class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): + """ + """ + def __init__(self): + QWidget.__init__(self) + self.setupUi(self) + self.connecterSignaux() + self.fichierIn="" + self.fichierOut="" + self.MeshIn="" + self.num=1 + +# Ces parametres ne sont pas remis à rien par le clean + self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat')) + self.LE_ParamsFile.setText(self.paramsFile) + self.LE_MeshFile.setText("") + self.LE_MeshSmesh.setText("") + + def connecterSignaux(self) : + self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed) + self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean) + self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed) + self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed) + self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed) + self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed) + self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed) + self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed) + self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName) + self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged) + self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged) + + + def PBHelpPressed(self): + try : + maDoc=os.environ['DISTENE_YAMS_DOC_PDF'] + commande='kpdf '+maDoc + os.system (commande) + except: + QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found") + + + def PBOKPressed(self): + if not(self.PrepareLigneCommande()) : return + self.PBSavePressed(NomHypo=True) + maFenetre=MonViewText(self,self.commande) + if os.path.isfile(self.fichierOut) :self.enregistreResultat() + + def enregistreResultat(self): + import smesh + import SMESH + import salome + from salome.kernel import studyedit + + maStudy=studyedit.getActiveStudy() + smesh.SetCurrentStudy(maStudy) + (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut) + meshname = 'yams'+str(self.num) + smesh.SetName(outputMesh.GetMesh(), meshname) + outputMesh.Compute() + + + self.editor = studyedit.getStudyEditor() # + moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH") + HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh', + comment = 'HypoForRemshing') + monStudyBuilder=maStudy.NewBuilder(); + monStudyBuilder.NewCommand(); + newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry) + aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName") + hypoName = 'monHypo_Yams_'+str(self.num) + aNameAttrib.SetValue(hypoName) + aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment") + aCommentAttrib.SetValue(str(self.commande)) + + SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0] + newLink=monStudyBuilder.NewObject(SOMesh) + monStudyBuilder.Addreference(newLink, newStudyIter); + if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0) + self.num+=1 + return True + + def PBSavePressed(self,NomHypo=False): + if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n" + else : text = '# Save intermediate params \n' + text += "# Params for mesh : " + self.LE_MeshSmesh.text() +'\n' + for RB in self.GBOptim.findChildren(QRadioButton,): + if RB.isChecked()==True: + text+="Optimisation ='"+RB.text()+"'\n" + break + for RB in self.GBUnit.findChildren(QRadioButton,): + if RB.isChecked()==True: + text+="Units ='"+RB.text()+"'\n" + text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n' + + text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n' + text+='Split_Edge=' + str(self.CB_SplitEdge.isChecked())+'\n' + text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n' + text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value()) +'\n' + text+='Ridge_Angle=' + str(self.SP_Ridge.value()) +'\n' + text+='Maximum_Size=' + str(self.SP_MaxSize.value()) +'\n' + text+='Minimum_Size=' + str(self.SP_MaxSize.value()) +'\n' + text+='Mesh_Gradation=' + str(self.SP_Gradation.value())+'\n' + + text+='Verbosity=' + str(self.SP_Verbosity.value())+'\n' + text+='Memory=' + str(self.SP_Memory.value())+'\n' + text+='\n\n' + + try : + f=open(self.paramsFile,'a') + except : + QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile) + return + try : + f.write(text) + except : + QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile) + return + f.close() + + def PBLoadPressed(self): + try : + f=open(self.paramsFile,'r') + except : + QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile) + return + try : + text=f.read() + except : + QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile) + return + f.close() + d={} + exec text in d + for RB in self.GBOptim.findChildren(QRadioButton,): + if d['Optimisation']== RB.text(): + RB.setChecked(True) + break + for RB in self.GBUnit.findChildren(QRadioButton,): + if d['Units']== RB.text(): + RB.setChecked(True) + break + self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation']) + + self.CB_Ridge.setChecked(d['Ridge_Detection']) + self.CB_Point.setChecked(d['Point_Smoothing']) + self.CB_SplitEdge.setChecked(d['Split_Edge']) + self.SP_Geomapp.setValue(d['Geometrical_Approximation']) + self.SP_Ridge.setValue(d['Ridge_Angle']) + self.SP_MaxSize.setValue(d['Maximum_Size']) + self.SP_MinSize.setValue(d['Minimum_Size']) + self.SP_Gradation.setValue(d['Mesh_Gradation']) + + self.SP_Verbosity.setValue(d['Verbosity']) + self.SP_Memory.setValue(d['Memory']) + + + def PBCancelPressed(self): + self.close() + + def PBMeshFilePressed(self): + fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)") + if fd.exec_(): + infile = fd.selectedFiles()[0] + self.LE_MeshFile.setText(infile) + self.fichierIn=infile.toLatin1() + + def setParamsFileName(self): + fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)") + if fd.exec_(): + infile = fd.selectedFiles()[0] + self.LE_ParamsFile.setText(infile) + self.paramsFile=infile.toLatin1() + + + def meshFileNameChanged(self): + self.fichierIn=self.LE_MeshFile.text() + if os.path.exists(self.fichierIn): return + QMessageBox.warning( self, "Unknown File", "File doesn't exist") + + def paramsFileNameChanged(self): + self.paramsFile=self.LE_ParamsFile.text() + + def PBMeshSmeshPressed(self): + import salome + import smesh + from salome.kernel import studyedit + from salome.smesh.smeshstudytools import SMeshStudyTools + from salome.gui import helper as guihelper + from omniORB import CORBA + + mySObject, myEntry = guihelper.getSObjectSelected() + if CORBA.is_nil(mySObject) or mySObject==None: + QMessageBox.critical(self, "Mesh", "select an input mesh") + return + self.smeshStudyTool = SMeshStudyTools() + self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject) + if CORBA.is_nil(self.__selectedMesh): + QMessageBox.critical(self, "Mesh", "select an input mesh") + return + myName = mySObject.GetName() + self.MeshIn=myName + self.LE_MeshSmesh.setText(myName) + + def prepareFichier(self): + self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh" + import SMESH + self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn) + + def PrepareLigneCommande(self): + self.commande="yams " + verbosity=str(self.SP_Verbosity.value()) + self.commande+="-v "+verbosity + for obj in self.mesRB.children(): + try : + if obj.isChecked(): + self.style=obj.objectName().remove(0,3) + self.style.replace("_","-") + break + except : + pass + self.commande+=" -O "+self.style.toLatin1() + if self.fichierIn=="" and self.MeshIn=="" : + QMessageBox.critical(self, "Mesh", "select an input mesh") + return False + if self.MeshIn!="" : self.prepareFichier() + if not (os.path.isfile(self.fichierIn)): + QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn)) + return False + + deb=os.path.splitext(self.fichierIn) + self.fichierOut=deb[0]+'.d.meshb' + + if self.RB_Absolute.isChecked()==True : + self.commande+=' -Dabsolute' + else : + self.commande+=' -Drelative' + self.commande+=',tolerance=%f'%self.SP_Tolerance.value() + if self.CB_Ridge.isChecked()==False : self.commande+=',nr' + if self.CB_Point.isChecked()==False : self.commande+=',ns' + if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value() + if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value() + if self.SP_MaxSize.value()!=-2 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value() + if self.SP_MinSize.value()!=-2 : self.commande+=',minsize=%f'%self.SP_MinSize.value() + if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value() + if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1' + + if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value() + if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value() + + self.commande+=" "+self.fichierIn + return True + + def clean(self): + self.RB_0.setChecked(True) + self.RB_G.setChecked(False) + self.RB_U.setChecked(False) + self.RB_S.setChecked(False) + self.RB_2.setChecked(False) + self.RB__2.setChecked(False) + self.RB_1.setChecked(False) + self.RB__1.setChecked(False) + self.RB_Absolute.setChecked(False) + self.RB_Relative.setChecked(True) + self.SP_Tolerance.setProperty("value", 1.0) + self.SP_Geomapp.setProperty("value", 0.04) + self.SP_Ridge.setProperty("value", 45.0) + self.SP_Gradation.setProperty("value", 1.3) + self.CB_Ridge.setChecked(True) + self.CB_Point.setChecked(True) + self.CB_SplitEdge.setChecked(False) + self.SP_MaxSize.setProperty("value", -2.0) + self.SP_MinSize.setProperty("value", -2.0) + self.SP_Verbosity.setProperty("value", 3) + self.SP_Memory.setProperty("value", 0) + + +__dialog=None +def getDialog(): + """ + This function returns a singleton instance of the plugin dialog. + c est obligatoire pour faire un show sans parent... + """ + global __dialog + if __dialog is None: + __dialog = MonYamsPlugDialog() + #else : + # __dialog.clean() + return __dialog + diff --git a/src/Tools/YamsPlug/select1.png b/src/Tools/YamsPlug/select1.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb252ab77e4d4b1c8b37de449155e4e77806fd8 GIT binary patch literal 1143 zcmV--1c>{IP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ*Y z+1|@J&vTys*x8s(A9y&=ABPX$@Ar2R#uxzVK5M}eVA}#m3ZfBZ@`~am4@2{B2*kg@6q&*BNEwM?&B@+_EcgOBFPbq)fl4T!YS@w}t zFVDWmkpfEygkanm1x6e}ti+})Zj&gJl$S{orION^4KN{5Ud{{4>Hywey>xcXnpdU^ zrOY^>9C?&PZQ`Xi@t94l#NwI9rp^VH0yU-aL{&Q7&jSk=qk`z-UEi)-47^pla@I!R z8mbt{@XMVYl*J`Wp1gAbuzXHs^@|Tb`aE;0?qkxevlz^2GOi+>_33PD%CS{TeJaziQldy^CkLzy55TqhE(>~8;uAP9aj#$*8>=mlDV z%OSJ~1Y?1RF1MZ}lj=tKMI0xJ5JCc(Vj=&Y5Te@{(;r&%LUkP>tN;Xn8J(1OKW)?| z(4U<8>jw;m@|$iW5{<`&5INwYG3M{E03-Jja23df6*kw5p4J*;%$DPazoU@LAZ3IZ z6*btlT@k9d8dkC^{H8*i=DM?NOn~qE?Y@`a@O%A60II4V$F}7nA%q2}(3%^n@@h9X zn;R|%hWpWYo>$k_dVI&xgWD)8pG4)ok07Od6>vt(tlM~A*KWEnelv^(3SqH!{b>Uf zl~V8gd%Avi!~U&Q&wrL%CeL_UN;waR@_&yvR44?NWdkTbOZ1|fK+8*w^>#Xem1^}qu>hx~?yEOm+002ov JPDHLkV1g&y5jFq- literal 0 HcmV?d00001 diff --git a/src/Tools/YamsPlug/yamsplug_plugin.py b/src/Tools/YamsPlug/yamsplug_plugin.py new file mode 100644 index 000000000..4e04a9833 --- /dev/null +++ b/src/Tools/YamsPlug/yamsplug_plugin.py @@ -0,0 +1,44 @@ +# Copyright (C) 2006-2012 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# if you already have plugins defined in a salome_plugins.py file, add this file at the end. +# if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py + +def YamsLct(context): + # get context study, studyId, salomeGui + study = context.study + studyId = context.studyId + sg = context.sg + + import os + import subprocess + import tempfile + from PyQt4 import QtCore + from PyQt4 import QtGui + from PyQt4.QtGui import QFileDialog + from PyQt4.QtGui import QMessageBox + + try : + os.environ['DISTENE_LICENCE_FILE_FOR_YAMS'] + except: + QMessageBox.warning(None,"Products","Distene's products are not installed") + return + import monYamsPlugDialog + window=monYamsPlugDialog.getDialog() + window.show()