From 36168d4a964a90891e6e74bc7469d8df4c957cdb Mon Sep 17 00:00:00 2001 From: caremoli Date: Tue, 28 Sep 2010 15:14:11 +0000 Subject: [PATCH] CCAR: update with V5_1_main (28/09) --- bin/Makefile.am | 1 + bin/addvars2notebook_GEOM.py | 50 + configure.ac | 14 +- doc/Makefile.am | 2 +- doc/docutils/Makefile.am | 92 + doc/docutils/conf.py | 200 + doc/docutils/docapi.rst | 43 + .../images/salome-geom-structuralelements.png | Bin 0 -> 171661 bytes doc/docutils/index.rst | 14 + doc/docutils/overview.rst | 38 + .../gui/GEOM/images/limit_tolerance_dlg.png | Bin 0 -> 23699 bytes .../images/salome-geom-structuralelements.png | Bin 0 -> 171661 bytes doc/salome/gui/GEOM/input/geompypkg.doc | 44 + doc/salome/gui/GEOM/input/index.doc | 3 + .../GEOM/input/limit_tolerance_operation.doc | 37 + doc/salome/gui/GEOM/input/partition.doc | 6 + .../gui/GEOM/input/repairing_operations.doc | 2 + .../GEOM/input/shape_processing_operation.doc | 15 +- .../GEOM/input/tui_repairing_operations.doc | 37 + doc/salome/gui/GEOM/input/tui_test_others.doc | 9 + idl/GEOM_Gen.idl | 496 +- resources/Makefile.am | 1 + resources/limit_tolerance.png | Bin 0 -> 565 bytes src/BasicGUI/BasicGUI_PointDlg.cxx | 8 +- src/DisplayGUI/DisplayGUI.cxx | 6 + src/DlgRef/DlgRef.cxx | 29 +- src/GEOM/GEOM_Engine.cxx | 38 +- src/GEOM/GEOM_Function.cxx | 104 +- src/GEOM/GEOM_Function.hxx | 107 +- src/GEOM/GEOM_ISubShape.hxx | 10 +- src/GEOM/GEOM_Object.cxx | 2 +- src/GEOMAlgo/BlockFix_UnionEdges.cxx | 44 +- src/GEOMGUI/GEOM_images.ts | 8 + src/GEOMGUI/GEOM_msg_en.ts | 9336 ++++++++--------- src/GEOMGUI/GEOM_msg_fr.ts | 6133 ++++++++--- src/GEOMGUI/GeometryGUI.cxx | 80 +- src/GEOMGUI/GeometryGUI.h | 5 +- src/GEOMGUI/GeometryGUI_Operations.h | 18 +- src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 40 +- src/GEOMImpl/GEOMImpl_HealingDriver.hxx | 7 +- src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx | 129 +- src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 205 + src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 105 +- src/GEOMImpl/GEOMImpl_IGroupOperations.cxx | 1 - src/GEOMImpl/GEOMImpl_IHealing.hxx | 7 +- src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 61 +- src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 27 +- src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 94 +- src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 4 + src/GEOMImpl/GEOMImpl_ImportDriver.cxx | 8 +- src/GEOMImpl/GEOMImpl_PartitionDriver.cxx | 167 +- src/GEOMImpl/GEOMImpl_Types.hxx | 1 + src/GEOMToolsGUI/GEOMToolsGUI.cxx | 12 + src/GEOMToolsGUI/GEOMToolsGUI.h | 7 +- src/GEOMToolsGUI/GEOMToolsGUI_1.cxx | 188 +- .../GEOMToolsGUI_TransparencyDlg.cxx | 2 + src/GEOM_I/GEOM_Gen_i.cc | 28 +- src/GEOM_I/GEOM_IBlocksOperations_i.cc | 59 + src/GEOM_I/GEOM_IBlocksOperations_i.hh | 12 +- src/GEOM_I/GEOM_IHealingOperations_i.cc | 28 +- src/GEOM_I/GEOM_IHealingOperations_i.hh | 59 +- src/GEOM_I/GEOM_IShapesOperations_i.cc | 26 +- src/GEOM_I/GEOM_IShapesOperations_i.hh | 137 +- src/GEOM_I/GEOM_Object_i.cc | 15 +- src/GEOM_PY/Makefile.am | 27 + src/GEOM_PY/__init__.py | 1 + src/GEOM_PY/geomtools.py | 115 + src/GEOM_PY/structelem/Makefile.am | 26 + src/GEOM_PY/structelem/__init__.py | 486 + src/GEOM_PY/structelem/orientation.py | 249 + src/GEOM_PY/structelem/parts.py | 969 ++ src/GEOM_SWIG/GEOM_TestAll.py | 8 + src/GEOM_SWIG/GEOM_TestOthers.py | 16 + src/GEOM_SWIG/geompyDC.py | 96 +- src/GroupGUI/GroupGUI_GroupDlg.cxx | 7 +- src/IGESImport/IGESImport.cxx | 77 +- src/IGESImport/Makefile.am | 9 +- src/Makefile.am | 4 +- src/MeasureGUI/Makefile.am | 2 +- src/MeasureGUI/MeasureGUI_AngleDlg.cxx | 4 +- src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx | 16 +- src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx | 9 +- src/MeasureGUI/MeasureGUI_DistanceDlg.cxx | 11 +- src/MeasureGUI/MeasureGUI_InertiaDlg.cxx | 25 +- src/MeasureGUI/MeasureGUI_MaxToleranceDlg.cxx | 16 +- src/MeasureGUI/MeasureGUI_PointDlg.cxx | 8 +- src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx | 8 +- src/MeasureGUI/MeasureGUI_WhatisDlg.cxx | 337 +- src/RepairGUI/Makefile.am | 4 + src/RepairGUI/RepairGUI.cxx | 37 +- src/RepairGUI/RepairGUI_LimitToleranceDlg.cxx | 441 + src/RepairGUI/RepairGUI_LimitToleranceDlg.h | 83 + .../RepairGUI_RemoveExtraEdgesDlg.cxx | 1 + src/STEPImport/Makefile.am | 2 +- src/STEPImport/STEPImport.cxx | 104 +- 95 files changed, 14572 insertions(+), 7087 deletions(-) create mode 100644 bin/addvars2notebook_GEOM.py create mode 100644 doc/docutils/Makefile.am create mode 100644 doc/docutils/conf.py create mode 100644 doc/docutils/docapi.rst create mode 100644 doc/docutils/images/salome-geom-structuralelements.png create mode 100644 doc/docutils/index.rst create mode 100644 doc/docutils/overview.rst create mode 100644 doc/salome/gui/GEOM/images/limit_tolerance_dlg.png create mode 100644 doc/salome/gui/GEOM/images/salome-geom-structuralelements.png create mode 100644 doc/salome/gui/GEOM/input/geompypkg.doc create mode 100644 doc/salome/gui/GEOM/input/limit_tolerance_operation.doc create mode 100644 resources/limit_tolerance.png create mode 100644 src/GEOM_PY/Makefile.am create mode 100644 src/GEOM_PY/__init__.py create mode 100644 src/GEOM_PY/geomtools.py create mode 100644 src/GEOM_PY/structelem/Makefile.am create mode 100644 src/GEOM_PY/structelem/__init__.py create mode 100644 src/GEOM_PY/structelem/orientation.py create mode 100644 src/GEOM_PY/structelem/parts.py create mode 100644 src/RepairGUI/RepairGUI_LimitToleranceDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_LimitToleranceDlg.h diff --git a/bin/Makefile.am b/bin/Makefile.am index da76a6844..f0f18a9f0 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -28,6 +28,7 @@ nodist_salomescript_DATA = VERSION # python files dist_salomescript_PYTHON = \ + addvars2notebook_GEOM.py \ geom_setenv.py # distributed files diff --git a/bin/addvars2notebook_GEOM.py b/bin/addvars2notebook_GEOM.py new file mode 100644 index 000000000..01c37c582 --- /dev/null +++ b/bin/addvars2notebook_GEOM.py @@ -0,0 +1,50 @@ + +def addvars2notebook(filename, vars_and_values): + stream = open(filename) + lines = stream.readlines() + stream.close() + newlines = [] + for line in lines: + if line.find("= geompy.") >= 0: + name = line.split('=')[0] + name = name.strip() + vals = line + fields = vals.split("(") + if len(fields) == 2: + begin = fields[0] + "(" + vals = fields[1] + fields = vals.split(")") + if len(fields) == 2: + vals = fields[0] + end = ")" + fields[1] + vals = vals.split(',') + newline = begin + newvals = [] + for i in range(len(vals)): + valname = name + "_val_%s"%(i+1) + val = vals[i] + vvv = val.strip() + try: + iii = int(vvv) + vars_and_values.append([valname, val]) + val = val.replace(vvv, valname.__repr__()) + except ValueError: + try: + fff = float(vvv) + vars_and_values.append([valname, val]) + val = val.replace(vvv, valname.__repr__()) + except ValueError: + pass + pass + newvals.append(val) + pass + newline += ','.join(newvals) + newline += end + line = newline + pass + pass + pass + newlines.append(line) + pass + content = "".join(newlines) + return content diff --git a/configure.ac b/configure.ac index a97d65c0b..e5cd6f127 100644 --- a/configure.ac +++ b/configure.ac @@ -316,6 +316,13 @@ echo CHECK_HTML_GENERATORS +echo +echo --------------------------------------------- +echo testing sphinx +echo --------------------------------------------- +echo +CHECK_SPHINX + echo echo --------------------------------------------- echo Testing Kernel @@ -333,7 +340,7 @@ echo echo Configure if test "${gui_ok}" = "yes"; then - variables="cc_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok omniORB_ok boost_ok occ_ok doxygen_ok graphviz_ok Kernel_ok gui_ok" + variables="cc_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok omniORB_ok boost_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok gui_ok" elif test "${SalomeGUI_need}" != "no"; then variables="cc_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok omniORB_ok boost_ok occ_ok doxygen_ok graphviz_ok Kernel_ok gui_ok" else @@ -381,6 +388,7 @@ AC_OUTPUT([ \ bin/Makefile \ GEOM_version.h \ doc/Makefile \ + doc/docutils/Makefile \ doc/salome/Makefile \ doc/salome/gui/Makefile \ doc/salome/gui/GEOM/Makefile \ @@ -415,6 +423,8 @@ AC_OUTPUT([ \ src/GEOM_I_Superv/Makefile \ src/GEOM_SWIG/Makefile \ src/GEOM_SWIG_WITHIHM/Makefile \ + src/GEOM_PY/Makefile \ + src/GEOM_PY/structelem/Makefile \ src/GenerationGUI/Makefile \ src/GroupGUI/Makefile \ src/IGESExport/Makefile \ @@ -439,3 +449,5 @@ AC_OUTPUT([ \ idl/Makefile \ Makefile \ ]) + +AC_HACK_LIBTOOL diff --git a/doc/Makefile.am b/doc/Makefile.am index f40fb81a5..6cf4c8ea2 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -24,7 +24,7 @@ # $Header$ # source path # -SUBDIRS = salome +SUBDIRS = salome docutils usr_docs: (cd salome && $(MAKE) $(AM_MAKEFLAGS) usr_docs) diff --git a/doc/docutils/Makefile.am b/doc/docutils/Makefile.am new file mode 100644 index 000000000..a85de6cef --- /dev/null +++ b/doc/docutils/Makefile.am @@ -0,0 +1,92 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# 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 + +pydocdir = $(docdir)/tui/GEOM/docutils + +.PHONY : latex + +if SPHINX_IS_OK + +pydoc_DATA=html/index.html +html/index.html:$(RSTFILES) + make htm + +endif + +EXTRA_DIST+= html + +SPHINXOPTS = +SOURCEDIR = $(srcdir) +SPHINXBUILD = sphinx-build +PAPEROPT_a4 = -D latex_paper_size=a4 +ALLSPHINXOPTS = -d doctrees $(PAPEROPT_a4) $(SPHINXOPTS) $(SOURCEDIR) + +SPHINX_PYTHONPATH = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages + +SPHINX_LD_LIBRARY_PATH = $(OMNIORB_ROOT)/lib + +htm: + mkdir -p html doctrees + PYTHONPATH=$(SPHINX_PYTHONPATH):${PYTHONPATH}; \ + LD_LIBRARY_PATH=$(SPHINX_LD_LIBRARY_PATH):${LD_LIBRARY_PATH}; \ + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) html + @echo + @echo "Build finished. The HTML pages are in html." + +latex: + mkdir -p latex doctrees + PYTHONPATH=$(SPHINX_PYTHONPATH):${PYTHONPATH}; \ + LD_LIBRARY_PATH=$(SPHINX_LD_LIBRARY_PATH):${LD_LIBRARY_PATH}; \ + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) latex + @echo + @echo "Build finished; the LaTeX files are in latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +html: + mkdir -p $@ + +RSTFILES= \ + index.rst \ + overview.rst \ + docapi.rst + +EXTRA_DIST+= $(RSTFILES) + +EXTRA_DIST+= \ + conf.py + +install-data-local: + $(INSTALL) -d $(pydocdir) + if test -d "html"; then b=; else b="$(srcdir)/"; fi; \ + cp -rf $$b"html"/* $(pydocdir) ; \ + if test -f $$b"latex"/geompy.pdf; then cp -f $$b"latex"/geompy.pdf $(pydocdir) ; fi; + +uninstall-local: + chmod -R +w $(pydocdir) + rm -rf $(pydocdir)/* + +clean-local: + -rm -rf html latex doctrees + if test -d "html"; then rm -rf html ; fi diff --git a/doc/docutils/conf.py b/doc/docutils/conf.py new file mode 100644 index 000000000..5afa71b2f --- /dev/null +++ b/doc/docutils/conf.py @@ -0,0 +1,200 @@ +# -*- coding: iso-8859-1 -*- +# +# yacs documentation build configuration file, created by +# sphinx-quickstart on Fri Aug 29 09:57:25 2008. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('.')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc'] + +# Uncomment the following line to build the links with Python documentation +# (you might need to set http_proxy environment variable for this to work) +#extensions += ['sphinx.ext.intersphinx'] + +# Intersphinx mapping to add links to modules and objects in the Python +# standard library documentation +intersphinx_mapping = {'http://docs.python.org': None} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'GEOM python packages' +copyright = '2010 EDF R&D' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '5.1.4' +# The full version, including alpha/beta/rc tags. +release = '5.1.4' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'en' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['.build','ref','images','CVS','.svn'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme = 'default' +#html_theme = 'nature' +#html_theme = 'agogo' +#html_theme = 'sphinxdoc' +#html_theme = 'omadoc' + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = ['themes'] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +#html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +html_use_modindex = False + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/. +html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'geompydoc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +latex_paper_size = 'a4' + +# The font size ('10pt', '11pt' or '12pt'). +latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'geompy.tex', 'Documentation of the GEOM python packages', 'EDF R\&D', 'manual') +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '../salome/tui/images/head.png' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = True + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +latex_use_modindex = False diff --git a/doc/docutils/docapi.rst b/doc/docutils/docapi.rst new file mode 100644 index 000000000..20a52ca80 --- /dev/null +++ b/doc/docutils/docapi.rst @@ -0,0 +1,43 @@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Documentation of the programming interface (API) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +This section describes the python packages and modules of the +``salome.geom`` python package. The main part is generated from the +code documentation included in source python files. + +:mod:`salome.geom` -- Package containing the GEOM python utilities +================================================================== + +:mod:`geomtools` -- Tools to access GEOM engine and objects +----------------------------------------------------------- + +.. automodule:: salome.geom.geomtools + :members: + +:mod:`structelem` -- Structural elements package +------------------------------------------------ + +.. automodule:: salome.geom.structelem + +.. autoclass:: StructuralElementManager + :members: + +.. autoclass:: StructuralElement + :members: + +:mod:`structelem.parts` -- Structural element parts +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: salome.geom.structelem.parts + :members: + :undoc-members: + :show-inheritance: + +:mod:`structelem.orientation` -- Structural element orientation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: salome.geom.structelem.orientation + :members: + :undoc-members: diff --git a/doc/docutils/images/salome-geom-structuralelements.png b/doc/docutils/images/salome-geom-structuralelements.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed41b12f9ace3c5ac932c478fdef0d35a64c349 GIT binary patch literal 171661 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/docutils/index.rst b/doc/docutils/index.rst new file mode 100644 index 000000000..81e4f24aa --- /dev/null +++ b/doc/docutils/index.rst @@ -0,0 +1,14 @@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Documentation of the GEOM python packages +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Main documentation +================== + +.. toctree:: + :maxdepth: 3 + + overview.rst + docapi.rst + diff --git a/doc/docutils/overview.rst b/doc/docutils/overview.rst new file mode 100644 index 000000000..3ca3a4b20 --- /dev/null +++ b/doc/docutils/overview.rst @@ -0,0 +1,38 @@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +General presentation of the GEOM python package +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The GEOM python package essentially contains: + +* The visualization of structural elements: a function to create + geometrical 3D representations of mechanical models called + "structural elements". + +Note that these functions either encapsulate the python programming +interface of GEOM core (the CORBA or SWIG interfaces for example) or +extend existing utilities as the ``geompy.py`` module. + +The functions are distributed in the python package +``salome.geom``. For example, the usage of the visualization of +structural elements can be appreciated with this set of instructions: + +.. code-block:: python + + from salome.geom.structelem import TEST_StructuralElement + TEST_StructuralElement() + +This creates the geometrical objects displayed in the study below: + +.. image:: /images/salome-geom-structuralelements.png + :align: center + +The specification of the programming interface of this package is +detailled in the part :doc:`Documentation of the programming interface +(API)` of this documentation. + +.. note:: + The main package ``salome`` contains other sub-packages that are + distributed with the other SALOME modules. For example, the KERNEL + module provides the python package ``salome.kernel`` and SMESH the + package ``salome.smesh``. diff --git a/doc/salome/gui/GEOM/images/limit_tolerance_dlg.png b/doc/salome/gui/GEOM/images/limit_tolerance_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..98adfc454b804f2cff872fb96bf2db10813d5dbf GIT binary patch literal 23699 zcmb@u1yq#nzBfFWh^Ul;q(})!N~eN!Nh39MhlKQi3W&6HgLH$$&>=`8ARR+@cMk*K zH9mWv@7?=6=bZJP^{(~!i1*Ch*Y*GZ>canxyu>{$Vk`&*a!*R~wGsq^kqQ1JVBP{- zjM73KAdn{zsn@SmToN~@+_hESpa0nFo4oz{r7}UCR&GY-%lS;a9YO*)9%KHLw3d$b zuo{z`<i5(KC#^)L z3-Vs{Huz8^vj3V<90?yb_<4RbLq&Vww?29&W2xNo)Soyan3Ri>QeXpN7!?iJtScH4 z33hV1$E$>QRAh`F`|fVtdm?Fzz3JMK^CC=(YbPfk)FT8({czIq7$l^LGjRxR-h4yw z@LA?6YigFyhw^)i+`$=}Q+Mk*7D{TpO7m`Hlyy^+m%ZI}F1r(m;-Y&Jh%U3CVN!Zu zqXID<3-REG(4GA0x${bWo;kGx3f2bI(WjgY&%#KY{Wnx}ekJy7J&-wp>Ub^7k4~H@syk#v z=9`BGJmnZ+B+$Nyl+UBK*_?>}@d(vlK`fG5{b5oD8sX_Ee8unl*c*zof+!c+Ik_t& zRJe2z3F(66fc8@nLGUdQ|>ewqoXNcm_Y#9EcUWtw%TBI$F= z-J%gMwoa!TH&|;!w^ry@D0#OmpyJj&#__9qvV^OXzqrJl=S{~PdZXVkwA=pv(UI^? z>+TzjY?hy14V6)hfu;y^qTfwipS?Wp%r*V4ymw0SP37ZV-rbb4uTT$o@A8h7AvWto z+v%S9Y3`4aO5N)}`9;lSe&^0f<680Fe0&zNfZH6_>P}`ASW{t%{b&ac$EbL%;yLwp z1|l?J5faIM&Cu$Bw9KDnDr6WTD2u5^!Y1-oC-#r_1DS z=%9h(jJ)J4DiCqmiQURhA>XdO**1y2L(!<2y>V}MLSKu**%?mLIr;!m(K>A)lb9c2 zeP`_!g;uoz-5%!LmolnUOF<>KWd{wuj^ip15%AOKx+R8vU>+g^1BQ9%767f0r(N($ z!LM?rF{j}+_@XWLMv{jChX4FSW`T5PaiH1Zwcv^rS25KqH&{9M|SE|lOLTL&?cgMtb8*wFCM%j=5lQqMf7Dnk8D)3a=z7|#_(`)5rss_4Pqpa++^_RlS6hTGKnup3i+K>vPXO`*AbWsY*j1Cfy!bhinXC9v=R*Mc9P<@V7se zWAz+X3Jok|U_+NfsAn=%g@c%3csM0$2D((Ks$R5Ny?@jtyi(A>Sh9HK=HlhuH|)UE z1AEe#V?lA&TG76DyNJAc98r`C^SUlDfX_whw;+tjnzFIEKWJM#;rV`{7YXnCM*B5d zy+lEM0XL1WS7;~6+Ijh8i)DhMxOS+&;nK`6umJpE4$GF1wrG|9vd>g$DbzN`fH^ae z(!qE5sKwC&b)xohpMeL#8F$K75ffL6bXeD?XMct zBV>$+qu3t)eDD?r_QJ!l`O(UE`FA|^78JC16EAMIy@$*7$36e8Vp}_OVWoCt$ZBEL zIN7R(h_&7Qh|66gv@H_I6gM?^Pl(4Rp~iB~QpSeYq#ZqW=|UsPEu8x=T|}iNI2aIp zr7K=DmrqHQ`1q`TMn{r*=7&c+K0S@a-1VNF85Yv(cggXBDWG6)T313%eq0hD41>=t zc!PA{I>NkA z%L8ZDb6S`4`-nqL8(dOp-vi#^P|9pfCzM{To@jQ74rgql34iF)dezlg(pK{qUX&Hg zB*FR)NAZ}QfC!J0key1qozS};iCi+q@&iQ+334-s{>)?5?g)Y<(})ET(1v`nZ=Th- zrFw&wr1*fE{tl(jE-|wXj1F|8q1%Maj_6jk?k79*=L2^1_GZhDuyC-sIQ1rv9b0
    +
  • The visualization of structural elements: a function to create + geometrical 3D representations of mechanical models called + "structural elements". +
+ +For details, you should refer to the complete + documentation of the GEOM +python packages generated with sphinx from rst text files. + +Note that these functions either encapsulate the python programming +interface of GEOM core (the CORBA or SWIG interfaces for example) or +extend existing utilities as the ``geompy.py`` module. + +The functions are distributed in the python package +``salome.geom``. For example, the usage of the visualization of +structural elements can be appreciated with this set of instructions: + +\code + + from salome.geom.structelem import TEST_StructuralElement + TEST_StructuralElement() +\endcode + +This creates the geometrical objects displayed in the study below: + +\image html salome-geom-structuralelements.png "Example of Geometry created from structural elements" + +*/ diff --git a/doc/salome/gui/GEOM/input/index.doc b/doc/salome/gui/GEOM/input/index.doc index d28e8c343..f612e7108 100644 --- a/doc/salome/gui/GEOM/input/index.doc +++ b/doc/salome/gui/GEOM/input/index.doc @@ -23,6 +23,9 @@ various algorithms; Almost all geometry module functionalities are accessible via \subpage geompy_page "Geometry module Python Interface" +\n Have a look also at the + documentation of the GEOM python packages + \image html image3.png "Example of Geometry module usage for engineering tasks" diff --git a/doc/salome/gui/GEOM/input/limit_tolerance_operation.doc b/doc/salome/gui/GEOM/input/limit_tolerance_operation.doc new file mode 100644 index 000000000..3767c0c99 --- /dev/null +++ b/doc/salome/gui/GEOM/input/limit_tolerance_operation.doc @@ -0,0 +1,37 @@ +/*! + +\page limit_tolerance_operation_page Limit Tolerance + +\n To produce a Limit Tolerance operation in the Main + Menu select Repair - > Limit Tolerance. + +\image html limit_tolerance_dlg.png + +\n Arguments: Name + 1 shape + 1 value (new tolerance). + +\n It is possible on all kind of shapes. + +\n The \b Result will be a \b GEOM_Object. + +\n This functionality tries to set new value of tolerance for the + given shape. But the final tolerance value depends also on the + initial shape topology (regards existing gaps) in order to obtain + valid resulting shape. + +\n Example of usage: +
    +
  1. Try a partition on objects obj1 and obj2.
  2. +
  3. Partition fails.
  4. +
  5. Perform Limit Tolerance on objects obj1 and obj2.
  6. +
  7. Try again the partition.
  8. +
+See also \ref tui_limit_tolerance "TUI example". + +\n TUI Command: geompy.LimitTolerance(Shape, Tolerance), + where \em Shape is a shape with presumably incorrect tolerance, \em + Tolerance is a desired value of tolerance. + +Our TUI Scripts provide you with useful examples of the use of +\ref tui_limit_tolerance "Repairing Operations". + +*/ diff --git a/doc/salome/gui/GEOM/input/partition.doc b/doc/salome/gui/GEOM/input/partition.doc index 6661d12f2..2b3b31eae 100644 --- a/doc/salome/gui/GEOM/input/partition.doc +++ b/doc/salome/gui/GEOM/input/partition.doc @@ -37,6 +37,12 @@ the box, see corresponding \ref partition_picture_3 "picture" below). \n Advanced option: \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments". +\note Partition is a kind of complex operation, result of it depends + on the initial shapes quality. Sometimes, if partition fails, + some healing operations could help. Try Shape Processing + and Limit Tolerance in such cases. See also \ref + tui_limit_tolerance "TUI example" of shape healing. + \n TUI Command: geompy.MakePartition(ListOfShapes, ListOfTools, ListOfKeepInside, ListOfRemoveInside, Limit, RemoveWebs, ListOfMaterials, KeepNonlimitShapes), where where \em diff --git a/doc/salome/gui/GEOM/input/repairing_operations.doc b/doc/salome/gui/GEOM/input/repairing_operations.doc index 542f5c25e..592c1b653 100644 --- a/doc/salome/gui/GEOM/input/repairing_operations.doc +++ b/doc/salome/gui/GEOM/input/repairing_operations.doc @@ -17,6 +17,8 @@ holes with free boundaries on a selected face.
  • \subpage sewing_operation_page "Sewing" - sews faces or shells.
  • \subpage glue_faces_operation_page "Glue faces" - unites coincident faces within the given tolerance.
  • +
  • \subpage limit_tolerance_operation_page "Limit Tolerance" - tries +to set new tolerance value for the given shape.
  • \subpage add_point_on_edge_operation_page "Add point on edge" - splits an edge in two.
  • \subpage change_orientation_operation_page "Change orientation" - diff --git a/doc/salome/gui/GEOM/input/shape_processing_operation.doc b/doc/salome/gui/GEOM/input/shape_processing_operation.doc index b10f35c6e..7d7c9a406 100644 --- a/doc/salome/gui/GEOM/input/shape_processing_operation.doc +++ b/doc/salome/gui/GEOM/input/shape_processing_operation.doc @@ -3,7 +3,7 @@ \page shape_processing_operation_page Shape Processing \n To produce a Shape Processing operation in the Main Menu -select Repair - > Shape Processing. + select Repair - > Shape Processing. \n This operation processes one or more shapes using various operators. \n The \b Result will be a \b GEOM_Object. @@ -15,6 +15,19 @@ is a list of operators ("FixShape", "SplitClosedFaces", etc.), etc), \em Values is a list of values of parameters placed in the same order as in the list of Parameters. +\note Shape Processing is usefull not only on invalid shapes, + but sometimes also on shapes, that are classified as valid by + the Check functionality. Use it, if some operation (for + example, Partition) fails. + Example of usage: +
      +
    1. Try a partition on objects obj1 and obj2.
    2. +
    3. Partition fails.
    4. +
    5. Perform Shape Processing on objects obj1 and obj2.
    6. +
    7. Try again the partition.
    8. +
    + See also \ref tui_limit_tolerance "TUI example". + \n In this dialog box you can select the object that you need to process, define its name and operators applied to it during processing. diff --git a/doc/salome/gui/GEOM/input/tui_repairing_operations.doc b/doc/salome/gui/GEOM/input/tui_repairing_operations.doc index 98dccc6f0..247234037 100644 --- a/doc/salome/gui/GEOM/input/tui_repairing_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_repairing_operations.doc @@ -289,6 +289,43 @@ gg.createAndDisplayGO(id_glue) gg.setDisplayMode(id_glue,1) \endcode +\anchor tui_limit_tolerance +

    Limit Tolerance

    + +\code +import geompy +gg = salome.ImportComponentGUI("GEOM") + +# import initial topology +shape1 = geompy.ImportBREP("my_shape_1.brep") +shape2 = geompy.ImportBREP("my_shape_2.brep") + +geompy.addToStudy(shape1, "Shape 1") +geompy.addToStudy(shape2, "Shape 2") + +# perform partition +try: + part = geompy.MakePartition([shape1, shape2]) +except: + # limit tolerance + tolerance = 1e-07 + shape1_lt = geompy.LimitTolerance(shape1, tolerance) + shape2_lt = geompy.LimitTolerance(shape2, tolerance) + + # process shape + good_shape1 = geompy.ProcessShape(shape1_lt, ["FixShape"], ["FixShape.Tolerance3d"], ["1e-7"]) + good_shape2 = geompy.ProcessShape(shape2_lt, ["FixShape"], ["FixShape.Tolerance3d"], ["1e-7"]) + + geompy.addToStudy(good_shape1, "Shape 1 corrected") + geompy.addToStudy(good_shape2, "Shape 2 corrected") + + # perform partition on corrected shapes + part = geompy.MakePartition([good_shape1, good_shape2]) + pass + +geompy.addToStudy(part, "Partition") +\endcode + \anchor tui_add_point_on_edge

    Add Point on Edge

    diff --git a/doc/salome/gui/GEOM/input/tui_test_others.doc b/doc/salome/gui/GEOM/input/tui_test_others.doc index 443326fea..e2c6d43b4 100644 --- a/doc/salome/gui/GEOM/input/tui_test_others.doc +++ b/doc/salome/gui/GEOM/input/tui_test_others.doc @@ -99,12 +99,21 @@ \anchor swig_GetPoint \until blocksComp (-50, -50, -50) +\anchor swig_GetVertexNearPoint +\until near (40, 40, 40) + +\anchor swig_GetEdge +\until by two points + \anchor swig_GetEdgeNearPoint \until edge near point \anchor swig_GetBlockByParts \until "b0 image" +\anchor swig_GetShapesNearPoint +\until "faces near point" + \anchor swig_GetShapesOnPlane \until Face on Plane diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 164969e51..94321f4d9 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -19,10 +19,9 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - // File : GEOM_Gen.idl // Author : Sergey RUIN -// + #ifndef __GEOM_GEN__ #define __GEOM_GEN__ @@ -45,13 +44,13 @@ module GEOM * Marker type */ enum marker_type { MT_NONE, MT_POINT, MT_PLUS, MT_STAR, MT_O, MT_X, MT_O_POINT, MT_O_PLUS, - MT_O_STAR, MT_O_X, MT_BALL, MT_RING1, MT_RING2, MT_RING3, MT_USER }; + MT_O_STAR, MT_O_X, MT_BALL, MT_RING1, MT_RING2, MT_RING3, MT_USER }; /*! * Marker size */ enum marker_size { MS_NONE, MS_10, MS_15, MS_20, MS_25, MS_30, MS_35, - MS_40, MS_45, MS_50, MS_55, MS_60, MS_65, MS_70 }; + MS_40, MS_45, MS_50, MS_55, MS_60, MS_65, MS_70 }; /*! * State of shape relatively geometrical surface like plane, sphere or cylinder. @@ -166,10 +165,10 @@ module GEOM * Get a shape_type of the object value. */ shape_type GetShapeType(); - + /*! * Get the topology type of the object value. - * In contrast to the shape type, this function returns type of the most + * In contrast to the shape type, this function returns type of the most * top-level sub-shape of the COMPOUND or COMPSOLID, if there is only one * sub-shape there. * \sa GetShapeType() @@ -385,7 +384,7 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object MakePointWithReference (in GEOM_Object theReference, - in double theX, in double theY, in double theZ); + in double theX, in double theY, in double theZ); /*! * Create a point, corresponding to the given parameter on the given curve. @@ -394,7 +393,7 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object MakePointOnCurve (in GEOM_Object theRefCurve, - in double theParameter); + in double theParameter); /*! * Create a point on the given curve, projecting given point @@ -418,8 +417,8 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object MakePointOnSurface (in GEOM_Object theRefSurf, - in double theUParameter, - in double theVParameter); + in double theUParameter, + in double theVParameter); /*! * Create a point on the given surface, projecting given point @@ -441,7 +440,7 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object MakePointOnLinesIntersection (in GEOM_Object theRefLine1, - in GEOM_Object theRefLine2); + in GEOM_Object theRefLine2); /*! * Create a vector, corresponding to tangent to the given parameter on the given curve. @@ -452,7 +451,7 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object MakeTangentOnCurve (in GEOM_Object theRefCurve, - in double theParameter); + in double theParameter); /*! * Create a vector with the given components. @@ -462,8 +461,8 @@ module GEOM * \return New GEOM_Object, containing the created vector. */ GEOM_Object MakeVectorDXDYDZ (in double theDX, - in double theDY, - in double theDZ); + in double theDY, + in double theDZ); /*! * Create a vector between two points. @@ -507,9 +506,9 @@ module GEOM * \return New GEOM_Object, containing the created plane. */ GEOM_Object MakePlaneThreePnt (in GEOM_Object thePnt1, - in GEOM_Object thePnt2, - in GEOM_Object thePnt3, - in double theTrimSize); + in GEOM_Object thePnt2, + in GEOM_Object thePnt3, + in double theTrimSize); /*! * Create a plane, passing through the given point @@ -520,8 +519,8 @@ module GEOM * \return New GEOM_Object, containing the created plane. */ GEOM_Object MakePlanePntVec (in GEOM_Object thePnt, - in GEOM_Object theVec, - in double theTrimSize); + in GEOM_Object theVec, + in double theTrimSize); /*! * Create a plane, similar to the existing one, but with another size of representing face. @@ -530,7 +529,7 @@ module GEOM * \return New GEOM_Object, containing the created plane. */ GEOM_Object MakePlaneFace (in GEOM_Object theFace, - in double theTrimSize); + in double theTrimSize); /*! * Create a plane, by two vectors. @@ -540,8 +539,8 @@ module GEOM * \return New GEOM_Object, containing the created plane. */ GEOM_Object MakePlane2Vec (in GEOM_Object theVec1, - in GEOM_Object theVec2, - in double theTrimSize); + in GEOM_Object theVec2, + in double theTrimSize); /*! * Create a plane, defined by local coordinate system. @@ -551,8 +550,8 @@ module GEOM * \return New GEOM_Object, containing the created plane. */ GEOM_Object MakePlaneLCS (in GEOM_Object theLCS, - in double theTrimSize, - in double theOrientation); + in double theTrimSize, + in double theOrientation); /*! * Create a local coordinate system. @@ -562,8 +561,8 @@ module GEOM * \return New GEOM_Object, containing the created coordinate system. */ GEOM_Object MakeMarker (in double theOX , in double theOY , in double theOZ, - in double theXDX, in double theXDY, in double theXDZ, - in double theYDX, in double theYDY, in double theYDZ); + in double theXDX, in double theXDY, in double theXDZ, + in double theYDX, in double theYDY, in double theYDZ); /*! * Create a local coordinate system from shape. @@ -571,7 +570,7 @@ module GEOM * \return New GEOM_Object, containing the created coordinate system. */ GEOM_Object MakeMarkerFromShape (in GEOM_Object theShape); - + /*! * Create a local coordinate system from point and two vectors (DX, DY). * \param theOrigin Point of coordinate system origin. @@ -580,7 +579,7 @@ module GEOM * \return New GEOM_Object, containing the created coordinate system. */ GEOM_Object MakeMarkerPntTwoVec (in GEOM_Object theOrigin, in GEOM_Object theXVec, in GEOM_Object theYVec); - + /*! * Create a tangent plane to specified face in the point with specified parameters. * Values of parameters should be between 0. and 1.0 @@ -591,9 +590,9 @@ module GEOM * \return New GEOM_Object, containing the face built on tangent plane. */ GEOM_Object MakeTangentPlaneOnFace(in GEOM_Object theFace, - in double theParameterU, - in double theParameterV, - in double theTrimSize); + in double theParameterU, + in double theParameterV, + in double theTrimSize); }; interface GEOM_ITransformOperations : GEOM_IOperations @@ -606,8 +605,8 @@ module GEOM * \return theObject. */ GEOM_Object TranslateTwoPoints (in GEOM_Object theObject, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /*! * Translate the given object along the vector, specified @@ -618,7 +617,7 @@ module GEOM * \return New GEOM_Object, containing the translated object. */ GEOM_Object TranslateTwoPointsCopy (in GEOM_Object theObject, - in GEOM_Object thePoint1, + in GEOM_Object thePoint1, in GEOM_Object thePoint2); /*! @@ -628,7 +627,7 @@ module GEOM * \return theObject. */ GEOM_Object TranslateDXDYDZ (in GEOM_Object theObject, - in double theDX, in double theDY, in double theDZ); + in double theDX, in double theDY, in double theDZ); /*! * Translate the given object along the vector, specified @@ -638,7 +637,7 @@ module GEOM * \return New GEOM_Object, containing the translated object. */ GEOM_Object TranslateDXDYDZCopy (in GEOM_Object theObject, - in double theDX, in double theDY, in double theDZ); + in double theDX, in double theDY, in double theDZ); /*! @@ -648,7 +647,7 @@ module GEOM * \return theObject. */ GEOM_Object TranslateVector (in GEOM_Object theObject, - in GEOM_Object theVector); + in GEOM_Object theVector); /*! * Translate the given object along the given vector, @@ -658,7 +657,7 @@ module GEOM * \return New GEOM_Object, containing the translated object. */ GEOM_Object TranslateVectorCopy (in GEOM_Object theObject, - in GEOM_Object theVector); + in GEOM_Object theVector); /*! * Translate the given object along the given vector on given distance, @@ -670,9 +669,9 @@ module GEOM * \return New GEOM_Object, containing the translated object. */ GEOM_Object TranslateVectorDistance (in GEOM_Object theObject, - in GEOM_Object theVector, - in double theDistance, - in boolean theCopy); + in GEOM_Object theVector, + in double theDistance, + in boolean theCopy); /*! * Translate the given object along the given vector a given number times @@ -684,9 +683,9 @@ module GEOM * the shapes, obtained after each translation. */ GEOM_Object MultiTranslate1D (in GEOM_Object theObject, - in GEOM_Object theVector, - in double theStep, - in long theNbTimes); + in GEOM_Object theVector, + in double theStep, + in long theNbTimes); /*! * Conseqently apply two specified translations to theObject specified number of times. @@ -701,12 +700,12 @@ module GEOM * the shapes, obtained after each translation. */ GEOM_Object MultiTranslate2D (in GEOM_Object theObject, - in GEOM_Object theVector1, - in double theStep1, - in long theNbTimes1, - in GEOM_Object theVector2, - in double theStep2, - in long theNbTimes2); + in GEOM_Object theVector1, + in double theStep1, + in long theNbTimes1, + in GEOM_Object theVector2, + in double theStep2, + in long theNbTimes2); /*! * Rotate given object around vector perpendicular to plane containing three points. @@ -717,9 +716,9 @@ module GEOM * \return theObject. */ GEOM_Object RotateThreePoints (in GEOM_Object theObject, - in GEOM_Object theCentPoint, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object theCentPoint, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /*! @@ -732,9 +731,9 @@ module GEOM * \return New GEOM_Object, containing the rotated object. */ GEOM_Object RotateThreePointsCopy (in GEOM_Object theObject, - in GEOM_Object theCentPoint, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object theCentPoint, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /*! * Rotate the given object around the given axis on the given angle. @@ -744,8 +743,8 @@ module GEOM * \return theObject. */ GEOM_Object Rotate (in GEOM_Object theObject, - in GEOM_Object theAxis, - in double theAngle); + in GEOM_Object theAxis, + in double theAngle); /*! @@ -757,8 +756,8 @@ module GEOM * \return New GEOM_Object, containing the rotated object. */ GEOM_Object RotateCopy (in GEOM_Object theObject, - in GEOM_Object theAxis, - in double theAngle); + in GEOM_Object theAxis, + in double theAngle); /*! @@ -771,8 +770,8 @@ module GEOM * shapes, obtained after each rotation. */ GEOM_Object MultiRotate1D (in GEOM_Object theObject, - in GEOM_Object theAxis, - in long theNbTimes); + in GEOM_Object theAxis, + in long theNbTimes); /*! * Rotate the given object around the @@ -790,11 +789,11 @@ module GEOM * shapes, obtained after each transformation. */ GEOM_Object MultiRotate2D (in GEOM_Object theObject, - in GEOM_Object theAxis, - in double theAngle, - in long theNbTimes1, - in double theStep, - in long theNbTimes2); + in GEOM_Object theAxis, + in double theAngle, + in long theNbTimes1, + in double theStep, + in long theNbTimes2); /*! * Replace the given object by an object, @@ -871,7 +870,7 @@ module GEOM * \return theObject. */ GEOM_Object ScaleShape (in GEOM_Object theObject, in GEOM_Object thePoint, - in double theFactor); + in double theFactor); /*! * Scale the given object by the factor, creating its copy before the scaling. @@ -881,7 +880,7 @@ module GEOM * \return New GEOM_Object, containing the scaled shape. */ GEOM_Object ScaleShapeCopy (in GEOM_Object theObject, in GEOM_Object thePoint, - in double theFactor); + in double theFactor); /*! * Scale the given object by different factors along coordinate axes. @@ -922,8 +921,8 @@ module GEOM * \return theObject. */ GEOM_Object PositionShape (in GEOM_Object theObject, - in GEOM_Object theStartLCS, - in GEOM_Object theEndLCS); + in GEOM_Object theStartLCS, + in GEOM_Object theEndLCS); /*! * Modify the Location of the given object by LCS, @@ -938,24 +937,24 @@ module GEOM * \return New GEOM_Object, containing the displaced shape. */ GEOM_Object PositionShapeCopy (in GEOM_Object theObject, - in GEOM_Object theStartLCS, - in GEOM_Object theEndLCS); + in GEOM_Object theStartLCS, + in GEOM_Object theEndLCS); /*! * Modify the Location of the given object by Path, * \param theObject The object to be displaced. * \param thePath Wire or Edge along that the object will be translated. - * \param theDistance progress of Path (0 = actual location, 1 = end of path location). - * \param theCopy is a true or false parameter. true is to create a copy, false to move the object. - * \param theCopy is a true or false parameter. true is to reverse direction, false is to move normal direction. + * \param theDistance progress of Path (0 = actual location, 1 = end of path location). + * \param theCopy is a true or false parameter. true is to create a copy, false to move the object. + * \param theCopy is a true or false parameter. true is to reverse direction, false is to move normal direction. * \return New GEOM_Object, containing the displaced shape. */ GEOM_Object PositionAlongPath (in GEOM_Object theObject, - in GEOM_Object thePath, - in double theDistance, - in boolean theCopy, - in boolean theReverse); + in GEOM_Object thePath, + in double theDistance, + in boolean theCopy, + in boolean theReverse); /*! * Recompute the shape from its arguments. @@ -1019,16 +1018,16 @@ module GEOM * \return New GEOM_Object, containing the created disk. */ GEOM_Object MakeDiskPntVecR (in GEOM_Object thePnt, - in GEOM_Object theVec, - in double theR); + in GEOM_Object theVec, + in double theR); /*! * Create a disk (circular face), passing through three given points * \param thePnt1, thePnt2, thePnt3 Points, defining the disk. * \return New GEOM_Object, containing the created disk. */ GEOM_Object MakeDiskThreePnt (in GEOM_Object thePnt1, - in GEOM_Object thePnt2, - in GEOM_Object thePnt3); + in GEOM_Object thePnt2, + in GEOM_Object thePnt3); /*! * Create a disk specified dimensions along OX-OY coordinate axes, @@ -1058,9 +1057,9 @@ module GEOM * \return New GEOM_Object, containing the created cylinder. */ GEOM_Object MakeCylinderPntVecRH (in GEOM_Object thePnt, - in GEOM_Object theAxis, - in double theR, - in double theH); + in GEOM_Object theAxis, + in double theR, + in double theH); /*! * Create a cone with given height and radiuses at @@ -1087,10 +1086,10 @@ module GEOM * \return New GEOM_Object, containing the created cone. */ GEOM_Object MakeConePntVecR1R2H (in GEOM_Object thePnt, - in GEOM_Object theAxis, - in double theR1, - in double theR2, - in double theH); + in GEOM_Object theAxis, + in double theR1, + in double theR2, + in double theH); /*! * Create a torus with given radiuses at the origin of coordinate system. @@ -1099,7 +1098,7 @@ module GEOM * \return New GEOM_Object, containing the created torus. */ GEOM_Object MakeTorusRR (in double theRMajor, - in double theRMinor); + in double theRMinor); /*! * Create a torus with given center, normal vector and radiuses. @@ -1110,9 +1109,9 @@ module GEOM * \return New GEOM_Object, containing the created torus. */ GEOM_Object MakeTorusPntVecRR (in GEOM_Object thePnt, - in GEOM_Object theVec, - in double theRMajor, - in double theRMinor); + in GEOM_Object theVec, + in double theRMajor, + in double theRMinor); /*! * Create a sphere with given radius at the origin of coordinate system. @@ -1139,12 +1138,12 @@ module GEOM * \return New GEOM_Object, containing the created prism. */ GEOM_Object MakePrismVecH (in GEOM_Object theBase, - in GEOM_Object theVec, - in double theH); + in GEOM_Object theVec, + in double theH); /* The Same Prism but in 2 directions (forward&backward) */ GEOM_Object MakePrismVecH2Ways (in GEOM_Object theBase, - in GEOM_Object theVec, - in double theH); + in GEOM_Object theVec, + in double theH); /*! * Create a shape by extrusion of the base shape along a vector, defined by two points. @@ -1154,12 +1153,12 @@ module GEOM * \return New GEOM_Object, containing the created prism. */ GEOM_Object MakePrismTwoPnt (in GEOM_Object theBase, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /* The same prism but in two directions forward&backward */ GEOM_Object MakePrismTwoPnt2Ways (in GEOM_Object theBase, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /*! * Create a shape by extrusion of the base shape along a vector, defined by DX DY DZ. @@ -1168,7 +1167,7 @@ module GEOM * \return New GEOM_Object, containing the created prism. */ GEOM_Object MakePrismDXDYDZ (in GEOM_Object theBase, - in double theDX, in double theDY, in double theDZ); + in double theDX, in double theDY, in double theDZ); /* The same prism but in two directions forward&backward */ GEOM_Object MakePrismDXDYDZ2Ways (in GEOM_Object theBase, in double theDX, in double theDY, in double theDZ); @@ -1192,12 +1191,12 @@ module GEOM * \return New GEOM_Object, containing the created revolution. */ GEOM_Object MakeRevolutionAxisAngle (in GEOM_Object theBase, - in GEOM_Object theAxis, - in double theAngle); + in GEOM_Object theAxis, + in double theAngle); /* The Same Revolution but in both ways forward&backward */ GEOM_Object MakeRevolutionAxisAngle2Ways (in GEOM_Object theBase, - in GEOM_Object theAxis, - in double theAngle); + in GEOM_Object theAxis, + in double theAngle); /*! * Create a filling from the given compound of contours. @@ -1210,9 +1209,9 @@ module GEOM * \return New GEOM_Object, containing the created filling surface. */ GEOM_Object MakeFilling (in GEOM_Object theShape, - in long theMinDeg, in long theMaxDeg, - in double theTol2D, in double theTol3D, - in long theNbIter, + in long theMinDeg, in long theMaxDeg, + in double theTol2D, in double theTol3D, + in long theNbIter, in filling_oper_method theMethod, in boolean theApprox); @@ -1225,8 +1224,8 @@ module GEOM * \return New GEOM_Object, containing the created shell or solid. */ GEOM_Object MakeThruSections(in ListOfGO theSeqSections, - in boolean theModeSolid, - in double thePreci, + in boolean theModeSolid, + in double thePreci, in boolean theRuled); /*! @@ -1241,14 +1240,14 @@ module GEOM * \param theWithContact - the mode defining that the section is translated to be in * contact with the spine. * \param - WithCorrection - defining that the section is rotated to be - * orthogonal to the spine tangent in the correspondent point + * orthogonal to the spine tangent in the correspondent point * \return New GEOM_Object, containing the created pipe. */ GEOM_Object MakePipeWithDifferentSections (in ListOfGO theSeqBases, - in ListOfGO theLocations, - in GEOM_Object thePath, - in boolean theWithContact , - in boolean theWithCorrection ); + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact , + in boolean theWithCorrection ); /*! * Create a shape by extrusion of the profile shape along @@ -1263,15 +1262,15 @@ module GEOM * \param theWithContact - the mode defining that the section is translated to be in * contact with the spine. * \param - WithCorrection - defining that the section is rotated to be - * orthogonal to the spine tangent in the correspondent point + * orthogonal to the spine tangent in the correspondent point * \return New GEOM_Object, containing the created pipe. */ GEOM_Object MakePipeWithShellSections (in ListOfGO theSeqBases, - in ListOfGO theSeqSubBases, - in ListOfGO theLocations, - in GEOM_Object thePath, - in boolean theWithContact , - in boolean theWithCorrection ); + in ListOfGO theSeqSubBases, + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact , + in boolean theWithCorrection ); /*! * Create solids between given sections @@ -1280,7 +1279,7 @@ module GEOM * \return New GEOM_Object, containing the created solids. */ GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases, - in ListOfGO theLocations); + in ListOfGO theLocations); /*! * Create a shape by extrusion of the base shape along @@ -1294,8 +1293,8 @@ module GEOM * \return New GEOM_Object, containing the created pipe. */ GEOM_Object MakePipeBiNormalAlongVector (in GEOM_Object theBase, - in GEOM_Object thePath, - in GEOM_Object theVec); + in GEOM_Object thePath, + in GEOM_Object theVec); }; @@ -1397,7 +1396,18 @@ module GEOM * \return New GEOM_Object, containing a copy of theShape without some faces. */ GEOM_Object MakeGlueFacesByList (in GEOM_Object theShape, in double theTolerance, - in ListOfGO theFaces, in boolean doKeepNonSolids); + in ListOfGO theFaces, in boolean doKeepNonSolids); + + /*! + * Get all sub-shapes and groups of \a theShape, + * that were created already by any other methods. + * \param theShape Any shape. + * \param theGroupsOnly If this parameter is TRUE, only groups will be + * returned, else all found sub-shapes and groups. + * \return List of existing sub-objects of \a theShape. + */ + ListOfGO GetExistingSubObjects (in GEOM_Object theShape, + in boolean theGroupsOnly); /*! * Explode a shape on subshapes of a given type. @@ -1408,8 +1418,8 @@ module GEOM * \return List of sub-shapes of type theShapeType, contained in theShape. */ ListOfGO MakeExplode (in GEOM_Object theShape, - in long theShapeType, - in boolean isSorted); + in long theShapeType, + in boolean isSorted); /*! * Explode a shape on subshapes of a given type. @@ -1422,8 +1432,8 @@ module GEOM * \return List of IDs of sub-shapes of type theShapeType, contained in theShape. */ ListOfLong SubShapeAllIDs (in GEOM_Object theShape, - in long theShapeType, - in boolean isSorted); + in long theShapeType, + in boolean isSorted); /*! * Get a sub shape defined by its unique ID inside \a theMainShape @@ -1431,7 +1441,7 @@ module GEOM * Don't try to apply modification operations on them. */ GEOM_Object GetSubShape (in GEOM_Object theMainShape, - in long theID); + in long theID); /*! * Get global index of \a theSubShape in \a theMainShape. @@ -1508,8 +1518,8 @@ module GEOM * \return List of sub-shapes of theShape1, shared with theShape2. */ ListOfGO GetSharedShapes (in GEOM_Object theShape1, - in GEOM_Object theShape2, - in long theShapeType); + in GEOM_Object theShape2, + in long theShapeType); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1522,9 +1532,9 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnPlane (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAx1, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAx1, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively * the specified plane by the certain way, defined through \a theState parameter. @@ -1537,10 +1547,10 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnPlaneWithLocation (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAx1, - in GEOM_Object thePnt, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAx1, + in GEOM_Object thePnt, + in shape_state theState); @@ -1556,10 +1566,10 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnCylinder (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAxis, - in double theRadius, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAxis, + in double theRadius, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1591,10 +1601,10 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnSphere (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theCenter, - in double theRadius, - in shape_state theState); + in long theShapeType, + in GEOM_Object theCenter, + in double theRadius, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1627,9 +1637,9 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnPlaneIDs (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAx1, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAx1, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1643,10 +1653,10 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnPlaneWithLocationIDs (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAx1, - in GEOM_Object thePnt, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAx1, + in GEOM_Object thePnt, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1660,10 +1670,10 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnCylinderIDs (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theAxis, - in double theRadius, - in shape_state theState); + in long theShapeType, + in GEOM_Object theAxis, + in double theRadius, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1695,10 +1705,10 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnSphereIDs (in GEOM_Object theShape, - in long theShapeType, - in GEOM_Object theCenter, - in double theRadius, - in shape_state theState); + in long theShapeType, + in GEOM_Object theCenter, + in double theRadius, + in shape_state theState); /*! * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively @@ -1729,9 +1739,9 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnBoxIDs (in GEOM_Object theBox, - in GEOM_Object theShape, - in long theShapeType, - in shape_state theState); + in GEOM_Object theShape, + in long theShapeType, + in shape_state theState); /*! * \brief Find subshapes complying with given status @@ -1742,9 +1752,9 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnBox (in GEOM_Object theBox, - in GEOM_Object theShape, - in long theShapeType, - in shape_state theState); + in GEOM_Object theShape, + in long theShapeType, + in shape_state theState); /*! * \brief Find subshapes complying with given status @@ -1755,9 +1765,9 @@ module GEOM * \return List of IDs of all found sub-shapes. */ ListOfLong GetShapesOnShapeIDs (in GEOM_Object theCheckShape, - in GEOM_Object theShape, - in short theShapeType, - in shape_state theState); + in GEOM_Object theShape, + in short theShapeType, + in shape_state theState); /*! * \brief Find subshapes complying with given status @@ -1768,9 +1778,9 @@ module GEOM * \return List of all found sub-shapes. */ ListOfGO GetShapesOnShape (in GEOM_Object theCheckShape, - in GEOM_Object theShape, - in short theShapeType, - in shape_state theState); + in GEOM_Object theShape, + in short theShapeType, + in shape_state theState); /*! * \brief Find subshapes complying with given status @@ -1781,9 +1791,9 @@ module GEOM * \return compound includes all found sub-shapes. */ GEOM_Object GetShapesOnShapeAsCompound (in GEOM_Object theCheckShape, - in GEOM_Object theShape, - in short theShapeType, - in shape_state theState); + in GEOM_Object theShape, + in short theShapeType, + in shape_state theState); /*! * Get sub-shape(s) of \a theShapeWhere, which are @@ -1793,7 +1803,7 @@ module GEOM * \return Group of all found sub-shapes or a single found sub-shape. */ GEOM_Object GetInPlace (in GEOM_Object theShapeWhere, - in GEOM_Object theShapeWhat); + in GEOM_Object theShapeWhat); /*! * Get sub-shape(s) of \a theShapeWhere, which are @@ -1810,7 +1820,7 @@ module GEOM * \return Group of all found sub-shapes or a single found sub-shape. */ GEOM_Object GetInPlaceByHistory (in GEOM_Object theShapeWhere, - in GEOM_Object theShapeWhat); + in GEOM_Object theShapeWhat); /*! * Get sub-shape of theShapeWhere, which are @@ -1820,7 +1830,7 @@ module GEOM * \return found sub-shape. */ GEOM_Object GetSame (in GEOM_Object theShapeWhere, - in GEOM_Object theShapeWhat); + in GEOM_Object theShapeWhat); }; /*! @@ -1841,9 +1851,9 @@ module GEOM * \return New GEOM_Object, containing the created face. */ GEOM_Object MakeQuad (in GEOM_Object theEdge1, - in GEOM_Object theEdge2, - in GEOM_Object theEdge3, - in GEOM_Object theEdge4); + in GEOM_Object theEdge2, + in GEOM_Object theEdge3, + in GEOM_Object theEdge4); /*! * Create a quadrangle face on two edges. @@ -1852,7 +1862,7 @@ module GEOM * \return New GEOM_Object, containing the created face. */ GEOM_Object MakeQuad2Edges (in GEOM_Object theEdge1, - in GEOM_Object theEdge2); + in GEOM_Object theEdge2); /*! * Create a quadrangle face with specified corners. @@ -1861,9 +1871,9 @@ module GEOM * \return New GEOM_Object, containing the created face. */ GEOM_Object MakeQuad4Vertices (in GEOM_Object thePnt1, - in GEOM_Object thePnt2, - in GEOM_Object thePnt3, - in GEOM_Object thePnt4); + in GEOM_Object thePnt2, + in GEOM_Object thePnt3, + in GEOM_Object thePnt4); /*! * Create a hexahedral solid, bounded by the six given faces. Order of @@ -1872,11 +1882,11 @@ module GEOM * \return New GEOM_Object, containing the created solid. */ GEOM_Object MakeHexa (in GEOM_Object theFace1, - in GEOM_Object theFace2, - in GEOM_Object theFace3, - in GEOM_Object theFace4, - in GEOM_Object theFace5, - in GEOM_Object theFace6); + in GEOM_Object theFace2, + in GEOM_Object theFace3, + in GEOM_Object theFace4, + in GEOM_Object theFace5, + in GEOM_Object theFace6); /*! * Create a hexahedral solid between two given faces. @@ -1885,7 +1895,7 @@ module GEOM * \return New GEOM_Object, containing the created solid. */ GEOM_Object MakeHexa2Faces (in GEOM_Object theFace1, - in GEOM_Object theFace2); + in GEOM_Object theFace2); /*! * Extract elements of blocks and blocks compounds @@ -1900,10 +1910,19 @@ module GEOM * \return New GEOM_Object, containing the found vertex. */ GEOM_Object GetPoint (in GEOM_Object theShape, - in double theX, - in double theY, - in double theZ, - in double theEpsilon); + in double theX, + in double theY, + in double theZ, + in double theEpsilon); + + /*! + * Find a vertex of the given shape, which has minimal distance to the given point. + * \param theShape Any shape. + * \param thePoint Point, close to the desired vertex. + * \return New GEOM_Object, containing the found vertex. + */ + GEOM_Object GetVertexNearPoint (in GEOM_Object theShape, + in GEOM_Object thePoint); /*! * Get an edge, found in the given shape by two given vertices. @@ -1912,8 +1931,8 @@ module GEOM * \return New GEOM_Object, containing the found edge. */ GEOM_Object GetEdge (in GEOM_Object theShape, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2); + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); /*! * Find an edge of the given shape, which has minimal distance to the given point. @@ -1922,7 +1941,7 @@ module GEOM * \return New GEOM_Object, containing the found edge. */ GEOM_Object GetEdgeNearPoint (in GEOM_Object theShape, - in GEOM_Object thePoint); + in GEOM_Object thePoint); /*! * Returns a face, found in the given shape by four given corner vertices. @@ -1931,10 +1950,10 @@ module GEOM * \return New GEOM_Object, containing the found face. */ GEOM_Object GetFaceByPoints (in GEOM_Object theShape, - in GEOM_Object thePoint1, - in GEOM_Object thePoint2, - in GEOM_Object thePoint3, - in GEOM_Object thePoint4); + in GEOM_Object thePoint1, + in GEOM_Object thePoint2, + in GEOM_Object thePoint3, + in GEOM_Object thePoint4); /*! * Get a face of block, found in the given shape by two given edges. @@ -1943,8 +1962,8 @@ module GEOM * \return New GEOM_Object, containing the found face. */ GEOM_Object GetFaceByEdges (in GEOM_Object theShape, - in GEOM_Object theEdge1, - in GEOM_Object theEdge2); + in GEOM_Object theEdge1, + in GEOM_Object theEdge2); /*! * Find a face, opposite to the given one in the given block. @@ -1953,7 +1972,7 @@ module GEOM * \return New GEOM_Object, containing the found face. */ GEOM_Object GetOppositeFace (in GEOM_Object theBlock, - in GEOM_Object theFace); + in GEOM_Object theFace); /*! * Find a face of the given shape, which has minimal distance to the given point. @@ -1962,7 +1981,7 @@ module GEOM * \return New GEOM_Object, containing the found face. */ GEOM_Object GetFaceNearPoint (in GEOM_Object theShape, - in GEOM_Object thePoint); + in GEOM_Object thePoint); /*! * Find a face of block, whose outside normale has minimal angle with the given vector. @@ -1971,7 +1990,23 @@ module GEOM * \return New GEOM_Object, containing the found face. */ GEOM_Object GetFaceByNormale (in GEOM_Object theBlock, - in GEOM_Object theVector); + in GEOM_Object theVector); + + /*! + * Find all subshapes of type \a theShapeType of the given shape, + * which have minimal distance to the given point. + * \param theShape Any shape. + * \param thePoint Point, close to the desired shape. + * \param theShapeType Defines what kind of subshapes is searched. + * \param theTolerance The tolerance for distances comparison. All shapes + * with distances to the given point in interval + * [minimal_distance, minimal_distance + theTolerance] will be gathered. + * \return New GEOM_Object, containing a group of all found shapes. + */ + GEOM_Object GetShapesNearPoint (in GEOM_Object theShape, + in GEOM_Object thePoint, + in long theShapeType, + in double theTolerance); /*! * Extract blocks from blocks compounds @@ -1987,9 +2022,9 @@ module GEOM * \return theNbBlocks Number of specified blocks in theCompound. */ boolean IsCompoundOfBlocks (in GEOM_Object theCompound, - in long theMinNbFaces, - in long theMaxNbFaces, - out long theNbBlocks); + in long theMinNbFaces, + in long theMaxNbFaces, + out long theNbBlocks); /*! * Enumeration of Blocks Compound defects. @@ -2040,7 +2075,7 @@ module GEOM * \return theErrors Structure, containing discovered errors and incriminated sub-shapes. */ boolean CheckCompoundOfBlocks (in GEOM_Object theCompound, - out BCErrors theErrors); + out BCErrors theErrors); /*! * Convert sequence of Blocks Compound errors, returned by @@ -2050,7 +2085,7 @@ module GEOM * \return String, describing all the errors in form, suitable for printing. */ string PrintBCErrors (in GEOM_Object theCompound, - in BCErrors theErrors); + in BCErrors theErrors); /*! * Remove all seam and degenerated edges from \a theShape. @@ -2083,8 +2118,8 @@ module GEOM * \return List of GEOM_Objects, containing the retrieved blocks. */ ListOfGO ExplodeCompoundOfBlocks (in GEOM_Object theCompound, - in long theMinNbFaces, - in long theMaxNbFaces); + in long theMinNbFaces, + in long theMaxNbFaces); /*! * Find block, containing the given point inside its volume or on boundary. @@ -2094,7 +2129,7 @@ module GEOM * \return New GEOM_Object, containing the found block. */ GEOM_Object GetBlockNearPoint (in GEOM_Object theCompound, - in GEOM_Object thePoint); + in GEOM_Object thePoint); /*! * Find block, containing all the elements, passed as the parts, or maximum quantity of them. @@ -2103,7 +2138,7 @@ module GEOM * \return New GEOM_Object, containing the found block. */ GEOM_Object GetBlockByParts (in GEOM_Object theCompound, - in ListOfGO theParts); + in ListOfGO theParts); /*! * Return all blocks, containing all the elements, passed as the parts. @@ -2112,7 +2147,7 @@ module GEOM * \return List of GEOM_Objects, containing the found blocks. */ ListOfGO GetBlocksByParts (in GEOM_Object theCompound, - in ListOfGO theParts); + in ListOfGO theParts); /*! * Operations on blocks with gluing of result @@ -2130,9 +2165,9 @@ module GEOM * \return New GEOM_Object, containing the result shape. */ GEOM_Object MakeMultiTransformation1D (in GEOM_Object theBlock, - in long theDirFace1, - in long theDirFace2, - in long theNbTimes); + in long theDirFace1, + in long theDirFace2, + in long theNbTimes); /*! * Multi-transformate block and glue the result. @@ -2726,6 +2761,14 @@ module GEOM GEOM_Object ChangeOrientation (in GEOM_Object theObject); GEOM_Object ChangeOrientationCopy (in GEOM_Object theObject); + /*! + * Try to limit tolerance of the given object by value \a theTolerance. + * \param theObject Shape to be processed. + * \param theTolerance Required tolerance value. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object LimitTolerance (in GEOM_Object theObject, in double theTolerance); + }; /*! @@ -2916,8 +2959,7 @@ module GEOM * \return New GEOM_Object, containing the created point. */ GEOM_Object GetCentreOfMass (in GEOM_Object theShape); - - + /* * Get the vertex by index for 1D objects depends the edge/wire orientation * \param theShape Shape (wire or edge) to find the vertex on it diff --git a/resources/Makefile.am b/resources/Makefile.am index 3ba2946e0..f8bc0a9dc 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -93,6 +93,7 @@ filletface.png \ filling.png \ fuse.png \ geometry.png \ +limit_tolerance.png \ line.png \ line2points.png \ line2faces.png \ diff --git a/resources/limit_tolerance.png b/resources/limit_tolerance.png new file mode 100644 index 0000000000000000000000000000000000000000..35f20804e63c150e81b78be80e32474caa2c1c46 GIT binary patch literal 565 zcmV-50?Pe~P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-t4TybRCwBA{Qv(y12q9a0I|RrjEsyJk|y!}SZzDA zu#gd#fdB!-f=v)+5Ktozkdgpm9vt!*1_J~T1IWwB-i9jX24ZC(wg%#0AdW}FATets zwQv9sKqv+xDbR;%3Wgf0kA`6u1*01Z5J1?xtOE7s3ncs%O$|3xjRcaOJ0Nuc0R(p; z)Fx#lS0Q@^S5n|c@;XQ_13&;Vp(%jbh~g?HCa^MbjPQb}d4Z&t8z6vKuo(CPNzs3( zVIV_a{QLJ0oWjubAR8zF5J2cI1SO9zNUq}n8UhL*1|VGlq(Y!x<3@8OOfL^W0I?8A z_#j0pP?y1i;|rRlC;%XUmwN)gI)bD4;z7!KJV+7t6(E4n4Ma9n1ugv0!wi;;?!fag z5C8-aHUrT!KSp^7wE%130T4jA3`92=mw_0G8z8^{vYo7x#-!Ws00000NkvXXu0mjf De$2&r literal 0 HcmV?d00001 diff --git a/src/BasicGUI/BasicGUI_PointDlg.cxx b/src/BasicGUI/BasicGUI_PointDlg.cxx index ef68dfb54..6fe83b1e4 100644 --- a/src/BasicGUI/BasicGUI_PointDlg.cxx +++ b/src/BasicGUI/BasicGUI_PointDlg.cxx @@ -899,9 +899,11 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) if ( GEOMBase::GetShape( anObj, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) { gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); - myX->setText( QString( "%1" ).arg( aPnt.X() ) ); - myY->setText( QString( "%1" ).arg( aPnt.Y() ) ); - myZ->setText( QString( "%1" ).arg( aPnt.Z() ) ); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myX->setText( DlgRef::PrintDoubleValue( aPnt.X(), aPrecision ) ); + myY->setText( DlgRef::PrintDoubleValue( aPnt.Y(), aPrecision ) ); + myZ->setText( DlgRef::PrintDoubleValue( aPnt.Z(), aPrecision ) ); } else { myX->setText( "" ); diff --git a/src/DisplayGUI/DisplayGUI.cxx b/src/DisplayGUI/DisplayGUI.cxx index 7d131f0eb..d77481e8f 100644 --- a/src/DisplayGUI/DisplayGUI.cxx +++ b/src/DisplayGUI/DisplayGUI.cxx @@ -342,6 +342,7 @@ void DisplayGUI::SetDisplayMode( const int mode, SUIT_ViewWindow* viewWindow ) if ( viewWindow->getViewManager()->getType() == SVTK_Viewer::Type() ) { SVTK_View* aView = ((SVTK_ViewWindow*)viewWindow)->getView(); aView->SetDisplayMode( mode ); + GeometryGUI::Modified(); } else if ( viewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)(viewWindow->getViewManager()))->getOCCViewer(); @@ -363,6 +364,7 @@ void DisplayGUI::SetDisplayMode( const int mode, SUIT_ViewWindow* viewWindow ) } ic->SetDisplayMode( newmode, Standard_False ); + GeometryGUI::Modified(); } } @@ -413,6 +415,7 @@ void DisplayGUI::SetVectorMode( const bool mode, SUIT_ViewWindow* viewWindow ) } } } + GeometryGUI::Modified(); } else if ( viewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { viewWindow->setCustomData( "VectorsMode", QVariant( mode ) ); @@ -433,6 +436,7 @@ void DisplayGUI::SetVectorMode( const bool mode, SUIT_ViewWindow* viewWindow ) } ite.Next(); } + GeometryGUI::Modified(); } } @@ -504,6 +508,7 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow } } aView->Repaint(); + GeometryGUI::Modified(); } else if ( viewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)(viewWindow->getViewManager()))->getOCCViewer(); @@ -534,6 +539,7 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow } } ic->UpdateCurrentViewer(); + GeometryGUI::Modified(); } } diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index d3a0bc5ec..9bd1c3fb3 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -781,13 +781,12 @@ QString DlgRef::PrintDoubleValue( double theValue, int thePrecision ) if ( qAbs(theValue) < prec ) return "0"; - QString aRes; - aRes.setNum( theValue, 'g', thePrecision ); + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( thePrecision ) ); if ( prec > 0 ) { int p = 0; while ( p < thePrecision ) { - aRes.setNum( theValue, 'g', p++ ); + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( p++ ) ); double v = aRes.toDouble(); double err = qAbs( theValue - v ); if ( err > 0 && err <= prec ) @@ -796,21 +795,19 @@ QString DlgRef::PrintDoubleValue( double theValue, int thePrecision ) } // remove trailing zeroes - QString delim( "." ); - int idx = aRes.lastIndexOf( delim ); - if ( idx == -1 ) - return aRes; + QRegExp expre( QString( "(%1|%2)[+-]?[0-9]+$" ).arg( QLocale().exponential().toLower(), + QLocale().exponential().toUpper() ) ); - QString iPart = aRes.left( idx ); - QString fPart = aRes.mid( idx + 1 ); - - while ( !fPart.isEmpty() && fPart.at( fPart.length() - 1 ) == '0' ) - fPart.remove( fPart.length() - 1, 1 ); + int idx = aRes.indexOf( expre ); + QString aResExp = ""; + if ( idx >= 0 ) { + aResExp = aRes.mid( idx ); + aRes = aRes.left( idx ); + } - aRes = iPart; - if ( !fPart.isEmpty() ) - aRes += delim + fPart; + if ( aRes.contains( QLocale().decimalPoint() ) ) + aRes.remove( QRegExp( QString( "(\\%1|0)0*$" ).arg( QLocale().decimalPoint() ) ) ); - return aRes; + return aRes == "-0" ? QString( "0" ) : aRes + aResExp; } diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx index 5de5a1e17..b0ea5a0c2 100644 --- a/src/GEOM/GEOM_Engine.cxx +++ b/src/GEOM/GEOM_Engine.cxx @@ -310,7 +310,7 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape, Handle(TColStd_HArray1OfInteger) theIndices, bool isStandaloneOperation) { - if(theMainShape.IsNull() || theIndices.IsNull()) return NULL; + if (theMainShape.IsNull() || theIndices.IsNull()) return NULL; Handle(TDocStd_Document) aDoc = GetDocument(theMainShape->GetDocID()); Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main()); @@ -319,21 +319,6 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape, // if this label has been freed (object deleted) bool useExisting = false; TDF_Label aChild; - /* - if (!_lastCleared.IsNull()) { - if (_lastCleared.Root() == aDoc->Main().Root()) { - useExisting = true; - aChild = _lastCleared; - // 0020229: if next label exists and is empty, try to reuse it - Standard_Integer aNextTag = aChild.Tag() + 1; - TDF_Label aNextL = aDoc->Main().FindChild(aNextTag, Standard_False); - if (!aNextL.IsNull() && !aNextL.HasAttribute()) - _lastCleared = aNextL; - else - _lastCleared.Nullify(); - } - } - */ int aDocID = theMainShape->GetDocID(); if (_freeLabels.find(aDocID) != _freeLabels.end()) { std::list& aFreeLabels = _freeLabels[aDocID]; @@ -349,10 +334,10 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape, } Handle(GEOM_Function) aMainShape = theMainShape->GetLastFunction(); - Handle(GEOM_Object) anObject = new GEOM_Object(aChild, 28); //28 is SUBSHAPE type + Handle(GEOM_Object) anObject = new GEOM_Object (aChild, 28); //28 is SUBSHAPE type Handle(GEOM_Function) aFunction = anObject->AddFunction(GEOM_Object::GetSubShapeID(), 1); - GEOM_ISubShape aSSI(aFunction); + GEOM_ISubShape aSSI (aFunction); aSSI.SetMainShape(aMainShape); aSSI.SetIndices(theIndices); @@ -372,11 +357,14 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape, return NULL; } - //Put an object in the map of created objects + // Put an object in the map of created objects TCollection_AsciiString anID = BuildIDFromObject(anObject); - if(_objects.IsBound(anID)) _objects.UnBind(anID); + if (_objects.IsBound(anID)) _objects.UnBind(anID); _objects.Bind(anID, anObject); + // Put this subshape in the list of subshapes of theMainShape + aMainShape->AddSubShapeReference(aFunction); + GEOM::TPythonDump pd (aFunction); if (isStandaloneOperation) { @@ -410,9 +398,17 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject) TCollection_AsciiString anID = BuildIDFromObject(theObject); if (_objects.IsBound(anID)) _objects.UnBind(anID); + // If subshape, remove it from the list of subshapes of its main shape + if (!theObject->IsMainShape()) { + Handle(GEOM_Function) aFunction = theObject->GetFunction(1); + GEOM_ISubShape aSSI (aFunction); + Handle(GEOM_Function) aMainShape = aSSI.GetMainShape(); + aMainShape->RemoveSubShapeReference(aFunction); + } + int nb = theObject->GetNbFunctions(); Handle(TDataStd_TreeNode) aNode; - for (int i = 1; i<=nb; i++) { + for (int i = 1; i <= nb; i++) { Handle(GEOM_Function) aFunction = theObject->GetFunction(i); if (aFunction->GetEntry().FindAttribute(GEOM_Function::GetFunctionTreeID(), aNode)) aNode->Remove(); diff --git a/src/GEOM/GEOM_Function.cxx b/src/GEOM/GEOM_Function.cxx index 3a348fd5e..46da48dfc 100644 --- a/src/GEOM/GEOM_Function.cxx +++ b/src/GEOM/GEOM_Function.cxx @@ -18,7 +18,6 @@ // 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 @@ -43,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -64,6 +64,8 @@ #define RESULT_LABEL 2 #define DESCRIPTION_LABEL 3 #define HISTORY_LABEL 4 +#define SUBSHAPES_LABEL 5 // 0020756: GetGroups +#define NAMING_LABEL 6 // 002020750: Naming during STEP import #define ARGUMENTS _label.FindChild((ARGUMENT_LABEL)) #define ARGUMENT(thePosition) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePosition)) @@ -471,8 +473,8 @@ TCollection_AsciiString GEOM_Function::GetString(int thePosition) void GEOM_Function::SetReference(int thePosition, Handle(GEOM_Function) theReference) { _isDone = false; - if(thePosition <= 0) return; - if(theReference.IsNull()) return; + if (thePosition <= 0) return; + if (theReference.IsNull()) return; TDF_Label anArgLabel = ARGUMENT(thePosition); TDF_Reference::Set(anArgLabel, theReference->GetEntry()); TDataStd_UAttribute::Set(anArgLabel, GetDependencyID()); @@ -670,6 +672,85 @@ void GEOM_Function::GetDependency(TDF_LabelSequence& theSeq) } } +//============================================================================= +/*! + * AddSubShapeReference + */ +//============================================================================= +void GEOM_Function::AddSubShapeReference(Handle(GEOM_Function) theSubShape) +{ + _isDone = false; + + TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL); + + Handle(TDataStd_ExtStringList) aList; + if (!aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) { + aList = new TDataStd_ExtStringList; + aSubShapesLabel.AddAttribute(aList); + } + + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theSubShape->GetOwnerEntry(), anEntry); + aList->Append(anEntry); + + _isDone = true; +} + +//============================================================================= +/*! + * RemoveSubShapeReference + */ +//============================================================================= +void GEOM_Function::RemoveSubShapeReference(Handle(GEOM_Function) theSubShape) +{ + _isDone = false; + + TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL); + + Handle(TDataStd_ExtStringList) aList; + if (aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) { + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theSubShape->GetOwnerEntry(), anEntry); + aList->Remove(anEntry); + } + + _isDone = true; +} + +//============================================================================= +/*! + * HasSubShapeReferences + */ +//============================================================================= +bool GEOM_Function::HasSubShapeReferences() +{ + _isDone = true; + + TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL); + return aSubShapesLabel.IsAttribute(TDataStd_ExtStringList::GetID()); +} + +//============================================================================= +/*! + * GetSubShapeReferences + */ +//============================================================================= +const TDataStd_ListOfExtendedString& GEOM_Function::GetSubShapeReferences() +{ + _isDone = false; + + TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL); + + Handle(TDataStd_ExtStringList) aList; + if (!aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) { + aList = new TDataStd_ExtStringList; + aSubShapesLabel.AddAttribute(aList); + } + + _isDone = true; + return aList->List(); +} + //============================================================================= /*! * GetHistoryEntry @@ -713,6 +794,16 @@ TDF_Label GEOM_Function::GetArgumentHistoryEntry (const TDF_Label& theArgu return aHistoryCurLabel; } +//============================================================================= +/*! + * GetNamingEntry + */ +//============================================================================= +TDF_Label GEOM_Function::GetNamingEntry (const Standard_Boolean create) +{ + return _label.FindChild(NAMING_LABEL, create); +} + //======================================================================= //function : GEOM_Function_Type_ //purpose : @@ -721,10 +812,9 @@ Standard_EXPORT Handle_Standard_Type& GEOM_Function_Type_() { static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared); + if (aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared); static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient); - + if (aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient); static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOM_Function", @@ -751,5 +841,5 @@ const Handle(GEOM_Function) Handle(GEOM_Function)::DownCast(const Handle(Standar } } - return _anOtherObject ; + return _anOtherObject; } diff --git a/src/GEOM/GEOM_Function.hxx b/src/GEOM/GEOM_Function.hxx index 4cd9fe3ff..9476ae2e6 100644 --- a/src/GEOM/GEOM_Function.hxx +++ b/src/GEOM/GEOM_Function.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_Function_HeaderFile #define _GEOM_Function_HeaderFile @@ -34,10 +33,10 @@ #endif #ifndef _Handle_MMgt_TShared_HeaderFile #include -#endif +#endif #ifndef _MMgt_TShared_HeaderFile #include -#endif +#endif #ifndef _Standard_GUID_HeaderFile #include #endif @@ -65,31 +64,31 @@ class Handle(MMgt_TShared); class GEOM_Function; #include - +#include Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_Function); class Handle(GEOM_Function) : public Handle(MMgt_TShared) { public: - inline void* operator new(size_t,void* anAddress) + inline void* operator new(size_t,void* anAddress) { return anAddress; } - inline void* operator new(size_t size) - { - return Standard::Allocate(size); + inline void* operator new(size_t size) + { + return Standard::Allocate(size); } - inline void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); } - Handle(GEOM_Function)():Handle(MMgt_TShared)() {} - Handle(GEOM_Function)(const Handle(GEOM_Function)& aHandle) : Handle(MMgt_TShared)(aHandle) + Handle(GEOM_Function)():Handle(MMgt_TShared)() {} + Handle(GEOM_Function)(const Handle(GEOM_Function)& aHandle) : Handle(MMgt_TShared)(aHandle) { } - Handle(GEOM_Function)(const GEOM_Function* anItem) : Handle(MMgt_TShared)((MMgt_TShared *)anItem) + Handle(GEOM_Function)(const GEOM_Function* anItem) : Handle(MMgt_TShared)((MMgt_TShared *)anItem) { } @@ -105,18 +104,18 @@ class Handle(GEOM_Function) : public Handle(MMgt_TShared) { return *this; } - GEOM_Function* operator->() + GEOM_Function* operator->() { return (GEOM_Function *)ControlAccess(); } - GEOM_Function* operator->() const + GEOM_Function* operator->() const { return (GEOM_Function *)ControlAccess(); } Standard_EXPORT ~Handle(GEOM_Function)() {}; - + Standard_EXPORT static const Handle(GEOM_Function) DownCast(const Handle(Standard_Transient)& AnObject); }; @@ -125,24 +124,26 @@ class GEOM_Function : public MMgt_TShared public: - inline void* operator new(size_t,void* anAddress) + inline void* operator new(size_t,void* anAddress) { return anAddress; } - inline void* operator new(size_t size) - { - return Standard::Allocate(size); + inline void* operator new(size_t size) + { + return Standard::Allocate(size); } - inline void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); } // Type management // Standard_EXPORT friend Handle_Standard_Type& GEOM_Function_Type_(); - Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOM_Function) ; } - Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOM_Function) == AType || MMgt_TShared::IsKind(AType)); } + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const + { return STANDARD_TYPE(GEOM_Function) ; } + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const + { return (STANDARD_TYPE(GEOM_Function) == AType || MMgt_TShared::IsKind(AType)); } private: @@ -150,22 +151,22 @@ private: public: - //Returns a GUID for a function tree + //Returns a GUID for a function tree Standard_EXPORT static const Standard_GUID& GetFunctionTreeID(); - //Returns the ID which is associated with a reference to another function + //Returns the ID which is associated with a reference to another function Standard_EXPORT static const Standard_GUID& GetDependencyID(); //Finds and returns a function located on a label theEntry Standard_EXPORT static Handle(GEOM_Function) GetFunction(const TDF_Label& theEntry); - Standard_EXPORT GEOM_Function(const TDF_Label& theEntry, const Standard_GUID& theGUID, int theType); + Standard_EXPORT GEOM_Function(const TDF_Label& theEntry, const Standard_GUID& theGUID, int theType); Standard_EXPORT ~GEOM_Function() {;} Standard_EXPORT TDF_Label GetOwnerEntry(); - //Access to properties + //Access to properties //Returns a result of the function built by the function Driver Standard_EXPORT TopoDS_Shape GetValue(); @@ -177,7 +178,7 @@ public: Standard_EXPORT TDF_Label& GetEntry() { return _label; } //Returns the type of the function - Standard_EXPORT int GetType(); + Standard_EXPORT int GetType(); //Returns a function Driver GUID Standard_EXPORT Standard_GUID GetDriverGUID(); @@ -185,8 +186,8 @@ public: //Returns aPython description of the function Standard_EXPORT TCollection_AsciiString GetDescription(); - //Sets aPython description of the function - Standard_EXPORT void SetDescription(const TCollection_AsciiString& theDescription); + //Sets aPython description of the function + Standard_EXPORT void SetDescription(const TCollection_AsciiString& theDescription); //Access to arguments @@ -206,8 +207,8 @@ public: Standard_EXPORT void SetInteger(int thePosition, int theValue); //Returns an integer argument at position thePosition - Standard_EXPORT int GetInteger(int thePosition); - + Standard_EXPORT int GetInteger(int thePosition); + //Sets an integer array argument at position thePosition Standard_EXPORT void SetIntegerArray(int thePosition, const Handle(TColStd_HArray1OfInteger)& theArray); @@ -221,18 +222,18 @@ public: Standard_EXPORT void SetString(int thePosition, const TCollection_AsciiString& theValue); //Returns a string argument at position thePosition - Standard_EXPORT TCollection_AsciiString GetString(int thePosition); - + Standard_EXPORT TCollection_AsciiString GetString(int thePosition); + //Returns a reference to other function argument at position thePosition - Standard_EXPORT Handle(GEOM_Function) GetReference(int thePosition); + Standard_EXPORT Handle(GEOM_Function) GetReference(int thePosition); //Set an array of ExtendedString Standard_EXPORT void SetStringArray(int thePosition, const Handle(TColStd_HArray1OfExtendedString)& theArray); - + //Returns the array of ExtendedString Standard_EXPORT Handle(TColStd_HArray1OfExtendedString) GetStringArray(int thePosition); - //Returns a GUID for a references tree + //Returns a GUID for a references tree Standard_EXPORT static const Standard_GUID& GetReferencesTreeID(); //Sets a list of references to other function arguments at position thePosition @@ -240,33 +241,41 @@ public: const Handle(TColStd_HSequenceOfTransient)& theRefList); //Returns a list of references to other function arguments at position thePosition - Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetReferenceList (int thePosition); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetReferenceList (int thePosition); //Sets a TopoDS_Shape argument at position thePosition //void SetShape(int thePosition, const TopoDS_Shape& theShape); - + //Returns a TopoDS_Shape argument at position thePosition - //TopoDS_Shape GetShape(int thePosition); - - //Returns true if the last method succided + //TopoDS_Shape GetShape(int thePosition); + + //Returns true if the last method succided Standard_EXPORT bool IsDone() { return _isDone; } //Returns a sequence of the external dependencies of this function Standard_EXPORT void GetDependency(TDF_LabelSequence& theSeq); + // Add/Remove/Check/Get subshape references + Standard_EXPORT void AddSubShapeReference (Handle(GEOM_Function) theSubShape); + Standard_EXPORT void RemoveSubShapeReference(Handle(GEOM_Function) theSubShape); + Standard_EXPORT bool HasSubShapeReferences(); + Standard_EXPORT const TDataStd_ListOfExtendedString& GetSubShapeReferences(); + //Returns top label of this function's history tree Standard_EXPORT TDF_Label GetHistoryEntry (const Standard_Boolean create = Standard_True); //Returns history label, corresponding to the label, //on which a reference on argument is stored Standard_EXPORT TDF_Label GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry, - const Standard_Boolean create = Standard_True); + const Standard_Boolean create = Standard_True); + + //Returns top label of this function's naming tree + Standard_EXPORT TDF_Label GetNamingEntry (const Standard_Boolean create = Standard_True); private: - - TDF_Label _label; - bool _isDone; + TDF_Label _label; + bool _isDone; }; #endif diff --git a/src/GEOM/GEOM_ISubShape.hxx b/src/GEOM/GEOM_ISubShape.hxx index 96e980918..2f09aa141 100644 --- a/src/GEOM/GEOM_ISubShape.hxx +++ b/src/GEOM/GEOM_ISubShape.hxx @@ -19,18 +19,16 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// NOTE: This is an intreface to a function for the Shapes +// (Wire, Face, Shell, Solid and Compound) creation. -// NOTE: This is an intreface to a function for the Shapes -// (Wire, Face, Shell, Solid and Compound) creation. -// #include "GEOM_Function.hxx" #include "TColStd_HSequenceOfTransient.hxx" #include "TColStd_HArray1OfInteger.hxx" -#define SHAPE_ARG_MAIN_SHAPE 1 -#define SHAPE_ARG_INDICES 2 -#define SHAPE_ARG_SORTED 3 +#define SHAPE_ARG_MAIN_SHAPE 1 +#define SHAPE_ARG_INDICES 2 class GEOM_ISubShape { diff --git a/src/GEOM/GEOM_Object.cxx b/src/GEOM/GEOM_Object.cxx index ca8ac421d..cbbce1eeb 100644 --- a/src/GEOM/GEOM_Object.cxx +++ b/src/GEOM/GEOM_Object.cxx @@ -191,7 +191,7 @@ GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType) //============================================================================= GEOM_Object::~GEOM_Object() { - //MESSAGE("GEOM_Object::~GEOM_Object()"); + MESSAGE("GEOM_Object::~GEOM_Object()"); } //============================================================================= diff --git a/src/GEOMAlgo/BlockFix_UnionEdges.cxx b/src/GEOMAlgo/BlockFix_UnionEdges.cxx index 602c3e859..8dd2946b0 100644 --- a/src/GEOMAlgo/BlockFix_UnionEdges.cxx +++ b/src/GEOMAlgo/BlockFix_UnionEdges.cxx @@ -291,9 +291,15 @@ TopoDS_Shape BlockFix_UnionEdges::Perform(const TopoDS_Shape& Shape, TopoDS_Shape aResult = myContext->Apply(Shape); // processing each solid - TopExp_Explorer exps; - for(exps.Init(Shape, TopAbs_SOLID); exps.More(); exps.Next()) { - TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + TopAbs_ShapeEnum aType = TopAbs_SOLID; + TopExp_Explorer exps (Shape, aType); + if (!exps.More()) { + aType = TopAbs_SHELL; + exps.Init(Shape, aType); + } + for (; exps.More(); exps.Next()) { + //TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + TopoDS_Shape aSolid = exps.Current(); TopTools_IndexedMapOfShape ChangedFaces; @@ -307,21 +313,21 @@ TopoDS_Shape BlockFix_UnionEdges::Perform(const TopoDS_Shape& Shape, // processing each face TopExp_Explorer exp; - for(exp.Init(aRes, TopAbs_FACE); exp.More(); exp.Next()) { + for (exp.Init(aRes, TopAbs_FACE); exp.More(); exp.Next()) { TopoDS_Face aFace = TopoDS::Face(aContext->Apply(exp.Current().Oriented(TopAbs_FORWARD))); TopTools_IndexedDataMapOfShapeListOfShape aMapFacesEdges; - for(TopExp_Explorer expe(aFace,TopAbs_EDGE); expe.More(); expe.Next()) { + for (TopExp_Explorer expe(aFace,TopAbs_EDGE); expe.More(); expe.Next()) { TopoDS_Edge edge = TopoDS::Edge(expe.Current()); - if(!aMapEdgeFaces.Contains(edge)) continue; + if (!aMapEdgeFaces.Contains(edge)) continue; const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); TopTools_ListIteratorOfListOfShape anIter(aList); - for( ; anIter.More(); anIter.Next()) { + for ( ; anIter.More(); anIter.Next()) { TopoDS_Face face = TopoDS::Face(anIter.Value()); TopoDS_Face face1 = TopoDS::Face(aContext->Apply(anIter.Value())); - if(face1.IsSame(aFace)) continue; - if(aMapFacesEdges.Contains(face)) { + if (face1.IsSame(aFace)) continue; + if (aMapFacesEdges.Contains(face)) { aMapFacesEdges.ChangeFromKey(face).Append(edge); } else { @@ -332,27 +338,27 @@ TopoDS_Shape BlockFix_UnionEdges::Perform(const TopoDS_Shape& Shape, } } - for(Standard_Integer i=1; i<=aMapFacesEdges.Extent(); i++) { + for (Standard_Integer i=1; i<=aMapFacesEdges.Extent(); i++) { const TopTools_ListOfShape& ListEdges = aMapFacesEdges.FindFromIndex(i); TopTools_SequenceOfShape SeqEdges; TopTools_ListIteratorOfListOfShape anIter(ListEdges); - for( ; anIter.More(); anIter.Next()) { + for ( ; anIter.More(); anIter.Next()) { SeqEdges.Append(anIter.Value()); } - if(SeqEdges.Length()==1) continue; + if (SeqEdges.Length()==1) continue; TopoDS_Edge E; - if( MergeEdges(SeqEdges,aFace,Tol,E) ) { + if ( MergeEdges(SeqEdges,aFace,Tol,E) ) { // now we have only one edge - aChain.Value(1) // we have to replace old ListEdges with this new edge aContext->Replace(SeqEdges(1),E); - for(Standard_Integer j=2; j<=SeqEdges.Length(); j++) { + for (Standard_Integer j=2; j<=SeqEdges.Length(); j++) { aContext->Remove(SeqEdges(j)); } TopoDS_Face tmpF = TopoDS::Face(exp.Current()); - if( !ChangedFaces.Contains(tmpF) ) + if ( !ChangedFaces.Contains(tmpF) ) ChangedFaces.Add(tmpF); tmpF = TopoDS::Face(aMapFacesEdges.FindKey(i)); - if( !ChangedFaces.Contains(tmpF) ) + if ( !ChangedFaces.Contains(tmpF) ) ChangedFaces.Add(tmpF); } } @@ -360,7 +366,7 @@ TopoDS_Shape BlockFix_UnionEdges::Perform(const TopoDS_Shape& Shape, } // end processing each face // fix changed faces and replace them in the local context - for(Standard_Integer i=1; i<=ChangedFaces.Extent(); i++) { + for (Standard_Integer i=1; i<=ChangedFaces.Extent(); i++) { TopoDS_Face aFace = TopoDS::Face(aContext->Apply(ChangedFaces.FindKey(i))); Handle(ShapeFix_Face) sff = new ShapeFix_Face(aFace); sff->SetContext(myContext); @@ -371,11 +377,11 @@ TopoDS_Shape BlockFix_UnionEdges::Perform(const TopoDS_Shape& Shape, aContext->Replace(aFace,sff->Face()); } - if(ChangedFaces.Extent()>0) { + if (ChangedFaces.Extent() > 0) { // fix changed shell and replace it in the local context TopoDS_Shape aRes1 = aContext->Apply(aRes); TopExp_Explorer expsh; - for(expsh.Init(aRes1, TopAbs_SHELL); expsh.More(); expsh.Next()) { + for (expsh.Init(aRes1, TopAbs_SHELL); expsh.More(); expsh.Next()) { TopoDS_Shell aShell = TopoDS::Shell(expsh.Current()); Handle(ShapeFix_Shell) sfsh = new ShapeFix_Shell; sfsh->FixFaceOrientation(aShell); diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 3dab5a404..e41de1d95 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -269,6 +269,10 @@ ICON_DLG_GLUE_FACES2 glue2.png + + ICON_DLG_LIMIT_TOLERANCE + limit_tolerance.png + ICON_DLG_INERTIA axisinertia.png @@ -849,6 +853,10 @@ ICO_GLUE_FACES glue.png + + ICO_LIMIT_TOLERANCE + limit_tolerance.png + ICO_GROUP_CREATE group_new.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index aac0da797..01b728a30 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1,4679 +1,4673 @@ + - - - - @default - - BRep_API: command not done - Error: can't build object - - - CHANGE_ORIENTATION_NEW_OBJ_NAME - Invert - - - CLOSE_CONTOUR_NEW_OBJ_NAME - CloseContour - - - DEP_OBJECT - Selected object has been used to create another one. -It can't be deleted - - - DEVIDE_EDGE_NEW_OBJECT_NAME - NewObject - - - ERROR_SHAPE_TYPE - Object of incorrect type selected! + + + @default + + BRep_API: command not done + Error: can't build object + + + CHANGE_ORIENTATION_NEW_OBJ_NAME + Invert + + + CLOSE_CONTOUR_NEW_OBJ_NAME + CloseContour + + + DEP_OBJECT + Selected object has been used to create another one. +It can't be deleted + + + DEVIDE_EDGE_NEW_OBJECT_NAME + NewObject + + + ERROR_SHAPE_TYPE + Object of incorrect type selected! Please, select face, shell or solid and try again - - - iErr : 10 - the Classifier is NULL - - - iErr : 11 - the Shape is NULL - - - iErr : 12 - Unallowed Type of Subshape - - - iErr : 13 - Unallowed State - - - iErr : 15 - Unallowed Surface Type - - - iErr : 20 - Triangulation is not Found - - - iErr : 30 - Can not Obtain the Line From the Link - - - iErr : 40 - A Point Can Not Be Classified - - - iErr : 41 - Invalid Data for Classifier - - - GEOM_2D_CONTINUTY - 2D continuity - - - GEOM_2D_CURVE_MODE - 2D curve mode - - - GEOM_2D_TOLERANCE - 2D tolerance - - - GEOM_3D_CONTINUTY - 3D continuity - - - GEOM_3D_CURVE_MODE - 3D curve mode - - - GEOM_3D_TOLERANCE - 3D tolerance - - - GEOM_3_POINTS - 3 points - - - GEOM_ADD_POINT - Add point - - - GEOM_ANGLE - Angle : - - - GEOM_ANGLE_1 - Angle - - - GEOM_ARC_ELLIPSE - Arc of ellipse - - - GEOM_ARC - Arc - - - GEOM_ARCHIMEDE - Archimede - - - GEOM_ARCHIMEDE_TITLE - Archimede Construction - - - GEOM_ARC_TITLE - Arc Construction - - - GEOM_ARGUMENTS - Arguments - - - GEOM_AXE_MIRROR - Axe Mirror - - - GEOM_AXIS - Axis - - - GEOM_BASE - Base - - - GEOM_BASE_OBJECT - Base Object - - - GEOM_BASE_POINT - Base Point - - - GEOM_BEZIER - Bezier - - - GEOM_BINORMAL - BiNormal - - - GEOM_BLOCK - Hexahedral Solid - - - GEOM_BLOCKS_COMPOUND - BlocksCompound - - - GEOM_BLOCK_EXPLODE - Sub Blocks - - - GEOM_BLOCK_EXPLODE_TITLE - Sub Blocks Selection - - - GEOM_BLOCK_MULTITRSF - Block Multi-Transformation - - - GEOM_BLOCK_MULTITRSF_DOUBLE - Multi-Transformation Double - - - GEOM_BLOCK_MULTITRSF_SIMPLE - Multi-Transformation Simple - - - GEOM_BLOCK_MULTITRSF_TITLE - Block Multi-Transformation - - - GEOM_BLOCK_TITLE - Hexahedral Solid Construction - - - GEOM_BNDBOX - Bounding Box - - - GEOM_BNDBOX_OBJDIM - Object And Its Dimensions - - - GEOM_BNDBOX_TITLE - Bounding Box Information - - - GEOM_BOX - Box - - - GEOM_BOX_OBJ - Dimensions At Origin - - - GEOM_BOX_TITLE - Box Construction - - - GEOM_BSplineRestriction - BSplineRestriction - - - GEOM_BUT_APPLY - &Apply - - - GEOM_BUT_CANCEL - &Cancel - - - GEOM_BUT_CLOSE - &Close - - - GEOM_BUT_CLOSE_SKETCH - Sketch Closure - - - GEOM_BUT_END_SKETCH - Sketch Validation - - - GEOM_BUT_EXPLODE - &Explode - - - GEOM_BUT_HELP - &Help - - - GEOM_BUT_NO - &No - - - GEOM_BUT_OK - O&k - - - GEOM_BUT_APPLY_AND_CLOSE - A&pply and Close - - - GEOM_BUT_YES - &Yes - - - GEOM_BY_LENGTH - By length - - - GEOM_BY_PARAMETER - By parameter - - - GEOM_CENTER - Center - - - GEOM_CENTER_POINT - Center Point - - - GEOM_CENTRAL_POINT - Central Point - - - GEOM_CHAMFER - Chamfer - - - GEOM_CHAMFER_ABORT - Chamfer can't be computed with %1 and %2 - - - GEOM_CHAMFER_ALL - Chamfer On Whole Shape - - - GEOM_CHAMFER_EDGES - Chamfer On Edges From Shape - - - GEOM_CHAMFER_FACES - Chamfer On Faces From Shape - - - GEOM_CHAMFER_TITLE - Chamfer Construction - - - GEOM_CHANGE_ORIENTATION - Objects to change orientation - - - GEOM_CHANGE_ORIENTATION_TITLE - Change orientation - - - GEOM_CHECK_BLOCKS_COMPOUND - Check and Improve Blocks Compound - - - GEOM_CHECK_BLOCKS_COMPOUND_FAILED - Check failed - - - GEOM_CHECK_BLOCKS_COMPOUND_ERRORS - Errors - - - GEOM_CHECK_BLOCKS_COMPOUND_HAS_ERRORS - The Compound of Blocks has errors - - - GEOM_CHECK_BLOCKS_COMPOUND_HAS_NO_ERRORS - The Compound of Blocks has no errors - - - GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES - Incriminated Sub-Shapes - - - GEOM_CHECK_INFOS - Object And Its Topological Information - - - GEOM_CHECK_SHAPE - Check Shape - - - GEOM_CHECK_TITLE - Check Shape Information - - - GEOM_CIRCLE - Circle - - - GEOM_CIRCLE_TITLE - Circle Construction - - - GEOM_CLOSECONTOUR_TITLE - Close contour - - - GEOM_CMASS - Center Of Mass - - - GEOM_CMASS_TITLE - Center Of Mass Construction - - - GEOM_COMMON - Common - - - GEOM_COMMON_TITLE - Common Of Two Objects - - - GEOM_COMPOUND - Compound - - - GEOM_COMPOUNDSOLID - CompSolid - - - GEOM_COMPOUND_TITLE - Create A Compound - - - GEOM_CONE - Cone - - - GEOM_CONE_TITLE - Cone Construction - - - GEOM_CONFIRM - Confirm operation - - - GEOM_CONFIRM_INFO - Shape contains %1 sub shapes ! - - - GEOM_COOR - Coord. : - - - GEOM_COORDINATES - Coordinates - - - GEOM_COORDINATES_RES - Result coordinates - - - GEOM_CREATE_COPY - Create a copy - - - GEOM_CREATE_SINGLE_SOLID - Create a single solid - - - GEOM_CURVE - Curve - - - GEOM_CURVE_CONTINUTY - Curve continuity - - - GEOM_CURVE_TITLE - Curve Construction - - - GEOM_CUT - Cut - - - GEOM_CUT_TITLE - Cut Of Two Objects - - - GEOM_CYLINDER - Cylinder - - - GEOM_CYLINDER_TITLE - Cylinder Construction - - - GEOM_D1 - D1 : - - - GEOM_D2 - D2 : - - - GEOM_DETECT - Detect - - - GEOM_DIAGONAL_POINTS - Diagonal Points - - - GEOM_DISK - Disk - - - GEOM_DISK_TITLE - Disk Construction - - - GEOM_DIMENSIONS - Dimensions - - - GEOM_DISTANCE - Distance - - - GEOM_DIVIDE_EDGE_TITLE - Addition of point - - - GEOM_DX - Dx : - - - GEOM_DY - Dy : - - - GEOM_DZ - Dz : - - - GEOM_DropSmallEdges - DropSmallEdges - - - GEOM_EDGE - Edge - - - GEOM_EDGE_TITLE - Create An Edge - - - GEOM_ELLIPSE - Ellipse - - - GEOM_ELLIPSE_ERROR_1 - Error creating ellipse. Reason: minor radius is greater than major radius. - - - GEOM_ELLIPSE_TITLE - Ellipse Construction - - - GEOM_END_LCS - End LCS - - - GEOM_ERROR - Error - - - GEOM_ERROR_STATUS - Operation status - - - GEOM_ERR_GET_ENGINE - Failed to obtain GEOM Engine component. Reload Geometry module and try again. - - - GEOM_ERR_LIB_NOT_FOUND - GUI library corresponding to the user action can not be found or loaded - - - GEOM_EXTRUSION - Extrusion - - - GEOM_EXTRUSION_BSV - Base Shape + Vector - - - GEOM_EXTRUSION_BSV_2P - Base Shape + 2 Points - - - GEOM_EXTRUSION_DXDYDZ - Base Shape + DX DY DZ Vector - - - GEOM_EXTRUSION_TITLE - Construction by Extrusion - - - GEOM_FACE - Face - - - GEOM_CS - Coordinate system - - - GEOM_GCS - Global coordinate system - - - GEOM_LCS - Local coordinate system - - - GEOM_FACES - Faces - - - GEOM_FACE_FFW - Face creation from wires and/or edges - - - GEOM_FACE_OPT - Try to create a planar face - - - GEOM_FACE_OR_LCS - Face or LCS - - - GEOM_FACE_SELECTION - Face Selection - - - GEOM_FACE_TITLE - Create A Face - - - GEOM_RECTANGLE_TITLE - Rectangle Construction - - - GEOM_RECTANGLE - Rectangle - - - GEOM_FILLET - Fillet - - - GEOM_FILLET_2D - Fillet 2D - - - GEOM_FILLET_1D - Fillet 1D - - - GEOM_FILLET_ABORT - Fillet can't be computed with radius %1 - - - GEOM_FILLET_ALL - Fillet On Whole Shape - - - GEOM_FILLET_EDGES - Fillet On Edges From Shape - - - GEOM_FILLET_WIRES - Fillet On Wires From Shape - - - GEOM_FILLET_FACES - Fillet On Faces From Shape - - - GEOM_FILLET_VERTEXES - Fillet On Vertexes From Face - - - GEOM_FILLET_TITLE - Fillet Construction - - - GEOM_FILLET_2D_TITLE - 2D Fillet Construction - - - GEOM_FILLET_1D_TITLE - 1D Fillet Construction - - - GEOM_FILLING - Filling - - - GEOM_FILLING_ARG - Arguments And Parameters - - - GEOM_FILLING_COMPOUND - Input compound - - - GEOM_FILLING_MAX_DEG - Max deg - - - GEOM_FILLING_MIN_DEG - Min deg - - - GEOM_FILLING_NB_ITER - Nb. Iter : - - - GEOM_FILLING_TITLE - Filling Surface With Edges - - - GEOM_FILLING_TOL_2D - Tol. 2D : - - - GEOM_FILLING_TOL_3D - Tol. 3D : - - - GEOM_FREE_BOUNDARIES - Free boundaries - - - GEOM_FREE_BOUNDS_ERROR - Object is not selected - - - GEOM_FREE_BOUNDS_MSG - Number of free boundaries detected: %1 (%2 closed, %3 open) - - - GEOM_FREE_BOUNDS_TLT - Free boundary detection - - - GEOM_FREE_FACES - Free faces - - - GEOM_FREE_FACES_TITLE - Free faces - - - GEOM_FUSE - Fuse - - - GEOM_FUSE_TITLE - Fuse Two Objects - - - GEOM_FixFaceSize - FixFaceSize - - - GEOM_FixShape - FixShape - - - GEOM_GLUE - Glue - - - GEOM_GLUE_TITLE - Glue faces - - - GEOM_HEIGHT - Height : - - - GEOM_HOLES - Holes - - - GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE - Identical names : select by mouse ! - - - GEOM_IMPORT - Imported_Shape - - - GEOM_INCORRECT_INPUT - Incorrect Input Data! - - - GEOM_INERTIA_CONSTR - Matrix And Moments Of Inertia - - - GEOM_INERTIA_I - %1:1 : - - - GEOM_INERTIA_IXYZ - IX & IY & IZ : - - - GEOM_INERTIA_TITLE - Calculs Of Inertia - - - GEOM_INF_LOADED - File %1 loaded. - - - GEOM_INTERNAL_WIRES - Internal wires - - - GEOM_INTERPOL - Interpolation - - - GEOM_KEEP_OBJECT - Keep Object - - - GEOM_LENGTH - Length : - - - GEOM_LINE - Line - - - GEOM_LINE_TITLE - Line Construction - - - GEOM_MAIN_OBJECT - Main Object - - - GEOM_MARKER - Marker - - - GEOM_MARKER_TITLE - Create marker - - - GEOM_MATERIAL_ID - Material ID: - - - GEOM_MATERIAL_MATERIAL - Material - - - GEOM_MATERIAL_SET - << Set - - - GEOM_MATERIAL_SHAPE - Shapes - - - GEOM_MATERIAL_TITLE - Define materials for Dominant Fuse - - - GEOM_MATRIX - Matrix : - - - GEOM_MAX - Max : - - - GEOM_MAX_3D_TOLERANCE - Max 3D tolerance - - - GEOM_MAX_TOLERANCE - Max tolerance - - - GEOM_MEN_ALL_FILES - All Files ( * ) - - - GEOM_MEN_ANGLE - Angle : - - - GEOM_MEN_COMPONENT - Geometry - - - GEOM_MEN_ENTER_ANGLE - Enter An Angle In Degrees - - - GEOM_MEN_EXPORT - Export - - - GEOM_MEN_IMPORT - Import - - - GEOM_MEN_ISOS - Select Number Of Isos - - - GEOM_MEN_ISOU - Isos U : - - - GEOM_MEN_ISOV - Isos V : - - - GEOM_MEN_POPUP_NAME - %1 Objects - - - GEOM_MEN_SHADING - Shading - - - GEOM_MEN_SKETCHER_X - Enter a Length to Set X - - - GEOM_MEN_SKETCHER_Y - Enter a Length to Set Y - - - GEOM_MEN_STEP_LABEL - Step : - - - GEOM_MEN_TRANSPARENCY - Transparency - - - GEOM_MEN_TRANSPARENCY_LABEL - Transparency : - - - GEOM_MEN_WIREFRAME - Wireframe - - - GEOM_MEN_X - X : - - - GEOM_MEN_Y - Y : - - - GEOM_MESHING_DEFLECTION - Meshing Deflect. : - - - GEOM_MIN - Min : - - - GEOM_MINDIST_OBJ - Objects And Results - - - GEOM_MINDIST_TITLE - Minimun Distance Between Two Objects - - - GEOM_MIRROR - Mirror - - - GEOM_MIRROR_TITLE - Mirror An Object - - - GEOM_MULTIROTATION - Multi-Rotation - - - GEOM_MULTIROTATION_DOUBLE - Multi Rotation Double - - - GEOM_MULTIROTATION_SIMPLE - Multi Rotation Simple - - - GEOM_MULTIROTATION_TITLE - Multi-Rotation - - - GEOM_MULTITRANSLATION - Multi-Translation - - - GEOM_MULTITRANSLATION_DOUBLE - Multi Translation Double - - - GEOM_MULTITRANSLATION_SIMPLE - Multi Translation Simple - - - GEOM_MULTITRANSLATION_TITLE - Multi-Translation - - - GEOM_NAME_INCORRECT - Object name not found - - - GEOM_NB_BLOCKS_NO_OTHERS - There are %1 specified blocks and NO other solids - - - GEOM_NB_BLOCKS_SOME_OTHERS - There are %1 specified blocks and some other solids - - - GEOM_NB_TIMES - Nb. Times : - - - GEOM_NB_TIMES_U - Nb. Times U : - - - GEOM_NB_TIMES_V - Nb. Times V : - - - GEOM_NODES - Nodes - - - GEOM_NUM_SPLIT_POINTS - Number of splitting points - - - GEOM_OBJECT - Object - - - GEOM_OBJECT_TYPE - Object Type - - - GEOM_OBJECTS - Objects - - - GEOM_OBJECT_I - Object %1 - - - GEOM_OBJECT_RESULT - Object And Result - - - GEOM_OFFSET - Offset - - - GEOM_OFFSET_TITLE - Offset Surface - - - GEOM_OPERATIONS - Operations - - - GEOM_ORIENTATION - Orientation - - - GEOM_ORIENTATION_OPT - Reverse orientation with normal vectors simulation - - - GEOM_ORIENTATION_TITLE - Change Orientation - - - GEOM_PARAMETER - Parameter : - - - GEOM_PARAMETERS - Parameters - - - GEOM_POINT_ON_EDGE - Point on Edge - - - GEOM_POINT_ON_FACE - Point on Face - - - GEOM_PARAM_VALUE - By parameter - - - GEOM_COORD_VALUE - By coordinate - - - GEOM_PARTITION - Partition - - - GEOM_WRN_PARTITION_RESULT_EMPTY - The partition result is empty, please verify the reconstruction limit parameter. - - - GEOM_PARTITION_HALFSPACE - Half-space partition - - - GEOM_PARTITION_ORIENTATION - Change Orientation - - - GEOM_PARTITION_TITLE - Partition Of Object With Tool - - - GEOM_PATH_OBJECT - Path Object - - - GEOM_PIPE - Pipe - - - GEOM_PIPE_TITLE - Pipe Construction - - - GEOM_SEGMENT - Segment of straight line - - - GEOM_SELECT_UNPUBLISHED_EDGES - Select unpublished edges - - - GEOM_PLANE - Plane - - - GEOM_PLANE_MIRROR - Plane Mirror - - - GEOM_PLANE_PV - Point + Vector - - - GEOM_PLANE_PVC - Point + Coordinate Vector - - - GEOM_PLANE_SIZE - Size of plane : - - - GEOM_PLANE_TITLE - Plane Construction - - - GEOM_POINT - Point - - - GEOM_POINT1 - Point 1 - - - GEOM_POINT2 - Point 2 - - - GEOM_POINT3 - Point 3 - - - GEOM_POINTS - Points - - - GEOM_POINT_I - Point %1 - - - GEOM_POINT_MIRROR - Point Mirror - - - GEOM_POINT_TITLE - Point Construction - - - GEOM_POLYLINE - Polyline - - - GEOM_POSITION - Location - - - GEOM_POSITION_TITLE - Modify the Location of an Object - - - GEOM_PRECISION - Precision : - - - GEOM_PROPAGATE - Propagate - - - GEOM_PROPAGATE_TITLE - Propagate - - - GEOM_PROPERTIES - Basic Properties - - - GEOM_PROPERTIES_CONSTR - Object And Its Properties - - - GEOM_PROPERTIES_SURFACE - Surface is : - - - GEOM_PROPERTIES_TITLE - Basic Properties Information - - - GEOM_PROPERTIES_VOLUME - Volume is : - - - GEOM_PRP_ABORT - Operation aborted - - - GEOM_PRP_COMMAND - No command associated with this id = %1. - - - GEOM_PRP_DONE - Operation done - - - GEOM_PRP_EXPORT - Exporting geometry to %1 ... - - - GEOM_PRP_LOADING - Loading %1 ... - - - GEOM_PRP_MIN_DIST - Min Distance not computed - - - GEOM_PRP_NOT_FOR_VTK_VIEWER - Not allowed in VTK viewer - - - GEOM_PRP_NULLSHAPE - Error, null or inappropriate shape ! - - - GEOM_PRP_READY - Ready - - - GEOM_PRP_SELECT_EDGE - Select edges and click on Apply - - - GEOM_PRP_SELECT_FACE - Select faces to suppress and click on Ok/Apply - - - GEOM_PRP_SELECT_FIRST - Select main shape first - - - GEOM_PRP_SELECT_SUBSHAPES - Select Sub Shapes - - - GEOM_PRP_SHAPE_IN_STUDY - Main shape must be in the study before - - - GEOM_QUAD_FACE - Quadrangle Face - - - GEOM_QUAD_FACE_TITLE - Quadrangle Face Construction - - - GEOM_RADIUS - Radius : - - - GEOM_RADIUS_I - Radius %1 : - - - GEOM_RADIUS_MAJOR - Major radius : - - - GEOM_RADIUS_MINOR - Minor radius : - - - GEOM_RECONSTRUCTION_LIMIT - Resulting Type - - - GEOM_RECONSTRUCTION_LIMIT_EDGE - Edge - - - GEOM_RECONSTRUCTION_LIMIT_FACE - Face - - - GEOM_RECONSTRUCTION_LIMIT_SHAPE - Shape - - - GEOM_RECONSTRUCTION_LIMIT_SHELL - Shell - - - GEOM_RECONSTRUCTION_LIMIT_SOLID - Solid - - - GEOM_RECONSTRUCTION_LIMIT_VERTEX - Vertex - - - GEOM_RECONSTRUCTION_LIMIT_WIRE - Wire - - - GEOM_REF_POINT - Point with reference - - - GEOM_REMOVE_ALL_HOLES - Remove all holes - - - GEOM_REMOVE_ALL_INT_WIRES - Remove all internal wires - - - GEOM_REMOVE_HOLES_TITLE - Suppress holes - - - GEOM_REMOVE_INTERNAL_WIRES_TITLE - Suppress internal wires - - - GEOM_REMOVE_WEBS - Remove webs - - - GEOM_REQUIRED_DEGREE - Required degree - - - GEOM_REQUIRED_NUM_SEGMENTS - Required number of segments - - - GEOM_REVERSE - Reverse - - - GEOM_REVERSE_DIRECTION - Reverse Direction - - - GEOM_REVERSE_PLANE - Reverse the plane normal - - - GEOM_REVERSE_U - Reverse U - - - GEOM_REVERSE_V - Reverse V - - - GEOM_REVERSE_VECTOR - Reverse Vector - - - GEOM_REVOLUTION - Revolution - - - GEOM_REVOLUTION_TITLE - Construction By Revolution - - - GEOM_ROTATION - Rotation - - - GEOM_ROTATION_TITLE - Rotation Of An Object - - - GEOM_SCALE - Scale - - - GEOM_SCALE_FACTOR - Scale Factor : - - - GEOM_SCALE_TITLE - Scale An Object - - - GEOM_SECTION - Section - - - GEOM_SECTION_TITLE - Section Of Two Objects - - - GEOM_SELECTED_FACE - Selected face - - - GEOM_SELECTED_OBJECTS - Selected objects - - - GEOM_SELECTED_SHAPE - Selected shape - - - GEOM_SELECTION - Selection - - - GEOM_SET_MATERIALS - Set materials - - - GEOM_SEWING - Sewing - - - GEOM_SEWING_TITLE - Topological sewing - - - GEOM_SHAPE - Shape - - - GEOM_SHAPEPROCESS_TITLE - Shape Processing - - - GEOM_SHAPES - Shapes - - - GEOM_SHELL - Shell - - - GEOM_SHELLS - Shells - - - GEOM_SHELL_TITLE - Shell Construction - - - GEOM_SKETCHER_ABS - Absolute - - - GEOM_SKETCHER_ANGLE - Angle - - - GEOM_SKETCHER_ANGLE2 - Angle : - - - GEOM_SKETCHER_APPLY - Apply - - - GEOM_SKETCHER_ARC - Arc - - - GEOM_SKETCHER_DEST - Destination - - - GEOM_SKETCHER_DIR - Direction - - - GEOM_SKETCHER_DX2 - DX : - - - GEOM_SKETCHER_DY2 - DY : - - - GEOM_SKETCHER_DZ2 - DZ : - - - GEOM_SKETCHER_EL - Element Type - - - GEOM_SKETCHER_RESTORE - Restore - - - GEOM_SKETCHER_LENGTH - Length - - - GEOM_SKETCHER_LENGTH2 - Length : - - - GEOM_SKETCHER_PER - Perpendicular - - - GEOM_SKETCHER_POINT - Point - - - GEOM_SKETCHER_POINT2 - Point : - - - GEOM_SKETCHER_RADIUS2 - Radius : - - - GEOM_SKETCHER_REL - Relative - - - GEOM_SKETCHER_SEGMENT - Segment - - - GEOM_SKETCHER_SEL - Selection - - - GEOM_SKETCHER_TAN - Tangent - - - GEOM_SKETCHER_TITLE - 2D Sketch Construction - - - GEOM_3DSKETCHER_TITLE - 3D Sketch Construction - - - GEOM_SKETCHER_TYPE - Type - - - GEOM_SKETCHER_UNDO - Undo - - - GEOM_SKETCHER_VALUES - Values - - - GEOM_SKETCHER_VX2 - VX : - - - GEOM_SKETCHER_VXVY - VX-VY - - - GEOM_SKETCHER_VY2 - VY : - - - GEOM_SKETCHER_X - X - - - GEOM_SKETCHER_X2 - X : - - - GEOM_SKETCHER_X3 - Abs. X : - - - GEOM_SKETCHER_Y - Y - - - GEOM_SKETCHER_Y2 - Y : - - - GEOM_SKETCHER_Y3 - Abs. Y : - - - GEOM_SKETCHER_Z2 - Z : - - - GEOM_3DSKETCHER - 3D Sketcher - - - GEOM_COORDINATES_TYPE - Coordinates Type - - - GEOM_SOLID - Solid - - - GEOM_SOLID_TITLE - Solid Construction - - - GEOM_SPHERE - Sphere - - - GEOM_SPHERE_CR - Center + Radius - - - GEOM_SPHERE_RO - Radius At Origin - - - GEOM_SPHERE_TITLE - Sphere Construction - - - GEOM_SPLINE - Spline - - - GEOM_SPLINE_TITLE - Spline Construction - - - GEOM_START_LCS - Start LCS - - - SELECT_UNPUBLISHED_EDGES - Select unpublished edges - - - GEOM_STEP - Step : - - - GEOM_STEP_TITLE - Step value for GUI constructions - - - GEOM_STEP_U - Step U : - - - GEOM_STEP_V - Step V : - - - GEOM_STUDY_LOCKED - The active study is locked and therefore cannot be modified - - - GEOM_SUBSHAPE_SELECT - Select Sub Shapes - - - GEOM_SUBSHAPE_TITLE - Sub Shapes Selection - - - GEOM_SUBSHAPE_TYPE - Sub Shapes Type : - - - GEOM_SUB_SHAPE - Sub Shapes - - - GEOM_SUPPRESSHOLE_FACE_SHELL - Face or shell - - - GEOM_SUPPRESSHOLE_SELECTFACE - Select the face with hole - - - GEOM_SUPPRESSHOLE_SELECTFACE_END - Select end face (if hole traversing) - - - GEOM_SUPPRESSHOLE_SELECTWIRE - Select wire on face - - - GEOM_SUPPRESSHOLE_SELECTWIRE_END - Select end wire (if hole traversing) - - - GEOM_SUPPRESSHOLE_SELECT_HOLES_ON_FACE - Select hole(s) on the face - - - GEOM_SUPPRESSHOLE_TITLE - Suppress holes - - - GEOM_SUPPRESS_RESULT - Suppress Result - - - GEOM_SUPPRESS_RESULT_INSIDE - Inside - - - GEOM_SUPPRESS_RESULT_OUTSIDE - Outside - - - GEOM_SUPRESSFACE - Supress Face - - - GEOM_SUPRESSFACE_SELECT - Select Faces To Suppress - - - GEOM_SUPRESSFACE_TITLE - Suppress Faces In An Object - - - GEOM_SURFACE_CONTINUTY - Surface continuity - - - GEOM_SURFACE_MODE - Surface mode - - - GEOM_SURFCONE - Conical Face - - - GEOM_SURFCYLINDER - Cylindrical Face - - - GEOM_SURFSPHERE - Spherical Face - - - GEOM_SURFTORUS - Toroidal Face - - - GEOM_SameParameter - SameParameter - - - GEOM_SplitAngle - SplitAngle - - - GEOM_SplitClosedFaces - SplitClosedFaces - - - GEOM_SplitContinuity - SplitContinuity - - - GEOM_TOLERANCE - Tolerance - - - GEOM_TOLERANCE_CONSTR - Object And Its Tolerances - - - GEOM_TOLERANCE_EDGE - Edge : - - - GEOM_TOLERANCE_FACE - Face : - - - GEOM_TOLERANCE_TITLE - Maximum Tolerance - - - GEOM_TOLERANCE_VERTEX - Vertex : - - - GEOM_TOOL_OBJECT - Tool Object - - - GEOM_TOOL_OBJECTS - Tool Objects - - - GEOM_TORUS - Torus - - - GEOM_TORUS_TITLE - Torus Construction - - - GEOM_TRANSLATION - Translation - - - GEOM_TRANSLATION_COOR - Translation With Coordinates - - - GEOM_TRANSLATION_TITLE - Translation Of An Object - - - GEOM_TRANSPARENCY_OPAQUE - Opaque - - - GEOM_TRANSPARENCY_TITLE - Transparency - - - GEOM_TRANSPARENCY_TRANSPARENT - Transparent - - - GEOM_TRIHEDRON - Trihedron - - - GEOM_ToBezier - ToBezier - - - GEOM_VALUE - Value - - - GEOM_VECTOR - Vector - - - GEOM_VECTOR_LENGTH - Vector Length : - - - GEOM_VECTOR_TITLE - Vector Construction - - - GEOM_VECTOR_U - Vector U - - - GEOM_VECTOR_V - Vector V - - - GEOM_VERTEX - Vertex - - - GEOM_VERTEXES - Vertexes - - - GEOM_WATER_DENSITY - Water Density : - - - GEOM_WEIGHT - Weight : - - - GEOM_WIDTH - Width : - - - GEOM_WHATIS - Whatis - - - GEOM_WHATIS_OBJECT - Object And Its Topological Information - - - GEOM_WHATIS_TITLE - Whatis Information - - - GEOM_WIRE - Wire - - - GEOM_WIRES - Wire(s) - - - GEOM_WIRES_TO_REMOVE - Wires to remove - - - GEOM_WIREZ - Wires - - - GEOM_WIRE_CONNECT - Wire creation from wires/edges connected - - - GEOM_WIRE_TITLE - Create A Wire - - - GEOM_WPLANE - Working Plane - - - GEOM_WPLANE_FACE - Plane, Planar Face or LCS - - - GEOM_WPLANE_ORIGIN - Select a plane - - - GEOM_WPLANE_OXY - OXY - - - GEOM_WPLANE_OYZ - OYZ - - - GEOM_WPLANE_OZX - OZX - - - GEOM_WPLANE_TITLE - Working Plane Selection - - - GEOM_WPLANE_VECTOR - Select 2 vectors - - - GEOM_WPLANE_VX - Vector X - - - GEOM_WPLANE_VZ - Vector Z - - - GEOM_WRN_RADIUS_NULL - Radius is null - - - GEOM_WRN_WARNING - Warning - - - WRN_SHAPE_UNCLOSED - Unable to create solid from unclosed shape %1 - - - GEOM_X - X : - - - GEOM_Y - Y : - - - GEOM_Z - Z : - - - GLUE_NEW_OBJ_NAME - Glue - - - MEN_ALL_SEL_ONLY - Select All - - - MEN_ARC - Arc - - - MEN_ARCHIMEDE - Archimede - - - MEN_BASIC - Basic - - - MEN_BASIC_PROPS - Basic Properties - - - MEN_BLOCKS - Blocks - - - MEN_BND_BOX - Bounding Box - - - MEN_BOOLEAN - Boolean - - - MEN_BOX - Box - - - MEN_BUILD - Build - - - MEN_CHAMFER - Chamfer - - - MEN_CHANGE_ORIENTATION - Change Orientation - - - MEN_CHECK - Check Shape - - - MEN_CHECK_COMPOUND - Check Compound of Blocks - - - MEN_CHECK_FREE_BNDS - Check Free Boundaries - - - MEN_CHECK_FREE_FACES - Check Free Faces - - - MEN_CHECK_GEOMETRY - Check Geometry - - - MEN_CIRCLE - Circle - - - MEN_CLIPPING - Clipping Range - - - MEN_CLOSE_CONTOUR - Close Contour - - - MEN_COMMON - Common - - - MEN_COMPOUND - Compound - - - MEN_COMPOUND_SEL_ONLY - Compound - - - MEN_CONE - Cone - - - MEN_CURVE - Curve - - - MEN_CUT - Cut - - - MEN_CYLINDER - Cylinder - - - MEN_RECTANGLE - Rectangle - - - MEN_DELETE - Delete - - - MEN_DIMENSIONS - Dimensions - - - MEN_DISPLAY - Show - - - MEN_DISK - Disk - - - MEN_DISPLAY_ALL - Show All - - - MEN_DISPLAY_MODE - Display Mode - - - MEN_DISPLAY_ONLY - Show Only - - - MEN_EDGE - Edge - - - MEN_EDGE_SEL_ONLY - Edge - - - MEN_EDIT - Edit - - - MEN_ELLIPSE - Ellipse - - - MEN_ERASE - Hide - - - MEN_ERASE_ALL - Hide All - - - MEN_EXPLODE - Explode - - - MEN_EXPLODE_BLOCKS - Explode on Blocks - - - MEN_EXPORT - Export... - - - MEN_EXTRUSION - Extrusion - - - MEN_FACE - Face - - - MEN_FACE_SEL_ONLY - Face - - - MEN_FILE - File - - - MEN_FILLET - Fillet 3D - - - MEN_FILLET_1D - Fillet 1D - - - MEN_FILLET_2D - Fillet 2D - - - MEN_FILLING - Filling - - - MEN_FUSE - Fuse - - - MEN_GENERATION - Generation - - - MEN_GLUE_FACES - Glue Faces - - - MEN_GROUP - Group - - - MEN_GROUP_CREATE - Create - - - MEN_GROUP_EDIT - Edit - - - MEN_RELOAD_IMPORTED - Reload From Disk - - - MEN_HEX_SOLID - Hexahedral Solid - - - MEN_IMPORT - Import... - - - MEN_INERTIA - Inertia - - - MEN_ISOS - Isos - - - MEN_LINE - Line - - - MEN_LOCAL_CS - Local Coordinate System - - - MEN_MASS_CENTER - Center of Mass - - - MEN_MEASURES - Measures - - - MEN_MIN_DIST - Min Distance - - - MEN_MIRROR - Mirror Image - - - MEN_MODIFY_LOCATION - Modify Location - - - MEN_MUL_ROTATION - Multi-Rotation - - - MEN_MUL_TRANSFORM - Multi-Transformation - - - MEN_MUL_TRANSLATION - Multi-Translation - - - MEN_NEW_ENTITY - New Entity - - - MEN_OFFSET - Offset Surface - - - MEN_OPERATIONS - Operations - - - MEN_ORIGIN_AND_VECTORS - Origin and Base Vectors - - - MEN_PARTITION - Partition - - - MEN_PIPE - Extrusion Along Path - - - MEN_PLANE - Plane - - - MEN_POINT - Point - - - MEN_POINT_COORDS - Point Coordinates - - - MEN_POINT_ON_EDGE - Add Point on Edge - - - MEN_POP_COLOR - Color - - - MEN_POP_CREATE_GROUP - Create Group - - - MEN_POP_SHOW_CHILDREN - Show Children - - - MEN_POP_HIDE_CHILDREN - Hide Children - - - MEN_POP_ISOS - Isos - - - MEN_POP_DEFLECTION - Deflection Coefficient - - - MEN_POP_RENAME - Rename - - - MEN_POP_SHADING - Shading - - - MEN_POP_TRANSPARENCY - Transparency - - - MEN_POP_WIREFRAME - Wireframe - - - MEN_POP_VECTORS - Show Edge Direction - - - MEN_PREFERENCES - Preferences - - - MEN_PREFERENCES_GEOM - Geometry - - - MEN_PRIMITIVES - Primitives - - - MEN_ADVANCED - Advanced - - - MEN_PROPAGATE - Propagate - - - MEN_Q_FACE - Quadrangle Face - - - MEN_REPAIR - Repair - - - MEN_REVOLUTION - Revolution - - - MEN_ROTATION - Rotation - - - MEN_SCALE - Scale Transform - - - MEN_SECTION - Section - - - MEN_SELECT_ONLY - Select Only - - - MEN_SEWING - Sewing - - - MEN_SHADING - Shading - - - MEN_SHADING_COLOR - Shading Color - - - MEN_SHAPE_PROCESS - Shape Processing - - - MEN_SHELL - Shell - - - MEN_SHELL_SEL_ONLY - Shell - - - MEN_SKETCH - 2D Sketch - - - MEN_3DSKETCH - 3D Sketch - - - MEN_SOLID - Solid - - - MEN_SOLID_SEL_ONLY - Solid - - - MEN_SPHERE - Sphere - - - MEN_STEP_VALUE - Step Value - - - MEN_SUPPERSS_HOLES - Suppress Holes - - - MEN_SUPPRESS_FACES - Suppress Faces - - - MEN_SUPPRESS_INT_WIRES - Suppress Internal Wires - - - MEN_TOLERANCE - Tolerance - - - MEN_TOOLS - Tools - - - MEN_TORUS - Torus - - - MEN_TRANSFORMATION - Transformation - - - MEN_TRANSLATION - Translation - - - MEN_VECTOR - Vector - - - MEN_VERTEX_SEL_ONLY - Vertex - - - MEN_VIEW - View - - - MEN_WHAT_IS - What is - - - MEN_WIRE - Wire - - - MEN_VECTOR_MODE_ON - Show Edge Direction - - - MEN_VECTOR_MODE_OFF - Hide Edge Direction - - - MEN_WIREFRAME - Wireframe - - - MEN_WIRE_SEL_ONLY - Wire - - - MEN_WORK_PLANE - Working Plane - - - MEN_POP_POINT_MARKER - Point Marker - - - NAME_LBL - Name: - - - NON_GEOM_OBJECTS_SELECTED - There are objects selected which do not belong to %1 component. - - - PREF_DEFLECTION - Deflection coefficient - - - GEOM_PREF_def_precision - Default precision - - - GEOM_PREF_length_precision - Length precision - - - GEOM_PREF_angle_precision - Angular precision - - - GEOM_PREF_len_tol_precision - Length tolerance precision - - - GEOM_PREF_ang_tol_precision - Angular tolerance precision - - - GEOM_PREF_weight_precision - Weight precision - - - GEOM_PREF_density_precision - Density precision - - - GEOM_PREF_parametric_precision - Parametric precision - - - GEOM_PREF_param_tol_precision - Parametric tolerance precision - - - PREF_AUTO_CREATE - Auto create - - - PREF_DISPLAY_MODE - Default display mode - - - PREF_FREE_BOUND_COLOR - Color of free boundaries - - - PREF_GROUP_ORIGIN_AND_BASE_VECTORS - Origin and base vectors - - - PREF_GROUP_GENERAL - General - - - PREF_GROUP_OCCVIEWER - OCC Viewer 3d - - - GEOM_PREF_GROUP_PRECISION - Input fields precision - - - PREF_GROUP_VERTEX - Marker of Points - - - PREF_ISOS_COLOR - Color of isolines - - - PREF_LINE_COLOR - Color of edges, vectors, wires - - - PREF_MARKER_SCALE - Size - - - PREF_POINT_COLOR - Color of points - - - PREF_SHADING_COLOR - Default shading color - - - PREF_STEP_VALUE - Step value for spin boxes - - - PREF_TAB_SETTINGS - Settings - - - PREF_TYPE_OF_MARKER - Type - - - PREF_BASE_VECTORS_LENGTH - Length of base vectors - - - PREF_WIREFRAME_COLOR - Default wireframe color - - - PROCESS_SHAPE_NEW_OBJ_NAME - ProcessShape - - - REMOVE_HOLES_NEW_OBJ_NAME - SupressHoles - - - REMOVE_INT_WIRES_NEW_OBJ_NAME - RemoveIntWires - - - SEWING_NEW_OBJ_NAME - Sewing - - - STB_ALL_SEL_ONLY - Select all Objects - - - STB_ARC - Create an arc - - - STB_ARCHIMEDE - Archimede operation - - - STB_BASIC_PROPS - Show basic properties of the shape - - - STB_BND_BOX - Compute bounding box of the shape - - - STB_BOX - Create a box - - - STB_CHAMFER - Create a chamfer - - - STB_CHANGE_ORIENTATION - Change orientation - - - STB_CHECK - Check shape validity - - - STB_CHECK_COMPOUND - Check compound of blocks - - - STB_CHECK_FREE_BNDS - Check free boundaries - - - STB_CHECK_FREE_FACES - Check free faces - - - STB_CHECK_GEOMETRY - Check Geometry - - - STB_CIRCLE - Create a circle - - - STB_CLIPPING - Clipping range - - - STB_CLOSE_CONTOUR - Perform close contour - - - STB_COMMON - Common - - - STB_COMPOUND - Build a compound - - - STB_COMPOUND_SEL_ONLY - Select only a Compounds - - - STB_CONE - Create a cone - - - STB_CURVE - Create a curve - - - STB_CUT - Cut - - - STB_CYLINDER - Create a cylinder - - - STB_RECTANGLE - Create rectangular face - - - STB_DELETE - Delete object - - - STB_DISK - Create a disk - - - STB_DISPLAY - Show object(s) - - - STB_DISPLAY_ALL - Show all - - - STB_DISPLAY_ONLY - Show only - - - STB_EDGE - Build an edge - - - STB_EDGE_SEL_ONLY - Select only a Edges - - - STB_ELLIPSE - Create an ellipse - - - STB_ERASE - Hide object(s) - - - STB_ERASE_ALL - Hide all - - - STB_EXPLODE - Explode - - - STB_EXPLODE_BLOCKS - Explode on Blocks - - - STB_EXPORT - Export geometry to BREP file - - - STB_EXTRUSION - Create an extrusion - - - STB_FACE - Build a face - - - STB_FACE_SEL_ONLY - Select only a Faces - - - STB_FILLET - Create 3D fillet - - - STB_FILLET_1D - Create 1D fillet - - - STB_FILLET_2D - Create 2D fillet - - - STB_FILLING - Create a filling - - - STB_FUSE - Fuse - - - STB_GLUE_FACES - Perform glue faces - - - STB_GROUP_CREATE - Create a group - - - STB_GROUP_EDIT - Edit a group - - - STB_RELOAD_IMPORTED - Reload imported shape from its original place on disk - - - STB_HEX_SOLID - Hexahedral Solid - - - STB_IMPORT - Import geometry from BREP file - - - STB_INERTIA - Compute moments of intertia of the shape - - - STB_ISOS - Set number of isolines - - - STB_LINE - Create a line - - - STB_LOCAL_CS - Create a local coordinate system - - - STB_MASS_CENTER - Compute center of mass of the shape - - - STB_MIN_DIST - Compute minimum distance between two objects - - - STB_MIRROR - Mirror a shape - - - STB_MODIFY_LOCATION - Modify shape's location - - - STB_MUL_ROTATION - Perform multi-rotation - - - STB_MUL_TRANSFORM - Perform multi-transformation - - - STB_MUL_TRANSLATION - Perform multi-translation - - - STB_OFFSET - Offset surface - - - STB_ORIGIN_AND_VECTORS - Create an origin and base Vectors - - - STB_PARTITION - Make a partition - - - STB_PIPE - Create a shape by extrusion along a path - - - STB_PLANE - Create a plane - - - STB_POINT - Create a point - - - STB_POINT_COORDS - Display point coordinates - - - STB_POINT_ON_EDGE - Add point on edge - - - STB_POP_COLOR - Color - - - STB_POP_CREATE_GROUP - Create Group - - - STB_POP_SHOW_CHILDREN - Show child objects - - - STB_POP_HIDE_CHILDREN - Hide child objects - - - STB_POP_ISOS - Isolines - - - STB_POP_DEFLECTION - Deflection Coefficient - - - STB_POP_RENAME - Rename - - - STB_POP_SHADING - Shading - - - STB_POP_TRANSPARENCY - Transparency - - - STB_POP_WIREFRAME - Wireframe - - - STB_PROPAGATE - Propagate - - - STB_Q_FACE - Quadrangle Face - - - STB_REVOLUTION - Create a revolution - - - STB_ROTATION - Rotate a shape - - - STB_SCALE - Scale a shape - - - STB_SECTION - Section - - - STB_SEWING - Perform sewing - - - STB_SHADING - Shading - - - STB_VECTOR_MODE - Change Edge Presentation Mode - - - STB_SHADING_COLOR - Set shading color - - - STB_SHAPE_PROCESS - Perform shape processing - - - STB_SHELL - Build a shell - - - STB_SHELL_SEL_ONLY - Select only a Shells - - - STB_SKETCH - Create 2D sketch - - - STB_3DSKETCH - Create 3D sketch - - - STB_SOLID - Build a solid - - - STB_SOLID_SEL_ONLY - Select only a Solids - - - STB_SPHERE - Create a sphere - - - STB_STEP_VALUE - Set step value - - - STB_SUPPERSS_HOLES - Perform suppress holes - - - STB_SUPPRESS_FACES - Perform suppress faces - - - STB_SUPPRESS_INT_WIRES - Perform suppress internal wires - - - STB_TOLERANCE - Compute tolerance of the shape - - - STB_TORUS - Create a torus - - - STB_TRANSLATION - Translate shape - - - STB_VECTOR - Create a vector - - - STB_VERTEX_SEL_ONLY - Select only a Points - - - STB_WHAT_IS - What is - - - STB_WIRE - Build a wire - - - STB_WIRE_SEL_ONLY - Select only a Wires - - - STB_WORK_PLANE - Create a working plane - - - STB_POP_POINT_MARKER - Set Point Marker - - - SUPPRESS_RESULT - Suppress Result - - - SUPRESS_FACE_NEW_OBJ_NAME - SupressFaces - - - ShHealOper_ErrorExecution_msg - Shape Healing algorithm failed - - - ShHealOper_InvalidParameters_msg - Incorrect parameters for Shape Healing algorithm - - - ShHealOper_NotError_msg - Shape Healing algorithm has done no modification of the original shape - - - TLT_RENAME - Rename - - - TOM_O - O - - - TOM_O_PLUS - + in O - - - TOM_O_POINT - . in O - - - TOM_O_STAR - * in O - - - TOM_O_X - X in O - - - TOM_PLUS - + - - - TOM_POINT - . - - - TOM_STAR - * - - - TOM_X - X - - - TOOL_BASIC - Basic - - - TOOL_BOOLEAN - Boolean operations - - - TOOL_GENERATION - Generation - - - TOOL_PRIMITIVES - Primitives - - - TOOL_TRANSFORMATION - Transformation - - - TOOL_BUILD - Build - - - TOOL_OPERATIONS - Operations - - - TOOL_ADVANCED - Advanced - - - TOOL_MEASURES - Measures - - - TOP_ARC - Create an arc - - - TOP_ARCHIMEDE - Archimede - - - TOP_BASIC_PROPS - Basic properties - - - TOP_BND_BOX - Bounding box - - - TOP_BOX - Create a box - - - TOP_CHAMFER - Chamfer - - - TOP_CHANGE_ORIENTATION - Change orientation - - - TOP_CHECK - Check shape - - - TOP_CHECK_COMPOUND - Check compound of blocks - - - TOP_CHECK_FREE_BNDS - Check free boundaries - - - TOP_CHECK_FREE_FACES - Check free faces - - - TOP_CHECK_GEOMETRY - Check Geometry - - - TOP_CIRCLE - Create a circle - - - TOP_CLIPPING - Clipping range - - - TOP_CLOSE_CONTOUR - Perform close contour - - - TOP_COMMON - Common - - - TOP_COMPOUND - Build compound - - - TOP_CONE - Create a cone - - - TOP_CURVE - Create a curve - - - TOP_CUT - Cut - - - TOP_CYLINDER - Create a cylinder - - - TOP_DELETE - Delete object - - - TOP_RECTANGLE - Create rectangular face - - - TOP_DISK - Create a disk - - - TOP_DISPLAY - Show - - - TOP_DISPLAY_ALL - Show all - - - TOP_DISPLAY_ONLY - Show only - - - TOP_EDGE - Build edge - - - TOP_ELLIPSE - Create an ellipse - - - TOP_ERASE - Hide - - - TOP_ERASE_ALL - Hide all - - - TOP_EXPLODE - Explode - - - TOP_EXPLODE_BLOCKS - Explode on Blocks - - - TOP_EXPORT - Export geometry to BREP file - - - TOP_EXTRUSION - Create an extrusion - - - TOP_FACE - Build face - - - TOP_FILLET - Fillet 3D - - - TOP_FILLET_1D - Fillet 1D - - - TOP_FILLET_2D - Fillet 2D - - - TOP_FILLING - Create a filling - - - TOP_FUSE - Fuse - - - TOP_GLUE_FACES - Perform glue faces - - - TOP_GROUP_CREATE - Create a group - - - TOP_GROUP_EDIT - Edit a group - - - TOP_HEX_SOLID - Hexahedral Solid - - - TOP_IMPORT - Import geometry from BREP file - - - TOP_INERTIA - Moments of intertia - - - TOP_ISOS - Set number of isolines - - - TOP_LINE - Create a line - - - TOP_LOCAL_CS - Create a local coordinate system - - - TOP_MASS_CENTER - Center of mass - - - TOP_MIN_DIST - Minimum distance - - - TOP_MIRROR - Mirror image - - - TOP_MODIFY_LOCATION - Modify location - - - TOP_MUL_ROTATION - Multi-Rotation - - - TOP_MUL_TRANSFORM - Multi-transformation - - - TOP_MUL_TRANSLATION - Multi-Translation - - - TOP_OFFSET - Offset surface - - - TOP_ORIGIN_AND_VECTORS - Create an origin and base Vectors - - - TOP_PARTITION - Partition - - - TOP_PIPE - Extrusion along path - - - TOP_PLANE - Create a plane - - - TOP_POINT - Create a point - - - TOP_POINT_COORDS - Point coordinates - - - TOP_POINT_ON_EDGE - Add point on edge - - - TOP_POP_COLOR - Color - - - TOP_POP_CREATE_GROUP - Create Group - - - TOP_POP_SHOW_CHILDREN - Show Children - - - TOP_POP_HIDE_CHILDREN - Hide Children - - - TOP_POP_ISOS - Isolines - - - TOP_POP_DEFLECTION - Deflection Coefficient - - - TOP_POP_RENAME - Rename - - - TOP_POP_SHADING - Shading - - - TOP_POP_TRANSPARENCY - Transparency - - - TOP_POP_WIREFRAME - Wireframe - - - TOP_PROPAGATE - Propagate - - - TOP_Q_FACE - Quadrangle Face - - - TOP_REVOLUTION - Create a revolution - - - TOP_ROTATION - Rotation - - - TOP_SCALE - Scale transform - - - TOP_SECTION - Section - - - TOP_SEWING - Perform sewing - - - TOP_SHADING - Shading - - - TOP_SHADING_COLOR - Set shading color - - - TOP_SHAPE_PROCESS - Perform shape processing - - - TOP_SHELL - Build shell - - - TOP_SKETCH - 2D sketch - - - TOP_3DSKETCH - 3D sketch - - - TOP_SOLID - Build solid - - - TOP_SPHERE - Create a sphere - - - TOP_STEP_VALUE - Set step value - - - TOP_SUPPERSS_HOLES - Perform suppress holes - - - TOP_SUPPRESS_FACES - Perform suppress faces - - - TOP_SUPPRESS_INT_WIRES - Perform suppress internal wires - - - TOP_TOLERANCE - Tolerance - - - TOP_TORUS - Create a torus - - - TOP_TRANSLATION - Translation - - - TOP_VECTOR - Create a vector - - - TOP_WHAT_IS - What is - - - TOP_WIRE - Build wire - - - TOP_WORK_PLANE - Create a working plane - - - TOP_POP_POINT_MARKER - Point Marker - - - WRN_NOT_IMPLEMENTED - Sorry, this functionality is not yet implemented - - - _S_ - (s) - - - NOT_FOUND_ANY - Not a single entity has been found - - - GEOM_FACE_I - Face %1 - - - GEOM_CONSTANT_RADIUS - Radius : - - - GEOM_R1 - R1 : - - - GEOM_R2 - R2 : - - - GEOM_BOTHWAY - Both Directions - - - GEOM_NORMALE - Normal To A Face - - - GEOM_VECTOR_NORMALE - Vector_Normal - - - GEOM_LINE1 - Line 1 - - - GEOM_LINE2 - Line 2 - - - GEOM_D - D : - - - GEOM_CHAMFER_EDGE - Chamfer On Selected Edges - - - SELECTED_EDGE - Selected Edges - - - GEOM_NORMALE_TITLE - Create Normal To A Face - - - GEOM_MEASURE_ANGLE_TITLE - Angle Between Two Straight Edges/Lines/Vectors - - - GEOM_MEASURE_ANGLE_ANGLE - Angle - - - GEOM_MEASURE_ANGLE_OBJ - Objects And Results - - - GEOM_MEASURE_ANGLE_IS - Angle in degrees : - - - GEOM_LINE_INTERSECTION - Point On Lines Intersection - - - GEOM_KEEP_NONLIMIT_SHAPES - Keep shapes of lower type - - - GEOM_CENTER_2POINTS - Center and two points - - - GEOM_REMOVE_EXTRA_EDGES_TITLE - Remove extra edges - - - GEOM_REMOVE_EXTRA_EDGES - Object to remove extra edges - - - GEOM_RMEE_UNION_FACES - Union faces, laying on common surface - - - REMOVE_EXTRA_EDGES_NEW_OBJ_NAME - NoExtraEdges - - - TOP_REMOVE_EXTRA_EDGES - Remove extra edges - - - MEN_REMOVE_EXTRA_EDGES - Remove Extra Edges - - - STB_REMOVE_EXTRA_EDGES - Remove extra edges - - - TOP_NORMALE - Normal to a face - - - MEN_NORMALE - Normal to a Face - - - STB_NORMALE - Compute normal to the face - - - TOP_MEASURE_ANGLE - Angle - - - MEN_MEASURE_ANGLE - Angle - - - STB_MEASURE_ANGLE - Compute angle between two lines or linear edges - - - TOP_POP_AUTO_COLOR - Auto color - - - MEN_POP_AUTO_COLOR - Auto Color - - - STB_POP_AUTO_COLOR - Auto color - - - TOP_POP_DISABLE_AUTO_COLOR - Disable auto color - - - MEN_POP_DISABLE_AUTO_COLOR - Disable Auto Color - - - STB_POP_DISABLE_AUTO_COLOR - Disable auto color - - - GEOM_RESULT_NAME_GRP - Result name - - - GEOM_RESULT_NAME_LBL - Name - - - GEOM_FILLING_APPROX - Approximation - - - GEOM_FILLING_METHOD - Method - - - GEOM_FILLING_DEFAULT - Default (standard behaviour) - - - GEOM_FILLING_USEORI - Use edges orientation - - - GEOM_FILLING_AUTO - Auto-correct edges orientation - - - GEOM_WRN_NO_APPROPRIATE_SELECTION - No appropriate objects selected - - - GEOM_SHAPES_ON_SHAPE - Get shapes on shape - - - GEOM_SHAPES_ON_SHAPE_ESHAPE - Shape for exploding - - - GEOM_SHAPES_ON_SHAPE_CSHAPE - Solid for checking - - - GEOM_SHAPES_ON_SHAPE_STATE - State - - - GEOM_KIND_OF_SHAPE - Kind of Shape : - - - GEOM_CLOSED - Closed - - - GEOM_UNCLOSED - Opened - - - GEOM_CLOSEDUNCLOSED - Not defined, Closed or Opened. Possibly, error occured. - - - GEOM_DISK_CIRCLE - Disk - - - GEOM_DISK_ELLIPSE - Elliptical face - - - GEOM_PLANAR_FACE - Planar Face - - - GEOM_PLANAR_EDGE_WIRE - Wire with Planar Edges - - - GEOM_POLYGON - Polygon - - - GEOM_POLYHEDRON - Polyhedron - - - GEOM_NORMAL - Normal direction - - - GEOM_DIRECTION - Direction - - - GEOM_UPARAMETER - U-parameter : - - - GEOM_VPARAMETER - V-parameter : - - - GEOM_X_I - X%1 : - - - GEOM_Y_I - Y%1 : - - - GEOM_Z_I - Z%1 : - - - GEOM_SHAPES_ON_SHAPE_TITLE - Get shapes on shape - - - GEOM_SCALE_FACTOR_X - Scale Factor X : - - - GEOM_SCALE_FACTOR_Y - Scale Factor Y : - - - GEOM_SCALE_FACTOR_Z - Scale Factor Z : - - - GEOM_STATE_IN - IN - - - GEOM_STATE_OUT - OUT - - - GEOM_STATE_ON - ON - - - GEOM_STATE_ONIN - ONIN - - - GEOM_STATE_ONOUT - ONOUT - - - GEOM_STATE_INOUT - INOUT - - - TOP_GET_SHAPES_ON_SHAPES - Get shapes on shape - - - MEN_GET_SHAPES_ON_SHAPES - Get Shapes on Shape - - - STB_GET_SHAPES_ON_SHAPES - Get shapes on shape - - - GEOM_PUBLISH_RESULT_GRP - Advanced options - - - GEOM_RESTORE_SUB_SHAPES - Set presentation parameters and subshapes from arguments - - - GEOM_RSS_ADD_FREFIX - Add prefix to names of restored subshapes - - - GEOM_ALL_IMPORT_FILES - All supported formats ( %1 ) - - - GEOM_UNSUPPORTED_TYPE - Unsupported format for the file - - - GEOM_UNKNOWN_IMPORT_ERROR - Unknown error - - - GEOM_IMPORT_ERRORS - Import operation has finished with errors: - - - GEOM_PUBLISH_NAMED_SHAPES - Create groups for named shapes (if there are any)? - - - GEOM_SCALE_DIMENSIONS - Would you like to take into account the units? + + + iErr : 10 + the Classifier is NULL + + + iErr : 11 + the Shape is NULL + + + iErr : 12 + Unallowed Type of Subshape + + + iErr : 13 + Unallowed State + + + iErr : 15 + Unallowed Surface Type + + + iErr : 20 + Triangulation is not Found + + + iErr : 30 + Can not Obtain the Line From the Link + + + iErr : 40 + A Point Can Not Be Classified + + + iErr : 41 + Invalid Data for Classifier + + + GEOM_2D_CONTINUTY + 2D continuity + + + GEOM_2D_CURVE_MODE + 2D curve mode + + + GEOM_2D_TOLERANCE + 2D tolerance + + + GEOM_3D_CONTINUTY + 3D continuity + + + GEOM_3D_CURVE_MODE + 3D curve mode + + + GEOM_3D_TOLERANCE + 3D tolerance + + + GEOM_3_POINTS + 3 points + + + GEOM_ADD_POINT + Add point + + + GEOM_ANGLE + Angle : + + + GEOM_ANGLE_1 + Angle + + + GEOM_ARC_ELLIPSE + Arc of ellipse + + + GEOM_ARC + Arc + + + GEOM_ARCHIMEDE + Archimede + + + GEOM_ARCHIMEDE_TITLE + Archimede Construction + + + GEOM_ARC_TITLE + Arc Construction + + + GEOM_ARGUMENTS + Arguments + + + GEOM_AXE_MIRROR + Axe Mirror + + + GEOM_AXIS + Axis + + + GEOM_BASE + Base + + + GEOM_BASE_OBJECT + Base Object + + + GEOM_BASE_POINT + Base Point + + + GEOM_BEZIER + Bezier + + + GEOM_BINORMAL + BiNormal + + + GEOM_BLOCK + Hexahedral Solid + + + GEOM_BLOCKS_COMPOUND + BlocksCompound + + + GEOM_BLOCK_EXPLODE + Sub Blocks + + + GEOM_BLOCK_EXPLODE_TITLE + Sub Blocks Selection + + + GEOM_BLOCK_MULTITRSF + Block Multi-Transformation + + + GEOM_BLOCK_MULTITRSF_DOUBLE + Multi-Transformation Double + + + GEOM_BLOCK_MULTITRSF_SIMPLE + Multi-Transformation Simple + + + GEOM_BLOCK_MULTITRSF_TITLE + Block Multi-Transformation + + + GEOM_BLOCK_TITLE + Hexahedral Solid Construction + + + GEOM_BNDBOX + Bounding Box + + + GEOM_BNDBOX_OBJDIM + Object And Its Dimensions + + + GEOM_BNDBOX_TITLE + Bounding Box Information + + + GEOM_BOX + Box + + + GEOM_BOX_OBJ + Dimensions At Origin + + + GEOM_BOX_TITLE + Box Construction + + + GEOM_BSplineRestriction + BSplineRestriction + + + GEOM_BUT_APPLY + &Apply + + + GEOM_BUT_CANCEL + &Cancel + + + GEOM_BUT_CLOSE + &Close + + + GEOM_BUT_CLOSE_SKETCH + Sketch Closure + + + GEOM_BUT_END_SKETCH + Sketch Validation + + + GEOM_BUT_EXPLODE + &Explode + + + GEOM_BUT_HELP + &Help + + + GEOM_BUT_NO + &No + + + GEOM_BUT_OK + O&k + + + GEOM_BUT_APPLY_AND_CLOSE + A&pply and Close + + + GEOM_BUT_YES + &Yes + + + GEOM_BY_LENGTH + By length + + + GEOM_BY_PARAMETER + By parameter + + + GEOM_CENTER + Center + + + GEOM_CENTER_POINT + Center Point + + + GEOM_CENTRAL_POINT + Central Point + + + GEOM_CHAMFER + Chamfer + + + GEOM_CHAMFER_ABORT + Chamfer can't be computed with %1 and %2 + + + GEOM_CHAMFER_ALL + Chamfer On Whole Shape + + + GEOM_CHAMFER_EDGES + Chamfer On Edges From Shape + + + GEOM_CHAMFER_FACES + Chamfer On Faces From Shape + + + GEOM_CHAMFER_TITLE + Chamfer Construction + + + GEOM_CHANGE_ORIENTATION + Objects to change orientation + + + GEOM_CHANGE_ORIENTATION_TITLE + Change orientation + + + GEOM_CHECK_BLOCKS_COMPOUND + Check and Improve Blocks Compound + + + GEOM_CHECK_BLOCKS_COMPOUND_FAILED + Check failed + + + GEOM_CHECK_BLOCKS_COMPOUND_ERRORS + Errors + + + GEOM_CHECK_BLOCKS_COMPOUND_HAS_ERRORS + The Compound of Blocks has errors + + + GEOM_CHECK_BLOCKS_COMPOUND_HAS_NO_ERRORS + The Compound of Blocks has no errors + + + GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES + Incriminated Sub-Shapes + + + GEOM_CHECK_INFOS + Object And Its Topological Information + + + GEOM_CHECK_SHAPE + Check Shape + + + GEOM_CHECK_TITLE + Check Shape Information + + + GEOM_CIRCLE + Circle + + + GEOM_CIRCLE_TITLE + Circle Construction + + + GEOM_CLOSECONTOUR_TITLE + Close contour + + + GEOM_CMASS + Center Of Mass + + + GEOM_CMASS_TITLE + Center Of Mass Construction + + + GEOM_COMMON + Common + + + GEOM_COMMON_TITLE + Common Of Two Objects + + + GEOM_COMPOUND + Compound + + + GEOM_COMPOUNDSOLID + CompSolid + + + GEOM_COMPOUND_TITLE + Create A Compound + + + GEOM_CONE + Cone + + + GEOM_CONE_TITLE + Cone Construction + + + GEOM_CONFIRM + Confirm operation + + + GEOM_CONFIRM_INFO + Shape contains %1 sub shapes ! + + + GEOM_COOR + Coord. : + + + GEOM_COORDINATES + Coordinates + + + GEOM_COORDINATES_RES + Result coordinates + + + GEOM_CREATE_COPY + Create a copy + + + GEOM_CREATE_SINGLE_SOLID + Create a single solid + + + GEOM_CURVE + Curve + + + GEOM_CURVE_CONTINUTY + Curve continuity + + + GEOM_CURVE_TITLE + Curve Construction + + + GEOM_CUT + Cut + + + GEOM_CUT_TITLE + Cut Of Two Objects + + + GEOM_CYLINDER + Cylinder + + + GEOM_CYLINDER_TITLE + Cylinder Construction + + + GEOM_D1 + D1 : + + + GEOM_D2 + D2 : + + + GEOM_DETECT + Detect + + + GEOM_DIAGONAL_POINTS + Diagonal Points + + + GEOM_DISK + Disk + + + GEOM_DISK_TITLE + Disk Construction + + + GEOM_DIMENSIONS + Dimensions + + + GEOM_DISTANCE + Distance + + + GEOM_DIVIDE_EDGE_TITLE + Addition of point + + + GEOM_DX + Dx : + + + GEOM_DY + Dy : + + + GEOM_DZ + Dz : + + + GEOM_DropSmallEdges + DropSmallEdges + + + GEOM_EDGE + Edge + + + GEOM_EDGE_TITLE + Create An Edge + + + GEOM_ELLIPSE + Ellipse + + + GEOM_ELLIPSE_ERROR_1 + Error creating ellipse. Reason: minor radius is greater than major radius. + + + GEOM_ELLIPSE_TITLE + Ellipse Construction + + + GEOM_END_LCS + End LCS + + + GEOM_ERROR + Error + + + GEOM_ERROR_STATUS + Operation status + + + GEOM_ERR_GET_ENGINE + Failed to obtain GEOM Engine component. Reload Geometry module and try again. + + + GEOM_ERR_LIB_NOT_FOUND + GUI library corresponding to the user action can not be found or loaded + + + GEOM_EXTRUSION + Extrusion + + + GEOM_EXTRUSION_BSV + Base Shape + Vector + + + GEOM_EXTRUSION_BSV_2P + Base Shape + 2 Points + + + GEOM_EXTRUSION_DXDYDZ + Base Shape + DX DY DZ Vector + + + GEOM_EXTRUSION_TITLE + Construction by Extrusion + + + GEOM_FACE + Face + + + GEOM_CS + Coordinate system + + + GEOM_GCS + Global coordinate system + + + GEOM_LCS + Local coordinate system + + + GEOM_FACES + Faces + + + GEOM_FACE_FFW + Face creation from wires and/or edges + + + GEOM_FACE_OPT + Try to create a planar face + + + GEOM_FACE_OR_LCS + Face or LCS + + + GEOM_FACE_SELECTION + Face Selection + + + GEOM_FACE_TITLE + Create A Face + + + GEOM_RECTANGLE_TITLE + Rectangle Construction + + + GEOM_RECTANGLE + Rectangle + + + GEOM_FILLET + Fillet + + + GEOM_FILLET_2D + Fillet 2D + + + GEOM_FILLET_1D + Fillet 1D + + + GEOM_FILLET_ABORT + Fillet can't be computed with radius %1 + + + GEOM_FILLET_ALL + Fillet On Whole Shape + + + GEOM_FILLET_EDGES + Fillet On Edges From Shape + + + GEOM_FILLET_WIRES + Fillet On Wires From Shape + + + GEOM_FILLET_FACES + Fillet On Faces From Shape + + + GEOM_FILLET_VERTEXES + Fillet On Vertexes From Face + + + GEOM_FILLET_TITLE + Fillet Construction + + + GEOM_FILLET_2D_TITLE + 2D Fillet Construction + + + GEOM_FILLET_1D_TITLE + 1D Fillet Construction + + + GEOM_FILLING + Filling + + + GEOM_FILLING_ARG + Arguments And Parameters + + + GEOM_FILLING_COMPOUND + Input compound + + + GEOM_FILLING_MAX_DEG + Max deg + + + GEOM_FILLING_MIN_DEG + Min deg + + + GEOM_FILLING_NB_ITER + Nb. Iter : + + + GEOM_FILLING_TITLE + Filling Surface With Edges + + + GEOM_FILLING_TOL_2D + Tol. 2D : + + + GEOM_FILLING_TOL_3D + Tol. 3D : + + + GEOM_FREE_BOUNDARIES + Free boundaries + + + GEOM_FREE_BOUNDS_ERROR + Object is not selected + + + GEOM_FREE_BOUNDS_MSG + Number of free boundaries detected: %1 (%2 closed, %3 open) + + + GEOM_FREE_BOUNDS_TLT + Free boundary detection + + + GEOM_FREE_FACES + Free faces + + + GEOM_FREE_FACES_TITLE + Free faces + + + GEOM_FUSE + Fuse + + + GEOM_FUSE_TITLE + Fuse Two Objects + + + GEOM_FixFaceSize + FixFaceSize + + + GEOM_FixShape + FixShape + + + GEOM_GLUE + Glue + + + GEOM_GLUE_TITLE + Glue faces + + + GEOM_LIMIT_TOLERANCE_TITLE + Limit tolerance + + + GEOM_HEIGHT + Height : + + + GEOM_HOLES + Holes + + + GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE + Identical names : select by mouse ! + + + GEOM_IMPORT + Imported_Shape + + + GEOM_INCORRECT_INPUT + Incorrect Input Data! + + + GEOM_INERTIA_CONSTR + Matrix And Moments Of Inertia + + + GEOM_INERTIA_I + %1:1 : + + + GEOM_INERTIA_IXYZ + IX & IY & IZ : + + + GEOM_INERTIA_TITLE + Calculs Of Inertia + + + GEOM_INF_LOADED + File %1 loaded. + + + GEOM_INTERNAL_WIRES + Internal wires + + + GEOM_INTERPOL + Interpolation + + + GEOM_KEEP_OBJECT + Keep Object + + + GEOM_LENGTH + Length : + + + GEOM_LINE + Line + + + GEOM_LINE_TITLE + Line Construction + + + GEOM_MAIN_OBJECT + Main Object + + + GEOM_MARKER + Marker + + + GEOM_MARKER_TITLE + Create marker + + + GEOM_MATERIAL_ID + Material ID: + + + GEOM_MATERIAL_MATERIAL + Material + + + GEOM_MATERIAL_SET + << Set + + + GEOM_MATERIAL_SHAPE + Shapes + + + GEOM_MATERIAL_TITLE + Define materials for Dominant Fuse + + + GEOM_MATRIX + Matrix : + + + GEOM_MAX + Max : + + + GEOM_MAX_3D_TOLERANCE + Max 3D tolerance + + + GEOM_MAX_TOLERANCE + Max tolerance + + + GEOM_MEN_ALL_FILES + All Files ( * ) + + + GEOM_MEN_ANGLE + Angle : + + + GEOM_MEN_COMPONENT + Geometry + + + GEOM_MEN_ENTER_ANGLE + Enter An Angle In Degrees + + + GEOM_MEN_EXPORT + Export + + + GEOM_MEN_IMPORT + Import + + + GEOM_MEN_ISOS + Select Number Of Isos + + + GEOM_MEN_ISOU + Isos U : + + + GEOM_MEN_ISOV + Isos V : + + + GEOM_MEN_POPUP_NAME + %1 Objects + + + GEOM_MEN_SHADING + Shading + + + GEOM_MEN_SKETCHER_X + Enter a Length to Set X + + + GEOM_MEN_SKETCHER_Y + Enter a Length to Set Y + + + GEOM_MEN_STEP_LABEL + Step : + + + GEOM_MEN_TRANSPARENCY + Transparency + + + GEOM_MEN_TRANSPARENCY_LABEL + Transparency : + + + GEOM_MEN_WIREFRAME + Wireframe + + + GEOM_MEN_X + X : + + + GEOM_MEN_Y + Y : + + + GEOM_MESHING_DEFLECTION + Meshing Deflect. : + + + GEOM_MIN + Min : + + + GEOM_MINDIST_OBJ + Objects And Results + + + GEOM_MINDIST_TITLE + Minimun Distance Between Two Objects + + + GEOM_MIRROR + Mirror + + + GEOM_MIRROR_TITLE + Mirror An Object + + + GEOM_MULTIROTATION + Multi-Rotation + + + GEOM_MULTIROTATION_DOUBLE + Multi Rotation Double + + + GEOM_MULTIROTATION_SIMPLE + Multi Rotation Simple + + + GEOM_MULTIROTATION_TITLE + Multi-Rotation + + + GEOM_MULTITRANSLATION + Multi-Translation + + + GEOM_MULTITRANSLATION_DOUBLE + Multi Translation Double + + + GEOM_MULTITRANSLATION_SIMPLE + Multi Translation Simple + + + GEOM_MULTITRANSLATION_TITLE + Multi-Translation + + + GEOM_NAME_INCORRECT + Object name not found + + + GEOM_NB_BLOCKS_NO_OTHERS + There are %1 specified blocks and NO other solids + + + GEOM_NB_BLOCKS_SOME_OTHERS + There are %1 specified blocks and some other solids + + + GEOM_NB_TIMES + Nb. Times : + + + GEOM_NB_TIMES_U + Nb. Times U : + + + GEOM_NB_TIMES_V + Nb. Times V : + + + GEOM_NODES + Nodes + + + GEOM_NUM_SPLIT_POINTS + Number of splitting points + + + GEOM_OBJECT + Object + + + GEOM_OBJECT_TYPE + Object Type + + + GEOM_OBJECTS + Objects + + + GEOM_OBJECT_I + Object %1 + + + GEOM_OBJECT_RESULT + Object And Result + + + GEOM_OFFSET + Offset + + + GEOM_OFFSET_TITLE + Offset Surface + + + GEOM_OPERATIONS + Operations + + + GEOM_ORIENTATION + Orientation + + + GEOM_ORIENTATION_OPT + Reverse orientation with normal vectors simulation + + + GEOM_ORIENTATION_TITLE + Change Orientation + + + GEOM_PARAMETER + Parameter : + + + GEOM_PARAMETERS + Parameters + + + GEOM_POINT_ON_EDGE + Point on Edge + + + GEOM_POINT_ON_FACE + Point on Face + + + GEOM_PARAM_VALUE + By parameter + + + GEOM_COORD_VALUE + By coordinate + + + GEOM_PARTITION + Partition + + + GEOM_WRN_PARTITION_RESULT_EMPTY + The partition result is empty, please verify the reconstruction limit parameter. + + + GEOM_PARTITION_HALFSPACE + Half-space partition + + + GEOM_PARTITION_ORIENTATION + Change Orientation + + + GEOM_PARTITION_TITLE + Partition Of Object With Tool + + + GEOM_PATH_OBJECT + Path Object + + + GEOM_PIPE + Pipe + + + GEOM_PIPE_TITLE + Pipe Construction + + + GEOM_SEGMENT + Segment of straight line + + + GEOM_SELECT_UNPUBLISHED_EDGES + Select unpublished edges + + + GEOM_PLANE + Plane + + + GEOM_PLANE_MIRROR + Plane Mirror + + + GEOM_PLANE_PV + Point + Vector + + + GEOM_PLANE_PVC + Point + Coordinate Vector + + + GEOM_PLANE_SIZE + Size of plane : + + + GEOM_PLANE_TITLE + Plane Construction + + + GEOM_POINT + Point + + + GEOM_POINT1 + Point 1 + + + GEOM_POINT2 + Point 2 + + + GEOM_POINT3 + Point 3 + + + GEOM_POINTS + Points + + + GEOM_POINT_I + Point %1 + + + GEOM_POINT_MIRROR + Point Mirror + + + GEOM_POINT_TITLE + Point Construction + + + GEOM_POLYLINE + Polyline + + + GEOM_POSITION + Location + + + GEOM_POSITION_TITLE + Modify the Location of an Object + + + GEOM_PRECISION + Precision : + + + GEOM_PROPAGATE + Propagate + + + GEOM_PROPAGATE_TITLE + Propagate + + + GEOM_PROPERTIES + Basic Properties + + + GEOM_PROPERTIES_CONSTR + Object And Its Properties + + + GEOM_PROPERTIES_SURFACE + Surface is : + + + GEOM_PROPERTIES_TITLE + Basic Properties Information + + + GEOM_PROPERTIES_VOLUME + Volume is : + + + GEOM_PRP_ABORT + Operation aborted + + + GEOM_PRP_COMMAND + No command associated with this id = %1. + + + GEOM_PRP_DONE + Operation done + + + GEOM_PRP_EXPORT + Exporting geometry to %1 ... + + + GEOM_PRP_LOADING + Loading %1 ... + + + GEOM_PRP_MIN_DIST + Min Distance not computed + + + GEOM_PRP_NOT_FOR_VTK_VIEWER + Not allowed in VTK viewer + + + GEOM_PRP_NULLSHAPE + Error, null or inappropriate shape ! + + + GEOM_PRP_READY + Ready + + + GEOM_PRP_SELECT_EDGE + Select edges and click on Apply + + + GEOM_PRP_SELECT_FACE + Select faces to suppress and click on Ok/Apply + + + GEOM_PRP_SELECT_FIRST + Select main shape first + + + GEOM_PRP_SELECT_SUBSHAPES + Select Sub Shapes + + + GEOM_PRP_SHAPE_IN_STUDY + Main shape must be in the study before + + + GEOM_QUAD_FACE + Quadrangle Face + + + GEOM_QUAD_FACE_TITLE + Quadrangle Face Construction + + + GEOM_RADIUS + Radius : + + + GEOM_RADIUS_I + Radius %1 : + + + GEOM_RADIUS_MAJOR + Major radius : + + + GEOM_RADIUS_MINOR + Minor radius : + + + GEOM_RECONSTRUCTION_LIMIT + Resulting Type + + + GEOM_RECONSTRUCTION_LIMIT_EDGE + Edge + + + GEOM_RECONSTRUCTION_LIMIT_FACE + Face + + + GEOM_RECONSTRUCTION_LIMIT_SHAPE + Shape + + + GEOM_RECONSTRUCTION_LIMIT_SHELL + Shell + + + GEOM_RECONSTRUCTION_LIMIT_SOLID + Solid + + + GEOM_RECONSTRUCTION_LIMIT_VERTEX + Vertex + + + GEOM_RECONSTRUCTION_LIMIT_WIRE + Wire + + + GEOM_REF_POINT + Point with reference + + + GEOM_REMOVE_ALL_HOLES + Remove all holes + + + GEOM_REMOVE_ALL_INT_WIRES + Remove all internal wires + + + GEOM_REMOVE_HOLES_TITLE + Suppress holes + + + GEOM_REMOVE_INTERNAL_WIRES_TITLE + Suppress internal wires + + + GEOM_REMOVE_WEBS + Remove webs + + + GEOM_REQUIRED_DEGREE + Required degree + + + GEOM_REQUIRED_NUM_SEGMENTS + Required number of segments + + + GEOM_REVERSE + Reverse + + + GEOM_REVERSE_DIRECTION + Reverse Direction + + + GEOM_REVERSE_PLANE + Reverse the plane normal + + + GEOM_REVERSE_U + Reverse U + + + GEOM_REVERSE_V + Reverse V + + + GEOM_REVERSE_VECTOR + Reverse Vector + + + GEOM_REVOLUTION + Revolution + + + GEOM_REVOLUTION_TITLE + Construction By Revolution + + + GEOM_ROTATION + Rotation + + + GEOM_ROTATION_TITLE + Rotation Of An Object + + + GEOM_SCALE + Scale + + + GEOM_SCALE_FACTOR + Scale Factor : + + + GEOM_SCALE_TITLE + Scale An Object + + + GEOM_SECTION + Section + + + GEOM_SECTION_TITLE + Section Of Two Objects + + + GEOM_SELECTED_FACE + Selected face + + + GEOM_SELECTED_OBJECTS + Selected objects + + + GEOM_SELECTED_SHAPE + Selected shape + + + GEOM_SELECTION + Selection + + + GEOM_SET_MATERIALS + Set materials + + + GEOM_SEWING + Sewing + + + GEOM_SEWING_TITLE + Topological sewing + + + GEOM_SHAPE + Shape + + + GEOM_SHAPEPROCESS_TITLE + Shape Processing + + + GEOM_SHAPES + Shapes + + + GEOM_SHELL + Shell + + + GEOM_SHELLS + Shells + + + GEOM_SHELL_TITLE + Shell Construction + + + GEOM_SKETCHER_ABS + Absolute + + + GEOM_SKETCHER_ANGLE + Angle + + + GEOM_SKETCHER_ANGLE2 + Angle : + + + GEOM_SKETCHER_APPLY + Apply + + + GEOM_SKETCHER_ARC + Arc + + + GEOM_SKETCHER_DEST + Destination + + + GEOM_SKETCHER_DIR + Direction + + + GEOM_SKETCHER_DX2 + DX : + + + GEOM_SKETCHER_DY2 + DY : + + + GEOM_SKETCHER_DZ2 + DZ : + + + GEOM_SKETCHER_EL + Element Type + + + GEOM_SKETCHER_RESTORE + Restore + + + GEOM_SKETCHER_LENGTH + Length + + + GEOM_SKETCHER_LENGTH2 + Length : + + + GEOM_SKETCHER_PER + Perpendicular + + + GEOM_SKETCHER_POINT + Point + + + GEOM_SKETCHER_POINT2 + Point : + + + GEOM_SKETCHER_RADIUS2 + Radius : + + + GEOM_SKETCHER_REL + Relative + + + GEOM_SKETCHER_SEGMENT + Segment + + + GEOM_SKETCHER_SEL + Selection + + + GEOM_SKETCHER_TAN + Tangent + + + GEOM_SKETCHER_TITLE + 2D Sketch Construction + + + GEOM_3DSKETCHER_TITLE + 3D Sketch Construction + + + GEOM_SKETCHER_TYPE + Type + + + GEOM_SKETCHER_UNDO + Undo + + + GEOM_SKETCHER_VALUES + Values + + + GEOM_SKETCHER_VX2 + VX : + + + GEOM_SKETCHER_VXVY + VX-VY + + + GEOM_SKETCHER_VY2 + VY : + + + GEOM_SKETCHER_X + X + + + GEOM_SKETCHER_X2 + X : + + + GEOM_SKETCHER_X3 + Abs. X : + + + GEOM_SKETCHER_Y + Y + + + GEOM_SKETCHER_Y2 + Y : + + + GEOM_SKETCHER_Y3 + Abs. Y : + + + GEOM_SKETCHER_Z2 + Z : + + + GEOM_3DSKETCHER + 3D Sketcher + + + GEOM_COORDINATES_TYPE + Coordinates Type + + + GEOM_SOLID + Solid + + + GEOM_SOLID_TITLE + Solid Construction + + + GEOM_SPHERE + Sphere + + + GEOM_SPHERE_CR + Center + Radius + + + GEOM_SPHERE_RO + Radius At Origin + + + GEOM_SPHERE_TITLE + Sphere Construction + + + GEOM_SPLINE + Spline + + + GEOM_SPLINE_TITLE + Spline Construction + + + GEOM_START_LCS + Start LCS + + + SELECT_UNPUBLISHED_EDGES + Select unpublished edges + + + GEOM_STEP + Step : + + + GEOM_STEP_TITLE + Step value for GUI constructions + + + GEOM_STEP_U + Step U : + + + GEOM_STEP_V + Step V : + + + GEOM_STUDY_LOCKED + The active study is locked and therefore cannot be modified + + + GEOM_SUBSHAPE_SELECT + Select Sub Shapes + + + GEOM_SUBSHAPE_TITLE + Sub Shapes Selection + + + GEOM_SUBSHAPE_TYPE + Sub Shapes Type : + + + GEOM_SUB_SHAPE + Sub Shapes + + + GEOM_SUPPRESSHOLE_FACE_SHELL + Face or shell + + + GEOM_SUPPRESSHOLE_SELECTFACE + Select the face with hole + + + GEOM_SUPPRESSHOLE_SELECTFACE_END + Select end face (if hole traversing) + + + GEOM_SUPPRESSHOLE_SELECTWIRE + Select wire on face + + + GEOM_SUPPRESSHOLE_SELECTWIRE_END + Select end wire (if hole traversing) + + + GEOM_SUPPRESSHOLE_SELECT_HOLES_ON_FACE + Select hole(s) on the face + + + GEOM_SUPPRESSHOLE_TITLE + Suppress holes + + + GEOM_SUPPRESS_RESULT + Suppress Result + + + GEOM_SUPPRESS_RESULT_INSIDE + Inside + + + GEOM_SUPPRESS_RESULT_OUTSIDE + Outside + + + GEOM_SUPRESSFACE + Supress Face + + + GEOM_SUPRESSFACE_SELECT + Select Faces To Suppress + + + GEOM_SUPRESSFACE_TITLE + Suppress Faces In An Object + + + GEOM_SURFACE_CONTINUTY + Surface continuity + + + GEOM_SURFACE_MODE + Surface mode + + + GEOM_SURFCONE + Conical Face + + + GEOM_SURFCYLINDER + Cylindrical Face + + + GEOM_SURFSPHERE + Spherical Face + + + GEOM_SURFTORUS + Toroidal Face + + + GEOM_SameParameter + SameParameter + + + GEOM_SplitAngle + SplitAngle + + + GEOM_SplitClosedFaces + SplitClosedFaces + + + GEOM_SplitContinuity + SplitContinuity + + + GEOM_TOLERANCE + Tolerance + + + GEOM_TOLERANCE_CONSTR + Object And Its Tolerances + + + GEOM_TOLERANCE_EDGE + Edge : + + + GEOM_TOLERANCE_FACE + Face : + + + GEOM_TOLERANCE_TITLE + Maximum Tolerance + + + GEOM_TOLERANCE_VERTEX + Vertex : + + + GEOM_TOOL_OBJECT + Tool Object + + + GEOM_TOOL_OBJECTS + Tool Objects + + + GEOM_TORUS + Torus + + + GEOM_TORUS_TITLE + Torus Construction + + + GEOM_TRANSLATION + Translation + + + GEOM_TRANSLATION_COOR + Translation With Coordinates + + + GEOM_TRANSLATION_TITLE + Translation Of An Object + + + GEOM_TRANSPARENCY_OPAQUE + Opaque + + + GEOM_TRANSPARENCY_TITLE + Transparency + + + GEOM_TRANSPARENCY_TRANSPARENT + Transparent + + + GEOM_TRIHEDRON + Trihedron + + + GEOM_ToBezier + ToBezier + + + GEOM_VALUE + Value + + + GEOM_VECTOR + Vector + + + GEOM_VECTOR_LENGTH + Vector Length : + + + GEOM_VECTOR_TITLE + Vector Construction + + + GEOM_VECTOR_U + Vector U + + + GEOM_VECTOR_V + Vector V + + + GEOM_VERTEX + Vertex + + + GEOM_VERTEXES + Vertexes + + + GEOM_WATER_DENSITY + Water Density : + + + GEOM_WEIGHT + Weight : + + + GEOM_WIDTH + Width : + + + GEOM_WHATIS + Whatis + + + GEOM_WHATIS_OBJECT + Object And Its Topological Information + + + GEOM_WHATIS_TITLE + Whatis Information + + + GEOM_WIRE + Wire + + + GEOM_WIRES + Wire(s) + + + GEOM_WIRES_TO_REMOVE + Wires to remove + + + GEOM_WIREZ + Wires + + + GEOM_WIRE_CONNECT + Wire creation from wires/edges connected + + + GEOM_WIRE_TITLE + Create A Wire + + + GEOM_WPLANE + Working Plane + + + GEOM_WPLANE_FACE + Plane, Planar Face or LCS + + + GEOM_WPLANE_ORIGIN + Select a plane + + + GEOM_WPLANE_OXY + OXY + + + GEOM_WPLANE_OYZ + OYZ + + + GEOM_WPLANE_OZX + OZX + + + GEOM_WPLANE_TITLE + Working Plane Selection + + + GEOM_WPLANE_VECTOR + Select 2 vectors + + + GEOM_WPLANE_VX + Vector X + + + GEOM_WPLANE_VZ + Vector Z + + + GEOM_WRN_RADIUS_NULL + Radius is null + + + GEOM_WRN_WARNING + Warning + + + WRN_SHAPE_UNCLOSED + Unable to create solid from unclosed shape %1 + + + GEOM_X + X : + + + GEOM_Y + Y : + + + GEOM_Z + Z : + + + GLUE_NEW_OBJ_NAME + Glue + + + LIMIT_TOLERANCE_NEW_OBJ_NAME + Limit_tolerance + + + MEN_ALL_SEL_ONLY + Select All + + + MEN_ARC + Arc + + + MEN_ARCHIMEDE + Archimede + + + MEN_BASIC + Basic + + + MEN_BASIC_PROPS + Basic Properties + + + MEN_BLOCKS + Blocks + + + MEN_BND_BOX + Bounding Box + + + MEN_BOOLEAN + Boolean + + + MEN_BOX + Box + + + MEN_BUILD + Build + + + MEN_CHAMFER + Chamfer + + + MEN_CHANGE_ORIENTATION + Change Orientation + + + MEN_CHECK + Check Shape + + + MEN_CHECK_COMPOUND + Check Compound of Blocks + + + MEN_CHECK_FREE_BNDS + Check Free Boundaries + + + MEN_CHECK_FREE_FACES + Check Free Faces + + + MEN_CHECK_GEOMETRY + Check Geometry + + + MEN_CIRCLE + Circle + + + MEN_CLIPPING + Clipping Range + + + MEN_CLOSE_CONTOUR + Close Contour + + + MEN_COMMON + Common + + + MEN_COMPOUND + Compound + + + MEN_COMPOUND_SEL_ONLY + Compound + + + MEN_CONE + Cone + + + MEN_CURVE + Curve + + + MEN_CUT + Cut + + + MEN_CYLINDER + Cylinder + + + MEN_RECTANGLE + Rectangle + + + MEN_DELETE + Delete + + + MEN_DIMENSIONS + Dimensions + + + MEN_DISPLAY + Show + + + MEN_DISK + Disk + + + MEN_DISPLAY_ALL + Show All + + + MEN_DISPLAY_MODE + Display Mode + + + MEN_DISPLAY_ONLY + Show Only + + + MEN_EDGE + Edge + + + MEN_EDGE_SEL_ONLY + Edge + + + MEN_EDIT + Edit + + + MEN_ELLIPSE + Ellipse + + + MEN_ERASE + Hide + + + MEN_ERASE_ALL + Hide All + + + MEN_EXPLODE + Explode + + + MEN_EXPLODE_BLOCKS + Explode on Blocks + + + MEN_EXPORT + Export... + + + MEN_EXTRUSION + Extrusion + + + MEN_FACE + Face + + + MEN_FACE_SEL_ONLY + Face + + + MEN_FILE + File + + + MEN_FILLET + Fillet 3D + + + MEN_FILLET_1D + Fillet 1D + + + MEN_FILLET_2D + Fillet 2D + + + MEN_FILLING + Filling + + + MEN_FUSE + Fuse + + + MEN_GENERATION + Generation + + + MEN_GLUE_FACES + Glue Faces + + + MEN_GROUP + Group + + + MEN_GROUP_CREATE + Create + + + MEN_GROUP_EDIT + Edit + + + MEN_RELOAD_IMPORTED + Reload From Disk + + + MEN_HEX_SOLID + Hexahedral Solid + + + MEN_IMPORT + Import... + + + MEN_INERTIA + Inertia + + + MEN_ISOS + Isos + + + MEN_LIMIT_TOLERANCE + Limit tolerance + + + MEN_LINE + Line + + + MEN_LOCAL_CS + Local Coordinate System + + + MEN_MASS_CENTER + Center of Mass + + + MEN_MEASURES + Measures + + + MEN_MIN_DIST + Min Distance + + + MEN_MIRROR + Mirror Image + + + MEN_MODIFY_LOCATION + Modify Location + + + MEN_MUL_ROTATION + Multi-Rotation + + + MEN_MUL_TRANSFORM + Multi-Transformation + + + MEN_MUL_TRANSLATION + Multi-Translation + + + MEN_NEW_ENTITY + New Entity + + + MEN_OFFSET + Offset Surface + + + MEN_OPERATIONS + Operations + + + MEN_ORIGIN_AND_VECTORS + Origin and Base Vectors + + + MEN_PARTITION + Partition + + + MEN_PIPE + Extrusion Along Path + + + MEN_PLANE + Plane + + + MEN_POINT + Point + + + MEN_POINT_COORDS + Point Coordinates + + + MEN_POINT_ON_EDGE + Add Point on Edge + + + MEN_POP_COLOR + Color + + + MEN_POP_CREATE_GROUP + Create Group + + + MEN_POP_SHOW_CHILDREN + Show Children + + + MEN_POP_HIDE_CHILDREN + Hide Children + + + MEN_POP_ISOS + Isos + + + MEN_POP_DEFLECTION + Deflection Coefficient + + + MEN_POP_RENAME + Rename + + + MEN_POP_SHADING + Shading + + + MEN_POP_TRANSPARENCY + Transparency + + + MEN_POP_WIREFRAME + Wireframe + + + MEN_POP_VECTORS + Show Edge Direction + + + MEN_PREFERENCES + Preferences + + + MEN_PREFERENCES_GEOM + Geometry + + + MEN_PRIMITIVES + Primitives + + + MEN_ADVANCED + Advanced + + + MEN_PROPAGATE + Propagate + + + MEN_Q_FACE + Quadrangle Face + + + MEN_REPAIR + Repair + + + MEN_REVOLUTION + Revolution + + + MEN_ROTATION + Rotation + + + MEN_SCALE + Scale Transform + + + MEN_SECTION + Section + + + MEN_SELECT_ONLY + Select Only + + + MEN_SEWING + Sewing + + + MEN_SHADING + Shading + + + MEN_SHADING_COLOR + Shading Color + + + MEN_SHAPE_PROCESS + Shape Processing + + + MEN_SHELL + Shell + + + MEN_SHELL_SEL_ONLY + Shell + + + MEN_SKETCH + 2D Sketch + + + MEN_3DSKETCH + 3D Sketch + + + MEN_SOLID + Solid + + + MEN_SOLID_SEL_ONLY + Solid + + + MEN_SPHERE + Sphere + + + MEN_STEP_VALUE + Step Value + + + MEN_SUPPERSS_HOLES + Suppress Holes + + + MEN_SUPPRESS_FACES + Suppress Faces + + + MEN_SUPPRESS_INT_WIRES + Suppress Internal Wires + + + MEN_TOLERANCE + Tolerance + + + MEN_TOOLS + Tools + + + MEN_TORUS + Torus + + + MEN_TRANSFORMATION + Transformation + + + MEN_TRANSLATION + Translation + + + MEN_VECTOR + Vector + + + MEN_VERTEX_SEL_ONLY + Vertex + + + MEN_VIEW + View + + + MEN_WHAT_IS + What is + + + MEN_WIRE + Wire + + + MEN_VECTOR_MODE_ON + Show Edge Direction + + + MEN_VECTOR_MODE_OFF + Hide Edge Direction + + + MEN_WIREFRAME + Wireframe + + + MEN_WIRE_SEL_ONLY + Wire + + + MEN_WORK_PLANE + Working Plane + + + MEN_POP_POINT_MARKER + Point Marker + + + NAME_LBL + Name: + + + NON_GEOM_OBJECTS_SELECTED + There are objects selected which do not belong to %1 component. + + + PREF_DEFLECTION + Deflection coefficient + + + GEOM_PREF_def_precision + Default precision + + + GEOM_PREF_length_precision + Length precision + + + GEOM_PREF_angle_precision + Angular precision + + + GEOM_PREF_len_tol_precision + Length tolerance precision + + + GEOM_PREF_ang_tol_precision + Angular tolerance precision + + + GEOM_PREF_weight_precision + Weight precision + + + GEOM_PREF_density_precision + Density precision + + + GEOM_PREF_parametric_precision + Parametric precision + + + GEOM_PREF_param_tol_precision + Parametric tolerance precision + + + PREF_AUTO_CREATE + Auto create + + + PREF_DISPLAY_MODE + Default display mode + + + PREF_FREE_BOUND_COLOR + Color of free boundaries + + + PREF_GROUP_ORIGIN_AND_BASE_VECTORS + Origin and base vectors + + + PREF_GROUP_GENERAL + General + + + PREF_GROUP_OCCVIEWER + OCC Viewer 3d + + + GEOM_PREF_GROUP_PRECISION + Input fields precision + + + PREF_GROUP_VERTEX + Marker of Points + + + PREF_ISOS_COLOR + Color of isolines + + + PREF_LINE_COLOR + Color of edges, vectors, wires + + + PREF_MARKER_SCALE + Size + + + PREF_POINT_COLOR + Color of points + + + PREF_SHADING_COLOR + Default shading color + + + PREF_STEP_VALUE + Step value for spin boxes + + + PREF_TAB_SETTINGS + Settings + + + PREF_TYPE_OF_MARKER + Type + + + PREF_BASE_VECTORS_LENGTH + Length of base vectors + + + PREF_WIREFRAME_COLOR + Default wireframe color + + + PROCESS_SHAPE_NEW_OBJ_NAME + ProcessShape + + + REMOVE_HOLES_NEW_OBJ_NAME + SupressHoles + + + REMOVE_INT_WIRES_NEW_OBJ_NAME + RemoveIntWires + + + SEWING_NEW_OBJ_NAME + Sewing + + + STB_ALL_SEL_ONLY + Select all Objects + + + STB_ARC + Create an arc + + + STB_ARCHIMEDE + Archimede operation + + + STB_BASIC_PROPS + Show basic properties of the shape + + + STB_BND_BOX + Compute bounding box of the shape + + + STB_BOX + Create a box + + + STB_CHAMFER + Create a chamfer + + + STB_CHANGE_ORIENTATION + Change orientation + + + STB_CHECK + Check shape validity + + + STB_CHECK_COMPOUND + Check compound of blocks + + + STB_CHECK_FREE_BNDS + Check free boundaries + + + STB_CHECK_FREE_FACES + Check free faces + + + STB_CHECK_GEOMETRY + Check Geometry + + + STB_CIRCLE + Create a circle + + + STB_CLIPPING + Clipping range + + + STB_CLOSE_CONTOUR + Perform close contour + + + STB_COMMON + Common + + + STB_COMPOUND + Build a compound + + + STB_COMPOUND_SEL_ONLY + Select only a Compounds + + + STB_CONE + Create a cone + + + STB_CURVE + Create a curve + + + STB_CUT + Cut + + + STB_CYLINDER + Create a cylinder + + + STB_RECTANGLE + Create rectangular face + + + STB_DELETE + Delete object + + + STB_DISK + Create a disk + + + STB_DISPLAY + Show object(s) + + + STB_DISPLAY_ALL + Show all + + + STB_DISPLAY_ONLY + Show only + + + STB_EDGE + Build an edge + + + STB_EDGE_SEL_ONLY + Select only a Edges + + + STB_ELLIPSE + Create an ellipse + + + STB_ERASE + Hide object(s) + + + STB_ERASE_ALL + Hide all + + + STB_EXPLODE + Explode + + + STB_EXPLODE_BLOCKS + Explode on Blocks + + + STB_EXPORT + Export geometry to BREP file + + + STB_EXTRUSION + Create an extrusion + + + STB_FACE + Build a face + + + STB_FACE_SEL_ONLY + Select only a Faces + + + STB_FILLET + Create 3D fillet + + + STB_FILLET_1D + Create 1D fillet + + + STB_FILLET_2D + Create 2D fillet + + + STB_FILLING + Create a filling + + + STB_FUSE + Fuse + + + STB_GLUE_FACES + Perform glue faces + + + STB_GROUP_CREATE + Create a group + + + STB_GROUP_EDIT + Edit a group + + + STB_RELOAD_IMPORTED + Reload imported shape from its original place on disk + + + STB_HEX_SOLID + Hexahedral Solid + + + STB_IMPORT + Import geometry from BREP file + + + STB_INERTIA + Compute moments of intertia of the shape + + + STB_ISOS + Set number of isolines + + + STB_LINE + Create a line + + + STB_LIMIT_TOLERANCE + Limit tolerance + + + STB_LOCAL_CS + Create a local coordinate system + + + STB_MASS_CENTER + Compute center of mass of the shape + + + STB_MIN_DIST + Compute minimum distance between two objects + + + STB_MIRROR + Mirror a shape + + + STB_MODIFY_LOCATION + Modify shape's location + + + STB_MUL_ROTATION + Perform multi-rotation + + + STB_MUL_TRANSFORM + Perform multi-transformation + + + STB_MUL_TRANSLATION + Perform multi-translation + + + STB_OFFSET + Offset surface + + + STB_ORIGIN_AND_VECTORS + Create an origin and base Vectors + + + STB_PARTITION + Make a partition + + + STB_PIPE + Create a shape by extrusion along a path + + + STB_PLANE + Create a plane + + + STB_POINT + Create a point + + + STB_POINT_COORDS + Display point coordinates + + + STB_POINT_ON_EDGE + Add point on edge + + + STB_POP_COLOR + Color + + + STB_POP_CREATE_GROUP + Create Group + + + STB_POP_SHOW_CHILDREN + Show child objects + + + STB_POP_HIDE_CHILDREN + Hide child objects + + + STB_POP_ISOS + Isolines + + + STB_POP_DEFLECTION + Deflection Coefficient + + + STB_POP_RENAME + Rename + + + STB_POP_SHADING + Shading + + + STB_POP_TRANSPARENCY + Transparency + + + STB_POP_WIREFRAME + Wireframe + + + STB_PROPAGATE + Propagate + + + STB_Q_FACE + Quadrangle Face + + + STB_REVOLUTION + Create a revolution + + + STB_ROTATION + Rotate a shape + + + STB_SCALE + Scale a shape + + + STB_SECTION + Section + + + STB_SEWING + Perform sewing + + + STB_SHADING + Shading + + + STB_VECTOR_MODE + Change Edge Presentation Mode + + + STB_SHADING_COLOR + Set shading color + + + STB_SHAPE_PROCESS + Perform shape processing + + + STB_SHELL + Build a shell + + + STB_SHELL_SEL_ONLY + Select only a Shells + + + STB_SKETCH + Create 2D sketch + + + STB_3DSKETCH + Create 3D sketch + + + STB_SOLID + Build a solid + + + STB_SOLID_SEL_ONLY + Select only a Solids + + + STB_SPHERE + Create a sphere + + + STB_STEP_VALUE + Set step value + + + STB_SUPPERSS_HOLES + Perform suppress holes + + + STB_SUPPRESS_FACES + Perform suppress faces + + + STB_SUPPRESS_INT_WIRES + Perform suppress internal wires + + + STB_TOLERANCE + Compute tolerance of the shape + + + STB_TORUS + Create a torus + + + STB_TRANSLATION + Translate shape + + + STB_VECTOR + Create a vector + + + STB_VERTEX_SEL_ONLY + Select only a Points + + + STB_WHAT_IS + What is + + + STB_WIRE + Build a wire + + + STB_WIRE_SEL_ONLY + Select only a Wires + + + STB_WORK_PLANE + Create a working plane + + + STB_POP_POINT_MARKER + Set Point Marker + + + SUPPRESS_RESULT + Suppress Result + + + SUPRESS_FACE_NEW_OBJ_NAME + SupressFaces + + + ShHealOper_ErrorExecution_msg + Shape Healing algorithm failed + + + ShHealOper_InvalidParameters_msg + Incorrect parameters for Shape Healing algorithm + + + ShHealOper_NotError_msg + Shape Healing algorithm has done no modification of the original shape + + + TLT_RENAME + Rename + + + TOM_O + O + + + TOM_O_PLUS + + in O + + + TOM_O_POINT + . in O + + + TOM_O_STAR + * in O + + + TOM_O_X + X in O + + + TOM_PLUS + + + + + TOM_POINT + . + + + TOM_STAR + * + + + TOM_X + X + + + TOOL_BASIC + Basic + + + TOOL_BOOLEAN + Boolean operations + + + TOOL_GENERATION + Generation + + + TOOL_PRIMITIVES + Primitives + + + TOOL_TRANSFORMATION + Transformation + + + TOOL_BUILD + Build + + + TOOL_OPERATIONS + Operations + + + TOOL_ADVANCED + Advanced + + + TOOL_MEASURES + Measures + + + TOP_ARC + Create an arc + + + TOP_ARCHIMEDE + Archimede + + + TOP_BASIC_PROPS + Basic properties + + + TOP_BND_BOX + Bounding box + + + TOP_BOX + Create a box + + + TOP_CHAMFER + Chamfer + + + TOP_CHANGE_ORIENTATION + Change orientation + + + TOP_CHECK + Check shape + + + TOP_CHECK_COMPOUND + Check compound of blocks + + + TOP_CHECK_FREE_BNDS + Check free boundaries + + + TOP_CHECK_FREE_FACES + Check free faces + + + TOP_CHECK_GEOMETRY + Check Geometry + + + TOP_CIRCLE + Create a circle + + + TOP_CLIPPING + Clipping range + + + TOP_CLOSE_CONTOUR + Perform close contour + + + TOP_COMMON + Common + + + TOP_COMPOUND + Build compound + + + TOP_CONE + Create a cone + + + TOP_CURVE + Create a curve + + + TOP_CUT + Cut + + + TOP_CYLINDER + Create a cylinder + + + TOP_DELETE + Delete object + + + TOP_RECTANGLE + Create rectangular face + + + TOP_DISK + Create a disk + + + TOP_DISPLAY + Show + + + TOP_DISPLAY_ALL + Show all + + + TOP_DISPLAY_ONLY + Show only + + + TOP_EDGE + Build edge + + + TOP_ELLIPSE + Create an ellipse + + + TOP_ERASE + Hide + + + TOP_ERASE_ALL + Hide all + + + TOP_EXPLODE + Explode + + + TOP_EXPLODE_BLOCKS + Explode on Blocks + + + TOP_EXPORT + Export geometry to BREP file + + + TOP_EXTRUSION + Create an extrusion + + + TOP_FACE + Build face + + + TOP_FILLET + Fillet 3D + + + TOP_FILLET_1D + Fillet 1D + + + TOP_FILLET_2D + Fillet 2D + + + TOP_FILLING + Create a filling + + + TOP_FUSE + Fuse + + + TOP_GLUE_FACES + Perform glue faces + + + TOP_GROUP_CREATE + Create a group + + + TOP_GROUP_EDIT + Edit a group + + + TOP_HEX_SOLID + Hexahedral Solid + + + TOP_IMPORT + Import geometry from BREP file + + + TOP_INERTIA + Moments of intertia + + + TOP_ISOS + Set number of isolines + + + TOP_LINE + Create a line + + + TOP_LIMIT_TOLERANCE + Limit tolerance + + + TOP_LOCAL_CS + Create a local coordinate system + + + TOP_MASS_CENTER + Center of mass + + + TOP_MIN_DIST + Minimum distance + + + TOP_MIRROR + Mirror image + + + TOP_MODIFY_LOCATION + Modify location + + + TOP_MUL_ROTATION + Multi-Rotation + + + TOP_MUL_TRANSFORM + Multi-transformation + + + TOP_MUL_TRANSLATION + Multi-Translation + + + TOP_OFFSET + Offset surface + + + TOP_ORIGIN_AND_VECTORS + Create an origin and base Vectors + + + TOP_PARTITION + Partition + + + TOP_PIPE + Extrusion along path + + + TOP_PLANE + Create a plane + + + TOP_POINT + Create a point + + + TOP_POINT_COORDS + Point coordinates + + + TOP_POINT_ON_EDGE + Add point on edge + + + TOP_POP_COLOR + Color + + + TOP_POP_CREATE_GROUP + Create Group + + + TOP_POP_SHOW_CHILDREN + Show Children + + + TOP_POP_HIDE_CHILDREN + Hide Children + + + TOP_POP_ISOS + Isolines + + + TOP_POP_DEFLECTION + Deflection Coefficient + + + TOP_POP_RENAME + Rename + + + TOP_POP_SHADING + Shading + + + TOP_POP_TRANSPARENCY + Transparency + + + TOP_POP_WIREFRAME + Wireframe + + + TOP_PROPAGATE + Propagate + + + TOP_Q_FACE + Quadrangle Face + + + TOP_REVOLUTION + Create a revolution + + + TOP_ROTATION + Rotation + + + TOP_SCALE + Scale transform + + + TOP_SECTION + Section + + + TOP_SEWING + Perform sewing + + + TOP_SHADING + Shading + + + TOP_SHADING_COLOR + Set shading color + + + TOP_SHAPE_PROCESS + Perform shape processing + + + TOP_SHELL + Build shell + + + TOP_SKETCH + 2D sketch + + + TOP_3DSKETCH + 3D sketch + + + TOP_SOLID + Build solid + + + TOP_SPHERE + Create a sphere + + + TOP_STEP_VALUE + Set step value + + + TOP_SUPPERSS_HOLES + Perform suppress holes + + + TOP_SUPPRESS_FACES + Perform suppress faces + + + TOP_SUPPRESS_INT_WIRES + Perform suppress internal wires + + + TOP_TOLERANCE + Tolerance + + + TOP_TORUS + Create a torus + + + TOP_TRANSLATION + Translation + + + TOP_VECTOR + Create a vector + + + TOP_WHAT_IS + What is + + + TOP_WIRE + Build wire + + + TOP_WORK_PLANE + Create a working plane + + + TOP_POP_POINT_MARKER + Point Marker + + + WRN_NOT_IMPLEMENTED + Sorry, this functionality is not yet implemented + + + _S_ + (s) + + + NOT_FOUND_ANY + Not a single entity has been found + + + GEOM_FACE_I + Face %1 + + + GEOM_CONSTANT_RADIUS + Radius : + + + GEOM_R1 + R1 : + + + GEOM_R2 + R2 : + + + GEOM_BOTHWAY + Both Directions + + + GEOM_NORMALE + Normal To A Face + + + GEOM_VECTOR_NORMALE + Vector_Normal + + + GEOM_LINE1 + Line 1 + + + GEOM_LINE2 + Line 2 + + + GEOM_D + D : + + + GEOM_CHAMFER_EDGE + Chamfer On Selected Edges + + + SELECTED_EDGE + Selected Edges + + + GEOM_NORMALE_TITLE + Create Normal To A Face + + + GEOM_MEASURE_ANGLE_TITLE + Angle Between Two Straight Edges/Lines/Vectors + + + GEOM_MEASURE_ANGLE_ANGLE + Angle + + + GEOM_MEASURE_ANGLE_OBJ + Objects And Results + + + GEOM_MEASURE_ANGLE_IS + Angle in degrees : + + + GEOM_LINE_INTERSECTION + Point On Lines Intersection + + + GEOM_KEEP_NONLIMIT_SHAPES + Keep shapes of lower type + + + GEOM_CENTER_2POINTS + Center and two points + + + GEOM_REMOVE_EXTRA_EDGES_TITLE + Remove extra edges + + + GEOM_REMOVE_EXTRA_EDGES + Object to remove extra edges + + + GEOM_RMEE_UNION_FACES + Union faces, laying on common surface + + + REMOVE_EXTRA_EDGES_NEW_OBJ_NAME + NoExtraEdges + + + TOP_REMOVE_EXTRA_EDGES + Remove extra edges + + + MEN_REMOVE_EXTRA_EDGES + Remove Extra Edges + + + STB_REMOVE_EXTRA_EDGES + Remove extra edges + + + TOP_NORMALE + Normal to a face + + + MEN_NORMALE + Normal to a Face + + + STB_NORMALE + Compute normal to the face + + + TOP_MEASURE_ANGLE + Angle + + + MEN_MEASURE_ANGLE + Angle + + + STB_MEASURE_ANGLE + Compute angle between two lines or linear edges + + + TOP_POP_AUTO_COLOR + Auto color + + + MEN_POP_AUTO_COLOR + Auto Color + + + STB_POP_AUTO_COLOR + Auto color + + + TOP_POP_DISABLE_AUTO_COLOR + Disable auto color + + + MEN_POP_DISABLE_AUTO_COLOR + Disable Auto Color + + + STB_POP_DISABLE_AUTO_COLOR + Disable auto color + + + GEOM_RESULT_NAME_GRP + Result name + + + GEOM_RESULT_NAME_LBL + Name + + + GEOM_FILLING_APPROX + Approximation + + + GEOM_FILLING_METHOD + Method + + + GEOM_FILLING_DEFAULT + Default (standard behaviour) + + + GEOM_FILLING_USEORI + Use edges orientation + + + GEOM_FILLING_AUTO + Auto-correct edges orientation + + + GEOM_WRN_NO_APPROPRIATE_SELECTION + No appropriate objects selected + + + GEOM_SHAPES_ON_SHAPE + Get shapes on shape + + + GEOM_SHAPES_ON_SHAPE_ESHAPE + Shape for exploding + + + GEOM_SHAPES_ON_SHAPE_CSHAPE + Solid for checking + + + GEOM_SHAPES_ON_SHAPE_STATE + State + + + GEOM_KIND_OF_SHAPE + Kind of Shape : + + + GEOM_CLOSED + Closed + + + GEOM_UNCLOSED + Opened + + + GEOM_CLOSEDUNCLOSED + Not defined, Closed or Opened. Possibly, error occured. + + + GEOM_DISK_CIRCLE + Disk + + + GEOM_DISK_ELLIPSE + Elliptical face + + + GEOM_PLANAR_FACE + Planar Face + + + GEOM_PLANAR_EDGE_WIRE + Wire with Planar Edges + + + GEOM_POLYGON + Polygon + + + GEOM_POLYHEDRON + Polyhedron + + + GEOM_NORMAL + Normal direction + + + GEOM_DIRECTION + Direction + + + GEOM_UPARAMETER + U-parameter : + + + GEOM_VPARAMETER + V-parameter : + + + GEOM_X_I + X%1 : + + + GEOM_Y_I + Y%1 : + + + GEOM_Z_I + Z%1 : + + + GEOM_SHAPES_ON_SHAPE_TITLE + Get shapes on shape + + + GEOM_SCALE_FACTOR_X + Scale Factor X : + + + GEOM_SCALE_FACTOR_Y + Scale Factor Y : + + + GEOM_SCALE_FACTOR_Z + Scale Factor Z : + + + GEOM_STATE_IN + IN + + + GEOM_STATE_OUT + OUT + + + GEOM_STATE_ON + ON + + + GEOM_STATE_ONIN + ONIN + + + GEOM_STATE_ONOUT + ONOUT + + + GEOM_STATE_INOUT + INOUT + + + TOP_GET_SHAPES_ON_SHAPES + Get shapes on shape + + + MEN_GET_SHAPES_ON_SHAPES + Get Shapes on Shape + + + STB_GET_SHAPES_ON_SHAPES + Get shapes on shape + + + GEOM_PUBLISH_RESULT_GRP + Advanced options + + + GEOM_RESTORE_SUB_SHAPES + Set presentation parameters and subshapes from arguments + + + GEOM_RSS_ADD_FREFIX + Add prefix to names of restored subshapes + + + GEOM_ALL_IMPORT_FILES + All supported formats ( %1 ) + + + GEOM_UNSUPPORTED_TYPE + Unsupported format for the file + + + GEOM_UNKNOWN_IMPORT_ERROR + Unknown error + + + GEOM_IMPORT_ERRORS + Import operation has finished with errors: + + + GEOM_PUBLISH_NAMED_SHAPES + Create groups for named shapes (if there are any)? + + + GEOM_SCALE_DIMENSIONS + Would you like to take into account the units? Otherwise the dimensions will be kept without modifications. - - - GEOM_ADVANCED - Advanced shape: type %1 - - - GEOM_PRECISION_HINT - + + + GEOM_ADVANCED + Advanced shape: type %1 + + + GEOM_PRECISION_HINT + Input value precision can be adjusted using -'%1' parameter in Geometry module preferences. - - - - BasicGUI_CurveDlg - - GEOM_IS_CLOSED - Build a closed edge - - - - BasicGUI_EllipseDlg - - GEOM_VECTOR_MAJOR - Major Axis - - - ORIGIN_DEFAULT - Origin by default - - - X_AXIS_DEFAULT - X axis by default - - - Z_AXIS_DEFAULT - Z axis by default - - - - BasicGUI_MarkerDlg - - CAPTION - Local CS Construction - - - DX - Dx - - - DY - Dy - - - DZ - Dz - - - LCS_NAME - LocalCS - - - LOCALCS - Local coordinate system - - - ORIGIN - Coordinates of origin - - - VEC_PARALLEL - Coordinate system axes cannot be parallel - - - XDIR - X axis direction - - - YDIR - Y axis direction - - - - BlocksGUI_BlockDlg - - FACE_1 - Face 1 - - - FACE_2 - Face 2 - - - FACE_3 - Face 3 - - - FACE_4 - Face 4 - - - FACE_5 - Face 5 - - - FACE_6 - Face 6 - - - - BlocksGUI_ExplodeDlg - - NB_FACES_MAX - Max. nb. faces - - - NB_FACES_MIN - Min. nb. faces - - - - BlocksGUI_QuadFaceDlg - - EDGE_1 - Edge 1 - - - EDGE_2 - Edge 2 - - - EDGE_3 - Edge 3 - - - EDGE_4 - Edge 4 - - - VERTEX_1 - Vertex 1 - - - VERTEX_2 - Vertex 2 - - - VERTEX_3 - Vertex 3 - - - VERTEX_4 - Vertex 4 - - - - BlocksGUI_TrsfDlg - - FACE_1 - Face 1 - - - FACE_1U - Face 1 U - - - FACE_1V - Face 1 V - - - FACE_2 - Face 2 - - - FACE_2U - Face 2 U - - - FACE_2V - Face 2 V - - - - EntityGUI_SketcherDlg - - CANNOT_CLOSE - It is impossible to close sketch +'%1' parameter in Geometry module preferences. + + + TOP_PIPETSHAPE + Create Pipe TShape + + + MEN_PIPETSHAPE + Pipe TShape + + + STB_PIPETSHAPE + Create new Pipe TShape object + + + GEOM_ADVANCED_201 + Pipe TShape + + + HALF_LENGTH_MAIN_PIPE + Main pipe half length + + + HALF_LENGTH_INCIDENT_PIPE + Incident pipe half length + + + CIRCULAR_QUARTER_PIPE + Circular quarter of pipe + + + THICKNESS + Thickness + + + FLANGE + Flange + + + CHAMFER_OR_FILLET + Chamfer or fillet + + + CHAMFER + Chamfer + + + FILLET + Fillet + + + JUNCTION_FACE_1 + Junction 1 + + + JUNCTION_FACE_2 + Junction 2 + + + JUNCTION_FACE_3 + Junction 3 + + + + BasicGUI_CurveDlg + + GEOM_IS_CLOSED + Build a closed edge + + + + BasicGUI_EllipseDlg + + GEOM_VECTOR_MAJOR + Major Axis + + + ORIGIN_DEFAULT + Origin by default + + + X_AXIS_DEFAULT + X axis by default + + + Z_AXIS_DEFAULT + Z axis by default + + + + BasicGUI_MarkerDlg + + CAPTION + Local CS Construction + + + DX + Dx + + + DY + Dy + + + DZ + Dz + + + LCS_NAME + LocalCS + + + LOCALCS + Local coordinate system + + + ORIGIN + Coordinates of origin + + + VEC_PARALLEL + Coordinate system axes cannot be parallel + + + XDIR + X axis direction + + + YDIR + Y axis direction + + + + BlocksGUI_BlockDlg + + FACE_1 + Face 1 + + + FACE_2 + Face 2 + + + FACE_3 + Face 3 + + + FACE_4 + Face 4 + + + FACE_5 + Face 5 + + + FACE_6 + Face 6 + + + + BlocksGUI_ExplodeDlg + + NB_FACES_MAX + Max. nb. faces + + + NB_FACES_MIN + Min. nb. faces + + + + BlocksGUI_QuadFaceDlg + + EDGE_1 + Edge 1 + + + EDGE_2 + Edge 2 + + + EDGE_3 + Edge 3 + + + EDGE_4 + Edge 4 + + + VERTEX_1 + Vertex 1 + + + VERTEX_2 + Vertex 2 + + + VERTEX_3 + Vertex 3 + + + VERTEX_4 + Vertex 4 + + + + BlocksGUI_TrsfDlg + + FACE_1 + Face 1 + + + FACE_1U + Face 1 U + + + FACE_1V + Face 1 V + + + FACE_2 + Face 2 + + + FACE_2U + Face 2 U + + + FACE_2V + Face 2 V + + + + EntityGUI_SketcherDlg + + CANNOT_CLOSE + It is impossible to close sketch Number of sketch points too small - - - - EntityGUI_SubShapeDlg - - NO_SUBSHAPES_SELECTED - Please, select one or more sub-shapes - - - - GroupGUI - - NO_GROUP - Please, select a group to edit - - - - GroupGUI_GroupDlg - - ADD - Add - - - CREATE_GROUP_TITLE - Create Group - - - EDIT_GROUP_TITLE - Edit Group - - - EMPTY_LIST - Please, select one or more sub-shapes to put into the group - - - EMPTY_NAME - Please, specify a non-empty group name - - - GROUP_NAME - Group Name - - - GROUP_PREFIX - Group - - - MAIN_SHAPE - Main Shape - - - MAIN_SUB_SHAPES - Main Shape And Sub-Shapes - - - NO_GROUP - Please, select a group to edit - - - NO_MAIN_OBJ - Please, select a main shape - - - REMOVE - Remove - - - SELECT_ALL - Select All - - - SHAPE_SEL_RESTR - Main Shape Selection restriction - - - SHAPE_TYPE - Shape Type - - - NO_RESTR - No restriction - - - GEOM_PARTS_OF_SHAPE2 - Geometrical parts of the Second Shape - - - SUBSHAPES_OF_SHAPE2 - Only Sub-Shapes of the Second Shape - - - SECOND_SHAPE - Second Shape - - - - MeasureGUI_1Sel1TextView1Check_QTD - - CHECK_SHAPE_GEOMETRY - Check also geometry - - - - MeasureGUI_PointDlg - - CAPTION - Point Coordinates - - - COORDINATES - Point and its coordinates - - - POINT - Point - - - X - X - - - Y - Y - - - Z - Z - - - - OperationGUI_ChamferDlg - - D - D - - - FACE_1 - Face 1 - - - FACE_2 - Face 2 - - - SELECTED_FACES - Selected faces - - - - OperationGUI_FilletDlg - - SELECTED_EDGES - Selected edges - - - SELECTED_FACES - Selected faces - - - - RepairGUI_FreeBoundDlg - - CAPTION - Check free boundaries - - - FREE_BOUND - Free boundaries - - - NUMBER_CLOSED - Number of closed free boundaries: - - - NUMBER_OPEN - Number of open free boundaries: - - - - RepairGUI_GlueDlg - - FACES_FOR_GLUING_ARE_DETECTED - There are %1 face(s) that can be glued. They are coloured on the screen with red colour. + + + + EntityGUI_SubShapeDlg + + NO_SUBSHAPES_SELECTED + Please, select one or more sub-shapes + + + + GroupGUI + + NO_GROUP + Please, select a group to edit + + + + GroupGUI_GroupDlg + + ADD + Add + + + CREATE_GROUP_TITLE + Create Group + + + EDIT_GROUP_TITLE + Edit Group + + + EMPTY_LIST + Please, select one or more sub-shapes to put into the group + + + EMPTY_NAME + Please, specify a non-empty group name + + + GROUP_NAME + Group Name + + + GROUP_PREFIX + Group + + + MAIN_SHAPE + Main Shape + + + MAIN_SUB_SHAPES + Main Shape And Sub-Shapes + + + NO_GROUP + Please, select a group to edit + + + NO_MAIN_OBJ + Please, select a main shape + + + REMOVE + Remove + + + SELECT_ALL + Select All + + + SHAPE_SEL_RESTR + Main Shape Selection restriction + + + SHAPE_TYPE + Shape Type + + + NO_RESTR + No restriction + + + GEOM_PARTS_OF_SHAPE2 + Geometrical parts of the Second Shape + + + SUBSHAPES_OF_SHAPE2 + Only Sub-Shapes of the Second Shape + + + SECOND_SHAPE + Second Shape + + + + MeasureGUI_1Sel1TextView1Check_QTD + + CHECK_SHAPE_GEOMETRY + Check also geometry + + + + MeasureGUI_PointDlg + + CAPTION + Point Coordinates + + + COORDINATES + Point and its coordinates + + + POINT + Point + + + X + X + + + Y + Y + + + Z + Z + + + + OperationGUI_ChamferDlg + + D + D + + + FACE_1 + Face 1 + + + FACE_2 + Face 2 + + + SELECTED_FACES + Selected faces + + + + OperationGUI_FilletDlg + + SELECTED_EDGES + Selected edges + + + SELECTED_FACES + Selected faces + + + + RepairGUI_FreeBoundDlg + + CAPTION + Check free boundaries + + + FREE_BOUND + Free boundaries + + + NUMBER_CLOSED + Number of closed free boundaries: + + + NUMBER_OPEN + Number of open free boundaries: + + + + RepairGUI_GlueDlg + + FACES_FOR_GLUING_ARE_DETECTED + There are %1 face(s) that can be glued. They are coloured on the screen with red colour. Please close this message box and select faces for glueing - - - GLUE_FACES - Glue faces - - - SELECT_FACES - Select Faces - - - THERE_ARE_NO_FACES_FOR_GLUING - There are no faces for gluing - - - - RepairGUI_ShapeProcessDlg - - ERROR_NO_OBJECTS - Please, select a geometrical object for Shape Processing. - - - ERROR_NO_OPERATORS - Please, select at least one Shape Process operation to proceed. - - - TIME_CONSUMING - Enabling this option may result in a very time-consuming operation for some input shapes. + + + GLUE_FACES + Glue faces + + + SELECT_FACES + Select Faces + + + THERE_ARE_NO_FACES_FOR_GLUING + There are no faces for gluing + + + + RepairGUI_ShapeProcessDlg + + ERROR_NO_OBJECTS + Please, select a geometrical object for Shape Processing. + + + ERROR_NO_OPERATORS + Please, select at least one Shape Process operation to proceed. + + + TIME_CONSUMING + Enabling this option may result in a very time-consuming operation for some input shapes. Would you like to continue? - - - - GEOMToolsGUI_DeleteDlg - - GEOM_REALLY_DELETE - Do you really want to delete %1 object(s)? - - - GEOM_REALLY_DELETE_ALL - Do you really want to delete all objects? - - - GEOM_DELETE_OBJECTS - Delete objects - - - - GEOMToolsGUI_DeflectionDlg - - GEOM_DEFLECTION_TLT - Select Deflection of Shape - - - GEOM_DEFLECTION - Deflection : - - - - GEOMToolsGUI_MarkerDlg - - SET_MARKER_TLT - Set Point Marker - - - STANDARD_MARKER - Standard - - - CUSTOM_MARKER - Custom - - - TYPE - Type: - - - SCALE - Scale: - - - CUSTOM - Texture: - - - BROWSE - Browse... - - - OK_BTN - &OK - - - CANCEL_BTN - &Cancel - - - HELP_BTN - &Help - - - LOAD_TEXTURE_TLT - Load Texture - - - - AdvancedGUI_PipeTShapeDlg - - GEOM_PIPE_TSHAPE_TITLE - Pipe TShape Construction - - - GEOM_PIPE_TSHAPE - PipeTShape - - - GEOM_PIPE_TSHAPE_MPIPE - Main pipe - - - GEOM_PIPE_TSHAPE_R - Radius - - - GEOM_PIPE_TSHAPE_W - Width - - - GEOM_PIPE_TSHAPE_L - Half-length - - - GEOM_PIPE_TSHAPE_IPIPE - Incident pipe - - - GEOM_PIPE_TSHAPE_CHAMFER - Chamfer - - - GEOM_PIPE_TSHAPE_CHAMFER_H - Height - - - GEOM_PIPE_TSHAPE_CHAMFER_W - Width - - - GEOM_PIPE_TSHAPE_FILLET - Fillet - - - GEOM_PIPE_TSHAPE_HEX - Prepare for hex mesh - - - GEOM_PIPE_TSHAPE_POSITION - Set position - - - GEOM_PIPE_TSHAPE_POSITION_P1 - Junction P1 - - - GEOM_PIPE_TSHAPE_POSITION_P2 - Junction P2 - - - GEOM_PIPE_TSHAPE_POSITION_P3 - Junction P3 - - - GEOM_PIPE_TSHAPE_POSITION_LBL_L1 - New L1 - - - GEOM_PIPE_TSHAPE_POSITION_LBL_L2 - New L2 - - - - @default - - TOP_PIPETSHAPE - Create Pipe TShape - - - MEN_PIPETSHAPE - Pipe TShape - - - STB_PIPETSHAPE - Create new Pipe TShape object - - - GEOM_ADVANCED_201 - Pipe TShape - - - HALF_LENGTH_MAIN_PIPE - Main pipe half length - - - HALF_LENGTH_INCIDENT_PIPE - Incident pipe half length - - - CIRCULAR_QUARTER_PIPE - Circular quarter of pipe - - - THICKNESS - Thickness - - - FLANGE - Flange - - - CHAMFER_OR_FILLET - Chamfer or fillet - - - CHAMFER - Chamfer - - - FILLET - Fillet - - - JUNCTION_FACE_1 - Junction 1 - - - JUNCTION_FACE_2 - Junction 2 - - - JUNCTION_FACE_3 - Junction 3 - - - + + + + GEOMToolsGUI_DeleteDlg + + GEOM_REALLY_DELETE + Do you really want to delete %1 object(s)? + + + GEOM_REALLY_DELETE_ALL + Do you really want to delete all objects? + + + GEOM_DELETE_OBJECTS + Delete objects + + + + GEOMToolsGUI_DeflectionDlg + + GEOM_DEFLECTION_TLT + Select Deflection of Shape + + + GEOM_DEFLECTION + Deflection : + + + + GEOMToolsGUI_MarkerDlg + + SET_MARKER_TLT + Set Point Marker + + + STANDARD_MARKER + Standard + + + CUSTOM_MARKER + Custom + + + TYPE + Type: + + + SCALE + Scale: + + + CUSTOM + Texture: + + + BROWSE + Browse... + + + OK_BTN + &OK + + + CANCEL_BTN + &Cancel + + + HELP_BTN + &Help + + + LOAD_TEXTURE_TLT + Load Texture + + + + AdvancedGUI_PipeTShapeDlg + + GEOM_PIPE_TSHAPE_TITLE + Pipe TShape Construction + + + GEOM_PIPE_TSHAPE + PipeTShape + + + GEOM_PIPE_TSHAPE_MPIPE + Main pipe + + + GEOM_PIPE_TSHAPE_R + Radius + + + GEOM_PIPE_TSHAPE_W + Width + + + GEOM_PIPE_TSHAPE_L + Half-length + + + GEOM_PIPE_TSHAPE_IPIPE + Incident pipe + + + GEOM_PIPE_TSHAPE_CHAMFER + Chamfer + + + GEOM_PIPE_TSHAPE_CHAMFER_H + Height + + + GEOM_PIPE_TSHAPE_CHAMFER_W + Width + + + GEOM_PIPE_TSHAPE_FILLET + Fillet + + + GEOM_PIPE_TSHAPE_HEX + Prepare for hex mesh + + + GEOM_PIPE_TSHAPE_POSITION + Set position + + + GEOM_PIPE_TSHAPE_POSITION_P1 + Junction P1 + + + GEOM_PIPE_TSHAPE_POSITION_P2 + Junction P2 + + + GEOM_PIPE_TSHAPE_POSITION_P3 + Junction P3 + + + GEOM_PIPE_TSHAPE_POSITION_LBL_L1 + New L1 + + + GEOM_PIPE_TSHAPE_POSITION_LBL_L2 + New L2 + + diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 62dc3b162..55c113af8 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -1,1465 +1,4672 @@ + - - - - @default - - GEOM_ANGLE - Angle : - - - GEOM_ARC - Arc - - - GEOM_ARCHIMEDE - Archimde - - - GEOM_ARCHIMEDE_TITLE - Construction d'Archimde - - - GEOM_ARC_TITLE - Construction d'un Arc - - - GEOM_ARGUMENTS - Arguments - - - GEOM_AXE_MIRROR - Axe Miroir - - - GEOM_AXIS - Axe - - - GEOM_BASE - Base - - - GEOM_BASE_OBJECT - Objet De Base - - - GEOM_BASE_POINT - Point De Base - - - GEOM_BEZIER - Bezier - - - GEOM_BNDBOX - Boite Anglobante - - - GEOM_BNDBOX_OBJDIM - Objet and ses dimensions - - - GEOM_BNDBOX_TITLE - Boite Englobante - - - GEOM_BOX - Boite - - - GEOM_BOX_OBJ - Dimensions A l'Origine - - - GEOM_BOX_TITLE - Construction d'une Boite - - - GEOM_BUT_APPLY - &Appliquer - - - GEOM_BUT_CANCEL - &Annuler - - - GEOM_BUT_CLOSE - &Fermer - - - GEOM_BUT_CLOSE_SKETCH - Fermer Sketch - - - GEOM_BUT_END_SKETCH - Terminer Sketch - - - GEOM_BUT_EXPLODE - &Exploser - - - GEOM_BUT_HELP - &Aide - - - GEOM_BUT_NO - &Non - - - GEOM_BUT_OK - &Ok - - - GEOM_BUT_YES - &Oui - - - GEOM_CENTER - Centre - - - GEOM_CENTER_POINT - Point Centre - - - GEOM_CENTRAL_POINT - Point Central - - - GEOM_CHAMFER - Chanfrein - - - GEOM_CHAMFER_ABORT - Le chanfrein ne peut-tre realis avec %1 et %2 - - - GEOM_CHAMFER_ALL - Chanfrein sur toute la Shape - - - GEOM_CHAMFER_EDGES - Chanfrein sur Edges de la Shape - - - GEOM_CHAMFER_FACES - Chanfrein sur Faces de la Shape - - - GEOM_CHAMFER_TITLE - Construction d'un Chanfrein - - - GEOM_CHECK_BLOCKS_COMPOUND - Check Blocks Compound - - - GEOM_CHECK_BLOCKS_COMPOUND_ERRORS - Errors - - - GEOM_CHECK_BLOCKS_COMPOUND_HAS_ERRORS - The Compound of Blocks has errors - - - GEOM_CHECK_BLOCKS_COMPOUND_HAS_NO_ERRORS - The Compound of Blocks has no errors - - - GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES - Incriminated Sub-Shapes - - - GEOM_CHECK_COMPOUND_BLOCKS_TITLE - Check Blocks Compound - - - GEOM_CHECK_INFOS - Objet et ses Informations Topologiques - - - GEOM_CHECK_SHAPE - Check Shape - - - GEOM_CHECK_TITLE - Check Shape - - - GEOM_CIRCLE - Cercle - - - GEOM_CIRCLE_TITLE - Construction d'un Cercle - - - GEOM_CMASS - Centre de Masse - - - GEOM_CMASS_TITLE - Centre De Gravit - - - GEOM_COMMON - Joindre - - - GEOM_COMMON_TITLE - BOOLEEN : Jonction De Deux Objets - - - GEOM_COMPOUND - Compound - - - GEOM_COMPOUNDSOLID - CompSolid - - - GEOM_COMPOUND_TITLE - Cration d'un Compound - - - GEOM_CONE - Cone - - - GEOM_CONE_TITLE - Construction d'un Cone - - - GEOM_CONFIRM - Confirmer cette operation - - - GEOM_CONFIRM_INFO - L'objet contient %1 sous objets - - - GEOM_COOR - Coord. : - - - GEOM_COORDINATES - Coordonnes - - - GEOM_COORDINATES_RES - Resultats coordonnes - - - GEOM_CREATE_COPY - Create a copy - - - GEOM_CREATE_SINGLE_SOLID - Create a single solid - - - GEOM_CUT - Couper - - - GEOM_CUT_TITLE - BOOLEEN : Couper Deux Objets - - - GEOM_CYLINDER - Cylindre - - - GEOM_CYLINDER_TITLE - Construction d'un Cylindre - - - GEOM_D1 - D1 : - - - GEOM_D2 - D2 : - - - GEOM_DIAGONAL_POINTS - Points Diagonaux - - - GEOM_DIMENSIONS - Dimensions - - - GEOM_DISTANCE - Distance - - - GEOM_DX - Dx : - - - GEOM_DY - Dy : - - - GEOM_DZ - Dz : - - - GEOM_EDGE - Edge - - - GEOM_EDGE_TITLE - Cration d'un Edge - - - GEOM_ELLIPSE - Ellipse - - - GEOM_ELLIPSE_TITLE - Construction d'Ellipses - - - GEOM_EXTRUSION - Extrusion - - - GEOM_EXTRUSION_BSV - Shape de base + Vecteur - - - GEOM_EXTRUSION_BSV_2P - Shape de base + 2 Points - - - GEOM_EXTRUSION_TITLE - Extruder une Shape de base - - - GEOM_FACE - Face - - - GEOM_FACES - Faces - - - GEOM_FACE_FFW - Face a partir d'un wire - - - GEOM_FACE_OPT - Cration d'une Face plane - - - GEOM_FACE_SELECTION - Selection de Face - - - GEOM_FACE_TITLE - Cration d'une Face - - - GEOM_FILLET - Conge - - - GEOM_FILLET_ABORT - Le cong ne peut-tre realis avec un rayon de %1 - - - GEOM_FILLET_ALL - Cong sur toute la Shape - - - GEOM_FILLET_EDGES - Cong sur Edges de la Shape - - - GEOM_FILLET_WIRES - Cong sur Wires de la Shape - - - GEOM_FILLET_FACES - Cong sur Faces de la Shape - - - GEOM_FILLET_TITLE - Construction d'un Cong - - - GEOM_FILLING - Surface Par Edges - - - GEOM_FILLING_ARG - Argument Et Parametres - - - GEOM_FILLING_COMPOUND - Compound de Edges - - - GEOM_FILLING_MAX_DEG - Max. Deg - - - GEOM_FILLING_MIN_DEG - Min. Deg - - - GEOM_FILLING_NB_ITER - Nb. Iter - - - GEOM_FILLING_TITLE - Surface Par Edges - - - GEOM_FILLING_TOL_2D - Tol. 2D - - - GEOM_FILLING_TOL_3D - Tol. 3D - - - GEOM_FREE_FACES - Free faces - - - GEOM_FREE_FACES_TITLE - Free faces - - - GEOM_FUSE - Fusionner - - - GEOM_FUSE_TITLE - BOOLEEN : Fusionner deux Objets - - - GEOM_HEIGHT - Hauteur - - - GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE - Noms identiques : selectionner avec la souris ! - - - GEOM_INERTIA_CONSTR - Matrice Et Moments d'Inertie - - - GEOM_INERTIA_I - %1:1 - - - GEOM_INERTIA_IXYZ - IX & IY & IZ - - - GEOM_INERTIA_TITLE - Calculs d'Inertie - - - GEOM_INF_LOADED - Le fichier %1 est charg. - - - GEOM_INTERPOL - Interpolation - - - GEOM_KEEP_OBJECT - Objet garde - - - GEOM_LENGTH - Longueur : - - - GEOM_LINE - Ligne - - - GEOM_LINE_TITLE - Construction d'une Ligne - - - GEOM_MAIN_OBJECT - Objet Principal - - - GEOM_MATERIAL_ID - Material ID: - - - GEOM_MATERIAL_MATERIAL - Material - - - GEOM_MATERIAL_SET - << Set - - - GEOM_MATERIAL_SHAPE - Shapes - - - GEOM_MATERIAL_TITLE - Define materials for Dominant Fuse - - - GEOM_MATRIX - Matrice : - - - GEOM_MAX - Max : - - - GEOM_MEN_ALL_FILES - Tous fichiers ( * ) - - - GEOM_MEN_ANGLE - Angle : - - - GEOM_MEN_COMPONENT - Gometrie - - - GEOM_MEN_ENTER_ANGLE - Saisir un angle en degrs - - - GEOM_MEN_EXPORT - Exporter - - - GEOM_MEN_IMPORT - Importer - - - GEOM_MEN_ISOS - Choisir un nombre d'isos - - - GEOM_MEN_ISOU - Isos u : - - - GEOM_MEN_ISOV - Isos v : - - - GEOM_MEN_LOAD_SCRIPT - Fichiers PYTHON ( *.py ) - - - GEOM_MEN_POPUP_NAME - %1 Objets - - - GEOM_MEN_SHADING - Ombr - - - GEOM_MEN_SKETCHER_X - Saisir une longueur pour fixer X - - - GEOM_MEN_SKETCHER_Y - Saisir une longueur pour fixer Y - - - GEOM_MEN_STEP_LABEL - Increment - - - GEOM_MEN_TRANSPARENCY - Transparence - - - GEOM_MEN_TRANSPARENCY_LABEL - Transparence : - - - GEOM_MEN_WIREFRAME - Filaire - - - GEOM_MEN_X - X : - - - GEOM_MEN_Y - Y : - - - GEOM_MESHING_DEFLECTION - Dflection Du Maillage : - - - GEOM_MIN - Min : - - - GEOM_MINDIST_OBJ - Objets Et Resultats - - - GEOM_MINDIST_TITLE - Distance Minimale entre Deux Objets - - - GEOM_MIRROR - Miroir - - - GEOM_MIRROR_TITLE - Methode Miroir - - - GEOM_MULTIROTATION - Multi-Rotation - - - GEOM_MULTIROTATION_DOUBLE - Multi Rotation Double - - - GEOM_MULTIROTATION_SIMPLE - Multi Rotation Simple - - - GEOM_MULTIROTATION_TITLE - Multi-Rotation - - - GEOM_MULTITRANSLATION - Multi-Translation - - - GEOM_MULTITRANSLATION_DOUBLE - Multi Translation Double - - - GEOM_MULTITRANSLATION_SIMPLE - Multi Translation Simple - - - GEOM_MULTITRANSLATION_TITLE - Multi-Translation - - - GEOM_NAME_INCORRECT - Le nom saisi n'existe pas - - - GEOM_NB_TIMES - Nb. Fois : - - - GEOM_NB_TIMES_U - Nb. Fois U : - - - GEOM_NB_TIMES_V - Nb. Fois V : - - - GEOM_OBJECT - Objet - - - GEOM_OBJECTS - Objets - - - GEOM_OBJECT_I - Objet %1 - - - GEOM_OBJECT_RESULT - Objet Et Rsultat - - - GEOM_ORIENTATION - Orientation - - - GEOM_ORIENTATION_OPT - Renverser l'orientation avec une simulation de vecteur normal - - - GEOM_ORIENTATION_TITLE - Changer l'Orientation - - - GEOM_PARAMETER - Paramtre : - - - GEOM_POINT_ON_EDGE - Point sur la Edge - - - GEOM_POINT_ON_FACE - Point sur la Face - - - GEOM_PARAM_VALUE - By paramtrique - - - GEOM_COORD_VALUE - By Coordonnes - - - GEOM_PARTITION - Partition - - - GEOM_PARTITION_HALFSPACE - Half-space partition - - - GEOM_PARTITION_ORIENTATION - Change l'orientation - - - GEOM_PARTITION_TITLE - Partition d'Objects Avec Outils - - - GEOM_PATH_OBJECT - Objet Chemin - - - GEOM_PIPE - Pipe - - - GEOM_PIPE_TITLE - Construction d'une Pipe - - - GEOM_PLANE - Plan - - - GEOM_PLANE_MIRROR - Plan Miroir - - - GEOM_PLANE_PV - Point + Vecteur - - - GEOM_PLANE_PVC - Point + Vecteur Coordonnes - - - GEOM_PLANE_SIZE - Taille du plan : - - - GEOM_PLANE_TITLE - Construction d'un Plan - - - GEOM_POINT - Point - - - GEOM_POINTS - Points - - - GEOM_POINT_I - Point %1 - - - GEOM_POINT_MIRROR - Point Miroir - - - GEOM_POINT_TITLE - Construction d'un Point - - - GEOM_PRECISION - Prcision : - - - GEOM_PROPAGATE - Propagate - - - GEOM_PROPAGATE_TITLE - Propagate - - - GEOM_PROPERTIES - Basiques Proprietes - - - GEOM_PROPERTIES_CONSTR - Objet et ses Proprietes - - - GEOM_PROPERTIES_SURFACE - Surface : - - - GEOM_PROPERTIES_TITLE - Proprietes Basiques - - - GEOM_PROPERTIES_VOLUME - Volume : - - - GEOM_PRP_ABORT - L'opration a echou - - - GEOM_PRP_COMMAND - Pas de commande associe l'id = %1. - - - GEOM_PRP_DONE - Opration effectue - - - GEOM_PRP_LOADING - Chargement de %1 ... - - - GEOM_PRP_MIN_DIST - Min Distance non calculer - - - GEOM_PRP_NOT_FOR_VTK_VIEWER - Non permis dans viewer VTK - - - GEOM_PRP_NULLSHAPE - Erreur, objet inconsistant ou inappropri ! - - - GEOM_PRP_READY - Prt... - - - GEOM_PRP_SELECT_EDGE - Selectionner les edges et clicker sur Apply - - - GEOM_PRP_SELECT_FACE - Select les faces a supprimer et clicker sur Ok/Apply - - - GEOM_PRP_SELECT_FIRST - Selectionner la shape principale en premier - - - GEOM_PRP_SELECT_SUBSHAPES - Selection de sous objets - - - GEOM_PRP_SHAPE_IN_STUDY - La shape principale doit etre avant dans l'etude - - - GEOM_RADIUS - Rayon - - - GEOM_RADIUS_I - Rayon %1 - - - GEOM_RADIUS_MAJOR - Rayon max. : - - - GEOM_RADIUS_MINOR - Rayon min. : - - - GEOM_REALLY_DELETE - Voulez-vous supprimer l'object(s) ? - - - GEOM_RECONSTRUCTION_LIMIT - Limite de Reconstruction - - - GEOM_RECONSTRUCTION_LIMIT_EDGE - Edge - - - GEOM_RECONSTRUCTION_LIMIT_FACE - Face - - - GEOM_RECONSTRUCTION_LIMIT_SHAPE - Shape - - - GEOM_RECONSTRUCTION_LIMIT_SHELL - Shell - - - GEOM_RECONSTRUCTION_LIMIT_SOLID - Solid - - - GEOM_RECONSTRUCTION_LIMIT_VERTEX - Vertex - - - GEOM_RECONSTRUCTION_LIMIT_WIRE - Wire - - - GEOM_REMOVE_WEBS - Remove webs - - - GEOM_REVERSE - Renverser - - - GEOM_REVERSE_U - Renverser U - - - GEOM_REVERSE_V - Reverser V - - - GEOM_REVERSE_VECTOR - Renverser Le Vecteur - - - GEOM_REVOLUTION - Rvolution - - - GEOM_REVOLUTION_TITLE - Construction Par Revolution - - - GEOM_ROTATION - Rotation - - - GEOM_ROTATION_TITLE - Rotation d'un Objet - - - GEOM_SCALE - Echelle - - - GEOM_SCALE_FACTOR - Facteur d'echelle - - - GEOM_SCALE_TITLE - Echelle d'un Objet - - - GEOM_SECTION - Section - - - GEOM_SECTION_TITLE - BOOLEEN : Section De Deux Objets - - - GEOM_SELECTION - Slection - - - GEOM_SET_MATERIALS - Set materials - - - GEOM_SEWING - Coudre - - - GEOM_SEWING_TITLE - Coudre des Topologies - - - GEOM_SHAPE - Shape - - - GEOM_SHELL - Shell - - - GEOM_SHELLS - Shells - - - GEOM_SHELL_TITLE - Construction d'une Shell - - - GEOM_SKETCHER_ABS - Absolu - - - GEOM_SKETCHER_ANGLE - Angle - - - GEOM_SKETCHER_ANGLE2 - Angle : - - - GEOM_SKETCHER_APPLY - Appliquer - - - GEOM_SKETCHER_ARC - Arc - - - GEOM_SKETCHER_DEST - Destination - - - GEOM_SKETCHER_DIR - Direction - - - GEOM_SKETCHER_DX2 - DX : - - - GEOM_SKETCHER_DY2 - DY : - - - GEOM_SKETCHER_EL - Type d'Element - - - GEOM_SKETCHER_LENGTH - Longueur - - - GEOM_SKETCHER_LENGTH2 - Longueur : - - - GEOM_SKETCHER_PER - Perpendiculaire - - - GEOM_SKETCHER_POINT - Point - - - GEOM_SKETCHER_POINT2 - Point : - - - GEOM_SKETCHER_RADIUS2 - Radius : - - - GEOM_SKETCHER_REL - Relative - - - GEOM_SKETCHER_SEGMENT - Sgment - - - GEOM_SKETCHER_SEL - Slection - - - GEOM_SKETCHER_TAN - Tangent - - - GEOM_SKETCHER_TITLE - Construction de Sketch - - - GEOM_SKETCHER_TYPE - Type - - - GEOM_SKETCHER_UNDO - Undo - - - GEOM_SKETCHER_VALUES - Valeurs - - - GEOM_SKETCHER_VX2 - VX : - - - GEOM_SKETCHER_VXVY - VX-VY - - - GEOM_SKETCHER_VY2 - VY : - - - GEOM_SKETCHER_X - X - - - GEOM_SKETCHER_X2 - X : - - - GEOM_SKETCHER_X3 - Abs. X : - - - GEOM_SKETCHER_Y - Y - - - GEOM_SKETCHER_Y2 - Y : - - - GEOM_SKETCHER_Y3 - Abs. Y : - - - GEOM_SOLID - Solide - - - GEOM_SOLID_TITLE - Construction d'un Solid - - - GEOM_SPHERE - Sphre - - - GEOM_SPHERE_CR - Centre + rayon - - - GEOM_SPHERE_RO - Rayon a l'origine - - - GEOM_SPHERE_TITLE - Construction d'une Sphere - - - GEOM_SPLINE - Spline - - - GEOM_SPLINE_TITLE - Construction de Splines - - - GEOM_STEP - Pas : - - - GEOM_STEP_TITLE - Increment par dfaut lors des constructions - - - GEOM_STEP_U - Pas U : - - - GEOM_STEP_V - Pas V : - - - GEOM_SUBSHAPE_SELECT - Selectionner de Sous Shapes - - - GEOM_SUBSHAPE_TITLE - Selection de Sous Shapes - - - GEOM_SUBSHAPE_TYPE - Type de Sous Shapes - - - GEOM_SUB_SHAPE - Sous Shapes - - - GEOM_SUPPRESSHOLE_FACE_SHELL - Face ou shell - - - GEOM_SUPPRESSHOLE_SELECTFACE - Selection de la face initiale - - - GEOM_SUPPRESSHOLE_SELECTFACE_END - Selection de la face terminale (si trou traversant) - - - GEOM_SUPPRESSHOLE_SELECTWIRE - Selection du contour/trou sur la face - - - GEOM_SUPPRESSHOLE_SELECTWIRE_END - Selection de contour final (si trou traversant) - - - GEOM_SUPPRESSHOLE_SELECT_HOLES_ON_FACE - Selection de trou(s) sur la face - - - GEOM_SUPPRESSHOLE_TITLE - Suppression de trous - - - GEOM_SUPPRESS_RESULT - Supprimer le Resultat - - - GEOM_SUPPRESS_RESULT_INSIDE - Intrieur - - - GEOM_SUPPRESS_RESULT_OUTSIDE - Extrieur - - - GEOM_SUPRESSFACE - Supression de Face - - - GEOM_SUPRESSFACE_SELECT - Selectionner les Faces a Supprimer - - - GEOM_SUPRESSFACE_TITLE - Supprimer des Faces dans un Objet - - - GEOM_SURFCONE - Face Conique - - - GEOM_SURFCYLINDER - Face Cylindrique - - - GEOM_SURFSPHERE - Face Sphrique - - - GEOM_SURFTORUS - Face Toroique - - - GEOM_TOLERANCE - Tolrance - - - GEOM_TOLERANCE_CONSTR - Object et ses Tolerances - - - GEOM_TOLERANCE_EDGE - Edge : - - - GEOM_TOLERANCE_FACE - Face : - - - GEOM_TOLERANCE_TITLE - Tolerance Maximale - - - GEOM_TOLERANCE_VERTEX - Vertex : - - - GEOM_TOOL_OBJECT - Objet Outil - - - GEOM_TORUS - Tore - - - GEOM_TORUS_TITLE - Constructiond'un Tore - - - GEOM_TRANSLATION - Translation - - - GEOM_TRANSLATION_COOR - Translation Avec Coordonnees - - - GEOM_TRANSLATION_TITLE - Translation d'un Objet - - - GEOM_TRANSPARENCY_OPAQUE - Opaque - - - GEOM_TRANSPARENCY_TITLE - Transparence - - - GEOM_TRANSPARENCY_TRANSPARENT - Transparent - - - GEOM_VECTOR - Vecteur - - - GEOM_VECTOR_LENGTH - Longueur Du Vecteur : - - - GEOM_VECTOR_TITLE - Construction d'un Vecteur - - - GEOM_VECTOR_U - Vecteur U - - - GEOM_VECTOR_V - Vecteur V - - - GEOM_VERTEX - Vertex - - - GEOM_WATER_DENSITY - Densit de l'eau : - - - GEOM_WEIGHT - poids - - - GEOM_WHATIS - Whatis - - - GEOM_WHATIS_OBJECT - Objet et ses Informations Topologiques - - - GEOM_WHATIS_TITLE - Whatis - - - GEOM_WIRE - Wire - - - GEOM_WIRES - Wire(s) - - - GEOM_WIRE_CONNECT - Creation d'un Wire a partir de wires/edges connectes - - - GEOM_WIRE_TITLE - Creer un Wire - - - GEOM_WPLANE - Plan de Travail - - - GEOM_WPLANE_FACE - Plan Ou Face plane - - - GEOM_WPLANE_TITLE - plan de travail - - - GEOM_WRN_RADIUS_NULL - Le rayon est nul - - - GEOM_WRN_WARNING - Avertissement - - - GEOM_X - X : - - - GEOM_Y - Y : - - - GEOM_Z - Z : - - - SUPPRESS_RESULT - Suppress Result - - + + + @default + + BRep_API: command not done + Erreur: impossible de construire l'objet + + + CHANGE_ORIENTATION_NEW_OBJ_NAME + Inverser + + + CLOSE_CONTOUR_NEW_OBJ_NAME + FermerContour + + + DEP_OBJECT + L'objet choisi a été utilisé pour créer un autre objet. +Il n'est pas possible de le supprimer + + + DEVIDE_EDGE_NEW_OBJECT_NAME + NouvelObjet + + + ERROR_SHAPE_TYPE + Le type de l'objet choisi n'est pas correct! +Choisissez face, coque ou solide et essayez de nouveau + + + iErr : 10 + le Classificateur est NULL + + + iErr : 11 + la Forme est NULL + + + iErr : 12 + Un type de sous-forme pas authorisé + + + iErr : 13 + Cet état n'est pas authorisé + + + iErr : 15 + Ce type de surface n'est pas authorisé + + + iErr : 20 + Impossible de trouver la triangulation + + + iErr : 30 + Impossible d'obtenir la ligne à partir du lien + + + iErr : 40 + Impossible de classifier le point + + + iErr : 41 + Les données ne sont pas valides pour le classificateur + + + GEOM_2D_CONTINUTY + Continuité 2D + + + GEOM_2D_CURVE_MODE + Mode courbe 2D + + + GEOM_2D_TOLERANCE + Tolérance 2D + + + GEOM_3D_CONTINUTY + Continuité 3D + + + GEOM_3D_CURVE_MODE + Mode courbe 3D + + + GEOM_3D_TOLERANCE + Tolérance 3D + + + GEOM_3_POINTS + 3 points + + + GEOM_ADD_POINT + Ajouter un point + + + GEOM_ANGLE + Angle : + + + GEOM_ANGLE_1 + Angle + + + GEOM_ARC_ELLIPSE + Arc d'ellipse + + + GEOM_ARC + Arc + + + GEOM_ARCHIMEDE + Archimède + + + GEOM_ARCHIMEDE_TITLE + Construction Archimède + + + GEOM_ARC_TITLE + Construction Arc + + + GEOM_ARGUMENTS + Arguments + + + GEOM_AXE_MIRROR + Axe Miroir + + + GEOM_AXIS + Axe + + + GEOM_BASE + Base + + + GEOM_BASE_OBJECT + Objet de Base + + + GEOM_BASE_POINT + Point de Base + + + GEOM_BEZIER + Bezier + + + GEOM_BINORMAL + BiNormal + + + GEOM_BLOCK + Solide Hexahédral + + + GEOM_BLOCKS_COMPOUND + AssemblageBloques + + + GEOM_BLOCK_EXPLODE + Sous-Bloques + + + GEOM_BLOCK_EXPLODE_TITLE + Sélection des Sous-bloques + + + GEOM_BLOCK_MULTITRSF + Multi-Transformation Bloques + + + GEOM_BLOCK_MULTITRSF_DOUBLE + Multi-Transformation Double + + + GEOM_BLOCK_MULTITRSF_SIMPLE + Multi-Transformation Simple + + + GEOM_BLOCK_MULTITRSF_TITLE + Multi-Transformation Bloques + + + GEOM_BLOCK_TITLE + Construction d'un Solide Hexahédral + + + GEOM_BNDBOX + Boîte Englonante + + + GEOM_BNDBOX_OBJDIM + Objet et ses Dimensions + + + GEOM_BNDBOX_TITLE + Boîte Englobante Information + + + GEOM_BOX + Boite + + + GEOM_BOX_OBJ + Dimensions à l'Origine + + + GEOM_BOX_TITLE + Construction d'une Boite + + + GEOM_BSplineRestriction + BSplineLimitation + + + GEOM_BUT_APPLY + &Appliquer + + + GEOM_BUT_CANCEL + A&nnuler + + + GEOM_BUT_CLOSE + &Fermer + + + GEOM_BUT_CLOSE_SKETCH + Renfermer le Contour + + + GEOM_BUT_END_SKETCH + Valider le Contour + + + GEOM_BUT_EXPLODE + &Eclatement + + + GEOM_BUT_HELP + &Aide + + + GEOM_BUT_NO + &Non + + + GEOM_BUT_OK + &Oui + + + GEOM_BUT_APPLY_AND_CLOSE + A&ppliquer et Fermer + + + GEOM_BUT_YES + &Oui + + + GEOM_BY_LENGTH + Par longueur + + + GEOM_BY_PARAMETER + Par paramètre + + + GEOM_CENTER + Centre + + + GEOM_CENTER_POINT + Point Central + + + GEOM_CENTRAL_POINT + Point Central + + + GEOM_CHAMFER + Chanfrein + + + GEOM_CHAMFER_ABORT + Il n'est pas possible de calculer un chanfrein avec %1 et %2 + + + GEOM_CHAMFER_ALL + Chanfrein sur l'Objet tout entier + + + GEOM_CHAMFER_EDGES + Chanfrein sur les arêtes d'un Objet + + + GEOM_CHAMFER_FACES + Chanfrein sur les Faces d'un Objet + + + GEOM_CHAMFER_TITLE + Construction d'un Chanfrain + + + GEOM_CHANGE_ORIENTATION + Les objets à changer l'orientation + + + GEOM_CHANGE_ORIENTATION_TITLE + Changer l'orientation + + + GEOM_CHECK_BLOCKS_COMPOUND + Check and Improve Blocks Compound + + + GEOM_CHECK_BLOCKS_COMPOUND_FAILED + Vérification n'a pas abouti + + + GEOM_CHECK_BLOCKS_COMPOUND_ERRORS + Erreurs + + + GEOM_CHECK_BLOCKS_COMPOUND_HAS_ERRORS + Il y a d'erreurs dans l'Assemblage des Bloques + + + GEOM_CHECK_BLOCKS_COMPOUND_HAS_NO_ERRORS + Il n'y a pas d'erreurs dans l'Assemblage des Bloques + + + GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES + Sous-Formes augmentées + + + GEOM_CHECK_INFOS + Objet et son Information Topologique + + + GEOM_CHECK_SHAPE + Vérifier la forme + + + GEOM_CHECK_TITLE + Vérifier l'Information de la Forme + + + GEOM_CIRCLE + Circle + + + GEOM_CIRCLE_TITLE + Construction d'un Circle + + + GEOM_CLOSECONTOUR_TITLE + Fermer le contour + + + GEOM_CMASS + Centre de la Masse + + + GEOM_CMASS_TITLE + Construction du Centre de la Masse + + + GEOM_COMMON + Commun + + + GEOM_COMMON_TITLE + Commun de deux Objets + + + GEOM_COMPOUND + Assemblage + + + GEOM_COMPOUNDSOLID + AssemblageSolide + + + GEOM_COMPOUND_TITLE + Créer un Assemblage + + + GEOM_CONE + Cône + + + GEOM_CONE_TITLE + Construction d'un Cône + + + GEOM_CONFIRM + Confirmer l'opération + + + GEOM_CONFIRM_INFO + La forme contient %1 sous-formes ! + + + GEOM_COOR + Coord. : + + + GEOM_COORDINATES + Coordonnées + + + GEOM_COORDINATES_RES + Coordonnées résultantes + + + GEOM_CREATE_COPY + Créer une copie + + + GEOM_CREATE_SINGLE_SOLID + Créer un solide + + + GEOM_CURVE + Courbe + + + GEOM_CURVE_CONTINUTY + Continuité des Courbes + + + GEOM_CURVE_TITLE + Construction d'une Courbe + + + GEOM_CUT + Découpe + + + GEOM_CUT_TITLE + Découpe de deux Objets + + + GEOM_CYLINDER + Cylindre + + + GEOM_CYLINDER_TITLE + Construction d'un Cylindre + + + GEOM_D1 + D1 : + + + GEOM_D2 + D2 : + + + GEOM_DETECT + Detecter + + + GEOM_DIAGONAL_POINTS + Points Diagonaux + + + GEOM_DISK + Disque + + + GEOM_DISK_TITLE + Construction d'un Disque + + + GEOM_DIMENSIONS + Dimensions + + + GEOM_DISTANCE + Distance + + + GEOM_DIVIDE_EDGE_TITLE + Ajouter un point + + + GEOM_DX + Dx : + + + GEOM_DY + Dy : + + + GEOM_DZ + Dz : + + + GEOM_DropSmallEdges + OmettreArêtesMineures + + + GEOM_EDGE + Arête + + + GEOM_EDGE_TITLE + Créer une Arête + + + GEOM_ELLIPSE + Ellipse + + + GEOM_ELLIPSE_ERROR_1 + Impossible de créer un ellipse: le rayon mineur est plus que le rayon majeur. + + + GEOM_ELLIPSE_TITLE + Construction d'un Ellipse + + + GEOM_END_LCS + Fin SCL + + + GEOM_ERROR + Erreur + + + GEOM_ERROR_STATUS + Etat de l'Opération + + + GEOM_ERR_GET_ENGINE + Il est impossible d'obtenir le composant GEOM Engine. Rouvrez le module Geometry et essayez de nouveau. + + + GEOM_ERR_LIB_NOT_FOUND + Il est impossible de trouver ou d'ouvrir la librairie IHM correspondante à l'action de l'utilisateur + + + GEOM_EXTRUSION + Extrusion + + + GEOM_EXTRUSION_BSV + Forme de Base + Vecteur + + + GEOM_EXTRUSION_BSV_2P + Forme de Base + 2 Points + + + GEOM_EXTRUSION_DXDYDZ + Forme de Base + Vecteur DX DY DZ + + + GEOM_EXTRUSION_TITLE + Construction par Extrusion + + + GEOM_FACE + Face + + + GEOM_CS + Système de Coordonnées + + + GEOM_GCS + Système de Coordonnées Globale + + + GEOM_LCS + Système de Coordonnées Locale + + + GEOM_FACES + Faces + + + GEOM_FACE_FFW + Création d'une Face à partir des contours et/ou arêtes + + + GEOM_FACE_OPT + Privilégier la création d'une face planaire + + + GEOM_FACE_OR_LCS + Face ou SCL + + + GEOM_FACE_SELECTION + Sélection d'une Face + + + GEOM_FACE_TITLE + Créer une Face + + + GEOM_RECTANGLE_TITLE + Construction d'un Rectangle + + + GEOM_RECTANGLE + Rectangle + + + GEOM_FILLET + Congé + + + GEOM_FILLET_2D + Congé 2D + + + GEOM_FILLET_1D + Congé 1D + + + GEOM_FILLET_ABORT + Il n'est pas possible de calculer un congé avec le rayon %1 + + + GEOM_FILLET_ALL + Congé sur l'Objet tout entier + + + GEOM_FILLET_EDGES + Congé sur les Arêtes de l'Objet + + + GEOM_FILLET_WIRES + Congé sur les Contours de l'Objet + + + GEOM_FILLET_FACES + Congé sur les Faces de l'Objet + + + GEOM_FILLET_VERTEXES + Congé sur les Sommets de l'Objet + + + GEOM_FILLET_TITLE + Construction d'un Congé + + + GEOM_FILLET_2D_TITLE + Construction d'un Congé 2D + + + GEOM_FILLET_1D_TITLE + Construction d'un Congé 1D + + + GEOM_FILLING + Remplissage + + + GEOM_FILLING_ARG + Arguments et Paramètres + + + GEOM_FILLING_COMPOUND + Assemblage d'entrée + + + GEOM_FILLING_MAX_DEG + Degré maximal + + + GEOM_FILLING_MIN_DEG + Degré minimal + + + GEOM_FILLING_NB_ITER + Nb. Itér : + + + GEOM_FILLING_TITLE + Remplir une Surface avec des Arêtes + + + GEOM_FILLING_TOL_2D + Tol. 2D : + + + GEOM_FILLING_TOL_3D + Tol. 3D : + + + GEOM_FREE_BOUNDARIES + Contours Libres + + + GEOM_FREE_BOUNDS_ERROR + L'objet n'est pas choisi + + + GEOM_FREE_BOUNDS_MSG + Contours libres trouvés: %1 (%2 fermés, %3 ouverts) + + + GEOM_FREE_BOUNDS_TLT + Trouver des Contours Libres + + + GEOM_FREE_FACES + Faces Libres + + + GEOM_FREE_FACES_TITLE + Faces Libres + + + GEOM_FUSE + Fusion + + + GEOM_FUSE_TITLE + Fusionner deux Objets + + + GEOM_FixFaceSize + FixerFaceTaille + + + GEOM_FixShape + FixerForme + + + GEOM_GLUE + Coller + + + GEOM_GLUE_TITLE + Coller des faces + + + GEOM_LIMIT_TOLERANCE_TITLE + Tolérance limite + + + GEOM_HEIGHT + Hauteur: + + + GEOM_HOLES + Trous + + + GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE + Noms Identiques : choisir par souris ! + + + GEOM_IMPORT + Objet_Importé + + + GEOM_INCORRECT_INPUT + Les données d'entrée ne sont pas correctes! + + + GEOM_INERTIA_CONSTR + Matrice et Moment d'Inertie + + + GEOM_INERTIA_I + %1:1 : + + + GEOM_INERTIA_IXYZ + IX & IY & IZ : + + + GEOM_INERTIA_TITLE + Calcul d'Inertie + + + GEOM_INF_LOADED + Fichier %1 est ouvert. + + + GEOM_INTERNAL_WIRES + Contours internes + + + GEOM_INTERPOL + Interpolation + + + GEOM_KEEP_OBJECT + Préserver l'Objet + + + GEOM_LENGTH + Longueur : + + + GEOM_LINE + Ligne + + + GEOM_LINE_TITLE + Construction d'une Ligne + + + GEOM_MAIN_OBJECT + Objet Principal + + + GEOM_MARKER + Repère + + + GEOM_MARKER_TITLE + Créer une repère + + + GEOM_MATERIAL_ID + ID Matériel: + + + GEOM_MATERIAL_MATERIAL + Matériel + + + GEOM_MATERIAL_SET + << Jeu + + + GEOM_MATERIAL_SHAPE + Formes + + + GEOM_MATERIAL_TITLE + Définir les matériaux pour la Fusion Dominante + + + GEOM_MATRIX + Matrice : + + + GEOM_MAX + Max : + + + GEOM_MAX_3D_TOLERANCE + Tolérance 3D Maximale + + + GEOM_MAX_TOLERANCE + Tolérance Maximale + + + GEOM_MEN_ALL_FILES + Tous les Fichiers ( * ) + + + GEOM_MEN_ANGLE + Angle : + + + GEOM_MEN_COMPONENT + Géométrie + + + GEOM_MEN_ENTER_ANGLE + Indiquez l'Angle en Degrés + + + GEOM_MEN_EXPORT + Exporter + + + GEOM_MEN_IMPORT + Importer + + + GEOM_MEN_ISOS + Choisir le numéro d'Isolignes + + + GEOM_MEN_ISOU + Isos U : + + + GEOM_MEN_ISOV + Isos V : + + + GEOM_MEN_POPUP_NAME + %1 Objets + + + GEOM_MEN_SHADING + Ombrage + + + GEOM_MEN_SKETCHER_X + Indiquez la distance selon l'axe X + + + GEOM_MEN_SKETCHER_Y + Indiquez la distance selon l'axe Y + + + GEOM_MEN_STEP_LABEL + Pas : + + + GEOM_MEN_TRANSPARENCY + Transparence + + + GEOM_MEN_TRANSPARENCY_LABEL + Transparence : + + + GEOM_MEN_WIREFRAME + Contours + + + GEOM_MEN_X + X : + + + GEOM_MEN_Y + Y : + + + GEOM_MESHING_DEFLECTION + Déflection de Maillage. : + + + GEOM_MIN + Min : + + + GEOM_MINDIST_OBJ + Objets et Résultats + + + GEOM_MINDIST_TITLE + Distance minimale entre deux Objets + + + GEOM_MIRROR + Miroir + + + GEOM_MIRROR_TITLE + Refléter un Objet + + + GEOM_MULTIROTATION + Multi-Rotation + + + GEOM_MULTIROTATION_DOUBLE + Multi Rotation Double + + + GEOM_MULTIROTATION_SIMPLE + Multi Rotation Simple + + + GEOM_MULTIROTATION_TITLE + Multi-Rotation + + + GEOM_MULTITRANSLATION + Multi-Translation + + + GEOM_MULTITRANSLATION_DOUBLE + Multi Translation Double + + + GEOM_MULTITRANSLATION_SIMPLE + Multi Translation Simple + + + GEOM_MULTITRANSLATION_TITLE + Multi-Translation + + + GEOM_NAME_INCORRECT + Le nom de l'Objet n'est pas trouvé + + + GEOM_NB_BLOCKS_NO_OTHERS + Il y a %1 bloques spécifiées et PAS d'autres solides + + + GEOM_NB_BLOCKS_SOME_OTHERS + Il y a %1 bloques spécifiées et un nombre d'autres solides + + + GEOM_NB_TIMES + Nb. Fois : + + + GEOM_NB_TIMES_U + Nb. Fois U : + + + GEOM_NB_TIMES_V + Nb. Fois V : + + + GEOM_NODES + Noeuds + + + GEOM_NUM_SPLIT_POINTS + Numéro de points de coupage + + + GEOM_OBJECT + Objet + + + GEOM_OBJECT_TYPE + Type d'Objet + + + GEOM_OBJECTS + Objets + + + GEOM_OBJECT_I + Objet %1 + + + GEOM_OBJECT_RESULT + Objet et Résultat + + + GEOM_OFFSET + Décalage + + + GEOM_OFFSET_TITLE + Surface de Décalage + + + GEOM_OPERATIONS + Opérations + + + GEOM_ORIENTATION + Orientation + + + GEOM_ORIENTATION_OPT + Invertir l'Orientation et simuler les vecturs normaux + + + GEOM_ORIENTATION_TITLE + Changer l'Orientation + + + GEOM_PARAMETER + Paramètre : + + + GEOM_PARAMETERS + Paramètres + + + GEOM_POINT_ON_EDGE + Point sur l'Arête + + + GEOM_POINT_ON_FACE + Point sur la Face + + + GEOM_PARAM_VALUE + Par paramètre + + + GEOM_COORD_VALUE + Par coordonnée + + + GEOM_PARTITION + Partition + + + GEOM_WRN_PARTITION_RESULT_EMPTY + The partition result is empty, please verify the reconstruction limit parameter. + + + GEOM_PARTITION_HALFSPACE + Partition de demi-espace + + + GEOM_PARTITION_ORIENTATION + Changer l'Orientation + + + GEOM_PARTITION_TITLE + Partition d'un Objet avec Outil + + + GEOM_PATH_OBJECT + Chemin à l'Objet + + + GEOM_PIPE + tuyau + + + GEOM_PIPE_TITLE + Construction d'un Tuyau + + + GEOM_SEGMENT + Segment d'une ligne droite + + + GEOM_SELECT_UNPUBLISHED_EDGES + Choisir les arêtes non-publiées + + + GEOM_PLANE + Plan + + + GEOM_PLANE_MIRROR + Plan Miroir + + + GEOM_PLANE_PV + Point + Vecteur + + + GEOM_PLANE_PVC + Point + Vecteur de Coordonnées + + + GEOM_PLANE_SIZE + Taille du plan : + + + GEOM_PLANE_TITLE + Construction d'un Plan + + + GEOM_POINT + Point + + + GEOM_POINT1 + Point 1 + + + GEOM_POINT2 + Point 2 + + + GEOM_POINT3 + Point 3 + + + GEOM_POINTS + Points + + + GEOM_POINT_I + Point %1 + + + GEOM_POINT_MIRROR + Point Miroir + + + GEOM_POINT_TITLE + Construction d'un Point + + + GEOM_POLYLINE + Polyline + + + GEOM_POSITION + Location + + + GEOM_POSITION_TITLE + Modifier la Position d'un Objet + + + GEOM_PRECISION + Précision : + + + GEOM_PROPAGATE + Propaguer + + + GEOM_PROPAGATE_TITLE + Propaguer + + + GEOM_PROPERTIES + Propriétés de Base + + + GEOM_PROPERTIES_CONSTR + L'Objet et ses Propriétés + + + GEOM_PROPERTIES_SURFACE + Surface est : + + + GEOM_PROPERTIES_TITLE + Information sur les Propriétés de Base + + + GEOM_PROPERTIES_VOLUME + Volume est : + + + GEOM_PRP_ABORT + Opération est annulée + + + GEOM_PRP_COMMAND + Pas de commandes associées avec cet id = %1. + + + GEOM_PRP_DONE + Opération aboutie + + + GEOM_PRP_EXPORT + Exporter la géométrie à %1 ... + + + GEOM_PRP_LOADING + Ouvrir %1 ... + + + GEOM_PRP_MIN_DIST + La Distance minimale n'est pas calculée + + + GEOM_PRP_NOT_FOR_VTK_VIEWER + Interdit au visualisateur VTK + + + GEOM_PRP_NULLSHAPE + Erreur, l'objet est inexistant ou incorrect! + + + GEOM_PRP_READY + Prêt + + + GEOM_PRP_SELECT_EDGE + Choisissez les arêtes et cliquez Appliquer + + + GEOM_PRP_SELECT_FACE + Choisissez les faces à supprimer et cliquez Oui/Appliquer + + + GEOM_PRP_SELECT_FIRST + Commencez par choisir l'objet principal + + + GEOM_PRP_SELECT_SUBSHAPES + Choisissez les Sous-Formes + + + GEOM_PRP_SHAPE_IN_STUDY + Commencez par indiquer l'objet principal + + + GEOM_QUAD_FACE + Face Quadrangulaire + + + GEOM_QUAD_FACE_TITLE + Construction d'une Face Quadrangulaire + + + GEOM_RADIUS + Rayon : + + + GEOM_RADIUS_I + Rayon %1 : + + + GEOM_RADIUS_MAJOR + Rayon Majeur : + + + GEOM_RADIUS_MINOR + Rayon Mineur : + + + GEOM_RECONSTRUCTION_LIMIT + Type Résultant + + + GEOM_RECONSTRUCTION_LIMIT_EDGE + Arête + + + GEOM_RECONSTRUCTION_LIMIT_FACE + Face + + + GEOM_RECONSTRUCTION_LIMIT_SHAPE + Objet + + + GEOM_RECONSTRUCTION_LIMIT_SHELL + Coque + + + GEOM_RECONSTRUCTION_LIMIT_SOLID + Solide + + + GEOM_RECONSTRUCTION_LIMIT_VERTEX + Point + + + GEOM_RECONSTRUCTION_LIMIT_WIRE + Contour + + + GEOM_REF_POINT + Point avec référence + + + GEOM_REMOVE_ALL_HOLES + Supprimer tous les trous + + + GEOM_REMOVE_ALL_INT_WIRES + Supprimer tous les contours internes + + + GEOM_REMOVE_HOLES_TITLE + Supprimer les trous + + + GEOM_REMOVE_INTERNAL_WIRES_TITLE + Supprimer les contours internes + + + GEOM_REMOVE_WEBS + Supprimer les toiles + + + GEOM_REQUIRED_DEGREE + Degré nécessaire + + + GEOM_REQUIRED_NUM_SEGMENTS + Le nombre de segments approprié + + + GEOM_REVERSE + Invertir + + + GEOM_REVERSE_DIRECTION + Direction Invertie + + + GEOM_REVERSE_PLANE + Invertir le normal du plan + + + GEOM_REVERSE_U + Invertir U + + + GEOM_REVERSE_V + Invertir V + + + GEOM_REVERSE_VECTOR + Invertir un Vecteur + + + GEOM_REVOLUTION + Révolution + + + GEOM_REVOLUTION_TITLE + Construction par Révolution + + + GEOM_ROTATION + Rotation + + + GEOM_ROTATION_TITLE + Rotation d'un Objet + + + GEOM_SCALE + Echelle + + + GEOM_SCALE_FACTOR + Facteur d'échelle : + + + GEOM_SCALE_TITLE + Redimensionner un Objet + + + GEOM_SECTION + Section + + + GEOM_SECTION_TITLE + Section de deux Objets + + + GEOM_SELECTED_FACE + Face Sélectionnée + + + GEOM_SELECTED_OBJECTS + Objets Sélectionnées + + + GEOM_SELECTED_SHAPE + Forme Sélectionné + + + GEOM_SELECTION + Sélection + + + GEOM_SET_MATERIALS + Définir les materiaux + + + GEOM_SEWING + Couture + + + GEOM_SEWING_TITLE + Couture Topologique + + + GEOM_SHAPE + Forme + + + GEOM_SHAPEPROCESS_TITLE + Traitement de Formes + + + GEOM_SHAPES + Formes + + + GEOM_SHELL + Coque + + + GEOM_SHELLS + Coques + + + GEOM_SHELL_TITLE + Construction d'une Coque + + + GEOM_SKETCHER_ABS + Absolues + + + GEOM_SKETCHER_ANGLE + Angle + + + GEOM_SKETCHER_ANGLE2 + Angle : + + + GEOM_SKETCHER_APPLY + Applquer + + + GEOM_SKETCHER_ARC + Arc + + + GEOM_SKETCHER_DEST + Destination + + + GEOM_SKETCHER_DIR + Direction + + + GEOM_SKETCHER_DX2 + DX : + + + GEOM_SKETCHER_DY2 + DY : + + + GEOM_SKETCHER_DZ2 + DZ : + + + GEOM_SKETCHER_EL + Type d'Elément + + + GEOM_SKETCHER_RESTORE + Restaurer + + + GEOM_SKETCHER_LENGTH + Longueur + + + GEOM_SKETCHER_LENGTH2 + Longueur : + + + GEOM_SKETCHER_PER + Perpendiculaire + + + GEOM_SKETCHER_POINT + Point + + + GEOM_SKETCHER_POINT2 + Point : + + + GEOM_SKETCHER_RADIUS2 + Rayon : + + + GEOM_SKETCHER_REL + Relatives + + + GEOM_SKETCHER_SEGMENT + Segment + + + GEOM_SKETCHER_SEL + Sélection + + + GEOM_SKETCHER_TAN + Tangent + + + GEOM_SKETCHER_TITLE + Construction d'un Contour 2D + + + GEOM_3DSKETCHER_TITLE + Construction d'un Contour 3D + + + GEOM_SKETCHER_TYPE + Type + + + GEOM_SKETCHER_UNDO + Défaire + + + GEOM_SKETCHER_VALUES + Valeurs + + + GEOM_SKETCHER_VX2 + VX : + + + GEOM_SKETCHER_VXVY + VX-VY + + + GEOM_SKETCHER_VY2 + VY : + + + GEOM_SKETCHER_X + X + + + GEOM_SKETCHER_X2 + X : + + + GEOM_SKETCHER_X3 + Abs. X : + + + GEOM_SKETCHER_Y + Y + + + GEOM_SKETCHER_Y2 + Y : + + + GEOM_SKETCHER_Y3 + Abs. Y : + + + GEOM_SKETCHER_Z2 + Z : + + + GEOM_3DSKETCHER + Contour 3D + + + GEOM_COORDINATES_TYPE + Type de Coordonnées + + + GEOM_SOLID + Solide + + + GEOM_SOLID_TITLE + Construction d'un Solide + + + GEOM_SPHERE + Sphère + + + GEOM_SPHERE_CR + Centre + Rayon + + + GEOM_SPHERE_RO + Rayon d'Origine + + + GEOM_SPHERE_TITLE + Construction d'une Sphère + + + GEOM_SPLINE + Spline + + + GEOM_SPLINE_TITLE + Construction d'un Spline + + + GEOM_START_LCS + SCL du Début + + + SELECT_UNPUBLISHED_EDGES + Choisir les arêtes non-publiées + + + GEOM_STEP + Pas : + + + GEOM_STEP_TITLE + Valeur du pas pour les constructions d'IHM + + + GEOM_STEP_U + Pas U : + + + GEOM_STEP_V + Pas V : + + + GEOM_STUDY_LOCKED + L'étude en cours est fermée et il n'est pas possible de la modifier + + + GEOM_SUBSHAPE_SELECT + Choisir les Sous-Formes + + + GEOM_SUBSHAPE_TITLE + Sélection des Sous-formes + + + GEOM_SUBSHAPE_TYPE + Type des Sous-formes: + + + GEOM_SUB_SHAPE + Sous-Formes + + + GEOM_SUPPRESSHOLE_FACE_SHELL + Face ou coque + + + GEOM_SUPPRESSHOLE_SELECTFACE + Choisir la face avec un trou + + + GEOM_SUPPRESSHOLE_SELECTFACE_END + Choisir la face finale (si l'on traverse le trou) + + + GEOM_SUPPRESSHOLE_SELECTWIRE + Choisir le contour d'une face + + + GEOM_SUPPRESSHOLE_SELECTWIRE_END + Choisir le contour final (si l'on traverse le trou) + + + GEOM_SUPPRESSHOLE_SELECT_HOLES_ON_FACE + Choisir les trous sur la face + + + GEOM_SUPPRESSHOLE_TITLE + Supprimer les trous + + + GEOM_SUPPRESS_RESULT + Supprimer le Résultat + + + GEOM_SUPPRESS_RESULT_INSIDE + A l'intérieur + + + GEOM_SUPPRESS_RESULT_OUTSIDE + A l'extérieur + + + GEOM_SUPRESSFACE + Supprimer une Face + + + GEOM_SUPRESSFACE_SELECT + Choisissez les faces à supprimer + + + GEOM_SUPRESSFACE_TITLE + Supprimer les Faces d'un Objet + + + GEOM_SURFACE_CONTINUTY + Continuité des Surfaces + + + GEOM_SURFACE_MODE + Mode de Surface + + + GEOM_SURFCONE + Face Conique + + + GEOM_SURFCYLINDER + Face Cylindrique + + + GEOM_SURFSPHERE + Face Sphèrique + + + GEOM_SURFTORUS + Face Toroïdal + + + GEOM_SameParameter + MêmeParamètre + + + GEOM_SplitAngle + SéparerAngle + + + GEOM_SplitClosedFaces + SéparerFacesFermées + + + GEOM_SplitContinuity + SéparerContinuité + + + GEOM_TOLERANCE + Tolérance + + + GEOM_TOLERANCE_CONSTR + Objet et ses Tolérances + + + GEOM_TOLERANCE_EDGE + Arête : + + + GEOM_TOLERANCE_FACE + Face : + + + GEOM_TOLERANCE_TITLE + Tolérance Maximale + + + GEOM_TOLERANCE_VERTEX + Point: + + + GEOM_TOOL_OBJECT + Objet Outil + + + GEOM_TOOL_OBJECTS + Objets Outils + + + GEOM_TORUS + Tore + + + GEOM_TORUS_TITLE + Construction d'un Tore + + + GEOM_TRANSLATION + Translation + + + GEOM_TRANSLATION_COOR + Translation avec Coordonnées + + + GEOM_TRANSLATION_TITLE + Translation d'un Objet + + + GEOM_TRANSPARENCY_OPAQUE + Opaque + + + GEOM_TRANSPARENCY_TITLE + Transparence + + + GEOM_TRANSPARENCY_TRANSPARENT + Transparent + + + GEOM_TRIHEDRON + Trihèdre + + + GEOM_ToBezier + VersBezier + + + GEOM_VALUE + Valeur + + + GEOM_VECTOR + Vecteur + + + GEOM_VECTOR_LENGTH + Longueur du Vecteur : + + + GEOM_VECTOR_TITLE + Construction d'un Vecteur + + + GEOM_VECTOR_U + Vecteur U + + + GEOM_VECTOR_V + Vecteur V + + + GEOM_VERTEX + Point + + + GEOM_VERTEXES + Points + + + GEOM_WATER_DENSITY + Densité de l'Eau : + + + GEOM_WEIGHT + Poids : + + + GEOM_WIDTH + Largeur : + + + GEOM_WHATIS + Qu'est-ce que c'est + + + GEOM_WHATIS_OBJECT + Objet et son Information Topologique + + + GEOM_WHATIS_TITLE + Qu'est-ce que c'est + + + GEOM_WIRE + Contour + + + GEOM_WIRES + Contour(s) + + + GEOM_WIRES_TO_REMOVE + Contours à supprimer + + + GEOM_WIREZ + Contours + + + GEOM_WIRE_CONNECT + Création d'un contour à partir des contours/arêtes connectés + + + GEOM_WIRE_TITLE + Création d'un Contour + + + GEOM_WPLANE + Plan de Travail + + + GEOM_WPLANE_FACE + Plan, Face Planaire ou SCL + + + GEOM_WPLANE_ORIGIN + Choisissez un plan + + + GEOM_WPLANE_OXY + OXY + + + GEOM_WPLANE_OYZ + OYZ + + + GEOM_WPLANE_OZX + OZX + + + GEOM_WPLANE_TITLE + Sélection du Plan de Travail + + + GEOM_WPLANE_VECTOR + Choisissez 2 vecteurs + + + GEOM_WPLANE_VX + Vecteur X + + + GEOM_WPLANE_VZ + Vecteur Z + + + GEOM_WRN_RADIUS_NULL + Le Rayon est nul + + + GEOM_WRN_WARNING + Avertissement + + + WRN_SHAPE_UNCLOSED + Impossible de créer un solide à partir de la forme non-fermée %1 + + + GEOM_X + X : + + + GEOM_Y + Y : + + + GEOM_Z + Z : + + + GLUE_NEW_OBJ_NAME + Coller + + + LIMIT_TOLERANCE_NEW_OBJ_NAME + Tolérance_limite + + + MEN_ALL_SEL_ONLY + Choisir Tous + + + MEN_ARC + Arc + + + MEN_ARCHIMEDE + Archimède + + + MEN_BASIC + de Base + + + MEN_BASIC_PROPS + Propriétés de Base + + + MEN_BLOCKS + Bloques + + + MEN_BND_BOX + Boîte Englobante + + + MEN_BOOLEAN + Booléen + + + MEN_BOX + Boîte + + + MEN_BUILD + Construire + + + MEN_CHAMFER + Chanfrein + + + MEN_CHANGE_ORIENTATION + Changer l'Orientation + + + MEN_CHECK + Vérifier une Forme + + + MEN_CHECK_COMPOUND + Vérifier un Assemblage de Bloques + + + MEN_CHECK_FREE_BNDS + Vérifier les Contours Libres + + + MEN_CHECK_FREE_FACES + Vérifier les Faces Libres + + + MEN_CHECK_GEOMETRY + Vérifier la Géométrie + + + MEN_CIRCLE + Circle + + + MEN_CLIPPING + Diapason de Clippage + + + MEN_CLOSE_CONTOUR + Fermer le Contour + + + MEN_COMMON + Commun + + + MEN_COMPOUND + Assemblage + + + MEN_COMPOUND_SEL_ONLY + Assemblage + + + MEN_CONE + Cône + + + MEN_CURVE + Courbe + + + MEN_CUT + Découpe + + + MEN_CYLINDER + Cylindre + + + MEN_RECTANGLE + Rectangle + + + MEN_DELETE + Supprimer + + + MEN_DIMENSIONS + Dimensions + + + MEN_DISPLAY + Visualiser + + + MEN_DISK + Disque + + + MEN_DISPLAY_ALL + Visualiser Tous + + + MEN_DISPLAY_MODE + Mode de Visualisation + + + MEN_DISPLAY_ONLY + Visualiser Seul + + + MEN_EDGE + Arête + + + MEN_EDGE_SEL_ONLY + Arête + + + MEN_EDIT + Editer + + + MEN_ELLIPSE + Ellipse + + + MEN_ERASE + Cacher + + + MEN_ERASE_ALL + Cacher Tous + + + MEN_EXPLODE + Eclatement + + + MEN_EXPLODE_BLOCKS + Eclater en Bloques + + + MEN_EXPORT + Exporter... + + + MEN_EXTRUSION + Extrusion + + + MEN_FACE + Face + + + MEN_FACE_SEL_ONLY + Face + + + MEN_FILE + Fichier + + + MEN_FILLET + Congé 3D + + + MEN_FILLET_1D + Congé 1D + + + MEN_FILLET_2D + Congé 2D + + + MEN_FILLING + Remplissage + + + MEN_FUSE + Fusion + + + MEN_GENERATION + Génération + + + MEN_GLUE_FACES + Coller les Faces + + + MEN_GROUP + Groupe + + + MEN_GROUP_CREATE + Créer une Groupe + + + MEN_GROUP_EDIT + Editer + + + MEN_RELOAD_IMPORTED + Rouvrir de la Disque + + + MEN_HEX_SOLID + Solid Hexahédral + + + MEN_IMPORT + Importer... + + + MEN_INERTIA + Inertie + + + MEN_ISOS + Isos + + + MEN_LIMIT_TOLERANCE + Tolérance limite + + + MEN_LINE + Ligne + + + MEN_LOCAL_CS + Système de Coordonnées Locale + + + MEN_MASS_CENTER + Centre de la Masse + + + MEN_MEASURES + Informations + + + MEN_MIN_DIST + Distance Minimale + + + MEN_MIRROR + Image Miroir + + + MEN_MODIFY_LOCATION + Modifer la Location + + + MEN_MUL_ROTATION + Multi-Rotation + + + MEN_MUL_TRANSFORM + Multi-Transformation + + + MEN_MUL_TRANSLATION + Multi-Translation + + + MEN_NEW_ENTITY + Entité Nouvelle + + + MEN_OFFSET + Surface de Décalage + + + MEN_OPERATIONS + Opérations + + + MEN_ORIGIN_AND_VECTORS + Vecteurs de Base et d'Origine + + + MEN_PARTITION + Partition + + + MEN_PIPE + Extrusion au long d'un Chemin + + + MEN_PLANE + Plan + + + MEN_POINT + Point + + + MEN_POINT_COORDS + Coordonnées d'un Point + + + MEN_POINT_ON_EDGE + Ajouter un Point sur l'Arête + + + MEN_POP_COLOR + Couleur + + + MEN_POP_CREATE_GROUP + Créer un Groupe + + + MEN_POP_SHOW_CHILDREN + Montrer les enfants + + + MEN_POP_HIDE_CHILDREN + Cacher les enfants + + + MEN_POP_ISOS + Isos + + + MEN_POP_DEFLECTION + Coefficient de Déflection + + + MEN_POP_RENAME + Renommer + + + MEN_POP_SHADING + Ombrage + + + MEN_POP_TRANSPARENCY + Transparence + + + MEN_POP_WIREFRAME + Contour + + + MEN_POP_VECTORS + Montrer la Direction de l'Arête + + + MEN_PREFERENCES + Préférences + + + MEN_PREFERENCES_GEOM + Géométrie + + + MEN_PRIMITIVES + Primitives + + + MEN_ADVANCED + Avancé + + + MEN_PROPAGATE + Propaguer + + + MEN_Q_FACE + Face Quadrangulaire + + + MEN_REPAIR + Reparer + + + MEN_REVOLUTION + Révolution + + + MEN_ROTATION + Rotation + + + MEN_SCALE + Transformation par + + + MEN_SECTION + Section + + + MEN_SELECT_ONLY + Choisir seul + + + MEN_SEWING + Couture + + + MEN_SHADING + Ombrage + + + MEN_SHADING_COLOR + Couleur d'Ombrage + + + MEN_SHAPE_PROCESS + Traitement de Forme + + + MEN_SHELL + Coque + + + MEN_SHELL_SEL_ONLY + Coque + + + MEN_SKETCH + Contour 2D + + + MEN_3DSKETCH + Contour 3D + + + MEN_SOLID + Solide + + + MEN_SOLID_SEL_ONLY + Solide + + + MEN_SPHERE + Sphère + + + MEN_STEP_VALUE + Valeur de Pas + + + MEN_SUPPERSS_HOLES + Supprimer les Trous + + + MEN_SUPPRESS_FACES + Supprimer les Faces + + + MEN_SUPPRESS_INT_WIRES + Supprimer les Contours Internes + + + MEN_TOLERANCE + Tolérance + + + MEN_TOOLS + Outils + + + MEN_TORUS + Tore + + + MEN_TRANSFORMATION + Transformation + + + MEN_TRANSLATION + Translation + + + MEN_VECTOR + Vecteur + + + MEN_VERTEX_SEL_ONLY + Point + + + MEN_VIEW + Vue + + + MEN_WHAT_IS + Qu'est-ce que c'est + + + MEN_WIRE + Contour + + + MEN_VECTOR_MODE_ON + Montrer la Direction de l'Arête + + + MEN_VECTOR_MODE_OFF + Cacher la Direction de l'Arête + + + MEN_WIREFRAME + Contour + + + MEN_WIRE_SEL_ONLY + Contour + + + MEN_WORK_PLANE + Plan de Travail + + + MEN_POP_POINT_MARKER + Repère Point + + + NAME_LBL + Nom : + + + NON_GEOM_OBJECTS_SELECTED + Dans la sélection il y a d'objets n'appartenant pas au composant %1. + + + PREF_DEFLECTION + Coefficient de Déflection + + + GEOM_PREF_def_precision + Précision de défaut + + + GEOM_PREF_length_precision + Précision de longueur + + + GEOM_PREF_angle_precision + Précision angulaire + + + GEOM_PREF_len_tol_precision + Tolérance de Précision de Longueur + + + GEOM_PREF_ang_tol_precision + Tolérance de Précision Angulaire + + + GEOM_PREF_weight_precision + Précision de Poids + + + GEOM_PREF_density_precision + Précision de Densité + + + GEOM_PREF_parametric_precision + Précision Paramétrique + + + GEOM_PREF_param_tol_precision + Tolérance de Précision Paramétrique + + + PREF_AUTO_CREATE + Créer automatiquement + + + PREF_DISPLAY_MODE + Mode de visualisation de défault + + + PREF_FREE_BOUND_COLOR + Couleur des Contours Libres + + + PREF_GROUP_ORIGIN_AND_BASE_VECTORS + Vecteurs d'origine et de base + + + PREF_GROUP_GENERAL + Général + + + PREF_GROUP_OCCVIEWER + Visualisateur OCC 3d + + + GEOM_PREF_GROUP_PRECISION + Précision des champs d'entrée + + + PREF_GROUP_VERTEX + Repère des points + + + PREF_ISOS_COLOR + Couleur des isolignes + + + PREF_LINE_COLOR + Couleur des arêtes, vecteurs, contours + + + PREF_MARKER_SCALE + Taille + + + PREF_POINT_COLOR + Couleur des points + + + PREF_SHADING_COLOR + Couleur d'Ombrage de Défault + + + PREF_STEP_VALUE + Valeur de pas pour les boîtes d'incrément + + + PREF_TAB_SETTINGS + Préférences + + + PREF_TYPE_OF_MARKER + Type + + + PREF_BASE_VECTORS_LENGTH + Longueur des vecteurs de base + + + PREF_WIREFRAME_COLOR + Couleur des contours de défaut + + + PROCESS_SHAPE_NEW_OBJ_NAME + FormeTraitement + + + REMOVE_HOLES_NEW_OBJ_NAME + SupprimerTrous + + + REMOVE_INT_WIRES_NEW_OBJ_NAME + SupprimerContoursInt + + + SEWING_NEW_OBJ_NAME + Couture + + + STB_ALL_SEL_ONLY + Choisir tous les Objets + + + STB_ARC + Créer un arc + + + STB_ARCHIMEDE + Opération Archimède + + + STB_BASIC_PROPS + Montrer les propriétés de base de l'Objet + + + STB_BND_BOX + Calculer la boîte englobante de l'objet + + + STB_BOX + Créer une boîte + + + STB_CHAMFER + Créer un Chanfrein + + + STB_CHANGE_ORIENTATION + Changer l'orientation + + + STB_CHECK + Valider une forme + + + STB_CHECK_COMPOUND + Valider un assemlage de bloques + + + STB_CHECK_FREE_BNDS + Vérifier les Contours Libres + + + STB_CHECK_FREE_FACES + Vérifier les Faces Libres + + + STB_CHECK_GEOMETRY + Vérifier la Géométrie + + + STB_CIRCLE + Créer un circle + + + STB_CLIPPING + Diapason de Clippage + + + STB_CLOSE_CONTOUR + Fermer le contour + + + STB_COMMON + Commun + + + STB_COMPOUND + Construire un assemblage + + + STB_COMPOUND_SEL_ONLY + Ne choisir que des Assemblages + + + STB_CONE + Créer un cône + + + STB_CURVE + Créer une courbe + + + STB_CUT + Découpe + + + STB_CYLINDER + Créer un cylindre + + + STB_RECTANGLE + Créer une face rectangulaire + + + STB_DELETE + Supprimer un objet + + + STB_DISK + Créer un disque + + + STB_DISPLAY + Visualiser les objets + + + STB_DISPLAY_ALL + Visualiser tous + + + STB_DISPLAY_ONLY + Visualiser seul + + + STB_EDGE + Créer une arête + + + STB_EDGE_SEL_ONLY + Ne choisir que des Arêtes + + + STB_ELLIPSE + Créer un ellipse + + + STB_ERASE + Cacher le(s) objet(s) + + + STB_ERASE_ALL + Cacher tous + + + STB_EXPLODE + Eclatement + + + STB_EXPLODE_BLOCKS + Eclater en Bloques + + + STB_EXPORT + Exporter la géométrie au fichier BREP + + + STB_EXTRUSION + Créer une extrusion + + + STB_FACE + Construire une face + + + STB_FACE_SEL_ONLY + Ne choisir que des Faces + + + STB_FILLET + Créer un congé 3D + + + STB_FILLET_1D + Créer un congé 1D + + + STB_FILLET_2D + Créer un congé 2D + + + STB_FILLING + Créer un remplissage + + + STB_FUSE + Fusion + + + STB_GLUE_FACES + Coller les faces + + + STB_GROUP_CREATE + Créer un groupe + + + STB_GROUP_EDIT + Editer un groupe + + + STB_RELOAD_IMPORTED + Recharger la forme importée de sa place d'origine sur la disque + + + STB_HEX_SOLID + Solide Hexahédral + + + STB_IMPORT + Importer une géométrie d'un fichier BREP + + + STB_INERTIA + Calculer les moments d'intertie de l'objet + + + STB_ISOS + Définir le numéro d'isolignes + + + STB_LINE + Créer une ligne + + + STB_LIMIT_TOLERANCE + Tolérance limite + + + STB_LOCAL_CS + Créer un système local de coordonnées + + + STB_MASS_CENTER + Calculer le centre de la masse de l'objet + + + STB_MIN_DIST + Calculer la distance minimale entre deux objets + + + STB_MIRROR + Refléter un objet + + + STB_MODIFY_LOCATION + Modifier la location d'un objet + + + STB_MUL_ROTATION + Effectuer une multi-rotation + + + STB_MUL_TRANSFORM + Effectuer une multi-transformation + + + STB_MUL_TRANSLATION + Effectuer une multi-translation + + + STB_OFFSET + Surface de Décalage + + + STB_ORIGIN_AND_VECTORS + Créer les Vecteurs de l'origine et de base + + + STB_PARTITION + Effectuer une partition + + + STB_PIPE + Créer un objet par l'extrusion au long d'un chemin + + + STB_PLANE + Créer un plan + + + STB_POINT + Créer un point + + + STB_POINT_COORDS + Montrer les coordonnées du point + + + STB_POINT_ON_EDGE + Ajouter un point sur l'arête + + + STB_POP_COLOR + Couleur + + + STB_POP_CREATE_GROUP + Créer un Groupe + + + STB_POP_SHOW_CHILDREN + Monter les objets fils + + + STB_POP_HIDE_CHILDREN + Cacher les objets fils + + + STB_POP_ISOS + Isolignes + + + STB_POP_DEFLECTION + Coefficient de Déflection + + + STB_POP_RENAME + Renommer + + + STB_POP_SHADING + Ombrage + + + STB_POP_TRANSPARENCY + Transparence + + + STB_POP_WIREFRAME + Contours + + + STB_PROPAGATE + Propaguer + + + STB_Q_FACE + Face Quadrangulaire + + + STB_REVOLUTION + Créer une révolution + + + STB_ROTATION + Tourner un objet + + + STB_SCALE + Redimensionner un objet + + + STB_SECTION + Section + + + STB_SEWING + Effectuer la couture + + + STB_SHADING + Ombrage + + + STB_VECTOR_MODE + Changer le Mode de Présentation des arêtes + + + STB_SHADING_COLOR + Définir le Couleur d'Ombrage + + + STB_SHAPE_PROCESS + Effectuer le traitement de formes + + + STB_SHELL + Construire une coque + + + STB_SHELL_SEL_ONLY + Ne choisir que des Coques + + + STB_SKETCH + Créer un contour 2D + + + STB_3DSKETCH + Créer un contour 3D + + + STB_SOLID + Construire un solide + + + STB_SOLID_SEL_ONLY + Ne choisir que des Solides + + + STB_SPHERE + Créer une sphère + + + STB_STEP_VALUE + Définir le valeur de pas + + + STB_SUPPERSS_HOLES + Effectuer la suppression des trous + + + STB_SUPPRESS_FACES + Effectuer la suppression des faces + + + STB_SUPPRESS_INT_WIRES + Effectuer la suppression des contours internes + + + STB_TOLERANCE + Calculer la tolérance d'un objet + + + STB_TORUS + Créer un tore + + + STB_TRANSLATION + Translater un objet + + + STB_VECTOR + Créer un vecteur + + + STB_VERTEX_SEL_ONLY + Ne choisir que des Points + + + STB_WHAT_IS + Qu'est-ce que c'est + + + STB_WIRE + Construire un contour + + + STB_WIRE_SEL_ONLY + Ne choisir que des Contours + + + STB_WORK_PLANE + Créer un plan de travail + + + STB_POP_POINT_MARKER + Définir un Point Repère + + + SUPPRESS_RESULT + Supprimer le Résultat + + + SUPRESS_FACE_NEW_OBJ_NAME + SupprimerFaces + + + ShHealOper_ErrorExecution_msg + L'algorithme de traitement de formes n'a pas abouti + + + ShHealOper_InvalidParameters_msg + Les paramètres de l'algorithme de traitement de formes sont incorrects + + + ShHealOper_NotError_msg + L'algorithme de traitement de formes n'a pas fait de modifications de la forme d'origine + + + TLT_RENAME + Renommer + + + TOM_O + O + + + TOM_O_PLUS + + en O + + + TOM_O_POINT + . en O + + + TOM_O_STAR + * en O + + + TOM_O_X + X en O + + + TOM_PLUS + + + + + TOM_POINT + . + + + TOM_STAR + * + + + TOM_X + X + + + TOOL_BASIC + de Base + + + TOOL_BOOLEAN + Opérations Booléennes + + + TOOL_GENERATION + Génération + + + TOOL_PRIMITIVES + Primitives + + + TOOL_TRANSFORMATION + Transformation + + + TOOL_BUILD + Construire + + + TOOL_OPERATIONS + Opérations + + + TOOL_ADVANCED + Avancé + + + TOOL_MEASURES + Informations + + + TOP_ARC + Créer un arc + + + TOP_ARCHIMEDE + Archimède + + + TOP_BASIC_PROPS + Propriétés de base + + + TOP_BND_BOX + Boîte Englobante + + + TOP_BOX + Créer une Boîte + + + TOP_CHAMFER + Chanfrain + + + TOP_CHANGE_ORIENTATION + Changer l'orientation + + + TOP_CHECK + Valider l'Objet + + + TOP_CHECK_COMPOUND + Valider l'assemblage de bloques + + + TOP_CHECK_FREE_BNDS + Valider les Contours Libres + + + TOP_CHECK_FREE_FACES + Valider les Faces Libres + + + TOP_CHECK_GEOMETRY + Valider la Géométrie + + + TOP_CIRCLE + Créer un circle + + + TOP_CLIPPING + Diapason de Clipage + + + TOP_CLOSE_CONTOUR + Fermer le contour + + + TOP_COMMON + Commun + + + TOP_COMPOUND + Construire un assemblage + + + TOP_CONE + Créer un cône + + + TOP_CURVE + Créer une courbe + + + TOP_CUT + Découpe + + + TOP_CYLINDER + Créer un cylindre + + + TOP_DELETE + Supprimer l'objet + + + TOP_RECTANGLE + Créer une face rectangulaire + + + TOP_DISK + Créer une disque + + + TOP_DISPLAY + Montrer + + + TOP_DISPLAY_ALL + Montrer Tous + + + TOP_DISPLAY_ONLY + Montrer Seul + + + TOP_EDGE + Construire une arête + + + TOP_ELLIPSE + Créer un ellipse + + + TOP_ERASE + Cacher + + + TOP_ERASE_ALL + Cacher tous + + + TOP_EXPLODE + Eclatement + + + TOP_EXPLODE_BLOCKS + Eclater en Bloques + + + TOP_EXPORT + Exporter une géométrie au fichier BREP + + + TOP_EXTRUSION + Créer une extrusion + + + TOP_FACE + Construire une face + + + TOP_FILLET + Congé 3D + + + TOP_FILLET_1D + Congé 1D + + + TOP_FILLET_2D + Congé 2D + + + TOP_FILLING + Créer un remplissage + + + TOP_FUSE + Fusion + + + TOP_GLUE_FACES + Coller les faces + + + TOP_GROUP_CREATE + Créer une groupe + + + TOP_GROUP_EDIT + Editer une groupe + + + TOP_HEX_SOLID + Solide Hexahédral + + + TOP_IMPORT + Importer une géométry du fichier BREP + + + TOP_INERTIA + Moments d'inertie + + + TOP_ISOS + Définir le numéro des isolignes + + + TOP_LINE + Créer une ligne + + + TOP_LIMIT_TOLERANCE + Tolérance limite + + + TOP_LOCAL_CS + Créer un système local de coordonnées + + + TOP_MASS_CENTER + Centre de la masse + + + TOP_MIN_DIST + Distance Minimale + + + TOP_MIRROR + Image Miroir + + + TOP_MODIFY_LOCATION + Modifer la location + + + TOP_MUL_ROTATION + Multi-Rotation + + + TOP_MUL_TRANSFORM + Multi-transformation + + + TOP_MUL_TRANSLATION + Multi-Translation + + + TOP_OFFSET + Surface de Décalage + + + TOP_ORIGIN_AND_VECTORS + Créer l'origine et les Vecteurs de base + + + TOP_PARTITION + Partition + + + TOP_PIPE + Extrusion au long d'un chemin + + + TOP_PLANE + Créer un plan + + + TOP_POINT + Créer un point + + + TOP_POINT_COORDS + Coordonnées d'un point + + + TOP_POINT_ON_EDGE + Ajouter un point sur l'arête + + + TOP_POP_COLOR + Couleur + + + TOP_POP_CREATE_GROUP + Créer un Groupe + + + TOP_POP_SHOW_CHILDREN + Montrer les Enfants + + + TOP_POP_HIDE_CHILDREN + Cacher les enfants + + + TOP_POP_ISOS + Isolignes + + + TOP_POP_DEFLECTION + Coefficient de Déflection + + + TOP_POP_RENAME + Renommer + + + TOP_POP_SHADING + Ombrage + + + TOP_POP_TRANSPARENCY + Transparence + + + TOP_POP_WIREFRAME + Contours + + + TOP_PROPAGATE + Propaguer + + + TOP_Q_FACE + Face Quadrangulaire + + + TOP_REVOLUTION + Créer une révolution + + + TOP_ROTATION + Rotation + + + TOP_SCALE + Redimentionnement + + + TOP_SECTION + Section + + + TOP_SEWING + Effecture une couture + + + TOP_SHADING + Ombrage + + + TOP_SHADING_COLOR + Définir la couleur d'ombrage + + + TOP_SHAPE_PROCESS + Effectuer le traitement de forme + + + TOP_SHELL + Construire une coque + + + TOP_SKETCH + Contour 2D + + + TOP_3DSKETCH + Contour 3D + + + TOP_SOLID + Créer un solide + + + TOP_SPHERE + Créer une sphère + + + TOP_STEP_VALUE + Définir la valeur de pas + + + TOP_SUPPERSS_HOLES + Supprimer les trous + + + TOP_SUPPRESS_FACES + Supprimer les faces + + + TOP_SUPPRESS_INT_WIRES + Supprimer les contours internes + + + TOP_TOLERANCE + Tolérance + + + TOP_TORUS + Créer un tore + + + TOP_TRANSLATION + Translation + + + TOP_VECTOR + Créer un vecteur + + + TOP_WHAT_IS + Qu'est-ce que c'est + + + TOP_WIRE + Construire un contour + + + TOP_WORK_PLANE + Créer un plan de travail + + + TOP_POP_POINT_MARKER + Repère d'un Point + + + WRN_NOT_IMPLEMENTED + Désolé, cette fonctionnalité n'est pas encore implémentée + + + _S_ + (s) + + + NOT_FOUND_ANY + Pas une seule entité a été trouvée + + + GEOM_FACE_I + Face %1 + + + GEOM_CONSTANT_RADIUS + Rayon : + + + GEOM_R1 + R1 : + + + GEOM_R2 + R2 : + + + GEOM_BOTHWAY + Toutes les deux directions + + + GEOM_NORMALE + Normale à une Face + + + GEOM_VECTOR_NORMALE + Vecteur_Normal + + + GEOM_LINE1 + Ligne 1 + + + GEOM_LINE2 + Ligne 2 + + + GEOM_D + D : + + + GEOM_CHAMFER_EDGE + Chanfrein sur les Arêtes choisies + + + SELECTED_EDGE + Arêtes choisies + + + GEOM_NORMALE_TITLE + Créer un Vecteur Normal à une Face + + + GEOM_MEASURE_ANGLE_TITLE + Angle entre deux Arêtes/Lignes/Vecteurs Droits + + + GEOM_MEASURE_ANGLE_ANGLE + Angle + + + GEOM_MEASURE_ANGLE_OBJ + Objets et Résultats + + + GEOM_MEASURE_ANGLE_IS + Angle en degrées : + + + GEOM_LINE_INTERSECTION + Point sur l'Intersection des Lignes + + + GEOM_KEEP_NONLIMIT_SHAPES + Préserver les formes inférieures + + + GEOM_CENTER_2POINTS + Centre et deux points + + + GEOM_REMOVE_EXTRA_EDGES_TITLE + Supprimer les arêtes supplémentaires + + + GEOM_REMOVE_EXTRA_EDGES + L'Objet pour suppimer les arêtes supplémentaires + + + GEOM_RMEE_UNION_FACES + Union des faces, qui appartiennent à la même surface + + + REMOVE_EXTRA_EDGES_NEW_OBJ_NAME + PasdAretesSupplementaires + + + TOP_REMOVE_EXTRA_EDGES + Suppimer les Arêtes Supplémentaires + + + MEN_REMOVE_EXTRA_EDGES + Suppimer les Arêtes Supplémentaires + + + STB_REMOVE_EXTRA_EDGES + Suppimer les Arêtes Supplémentaires + + + TOP_NORMALE + Vecteur Normal à une Face + + + MEN_NORMALE + Vecteur Normal à une Face + + + STB_NORMALE + Calculer le Vecteur Normal à une Face + + + TOP_MEASURE_ANGLE + Angle + + + MEN_MEASURE_ANGLE + Angle + + + STB_MEASURE_ANGLE + Calculer l'angle entre deux lignes ou arêtes linéaires + + + TOP_POP_AUTO_COLOR + Couleur Automatique + + + MEN_POP_AUTO_COLOR + Couleur Automatique + + + STB_POP_AUTO_COLOR + Couleur Automatique + + + TOP_POP_DISABLE_AUTO_COLOR + Désactiver le Couleur Automatique + + + MEN_POP_DISABLE_AUTO_COLOR + Désactiver le Couleur Automatique + + + STB_POP_DISABLE_AUTO_COLOR + Désactiver le Couleur Automatique + + + GEOM_RESULT_NAME_GRP + Nom du Résultat + + + GEOM_RESULT_NAME_LBL + Nom + + + GEOM_FILLING_APPROX + Approximation + + + GEOM_FILLING_METHOD + Méthode + + + GEOM_FILLING_DEFAULT + Défaut (comportement standardisé) + + + GEOM_FILLING_USEORI + Utiliser l'orientation des arêtes + + + GEOM_FILLING_AUTO + Auto-corrger l'orientation des arêtes + + + GEOM_WRN_NO_APPROPRIATE_SELECTION + Pas d'objets appropriés choisis + + + GEOM_SHAPES_ON_SHAPE + Trouver les éléments d'un objet + + + GEOM_SHAPES_ON_SHAPE_ESHAPE + L'objet à éclater + + + GEOM_SHAPES_ON_SHAPE_CSHAPE + Le Solide à vérifier + + + GEOM_SHAPES_ON_SHAPE_STATE + Etat + + + GEOM_KIND_OF_SHAPE + Type d'Objet : + + + GEOM_CLOSED + Fermé + + + GEOM_UNCLOSED + Ouvert + + + GEOM_CLOSEDUNCLOSED + Il n'est pas défini, si l'objet est fermé ou ouvert. Possiblement, il y a un erreur. + + + GEOM_DISK_CIRCLE + Disque + + + GEOM_DISK_ELLIPSE + Face Elliptique + + + GEOM_PLANAR_FACE + Face Planaire + + + GEOM_PLANAR_EDGE_WIRE + Contour avec des Arêtes Planaires + + + GEOM_POLYGON + Polygone + + + GEOM_POLYHEDRON + Polyèdre + + + GEOM_NORMAL + Direction Normale + + + GEOM_DIRECTION + Direction + + + GEOM_UPARAMETER + Paramètre-U : + + + GEOM_VPARAMETER + Paramètre-V : + + + GEOM_X_I + X%1 : + + + GEOM_Y_I + Y%1 : + + + GEOM_Z_I + Z%1 : + + + GEOM_SHAPES_ON_SHAPE_TITLE + Trouver les éléments d'un objet + + + GEOM_SCALE_FACTOR_X + Facteur de Redimentionnnement à l'axe X : + + + GEOM_SCALE_FACTOR_Y + Facteur de Redimentionnnement à l'axe Y : + + + GEOM_SCALE_FACTOR_Z + Facteur de Redimentionnnement à l'axe Z : + + + GEOM_STATE_IN + IN + + + GEOM_STATE_OUT + OUT + + + GEOM_STATE_ON + ON + + + GEOM_STATE_ONIN + ONIN + + + GEOM_STATE_ONOUT + ONOUT + + + GEOM_STATE_INOUT + INOUT + + + TOP_GET_SHAPES_ON_SHAPES + Trouver les éléments d'un objet + + + MEN_GET_SHAPES_ON_SHAPES + Trouver les éléments d'un objet + + + STB_GET_SHAPES_ON_SHAPES + Trouver les éléments d'un objet + + + GEOM_PUBLISH_RESULT_GRP + Options avancées + + + GEOM_RESTORE_SUB_SHAPES + Importer à partir des arguments les paramètres de la présentation et les sous-formes + + + GEOM_RSS_ADD_FREFIX + Ajouter un préfixe aux noms des sous-formes restaurées + + + GEOM_ALL_IMPORT_FILES + Tous les formats supportés ( %1 ) + + + GEOM_UNSUPPORTED_TYPE + Le format de ficher n'est pas supporté + + + GEOM_UNKNOWN_IMPORT_ERROR + Erreur inconnue + + + GEOM_IMPORT_ERRORS + L'importation s'est finie avec des erreurs: + + + GEOM_PUBLISH_NAMED_SHAPES + Créer des groupes pour les objets indiqués (s'ils existent)? + + + GEOM_SCALE_DIMENSIONS + Voulez-vous prendre les unités en consiération? +Sinon les dimensions seront préservées sans modifications. + + + GEOM_ADVANCED + Forme Avancée : type %1 + + + GEOM_PRECISION_HINT + Il est possible d'ajuster la précision de la valeur d'entrée avec +le paramètre '%1' aux préférences du module Géométrie. + + + TOP_PIPETSHAPE + Créer un Tuyau TForme + + + MEN_PIPETSHAPE + Tuyau TForme + + + STB_PIPETSHAPE + Créer un Nouveau Tuyau TForme + + + GEOM_ADVANCED_201 + Tuyau TForme + + + HALF_LENGTH_MAIN_PIPE + Demi-longueur du Tuyau Principal + + + HALF_LENGTH_INCIDENT_PIPE + Demi-longueur du Tuyau Incident + + + CIRCULAR_QUARTER_PIPE + Un quart circulaire du tuyau + + + THICKNESS + Epaisseur + + + FLANGE + Flange + + + CHAMFER_OR_FILLET + Chanfrein ou Congé + + + CHAMFER + Chanfrein + + + FILLET + Congé + + + JUNCTION_FACE_1 + Jonction 1 + + + JUNCTION_FACE_2 + Jonction 2 + + + JUNCTION_FACE_3 + Jonction 3 + + + + BasicGUI_CurveDlg + + GEOM_IS_CLOSED + Construire une arête fermée + + + + BasicGUI_EllipseDlg + + GEOM_VECTOR_MAJOR + Axe Majeur + + + ORIGIN_DEFAULT + Origine de défaut + + + X_AXIS_DEFAULT + Axe X de défaut + + + Z_AXIS_DEFAULT + Axe Z de défaut + + + + BasicGUI_MarkerDlg + + CAPTION + Construction d'un SC Local + + + DX + Dx + + + DY + Dy + + + DZ + Dz + + + LCS_NAME + SCLocal + + + LOCALCS + Système de coordonnées local + + + ORIGIN + Coordonnées de l'origine + + + VEC_PARALLEL + Il n'est pas possible que les axes du système de coordonnées soient parallels + + + XDIR + Direction de l'axe X + + + YDIR + Direction de l'axe Y + + + + BlocksGUI_BlockDlg + + FACE_1 + Face 1 + + + FACE_2 + Face 2 + + + FACE_3 + Face 3 + + + FACE_4 + Face 4 + + + FACE_5 + Face 5 + + + FACE_6 + Face 6 + + + + BlocksGUI_ExplodeDlg + + NB_FACES_MAX + Numéro maximal des faces + + + NB_FACES_MIN + Numéro minimal des faces + + + + BlocksGUI_QuadFaceDlg + + EDGE_1 + Arête 1 + + + EDGE_2 + Arête 2 + + + EDGE_3 + Arête 3 + + + EDGE_4 + Arête 4 + + + VERTEX_1 + Point 1 + + + VERTEX_2 + Point 2 + + + VERTEX_3 + Point 3 + + + VERTEX_4 + Point 4 + + + + BlocksGUI_TrsfDlg + + FACE_1 + Face 1 + + + FACE_1U + Face 1 U + + + FACE_1V + Face 1 V + + + FACE_2 + Face 2 + + + FACE_2U + Face 2 U + + + FACE_2V + Face 2 V + + + + EntityGUI_SketcherDlg + + CANNOT_CLOSE + Il est impossible de fermer le contour +Le numéro de points du contour n'est pas suffisant + + + + EntityGUI_SubShapeDlg + + NO_SUBSHAPES_SELECTED + Choisissez une ou plusieurs sous-formes + + + + GroupGUI + + NO_GROUP + Choisissez un groupe à éditer + + + + GroupGUI_GroupDlg + + ADD + Ajouter + + + CREATE_GROUP_TITLE + Créer un Groupe + + + EDIT_GROUP_TITLE + Editer un Groupe + + + EMPTY_LIST + Choisissez une ou plus de sous-formes à placer dans le groupe + + + EMPTY_NAME + Le nom de groupe est vide. Indiquez un nom correcte + + + GROUP_NAME + Npm du Groupe + + + GROUP_PREFIX + Groupe + + + MAIN_SHAPE + La Forme Principale + + + MAIN_SUB_SHAPES + La Forme Principale et ces Sous-Formes + + + NO_GROUP + Choisissez un groupe à éditer + + + NO_MAIN_OBJ + Choisissez l'objet principal + + + REMOVE + Supprimer + + + SELECT_ALL + Choisir Tous + + + SHAPE_SEL_RESTR + Sélection Limité de la Forme Principale + + + SHAPE_TYPE + Type de la Forme + + + NO_RESTR + Pas de restriction + + + GEOM_PARTS_OF_SHAPE2 + Parties Géométriques de la Seconde Forme + + + SUBSHAPES_OF_SHAPE2 + Seules les Sous-Formes de la Seconde Forme + + + SECOND_SHAPE + Seconde Forme + + + + MeasureGUI_1Sel1TextView1Check_QTD + + CHECK_SHAPE_GEOMETRY + Vérifier la géométrie + + + + MeasureGUI_PointDlg + + CAPTION + Coordonnées d'un Point + + + COORDINATES + Le Point et ces coordonnées + + + POINT + Point + + + X + X + + + Y + Y + + + Z + Z + + + + OperationGUI_ChamferDlg + + D + D + + + FACE_1 + Face 1 + + + FACE_2 + Face 2 + + + SELECTED_FACES + Les Faces Choisies + + + + OperationGUI_FilletDlg + + SELECTED_EDGES + Les arêtes choisies + + + SELECTED_FACES + Les Faces Choisies + + + + RepairGUI_FreeBoundDlg + + CAPTION + Vérifier les contours libres + + + FREE_BOUND + Contours Libres + + + NUMBER_CLOSED + Numéro de contours libres fermés + + + NUMBER_OPEN + Numéro de contours libres ouverts + + + + RepairGUI_GlueDlg + + FACES_FOR_GLUING_ARE_DETECTED + Il y a %1 face(s) à coller surlignées en couleur rouge. +Fermez cette boîte d'alerte et choisissez les faces à coller + + + GLUE_FACES + Coller les faces + + + SELECT_FACES + Choisir les Faces + + + THERE_ARE_NO_FACES_FOR_GLUING + Il n'y a pas de Faces à Coller + + + + RepairGUI_ShapeProcessDlg + + ERROR_NO_OBJECTS + Choisissez un objet géométrique pour le traitement de forme. + + + ERROR_NO_OPERATORS + Choisissez au moins une opération de traitement de forme pour donner suite à l'opération + + + TIME_CONSUMING + L'activarion de cette option peut résulter en une perte de temps à l'entrée de certaines formes. +Voudriez-vous continuer? + + + + GEOMToolsGUI_DeleteDlg + + GEOM_REALLY_DELETE + Est-ce que vous voulez supprimer %1 objet(s)? + + + GEOM_REALLY_DELETE_ALL + Est-ce que vous voulez de supprimer tous les objets? + + + GEOM_DELETE_OBJECTS + Supprimer les objets + + + + GEOMToolsGUI_DeflectionDlg + + GEOM_DEFLECTION_TLT + Choisir la déflection d'un Objet + + + GEOM_DEFLECTION + Déflection : + + + + GEOMToolsGUI_MarkerDlg + + SET_MARKER_TLT + Définir le Repère de Point + + + STANDARD_MARKER + Standard + + + CUSTOM_MARKER + Personnalisé + + + TYPE + Type: + + + SCALE + Echelle: + + + CUSTOM + Texture: + + + BROWSE + Naviguer... + + + OK_BTN + &OK + + + CANCEL_BTN + A&nnuler + + + HELP_BTN + &Aide + + + LOAD_TEXTURE_TLT + Ouvrir une Texture + + + + AdvancedGUI_PipeTShapeDlg + + GEOM_PIPE_TSHAPE_TITLE + Construction d'un Tuyau TForme + + + GEOM_PIPE_TSHAPE + TuyauTForme + + + GEOM_PIPE_TSHAPE_MPIPE + Tuyau Principal + + + GEOM_PIPE_TSHAPE_R + Rayon + + + GEOM_PIPE_TSHAPE_W + Largeur + + + GEOM_PIPE_TSHAPE_L + Demi-longueur + + + GEOM_PIPE_TSHAPE_IPIPE + Tuyau Incident + + + GEOM_PIPE_TSHAPE_CHAMFER + Chanfrein + + + GEOM_PIPE_TSHAPE_CHAMFER_H + Hauteur + + + GEOM_PIPE_TSHAPE_CHAMFER_W + Largeur + + + GEOM_PIPE_TSHAPE_FILLET + Congé + + + GEOM_PIPE_TSHAPE_HEX + Préparer pour un maillage hexagonal + + + GEOM_PIPE_TSHAPE_POSITION + Définir la position + + + GEOM_PIPE_TSHAPE_POSITION_P1 + Jonction P1 + + + GEOM_PIPE_TSHAPE_POSITION_P2 + Jonction P2 + + + GEOM_PIPE_TSHAPE_POSITION_P3 + Jonction P3 + + + GEOM_PIPE_TSHAPE_POSITION_LBL_L1 + Nouvelle L1 + + + GEOM_PIPE_TSHAPE_POSITION_LBL_L2 + Nouvelle L2 + + diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 1edeb1ada..740792c7b 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -19,11 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// GEOM GEOMGUI : GUI for Geometry component +// File : GeometryGUI.cxx +// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI.cxx -// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// #include // E.A. must be included before Python.h to fix compilation on windows #include "Python.h" #include "GeometryGUI.h" @@ -152,6 +151,17 @@ SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy) return aDSStudy._retn(); } +void GeometryGUI::Modified( bool theIsUpdateActions ) +{ + if( SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ) ) { + if( SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ) ) { + appStudy->Modified(); + if( theIsUpdateActions ) + app->updateActions(); + } + } +} + //======================================================================= // function : GeometryGUI::GeometryGUI() // purpose : Constructor @@ -378,7 +388,11 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT case GEOMOp::OpColor: // POPUP MENU - COLOR case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY + case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY + case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY case GEOMOp::OpIsos: // POPUP MENU - ISOS + case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS + case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR case GEOMOp::OpShowChildren: // POPUP MENU - SHOW CHILDREN @@ -476,6 +490,7 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES + case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES libName = "RepairGUI"; break; @@ -572,7 +587,8 @@ void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e ) // function : createGeomAction // purpose : //======================================================================= -void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel, const int accel, const bool toggle ) +void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel, + const int accel, const bool toggle, const QString& shortcutAction ) { SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false ) @@ -580,16 +596,17 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS createAction( id, tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ), icon, - tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ), + tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ), tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ), accel, application()->desktop(), toggle, - this, SLOT( OnGUIEvent() ) ); + this, SLOT( OnGUIEvent() ), + shortcutAction ); } //======================================================================= -// function : createGeomAction +// function : createOriginAndBaseVectors // purpose : //======================================================================= void GeometryGUI::createOriginAndBaseVectors() @@ -706,6 +723,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpSewing, "SEWING" ); createGeomAction( GEOMOp::OpGlueFaces, "GLUE_FACES" ); + createGeomAction( GEOMOp::OpLimitTolerance, "LIMIT_TOLERANCE" ); createGeomAction( GEOMOp::OpSuppressFaces, "SUPPRESS_FACES" ); createGeomAction( GEOMOp::OpSuppressHoles, "SUPPERSS_HOLES" ); createGeomAction( GEOMOp::OpShapeProcess, "SHAPE_PROCESS" ); @@ -765,8 +783,21 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpShowChildren, "POP_SHOW_CHILDREN" ); createGeomAction( GEOMOp::OpHideChildren, "POP_HIDE_CHILDREN" ); createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" ); - + createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" ); + + // Create actions for increase/decrease transparency shortcuts + createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false, + "Geometry:Increase transparency"); + createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false, + "Geometry:Decrease transparency"); + + // Create actions for increase/decrease number of isolines + createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false, + "Geometry:Increase number of isolines"); + createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false, + "Geometry:Decrease number of isolines"); + // createGeomAction( GEOMOp::OpPipeTShapeGroups, "PIPETSHAPEGROUPS" ); //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@// @@ -891,6 +922,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpSuppressHoles, repairId, -1 ); createMenu( GEOMOp::OpSewing, repairId, -1 ); createMenu( GEOMOp::OpGlueFaces, repairId, -1 ); + createMenu( GEOMOp::OpLimitTolerance, repairId, -1 ); createMenu( GEOMOp::OpAddPointOnEdge, repairId, -1 ); //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 ); //createMenu( GEOMOp::OpFreeFaces, repairId, -1 ); @@ -1089,7 +1121,7 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpDeflection ), "selcount>0 and isVisible and client='OCCViewer'", QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule ); - mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM::VERTEX), QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1 %2}" ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpAutoColor ), -1, -1 ); // auto color mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule ); @@ -1210,7 +1242,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) SALOME_ListIO selected; sm->selectedObjects( selected ); sm->clearSelected(); - + // disable OCC selectors getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); QListIterator itOCCSel( myOCCSelectors ); @@ -1473,7 +1505,7 @@ void GeometryGUI::createPreferences() setPreferenceProperty( genGroup, "columns", 2 ); int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup, - LightApp_Preferences::Selector, + LightApp_Preferences::Selector, "Geometry", "display_mode" ); addPreference( tr( "PREF_SHADING_COLOR" ), genGroup, @@ -1499,36 +1531,36 @@ void GeometryGUI::createPreferences() int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup, LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" ); - + // Quantities with individual precision settings int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId ); setPreferenceProperty( precGroup, "columns", 2 ); - + const int nbQuantities = 8; int prec[nbQuantities], ii = 0; prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "length_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "length_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "angle_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "angle_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "weight_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "weight_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "density_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "density_precision" ); prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" ); + LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" ); prec[ii ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup, - LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" ); - + LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" ); + // Set property for precision value for spinboxes for ( ii = 0; ii < nbQuantities; ii++ ){ setPreferenceProperty( prec[ii], "min", -14 ); setPreferenceProperty( prec[ii], "max", 14 ); setPreferenceProperty( prec[ii], "precision", 2 ); - } + } int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId ); setPreferenceProperty( VertexGroup, "columns", 2 ); diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h index 613282d40..ef5c054a8 100644 --- a/src/GEOMGUI/GeometryGUI.h +++ b/src/GEOMGUI/GeometryGUI.h @@ -87,6 +87,8 @@ public: static CORBA::Object_var ClientSObjectToObject (_PTR(SObject) theSObject); static SALOMEDS::Study_var ClientStudyToStudy (_PTR(Study) theStudy); + static void Modified( bool = true ); + GEOM_Client& GetShapeReader() { return GEOM_Client::ShapeReader; } //GEOM_Client& GetShapeReader() { return myShapeReader; } @@ -148,7 +150,8 @@ private: GEOMGUI* getLibrary( const QString& libraryName ); void createGeomAction( const int id, const QString& po_id, const QString& icon_id = QString(""), - const int key = 0, const bool toggle = false ); + const int key = 0, const bool toggle = false, + const QString& shortcutAction = QString() ); void createPopupItem( const int, const QString& clients, const QString& types, const bool isSingle = false, const int isVisible = -1, const bool isExpandAll = false, const bool isOCC = false, diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index 311dbbe76..064d04fe0 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -16,10 +16,9 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - // File : GeometryGUI_Operations.h // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #ifndef GEOMETRYGUI_OPERATIONS_H #define GEOMETRYGUI_OPERATIONS_H @@ -41,10 +40,14 @@ namespace GEOMOp { OpDeflection = 1200, // POPUP MENU - DEFLECTION COEFFICIENT OpColor = 1201, // POPUP MENU - COLOR OpTransparency = 1202, // POPUP MENU - TRANSPARENCY - OpIsos = 1203, // POPUP MENU - ISOS - OpAutoColor = 1204, // POPUP MENU - AUTO COLOR - OpNoAutoColor = 1205, // POPUP MENU - DISABLE AUTO COLOR - OpPointMarker = 1206, // POPUP MENU - POINT MARKER + OpIncrTransparency = 1203, // SHORTCUT - INCREASE TRANSPARENCY + OpDecrTransparency = 1204, // SHORTCUT - DECREASE TRANSPARENCY + OpIsos = 1205, // POPUP MENU - ISOS + OpIncrNbIsos = 1206, // SHORTCUT - INCREASE NB ISOS + OpDecrNbIsos = 1207, // SHORTCUT - DECREASE NB ISOS + OpAutoColor = 1208, // POPUP MENU - AUTO COLOR + OpNoAutoColor = 1209, // POPUP MENU - DISABLE AUTO COLOR + OpPointMarker = 1210, // POPUP MENU - POINT MARKER OpShowChildren = 1250, // POPUP MENU - SHOW CHILDREN OpHideChildren = 1251, // POPUP MENU - HIDE CHILDREN OpRename = 1252, // POPUP MENU - RENAME @@ -131,6 +134,7 @@ namespace GEOMOp { OpOrientation = 4009, // MENU REPAIR - CHANGE ORIENTATION OpGlueFaces = 4010, // MENU REPAIR - GLUE FACES OpRemoveExtraEdges = 4011, // MENU REPAIR - REMOVE EXTRA EDGES + OpLimitTolerance = 4012, // MENU REPAIR - LIMIT TOLERANCE // MeasureGUI ----------------//-------------------------------- OpProperties = 5000, // MENU MEASURES - PROPERTIES OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS @@ -160,6 +164,6 @@ namespace GEOMOp { // OpPipeTShapeGroups = 10002, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS //@@ insert new functions before this line @@ do not remove this line @@// }; -} +} #endif // GEOMETRYGUI_OPERATIONS_H diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index 5670d099b..d59b07203 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -18,7 +18,6 @@ // 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 @@ -45,6 +44,12 @@ #include #include +#include +#include +#include +#include +#include + #include #include @@ -126,6 +131,9 @@ Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const case CHANGE_ORIENTATION: ChangeOrientation(&HI, anOriginalShape, aShape); break; + case LIMIT_TOLERANCE: + LimitTolerance(&HI, anOriginalShape, aShape); + break; default: return 0; } @@ -465,6 +473,36 @@ Standard_Boolean GEOMImpl_HealingDriver::ChangeOrientation (GEOMImpl_IHealing* t return aResult; } +//======================================================================= +//function : LimitTolerance +//purpose : +//======================================================================= +void GEOMImpl_HealingDriver::LimitTolerance (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Standard_Real aTol = theHI->GetTolerance(); + if (aTol < Precision::Confusion()) + aTol = Precision::Confusion(); + + // 1. Make a copy to prevent the original shape changes. + TopoDS_Shape aShapeCopy; + TColStd_IndexedDataMapOfTransientTransient aMapTShapes; + TNaming_CopyShape::CopyTool(theOriginalShape, aMapTShapes, aShapeCopy); + + // 2. Limit tolerance. + ShapeFix_ShapeTolerance aSFT; + aSFT.LimitTolerance(aShapeCopy, aTol, aTol, TopAbs_SHAPE); + + // 3. Fix obtained shape. + Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape (aShapeCopy); + aSfs->Perform(); + theOutShape = aSfs->Shape(); + + BRepCheck_Analyzer ana (theOutShape, Standard_True); + if (!ana.IsValid()) + StdFail_NotDone::Raise("Non valid shape result"); +} //======================================================================= //function : GEOMImpl_HealingDriver_Type_ diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx index 344cf770c..4e4b44b49 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx @@ -19,10 +19,9 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - // File : GEOMImpl_HealingDriver.hxx // Module : GEOMImpl -// + #ifndef _GEOMImpl_HealingDriver_HeaderFile #define _GEOMImpl_HealingDriver_HeaderFile @@ -156,7 +155,7 @@ Standard_EXPORT ~GEOMImpl_HealingDriver() {}; // Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_HealingDriver_Type_(); Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_HealingDriver) ; } -Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_HealingDriver) == AType || TFunction_Driver::IsKind(AType)); } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_HealingDriver) == AType || TFunction_Driver::IsKind(AType)); } private: Standard_Boolean ShapeProcess ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; @@ -167,7 +166,7 @@ Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean ChangeOrientation( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; - +void LimitTolerance( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; }; diff --git a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx index e1ecb47bd..9899fc5da 100644 --- a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx @@ -281,6 +281,10 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int aShell->GetLastFunction()->SetDescription(""); // Get the common shapes between shell and shape Handle(GEOM_Object) aCommonCompound = myBooleanOperations->MakeBoolean (theShape, aShell, 1); // MakeCommon + if (aCommonCompound.IsNull()) { + SetErrorCode(myBooleanOperations->GetErrorCode()); + return false; + } aCommonCompound->GetLastFunction()->SetDescription(""); // Explode the faces of common shapes => 3 faces Handle(TColStd_HSequenceOfTransient) aCommonFaces = myShapesOperations->MakeExplode(aCommonCompound, TopAbs_FACE, true); @@ -316,34 +320,34 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int // Uncomment the following lines when GetInPlace bug is solved // == BEGIN - // Handle(GEOM_Object) aP1 = myBasicOperations->MakePointXYZ(-theL1, 0, 0); - // Handle(GEOM_Object) aP2 = myBasicOperations->MakePointXYZ(-0, 0, theL2); - // Handle(GEOM_Object) aP3 = myBasicOperations->MakePointXYZ(theL1, 0, 0); - // aP1->GetLastFunction()->SetDescription(""); - // aP2->GetLastFunction()->SetDescription(""); - // aP3->GetLastFunction()->SetDescription(""); - // Handle(GEOM_Object) aV1 = myBasicOperations->MakeVectorDXDYDZ(-1, 0, 0); - // Handle(GEOM_Object) aV2 = myBasicOperations->MakeVectorDXDYDZ(0, 0, 1); - // Handle(GEOM_Object) aV3 = myBasicOperations->MakeVectorDXDYDZ(1, 0, 0); - // aV1->GetLastFunction()->SetDescription(""); - // aV2->GetLastFunction()->SetDescription(""); - // aV3->GetLastFunction()->SetDescription(""); - // Handle(GEOM_Object) aPln1 = myBasicOperations->MakePlanePntVec(aP1, aV1, 2*(theR1+theW1+theL2)); - // Handle(GEOM_Object) aPln2 = myBasicOperations->MakePlanePntVec(aP2, aV2, 2*(theR2+theW2)); - // Handle(GEOM_Object) aPln3 = myBasicOperations->MakePlanePntVec(aP3, aV3, 2*(theR1+theW1+theL2)); - // aPln1->GetLastFunction()->SetDescription(""); - // aPln2->GetLastFunction()->SetDescription(""); - // aPln3->GetLastFunction()->SetDescription(""); - - // BRepBuilderAPI_Transform aTransformation1(aPln1->GetValue(), aTrsf, Standard_False); - // TopoDS_Shape aTrsf_Shape1 = aTransformation1.Shape(); - // aPln1->GetLastFunction()->SetValue(aTrsf_Shape1); - // BRepBuilderAPI_Transform aTransformation2(aPln2->GetValue(), aTrsf, Standard_False); - // TopoDS_Shape aTrsf_Shape2 = aTransformation2.Shape(); - // aPln2->GetLastFunction()->SetValue(aTrsf_Shape2); - // BRepBuilderAPI_Transform aTransformation3(aPln3->GetValue(), aTrsf, Standard_False); - // TopoDS_Shape aTrsf_Shape3 = aTransformation3.Shape(); - // aPln3->GetLastFunction()->SetValue(aTrsf_Shape3); +// Handle(GEOM_Object) aP1 = myBasicOperations->MakePointXYZ(-theL1, 0, 0); +// Handle(GEOM_Object) aP2 = myBasicOperations->MakePointXYZ(-0, 0, theL2); +// Handle(GEOM_Object) aP3 = myBasicOperations->MakePointXYZ(theL1, 0, 0); +// aP1->GetLastFunction()->SetDescription(""); +// aP2->GetLastFunction()->SetDescription(""); +// aP3->GetLastFunction()->SetDescription(""); +// Handle(GEOM_Object) aV1 = myBasicOperations->MakeVectorDXDYDZ(-1, 0, 0); +// Handle(GEOM_Object) aV2 = myBasicOperations->MakeVectorDXDYDZ(0, 0, 1); +// Handle(GEOM_Object) aV3 = myBasicOperations->MakeVectorDXDYDZ(1, 0, 0); +// aV1->GetLastFunction()->SetDescription(""); +// aV2->GetLastFunction()->SetDescription(""); +// aV3->GetLastFunction()->SetDescription(""); +// Handle(GEOM_Object) aPln1 = myBasicOperations->MakePlanePntVec(aP1, aV1, 2*(aR1Ext+theL2)); +// Handle(GEOM_Object) aPln2 = myBasicOperations->MakePlanePntVec(aP2, aV2, 2*(aR2Ext)); +// Handle(GEOM_Object) aPln3 = myBasicOperations->MakePlanePntVec(aP3, aV3, 2*(aR1Ext+theL2)); +// aPln1->GetLastFunction()->SetDescription(""); +// aPln2->GetLastFunction()->SetDescription(""); +// aPln3->GetLastFunction()->SetDescription(""); +// +// BRepBuilderAPI_Transform aTransformation1(aPln1->GetValue(), aTrsf, Standard_False); +// TopoDS_Shape aTrsf_Shape1 = aTransformation1.Shape(); +// aPln1->GetLastFunction()->SetValue(aTrsf_Shape1); +// BRepBuilderAPI_Transform aTransformation2(aPln2->GetValue(), aTrsf, Standard_False); +// TopoDS_Shape aTrsf_Shape2 = aTransformation2.Shape(); +// aPln2->GetLastFunction()->SetValue(aTrsf_Shape2); +// BRepBuilderAPI_Transform aTransformation3(aPln3->GetValue(), aTrsf, Standard_False); +// TopoDS_Shape aTrsf_Shape3 = aTransformation3.Shape(); +// aPln3->GetLastFunction()->SetValue(aTrsf_Shape3); // == END // @@ -386,7 +390,10 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int // theSeq->Append(aPln3); // return false; } + // Comment the following lines when GetInPlace bug is solved + // == BEGIN } + // == END ///////////////////////// //// Groups of Edges //// ///////////////////////// @@ -510,7 +517,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int } else if (nbEdges == 8) { incidentPipeFound = true; - mainPipeFound = false; + mainPipeFound = true; flangeFound = false; TopExp_Explorer Ex(aGroupShapeTrsfInv,TopAbs_VERTEX); @@ -989,7 +996,12 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapePartition(Handle(GEOM_Object) t } Te3->GetLastFunction()->SetDescription(""); - + // Last verification: result should be a block + std::list errList; + if (!myBlocksOperations->CheckCompoundOfBlocks(Te3,errList)) { + SetErrorCode("TShape is not a block"); + return false; + } TopoDS_Shape aShape = Te3->GetValue(); theShape->GetLastFunction()->SetValue(aShape); @@ -1141,8 +1153,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShape(double theR1, double theW1, double /* * Get the groups: BEGIN */ - if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + try { + if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + return NULL; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; + } TCollection_AsciiString aListRes, anEntry; // Iterate over the sequence aSeq @@ -1271,7 +1290,14 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th // // Get the groups: BEGIN // - if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) { + try { + if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) { + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; } @@ -1465,8 +1491,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, // << ", " << theHexMesh << ")"; // } // else { - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + try { + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + return NULL; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; + } TCollection_AsciiString aListRes, anEntry; // Iterate over the sequence aSeq @@ -1658,8 +1691,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do /* * Get the groups: BEGIN */ - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + try { + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + return NULL; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; + } TCollection_AsciiString aListRes, anEntry; // Iterate over the sequence aSeq @@ -1808,7 +1848,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d return NULL; } if (aFillet.IsNull()) { - SetErrorCode("Fillet can not be computed on the given shape with the given parameters"); +// SetErrorCode("Fillet can not be computed on the given shape with the given parameters"); + SetErrorCode(myLocalOperations->GetErrorCode()); return NULL; } aFillet->GetLastFunction()->SetDescription(""); @@ -1830,8 +1871,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d /* * Get the groups: BEGIN */ - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + try { + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + return NULL; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; + } TCollection_AsciiString aListRes, anEntry; // Iterate over the sequence aSeq @@ -2022,8 +2070,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou /* * Get the groups: BEGIN */ - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + try { + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + return NULL; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); return NULL; + } TCollection_AsciiString aListRes, anEntry; // Iterate over the sequence aSeq diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 3aeca3008..b4c4ebd77 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -569,6 +569,81 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetPoint return aResult; } +//============================================================================= +/*! + * GetVertexNearPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetVertexNearPoint + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + // New Point object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || thePoint.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + TopoDS_Shape aPoint = thePoint->GetValue(); + if (aBlockOrComp.IsNull() || aPoint.IsNull()) { + SetErrorCode("Given shape is null"); + return NULL; + } + + if (aPoint.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for vertex identification is not a vertex"); + return NULL; + } + + TopoDS_Vertex aVert = TopoDS::Vertex(aPoint); + gp_Pnt aP = BRep_Tool::Pnt(aVert); + + // Compute the Vertex value + TopoDS_Shape V; + bool isFound = false; + Standard_Real aDist = RealLast(); + TopTools_MapOfShape mapShape; + + TopExp_Explorer exp (aBlockOrComp, TopAbs_VERTEX); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Vertex aVi = TopoDS::Vertex(exp.Current()); + gp_Pnt aPi = BRep_Tool::Pnt(aVi); + Standard_Real aDisti = aPi.Distance(aP); + if (aDisti < aDist) { + V = aVi; + aDist = aDisti; + isFound = true; + } + } + } + + if (!isFound) { + SetErrorCode("Vertex has not been found"); + return NULL; + } + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(V)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + + // The GetPoint() doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + + // Make a Python command + GEOM::TPythonDump(aFunction, /*append=*/true) + << aResult << " = geompy.GetVertexNearPoint(" + << theShape << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aResult; +} + //============================================================================= /*! * GetEdge @@ -1458,6 +1533,136 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetFaceByNormale return aResult; } +//============================================================================= +/*! + * GetShapesNearPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetShapesNearPoint + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint, + const Standard_Integer theShapeType, + const Standard_Real theTolerance) +{ + SetErrorCode(KO); + + // New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || thePoint.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block or compound is null"); + return NULL; + } + + TopoDS_Shape anArg = thePoint->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for face identification is not a vertex"); + return NULL; + } + + if (theShapeType < TopAbs_SOLID || TopAbs_VERTEX < theShapeType) { + SetErrorCode("Invalid type of result is requested"); + return NULL; + } + + if (theTolerance < Precision::Confusion()) { + theTolerance == Precision::Confusion(); + } + + // Compute the result + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + + TopTools_MapOfShape mapShape; + Standard_Integer nbEdges = 0; + TopExp_Explorer exp (aBlockOrComp, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbEdges++; + } + } + + if (nbEdges == 0) { + SetErrorCode("Given shape contains no subshapes of requested type"); + return NULL; + } + + // Calculate distances and find min + mapShape.Clear(); + Standard_Integer ind = 1; + Standard_Real aMinDist = RealLast(); + TopTools_Array1OfShape anEdges (1, nbEdges); + TColStd_Array1OfReal aDistances (1, nbEdges); + for (exp.Init(aBlockOrComp, TopAbs_ShapeEnum(theShapeType)); exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape anEdge = exp.Current(); + anEdges(ind) = anEdge; + + BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind)); + if (!aDistTool.IsDone()) { + SetErrorCode("Can not find a distance from the given point to one of subshapes"); + return NULL; + } + aDistances(ind) = aDistTool.Value(); + if (aDistances(ind) < aMinDist) { + aMinDist = aDistances(ind); + } + ind++; + } + } + + if (aMinDist < RealLast()) { + // Collect subshapes with distance < (aMinDist + theTolerance) + int nbSubShapes = 0; + TopTools_Array1OfShape aNearShapes (1, nbEdges); + for (ind = 1; ind <= nbEdges; ind++) { + if (aDistances(ind) < aMinDist + theTolerance) { + nbSubShapes++; + aNearShapes(nbSubShapes) = anEdges(ind); + } + } + + // Add subshape + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger (1, nbSubShapes); + for (ind = 1; ind <= nbSubShapes; ind++) { + anArray->SetValue(ind, anIndices.FindIndex(aNearShapes(ind))); + } + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + if (aResult.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) + << aResult << " = geompy.GetShapesNearPoint(" << theShape << ", " << thePoint + << ", " << TopAbs_ShapeEnum(theShapeType) << ", " << theTolerance << ")"; + + SetErrorCode(OK); + return aResult; +} + //============================================================================= /*! * IsCompoundOfBlocks diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index c5ce21151..43caa5883 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IBlocksOperations_HXX_ #define _GEOMImpl_IBlocksOperations_HXX_ @@ -41,68 +40,76 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { // Creation of blocks and block faces Standard_EXPORT Handle(GEOM_Object) MakeQuad (Handle(GEOM_Object) theEdge1, - Handle(GEOM_Object) theEdge2, - Handle(GEOM_Object) theEdge3, - Handle(GEOM_Object) theEdge4); + Handle(GEOM_Object) theEdge2, + Handle(GEOM_Object) theEdge3, + Handle(GEOM_Object) theEdge4); Standard_EXPORT Handle(GEOM_Object) MakeQuad2Edges (Handle(GEOM_Object) theEdge1, - Handle(GEOM_Object) theEdge2); + Handle(GEOM_Object) theEdge2); Standard_EXPORT Handle(GEOM_Object) MakeQuad4Vertices (Handle(GEOM_Object) thePoint1, - Handle(GEOM_Object) thePoint2, - Handle(GEOM_Object) thePoint3, - Handle(GEOM_Object) thePoint4); + Handle(GEOM_Object) thePoint2, + Handle(GEOM_Object) thePoint3, + Handle(GEOM_Object) thePoint4); Standard_EXPORT Handle(GEOM_Object) MakeHexa (Handle(GEOM_Object) theFace1, - Handle(GEOM_Object) theFace2, - Handle(GEOM_Object) theFace3, - Handle(GEOM_Object) theFace4, - Handle(GEOM_Object) theFace5, - Handle(GEOM_Object) theFace6); + Handle(GEOM_Object) theFace2, + Handle(GEOM_Object) theFace3, + Handle(GEOM_Object) theFace4, + Handle(GEOM_Object) theFace5, + Handle(GEOM_Object) theFace6); Standard_EXPORT Handle(GEOM_Object) MakeHexa2Faces (Handle(GEOM_Object) theFace1, - Handle(GEOM_Object) theFace2); + Handle(GEOM_Object) theFace2); Standard_EXPORT Handle(GEOM_Object) MakeBlockCompound (Handle(GEOM_Object) theCompound); // Extract elements of blocks and blocks compounds Standard_EXPORT Handle(GEOM_Object) GetPoint (Handle(GEOM_Object) theShape, - const Standard_Real theX, - const Standard_Real theY, - const Standard_Real theZ, - const Standard_Real theEpsilon); + const Standard_Real theX, + const Standard_Real theY, + const Standard_Real theZ, + const Standard_Real theEpsilon); + + Standard_EXPORT Handle(GEOM_Object) GetVertexNearPoint (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint); Standard_EXPORT Handle(GEOM_Object) GetEdge (Handle(GEOM_Object) theShape, - Handle(GEOM_Object) thePoint1, - Handle(GEOM_Object) thePoint2); + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); Standard_EXPORT Handle(GEOM_Object) GetEdgeNearPoint (Handle(GEOM_Object) theBlock, - Handle(GEOM_Object) thePoint); + Handle(GEOM_Object) thePoint); Standard_EXPORT Handle(GEOM_Object) GetFaceByPoints (Handle(GEOM_Object) theShape, - Handle(GEOM_Object) thePoint1, - Handle(GEOM_Object) thePoint2, - Handle(GEOM_Object) thePoint3, - Handle(GEOM_Object) thePoint4); + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2, + Handle(GEOM_Object) thePoint3, + Handle(GEOM_Object) thePoint4); Standard_EXPORT Handle(GEOM_Object) GetFaceByEdges (Handle(GEOM_Object) theShape, - Handle(GEOM_Object) theEdge1, - Handle(GEOM_Object) theEdge2); + Handle(GEOM_Object) theEdge1, + Handle(GEOM_Object) theEdge2); Standard_EXPORT Handle(GEOM_Object) GetOppositeFace (Handle(GEOM_Object) theBlock, - Handle(GEOM_Object) theFace); + Handle(GEOM_Object) theFace); Standard_EXPORT Handle(GEOM_Object) GetFaceNearPoint (Handle(GEOM_Object) theBlock, - Handle(GEOM_Object) thePoint); + Handle(GEOM_Object) thePoint); Standard_EXPORT Handle(GEOM_Object) GetFaceByNormale (Handle(GEOM_Object) theBlock, - Handle(GEOM_Object) theVector); + Handle(GEOM_Object) theVector); + + Standard_EXPORT Handle(GEOM_Object) GetShapesNearPoint (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint, + const Standard_Integer theShapeType, + const Standard_Real theTolerance); // Check blocks compounds Standard_EXPORT Standard_Boolean IsCompoundOfBlocks (Handle(GEOM_Object) theCompound, - const Standard_Integer theMinNbFaces, - const Standard_Integer theMaxNbFaces, - Standard_Integer& theNbBlocks); + const Standard_Integer theMinNbFaces, + const Standard_Integer theMaxNbFaces, + Standard_Integer& theNbBlocks); enum BCErrorType { NOT_BLOCK, @@ -118,13 +125,13 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { }; Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound, - std::list& theErrors); + std::list& theErrors); Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, - std::list& theErrors); + std::list& theErrors); Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, - const std::list& theErrors); + const std::list& theErrors); Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, const Standard_Integer theOptimumNbFaces = 6); @@ -132,9 +139,9 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) CheckAndImprove (Handle(GEOM_Object) theCompound); Standard_EXPORT static void AddBlocksFrom (const TopoDS_Shape& theShape, - TopTools_ListOfShape& BLO, - TopTools_ListOfShape& NOT, - TopTools_ListOfShape& EXT); + TopTools_ListOfShape& BLO, + TopTools_ListOfShape& NOT, + TopTools_ListOfShape& EXT); // Extract blocks from blocks compounds Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks @@ -143,7 +150,7 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { const Standard_Integer theMaxNbFaces); Standard_EXPORT Handle(GEOM_Object) GetBlockNearPoint (Handle(GEOM_Object) theCompound, - Handle(GEOM_Object) thePoint); + Handle(GEOM_Object) thePoint); Standard_EXPORT Handle(GEOM_Object) GetBlockByParts (Handle(GEOM_Object) theCompound, @@ -155,17 +162,17 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { // Operations on blocks with gluing of result Standard_EXPORT Handle(GEOM_Object) MakeMultiTransformation1D (Handle(GEOM_Object) theBlock, - const Standard_Integer theDirFace1, - const Standard_Integer theDirFace2, - const Standard_Integer theNbTimes); + const Standard_Integer theDirFace1, + const Standard_Integer theDirFace2, + const Standard_Integer theNbTimes); Standard_EXPORT Handle(GEOM_Object) MakeMultiTransformation2D (Handle(GEOM_Object) theBlock, - const Standard_Integer theDirFace1U, - const Standard_Integer theDirFace2U, - const Standard_Integer theNbTimesU, - const Standard_Integer theDirFace1V, - const Standard_Integer theDirFace2V, - const Standard_Integer theNbTimesV); + const Standard_Integer theDirFace1U, + const Standard_Integer theDirFace2U, + const Standard_Integer theNbTimesU, + const Standard_Integer theDirFace1V, + const Standard_Integer theDirFace2V, + const Standard_Integer theNbTimesV); // Build groups for Propagation of 1D hypotheses Standard_EXPORT Handle(TColStd_HSequenceOfTransient) Propagate (Handle(GEOM_Object) theShape); diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx index 0d7ce4435..cf81ed23c 100644 --- a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx @@ -18,7 +18,6 @@ // 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 diff --git a/src/GEOMImpl/GEOMImpl_IHealing.hxx b/src/GEOMImpl/GEOMImpl_IHealing.hxx index 07252ac76..5a9d26455 100755 --- a/src/GEOMImpl/GEOMImpl_IHealing.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealing.hxx @@ -19,9 +19,8 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// NOTE: This is an intreface to a function for the Healing creation. -//NOTE: This is an intreface to a function for the Healing creation. -// #include "GEOM_Function.hxx" #include @@ -76,7 +75,7 @@ public: void SetIndex( Standard_Integer val ) { _func->SetInteger(ARG_SUBSHAPE_INDEX, val); } Standard_Integer GetIndex() { return _func->GetInteger(ARG_SUBSHAPE_INDEX); } - + private: - Handle(GEOM_Function) _func; + Handle(GEOM_Function) _func; }; diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index d78c82d4e..e19acd19a 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifdef WNT #pragma warning( disable:4786 ) @@ -864,7 +863,6 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientation (Handle(GEOM_ return theObject; } - //============================================================================= /*! * ChangeOrientationCopy @@ -921,3 +919,62 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientationCopy (Handle(G SetErrorCode(OK); return aNewObject; } + +//============================================================================= +/*! + * LimitTolerance + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::LimitTolerance (Handle(GEOM_Object) theObject, + double theTolerance) +{ + // Set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) + return NULL; // There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + // Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), LIMIT_TOLERANCE); + + if (aFunction.IsNull()) + return NULL; + + // Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // Prepare "data container" class IHealing + GEOMImpl_IHealing HI (aFunction); + HI.SetOriginal(aLastFunction); + HI.SetTolerance(theTolerance); + + // Compute + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Healing driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + // Make a Python command + GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.LimitTolerance(" + << theObject << ", " << theTolerance << ")"; + + SetErrorCode(OK); + return aNewObject; +} diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index aafa9687d..064194fdd 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IHealingOperations_HXX_ #define _GEOMImpl_IHealingOperations_HXX_ @@ -39,9 +38,9 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { // Apply Shape Processing to the selected Object Standard_EXPORT Handle(GEOM_Object) ShapeProcess( Handle(GEOM_Object) theObject, - const Handle(TColStd_HArray1OfExtendedString)& theOperations, - const Handle(TColStd_HArray1OfExtendedString)& theParams, - const Handle(TColStd_HArray1OfExtendedString)& theValues ); + const Handle(TColStd_HArray1OfExtendedString)& theOperations, + const Handle(TColStd_HArray1OfExtendedString)& theParams, + const Handle(TColStd_HArray1OfExtendedString)& theValues ); // Retrieve default Shape Process parameters (from resource file) Standard_EXPORT void GetShapeProcessParameters( std::list& theOperations, @@ -49,12 +48,13 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { std::list& theValues ); // Retrieve default Shape Process parameters for given operator - Standard_EXPORT bool GetOperatorParameters( const std::string theOperation, + Standard_EXPORT bool GetOperatorParameters( const std::string theOperation, std::list& theParams, std::list& theValues ); // returns all parameters that are valid for the given operation (Shape Process operator) - Standard_EXPORT static bool GetParameters( const std::string theOperation, std::list& theParams ); + Standard_EXPORT static bool GetParameters( const std::string theOperation, + std::list& theParams ); Standard_EXPORT Handle(GEOM_Object) SuppressFaces( Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theFaces); @@ -68,25 +68,28 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) FillHoles( Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theWires); - + Standard_EXPORT Handle(GEOM_Object) Sew( Handle(GEOM_Object) theObject, double theTolerance ); Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject, - int theIndex, - double theValue, - bool isByParameter ); + int theIndex, + double theValue, + bool isByParameter ); // this function does not use Function-Driver mechanism, it just computes the free // boundary edges and returns them in the sequence. It is called just for information reasons // and it's not intended for history/undo/redo/etc.. - Standard_EXPORT bool GetFreeBoundary ( Handle(GEOM_Object) theObject, - Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, + Standard_EXPORT bool GetFreeBoundary ( Handle(GEOM_Object) theObject, + Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, Handle(TColStd_HSequenceOfTransient)& theOutOpenWires ); Standard_EXPORT Handle(GEOM_Object) ChangeOrientation( Handle(GEOM_Object) theObject); Standard_EXPORT Handle(GEOM_Object) ChangeOrientationCopy( Handle(GEOM_Object) theObject); + Standard_EXPORT Handle(GEOM_Object) LimitTolerance( Handle(GEOM_Object) theObject, + double theTolerance ); + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 520b13680..202a02f44 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -19,13 +19,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - // File : GEOMImpl_IShapesOperations.cxx // Created : // Author : modified by Lioka RAZAFINDRAZAKA (CEA) 22/06/2007 // Project : SALOME // $Header$ -// + #include #include "GEOMImpl_IShapesOperations.hxx" @@ -66,6 +65,7 @@ #include #include #include +#include #include #include @@ -803,6 +803,70 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeGlueFacesByList return aGlued; } +//============================================================================= +/*! + * GetExistingSubObjects + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetExistingSubObjects + (Handle(GEOM_Object) theShape, + const Standard_Boolean theGroupsOnly) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + Handle(GEOM_Function) aMainShape = theShape->GetLastFunction(); + if (aMainShape.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + SetErrorCode(NOT_FOUND_ANY); + + if (!aMainShape->HasSubShapeReferences()) return aSeq; + const TDataStd_ListOfExtendedString& aListEntries = aMainShape->GetSubShapeReferences(); + if (aListEntries.IsEmpty()) return aSeq; + + SetErrorCode(KO); + + TCollection_AsciiString anAsciiList; + + TDataStd_ListIteratorOfListOfExtendedString anIt (aListEntries); + for (; anIt.More(); anIt.Next()) { + TCollection_ExtendedString anEntry = anIt.Value(); + Standard_Integer aStrLen = anEntry.LengthOfCString(); + char* anEntryStr = new char[aStrLen]; + anEntry.ToUTF8CString(anEntryStr); + Handle(GEOM_Object) anObj = GetEngine()->GetObject(GetDocID(), anEntryStr, false); + if (!anObj.IsNull()) { + if (!theGroupsOnly || anObj->GetType() == GEOM_GROUP) { + aSeq->Append(anObj); + + // for python command + anAsciiList += anEntryStr; + anAsciiList += ","; + } + } + delete [] anEntryStr; + } + + if (aSeq->Length() == 0) { + SetErrorCode(NOT_FOUND_ANY); + return aSeq; + } + + //Make a Python command + anAsciiList.Trunc(anAsciiList.Length() - 1); + + GEOM::TPythonDump pd (aMainShape, /*append=*/true); + pd << "[" << anAsciiList.ToCString(); + pd << "] = geompy.GetExistingSubObjects("; + pd << theShape << ", " << (int)theGroupsOnly << ")"; + + SetErrorCode(OK); + + return aSeq; +} + //============================================================================= /*! * MakeExplode @@ -1941,9 +2005,31 @@ Handle(TColStd_HSequenceOfInteger) return aSeqOfIDs; } + // BEGIN: Mantis issue 0020961: Error on a pipe T-Shape + // Compute tolerance + Standard_Real T, VertMax = -RealLast(); + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + for (TopExp_Explorer ExV (theShape, TopAbs_VERTEX); ExV.More(); ExV.Next()) { + TopoDS_Vertex Vertex = TopoDS::Vertex(ExV.Current()); + T = BRep_Tool::Tolerance(Vertex); + if (T > VertMax) + VertMax = T; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return aSeqOfIDs; + } + // END: Mantis issue 0020961 + // Call algo GEOMAlgo_FinderShapeOn1 aFinder; - Standard_Real aTol = 0.0001; // default value + //Standard_Real aTol = 0.0001; // default value + Standard_Real aTol = VertMax; // Mantis issue 0020961 aFinder.SetShape(theShape); aFinder.SetTolerance(aTol); @@ -2576,7 +2662,7 @@ Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetShapesOnCylind aSeq = getShapesOnSurfaceIDs( aCylinder, aShape, aShapeType, theState ); // The GetShapesOnCylinder() doesn't change object so no new function is required. - Handle(GEOM_Function) aFunction = + Handle(GEOM_Function) aFunction = GEOM::GetCreatedLast(theShape, GEOM::GetCreatedLast(thePnt,theAxis))->GetLastFunction(); // Make a Python command diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index ee9a83b02..c776217c9 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -85,6 +85,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations std::list theFaces, const Standard_Boolean doKeepNonSolids); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetExistingSubObjects + (Handle(GEOM_Object) theShape, + const Standard_Boolean theGroupsOnly); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakeExplode (Handle(GEOM_Object) theShape, const Standard_Integer theShapeType, const Standard_Boolean isSorted); diff --git a/src/GEOMImpl/GEOMImpl_ImportDriver.cxx b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx index a4b0300f4..f28f5ea9d 100644 --- a/src/GEOMImpl/GEOMImpl_ImportDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx @@ -18,7 +18,6 @@ // 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 @@ -109,7 +108,7 @@ Standard_Integer GEOMImpl_ImportDriver::Execute(TFunction_Logbook& log) const // perform the import TCollection_AsciiString anError; - TopoDS_Shape aShape = fp( aFileName, aFormatName, anError, aFunction->GetEntry() ); + TopoDS_Shape aShape = fp(aFileName, aFormatName, anError, aFunction->GetNamingEntry()); // unload plugin library // commented by enk: @@ -159,7 +158,8 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_ImportDriver_Type_() //function : DownCast //purpose : //======================================================================= -const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast + (const Handle(Standard_Transient)& AnObject) { Handle(GEOMImpl_ImportDriver) _anOtherObject; @@ -169,5 +169,5 @@ const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast(cons } } - return _anOtherObject ; + return _anOtherObject; } diff --git a/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx index e6ff34fea..f6421fa40 100644 --- a/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx @@ -18,7 +18,6 @@ // 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 @@ -29,12 +28,12 @@ #include #include -//#include #include -#include #include +#include +//#include #include #include @@ -46,11 +45,14 @@ #include #include #include +#include #include +#include #include #include +#include #include #include #include @@ -117,6 +119,9 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const //sklNMTAlgo_Splitter1 PS; GEOMAlgo_Splitter PS; + TopTools_DataMapOfShapeShape aCopyMap; + TColStd_IndexedDataMapOfTransientTransient aMapTShapes; + if (aType == PARTITION_PARTITION || aType == PARTITION_NO_SELF_INTERSECTIONS) { Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); @@ -141,8 +146,27 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("In Partition a shape is null"); } // + //BRepBuilderAPI_Copy aCopyTool (aShape_i); + TopoDS_Shape aShape_i_copy; + TNaming_CopyShape::CopyTool(aShape_i, aMapTShapes, aShape_i_copy); + //if (aCopyTool.IsDone()) + // aShape_i_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aShape_i_inds; + TopTools_IndexedMapOfShape aShape_i_copy_inds; + TopExp::MapShapes(aShape_i, aShape_i_inds); + TopExp::MapShapes(aShape_i_copy, aShape_i_copy_inds); + Standard_Integer nbInds = aShape_i_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aShape_i_inds.FindKey(ie), aShape_i_copy_inds.FindKey(ie)); + } + // TopTools_ListOfShape aSimpleShapes; - PrepareShapes(aShape_i, aType, aSimpleShapes); + //PrepareShapes(aShape_i, aType, aSimpleShapes); + PrepareShapes(aShape_i_copy, aType, aSimpleShapes); TopTools_ListIteratorOfListOfShape aSimpleIter (aSimpleShapes); for (; aSimpleIter.More(); aSimpleIter.Next()) { const TopoDS_Shape& aSimpleSh = aSimpleIter.Value(); @@ -164,8 +188,27 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("In Partition a tool shape is null"); } // + //BRepBuilderAPI_Copy aCopyTool (aShape_i); + TopoDS_Shape aShape_i_copy; + TNaming_CopyShape::CopyTool(aShape_i, aMapTShapes, aShape_i_copy); + //if (aCopyTool.IsDone()) + // aShape_i_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aShape_i_inds; + TopTools_IndexedMapOfShape aShape_i_copy_inds; + TopExp::MapShapes(aShape_i, aShape_i_inds); + TopExp::MapShapes(aShape_i_copy, aShape_i_copy_inds); + Standard_Integer nbInds = aShape_i_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aShape_i_inds.FindKey(ie), aShape_i_copy_inds.FindKey(ie)); + } + // TopTools_ListOfShape aSimpleShapes; - PrepareShapes(aShape_i, aType, aSimpleShapes); + //PrepareShapes(aShape_i, aType, aSimpleShapes); + PrepareShapes(aShape_i_copy, aType, aSimpleShapes); TopTools_ListIteratorOfListOfShape aSimpleIter (aSimpleShapes); for (; aSimpleIter.More(); aSimpleIter.Next()) { const TopoDS_Shape& aSimpleSh = aSimpleIter.Value(); @@ -183,8 +226,27 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("In Partition a Keep Inside shape is null"); } // + //BRepBuilderAPI_Copy aCopyTool (aShape_i); + TopoDS_Shape aShape_i_copy; + TNaming_CopyShape::CopyTool(aShape_i, aMapTShapes, aShape_i_copy); + //if (aCopyTool.IsDone()) + // aShape_i_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aShape_i_inds; + TopTools_IndexedMapOfShape aShape_i_copy_inds; + TopExp::MapShapes(aShape_i, aShape_i_inds); + TopExp::MapShapes(aShape_i_copy, aShape_i_copy_inds); + Standard_Integer nbInds = aShape_i_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aShape_i_inds.FindKey(ie), aShape_i_copy_inds.FindKey(ie)); + } + // TopTools_ListOfShape aSimpleShapes; - PrepareShapes(aShape_i, aType, aSimpleShapes); + //PrepareShapes(aShape_i, aType, aSimpleShapes); + PrepareShapes(aShape_i_copy, aType, aSimpleShapes); TopTools_ListIteratorOfListOfShape aSimpleIter (aSimpleShapes); for (; aSimpleIter.More(); aSimpleIter.Next()) { const TopoDS_Shape& aSimpleSh = aSimpleIter.Value(); @@ -201,8 +263,27 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("In Partition a Remove Inside shape is null"); } // + //BRepBuilderAPI_Copy aCopyTool (aShape_i); + TopoDS_Shape aShape_i_copy; + TNaming_CopyShape::CopyTool(aShape_i, aMapTShapes, aShape_i_copy); + //if (aCopyTool.IsDone()) + // aShape_i_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aShape_i_inds; + TopTools_IndexedMapOfShape aShape_i_copy_inds; + TopExp::MapShapes(aShape_i, aShape_i_inds); + TopExp::MapShapes(aShape_i_copy, aShape_i_copy_inds); + Standard_Integer nbInds = aShape_i_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aShape_i_inds.FindKey(ie), aShape_i_copy_inds.FindKey(ie)); + } + // TopTools_ListOfShape aSimpleShapes; - PrepareShapes(aShape_i, aType, aSimpleShapes); + //PrepareShapes(aShape_i, aType, aSimpleShapes); + PrepareShapes(aShape_i_copy, aType, aSimpleShapes); TopTools_ListIteratorOfListOfShape aSimpleIter (aSimpleShapes); for (; aSimpleIter.More(); aSimpleIter.Next()) { const TopoDS_Shape& aSimpleSh = aSimpleIter.Value(); @@ -212,7 +293,7 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const } PS.SetLimitMode(aCI.GetKeepNonlimitShapes()); - PS.SetLimit( (TopAbs_ShapeEnum)aCI.GetLimit() ); + PS.SetLimit((TopAbs_ShapeEnum)aCI.GetLimit()); PS.Perform(); //skl PS.Compute(); @@ -245,11 +326,52 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("In Half Partition a shape or a plane is null"); } + TopoDS_Shape aShapeArg_copy; + TopoDS_Shape aPlaneArg_copy; + { + TNaming_CopyShape::CopyTool(aShapeArg, aMapTShapes, aShapeArg_copy); + //BRepBuilderAPI_Copy aCopyTool (aShapeArg); + //if (aCopyTool.IsDone()) + // aShapeArg_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aShapeArg_inds; + TopTools_IndexedMapOfShape aShapeArg_copy_inds; + TopExp::MapShapes(aShapeArg, aShapeArg_inds); + TopExp::MapShapes(aShapeArg_copy, aShapeArg_copy_inds); + Standard_Integer nbInds = aShapeArg_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aShapeArg_inds.FindKey(ie), aShapeArg_copy_inds.FindKey(ie)); + } + } + { + TNaming_CopyShape::CopyTool(aPlaneArg, aMapTShapes, aPlaneArg_copy); + //BRepBuilderAPI_Copy aCopyTool (aPlaneArg); + //if (aCopyTool.IsDone()) + // aPlaneArg_copy = aCopyTool.Shape(); + //else + // Standard_NullObject::Raise("Bad shape detected"); + // + // fill aCopyMap for history + TopTools_IndexedMapOfShape aPlaneArg_inds; + TopTools_IndexedMapOfShape aPlaneArg_copy_inds; + TopExp::MapShapes(aPlaneArg, aPlaneArg_inds); + TopExp::MapShapes(aPlaneArg_copy, aPlaneArg_copy_inds); + Standard_Integer nbInds = aPlaneArg_inds.Extent(); + for (Standard_Integer ie = 1; ie <= nbInds; ie++) { + aCopyMap.Bind(aPlaneArg_inds.FindKey(ie), aPlaneArg_copy_inds.FindKey(ie)); + } + } + // add object shapes that are in ListShapes; - PS.AddShape(aShapeArg); + PS.AddShape(aShapeArg_copy); + //PS.AddShape(aShapeArg); // add tool shapes that are in ListTools and not in ListShapes; - PS.AddTool(aPlaneArg); + PS.AddTool(aPlaneArg_copy); + //PS.AddTool(aPlaneArg); //skl PS.Compute(); PS.Perform(); @@ -293,6 +415,7 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const const TopTools_IndexedDataMapOfShapeListOfShape& aMR = PS.ImagesResult(); // history for all argument shapes + // be sure to use aCopyMap TDF_LabelSequence aLabelSeq; aFunction->GetDependency(aLabelSeq); Standard_Integer nbArg = aLabelSeq.Length(); @@ -314,6 +437,10 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) { TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie); + // be sure to use aCopyMap here + if (aCopyMap.IsBound(anEntity)) + anEntity = aCopyMap.Find(anEntity); + // if (!aMR.Contains(anEntity)) continue; const TopTools_ListOfShape& aModified = aMR.FindFromKey(anEntity); @@ -346,21 +473,17 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const //======================================================================= Standard_EXPORT Handle_Standard_Type& GEOMImpl_PartitionDriver_Type_() { - static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + if (aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + if (aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - + if (aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PartitionDriver", - sizeof(GEOMImpl_PartitionDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); + static Handle_Standard_Transient _Ancestors[] = {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = + new Standard_Type ("GEOMImpl_PartitionDriver", sizeof(GEOMImpl_PartitionDriver), + 1, (Standard_Address)_Ancestors, (Standard_Address)NULL); return _aType; } @@ -379,5 +502,5 @@ const Handle(GEOMImpl_PartitionDriver) Handle(GEOMImpl_PartitionDriver)::DownCas } } - return _anOtherObject ; + return _anOtherObject; } diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index b1d626427..d1dcbe274 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -269,6 +269,7 @@ #define SEWING 6 #define DIVIDE_EDGE 7 #define CHANGE_ORIENTATION 8 +#define LIMIT_TOLERANCE 9 #define BASIC_FILLING 1 diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index a01872173..3d183d976 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -334,9 +334,21 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpTransparency: // POPUP - TRANSPARENCY OnTransparency(); break; + case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY + OnChangeTransparency( true ); + break; + case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY + OnChangeTransparency( false ); + break; case GEOMOp::OpIsos: // POPUP - ISOS OnNbIsos(); break; + case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOLINES + OnNbIsos( INCR ); + break; + case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOLINES + OnNbIsos( DECR ); + break; case GEOMOp::OpAutoColor: // POPUP - AUTO COLOR OnAutoColor(); break; diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index ab7d404f3..09cdbd4e8 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -52,6 +52,8 @@ public: bool OnGUIEvent( int, SUIT_Desktop* ); virtual void deactivate(); + enum ActionType { SHOWDLG, INCR, DECR }; + private: // Import and export topology methods bool Import(); @@ -67,12 +69,15 @@ private: void OnDisableAutoColor(); void OnColor(); void OnTransparency(); - void OnNbIsos(); + void OnNbIsos( ActionType actionType = SHOWDLG ); void OnDeflection(); void OnSelectOnly(int mode); void OnShowHideChildren( bool ); void OnPointMarker(); + // Shortcut commands + void OnChangeTransparency( bool ); + // Recursive deletion of object with children void removeObjectWithChildren( _PTR(SObject), _PTR(Study), diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index fb05288a1..7706ab3c9 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -325,6 +325,7 @@ void GEOMToolsGUI::OnColor() for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { aView->SetColor( It.Value(), c ); } + GeometryGUI::Modified(); } } // if ( isVTK ) else if ( isOCC ) { @@ -382,6 +383,7 @@ void GEOMToolsGUI::OnColor() anObject->SetColor( aSColor ); anObject->SetAutoColor( false ); } + GeometryGUI::Modified(); } } // if c.isValid() } // first IO is not null @@ -399,7 +401,88 @@ void GEOMToolsGUI::OnTransparency() dlg.exec(); } -void GEOMToolsGUI::OnNbIsos() +void GEOMToolsGUI::OnChangeTransparency( bool increase ) +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) + return; + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( !aSelMgr ) + return; + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.IsEmpty() ) + return; + + Handle(SALOME_InteractiveObject) FirstIOS = selected.First(); + if ( FirstIOS.IsNull() ) + return; + + // Delta + float delta = 0.01; + if ( !increase ) + delta *= -1; + + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + if ( isVTK ) { + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) + return; + SVTK_View* aView = vtkVW->getView(); + + float transp = aView->GetTransparency(FirstIOS); + + // Compute new transparency value + transp = transp + delta; + if ( transp < 0 ) + transp = 0; + else if ( transp > 1 ) + transp = 1; + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + aView->SetTransparency( It.Value(), transp ); + } + aView->Repaint(); + GeometryGUI::Modified(); + } // if ( isVTK ) + + else if ( isOCC ) { + GEOMBase* gb = new GEOMBase(); + Standard_Boolean found; + Handle(GEOM_AISShape) aisShape; + + aisShape = gb->ConvertIOinGEOMAISShape( FirstIOS, found ); + if( !found ) + return; + float transp = aisShape->Transparency(); + + // Compute new transparency value + transp = transp + delta; + if ( transp < 0 ) + transp = 0; + else if ( transp > 1 ) + transp = 1; + + OCCViewer_Viewer* vm = dynamic_cast( window->getViewManager()->getViewModel() ); + if ( !vm ) + return; + Handle(AIS_InteractiveContext) ic = vm->getAISContext(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + aisShape = gb->ConvertIOinGEOMAISShape( It.Value(), found ); + if ( found ) { + ic->SetTransparency( aisShape, transp, false ); + ic->Redisplay( aisShape, Standard_False, Standard_True ); + } + } // for... + ic->UpdateCurrentViewer(); + GeometryGUI::Modified(); + } // if ( isOCC ) +} + +void GEOMToolsGUI::OnNbIsos( ActionType actionType ) { SUIT_ViewWindow* window = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); @@ -419,29 +502,47 @@ void GEOMToolsGUI::OnNbIsos() int UIso = CurDrawer->UIsoAspect()->Number(); int VIso = CurDrawer->VIsoAspect()->Number(); - GEOMToolsGUI_NbIsosDlg * NbIsosDlg = - new GEOMToolsGUI_NbIsosDlg( SUIT_Session::session()->activeApplication()->desktop() ); + int newNbUIso = -1; + int newNbVIso = -1; - NbIsosDlg->setU( UIso ); - NbIsosDlg->setV( VIso ); + if ( actionType == SHOWDLG ) { + GEOMToolsGUI_NbIsosDlg * NbIsosDlg = + new GEOMToolsGUI_NbIsosDlg( SUIT_Session::session()->activeApplication()->desktop() ); - if ( NbIsosDlg->exec() ) { - SUIT_OverrideCursor(); - for(; ic->MoreCurrent(); ic->NextCurrent()) { - CurObject = Handle(GEOM_AISShape)::DownCast(ic->Current()); - Handle(AIS_Drawer) CurDrawer = CurObject->Attributes(); + NbIsosDlg->setU( UIso ); + NbIsosDlg->setV( VIso ); - int nbUIso = NbIsosDlg->getU(); - int nbVIso = NbIsosDlg->getV(); - - CurDrawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , nbUIso) ); - CurDrawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , nbVIso) ); + if ( NbIsosDlg->exec() ) { + SUIT_OverrideCursor(); + + newNbUIso = NbIsosDlg->getU(); + newNbVIso = NbIsosDlg->getV(); + } + } + else if ( actionType == INCR || actionType == DECR ) { + int delta = 1; + if (actionType == DECR) + delta = -1; + + newNbUIso = UIso + delta; + newNbVIso = VIso + delta; + + if ( newNbUIso < 0 || newNbVIso < 0 || newNbUIso > 99 || newNbVIso > 99 ) + return; + } - ic->SetLocalAttributes(CurObject, CurDrawer); - ic->Redisplay(CurObject); - } + for(; ic->MoreCurrent(); ic->NextCurrent()) { + CurObject = Handle(GEOM_AISShape)::DownCast(ic->Current()); + Handle(AIS_Drawer) CurDrawer = CurObject->Attributes(); + + CurDrawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , newNbUIso) ); + CurDrawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , newNbVIso) ); + + ic->SetLocalAttributes(CurObject, CurDrawer); + ic->Redisplay(CurObject); } } + GeometryGUI::Modified(); } else if(isVTK){ // if is VTKViewer // @@ -492,27 +593,46 @@ void GEOMToolsGUI::OnNbIsos() anActor->GetNbIsos(UIso,VIso); else return; + + int newNbUIso = -1; + int newNbVIso = -1; - GEOMToolsGUI_NbIsosDlg* NbIsosDlg = - new GEOMToolsGUI_NbIsosDlg( SUIT_Session::session()->activeApplication()->desktop() ); + if ( actionType == SHOWDLG ) { + GEOMToolsGUI_NbIsosDlg* NbIsosDlg = + new GEOMToolsGUI_NbIsosDlg( SUIT_Session::session()->activeApplication()->desktop() ); - NbIsosDlg->setU( UIso ); - NbIsosDlg->setV( VIso ); + NbIsosDlg->setU( UIso ); + NbIsosDlg->setV( VIso ); - if ( NbIsosDlg->exec() ) { - SUIT_OverrideCursor(); + if ( NbIsosDlg->exec() ) { + SUIT_OverrideCursor(); - while( anAct!=NULL ) { - if(GEOM_Actor* anActor = GEOM_Actor::SafeDownCast(anAct)){ - // There are no casting to needed actor. - UIso = NbIsosDlg->getU(); - VIso = NbIsosDlg->getV(); - int aIsos[2]={UIso,VIso}; - anActor->SetNbIsos(aIsos); - } - anAct = aCollection->GetNextActor(); + newNbUIso = NbIsosDlg->getU(); + newNbVIso = NbIsosDlg->getV(); + } + } + else if ( actionType == INCR || actionType == DECR ) { + int delta = 1; + if (actionType == DECR) + delta = -1; + + newNbUIso = UIso + delta; + newNbVIso = VIso + delta; + + if ( newNbUIso < 0 || newNbVIso < 0 || newNbUIso > 99 || newNbVIso > 99 ) + return; + } + + while( anAct!=NULL ) { + if(GEOM_Actor* anActor = GEOM_Actor::SafeDownCast(anAct)){ + // There are no casting to needed actor. + int aIsos[2]={newNbUIso,newNbVIso}; + anActor->SetNbIsos(aIsos); } + anAct = aCollection->GetNextActor(); } + view->Repaint(); + GeometryGUI::Modified(); } // end vtkviewer } @@ -559,6 +679,7 @@ void GEOMToolsGUI::OnDeflection() } } } + GeometryGUI::Modified(); } else if (isVTK) { // if is VTKViewer SalomeApp_Application* app = dynamic_cast @@ -623,6 +744,7 @@ void GEOMToolsGUI::OnDeflection() anAct = aCollection->GetNextActor(); } } + GeometryGUI::Modified(); } // end vtkviewer } diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx index 5856aa4e6..33940d0a0 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx @@ -269,6 +269,7 @@ void GEOMToolsGUI_TransparencyDlg::SetTransparency() for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { aView->SetTransparency( It.Value(), newValue ); } + GeometryGUI::Modified(); aView->Repaint(); } // if ( isVTK ) @@ -300,6 +301,7 @@ void GEOMToolsGUI_TransparencyDlg::SetTransparency() } } // for... ic->UpdateCurrentViewer(); + GeometryGUI::Modified(); } // if ( isOCC ) ValueHasChanged(); diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 9c7ce2cea..a0e18d411 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -276,7 +276,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, //if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag()); //else aShapeName = TCollection_AsciiString(CORBA::string_dup(theName)); - // try to find existed name for current shape + // BEGIN: try to find existed name for current shape bool HasName = false; // recieve current TopoDS shape CORBA::String_var entry = aShape->GetEntry(); @@ -289,24 +289,28 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, } entry = aMainSh->GetEntry(); Handle(GEOM_Object) anObj = _impl->GetObject(aMainSh->GetStudyID(), entry); - TDF_Label aMainLbl = anObj->GetEntry(); + TDF_Label aMainLbl = anObj->GetFunction(1)->GetNamingEntry(); + // check all named shapes using iterator - TDF_ChildIDIterator anIt(aMainLbl, TNaming_NamedShape::GetID(), Standard_True); - for(; anIt.More(); anIt.Next()) { + TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True); + + for (; anIt.More() && !HasName; anIt.Next()) { Handle(TNaming_NamedShape) anAttr = Handle(TNaming_NamedShape)::DownCast(anIt.Value()); - if(anAttr.IsNull()) continue; + if (anAttr.IsNull()) continue; TopoDS_Shape S = anAttr->Get(); - if( !S.IsEqual(TopoSh) ) continue; - TDF_Label L = anAttr->Label(); - Handle(TDataStd_Name) aName; - if(L.FindAttribute(TDataStd_Name::GetID(),aName)) { - aShapeName = aName->Get(); - HasName = true; + if (S.IsEqual(TopoSh)) { + TDF_Label L = anAttr->Label(); + Handle(TDataStd_Name) aName; + if (L.FindAttribute(TDataStd_Name::GetID(), aName)) { + aShapeName = aName->Get(); + HasName = true; + } } } + // END: try to find existed name for current shape - if(!HasName) { + if (!HasName) { // asv : 11.11.04 Introducing a more sofisticated method of name creation, just as // it is done in GUI in GEOMBase::GetDefaultName() - not just add a Tag() == number // of objects in the study, but compute a number of objects with the same prefix diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc index d5435c5d1..f765856d0 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -269,6 +269,34 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetPoint (GEOM::GEOM_Object_ptr return GetObject(anObject); } +//============================================================================= +/*! + * GetVertexNearPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetVertexNearPoint + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the reference Objects + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint); + if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn(); + + // Create the Point + Handle(GEOM_Object) anObject = + GetOperations()->GetVertexNearPoint(aShape, aPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * GetEdge @@ -481,6 +509,37 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByNormale (GEOM::GEOM_Obj return GetObject(anObject); } +//============================================================================= +/*! + * GetShapesNearPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetShapesNearPoint + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Long theShapeType, + CORBA::Double theTolerance) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the reference Objects + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint); + + if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn(); + + // Create the Shape + Handle(GEOM_Object) anObject = + GetOperations()->GetShapesNearPoint(aShape, aPoint, theShapeType, theTolerance); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * ExplodeCompoundOfBlocks diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index 68904892c..8fa1e1de7 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -75,6 +75,9 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : CORBA::Double theZ, CORBA::Double theEpsilon); + GEOM::GEOM_Object_ptr GetVertexNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr GetEdge (GEOM::GEOM_Object_ptr theShape, GEOM::GEOM_Object_ptr thePoint1, GEOM::GEOM_Object_ptr thePoint2); @@ -101,10 +104,15 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : GEOM::GEOM_Object_ptr GetFaceByNormale (GEOM::GEOM_Object_ptr theBlock, GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr GetShapesNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Long theShapeType, + CORBA::Double theTolerance); + // Check blocks compound CORBA::Boolean IsCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, - CORBA::Long theMinNbFaces, - CORBA::Long theMaxNbFaces, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces, CORBA::Long& theNbBlocks); CORBA::Boolean CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc index 81dac09c3..39df78fe1 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.cc +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -18,7 +18,6 @@ // 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 @@ -493,3 +492,30 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ChangeOrientationCopy (GEOM::GE return GetObject(aNewObject); } + +//============================================================================= +/*! + * LimitTolerance + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::LimitTolerance (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->LimitTolerance(anObject, theTolerance); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.hh b/src/GEOM_I/GEOM_IHealingOperations_i.hh index be42fbd55..01b3f48fc 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.hh +++ b/src/GEOM_I/GEOM_IHealingOperations_i.hh @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _GEOM_IHealingOperations_i_HeaderFile #define _GEOM_IHealingOperations_i_HeaderFile @@ -36,42 +36,65 @@ #include #include -class GEOM_I_EXPORT GEOM_IHealingOperations_i : +class GEOM_I_EXPORT GEOM_IHealingOperations_i : public virtual POA_GEOM::GEOM_IHealingOperations, public virtual GEOM_IOperations_i { public: - GEOM_IHealingOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOMImpl_IHealingOperations* theImpl); + GEOM_IHealingOperations_i(PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IHealingOperations* theImpl); ~GEOM_IHealingOperations_i(); - - GEOM::GEOM_Object_ptr ProcessShape(GEOM::GEOM_Object_ptr theObject, const GEOM::string_array& theOperations, const GEOM::string_array& theParams, const GEOM::string_array& theValues); - void GetShapeProcessParameters(GEOM::string_array_out theOperations, GEOM::string_array_out theParams, GEOM::string_array_out theValues); + GEOM::GEOM_Object_ptr ProcessShape(GEOM::GEOM_Object_ptr theObject, + const GEOM::string_array& theOperations, + const GEOM::string_array& theParams, + const GEOM::string_array& theValues); + + void GetShapeProcessParameters(GEOM::string_array_out theOperations, + GEOM::string_array_out theParams, + GEOM::string_array_out theValues); - void GetOperatorParameters (const char* theOperator, GEOM::string_array_out theParams, GEOM::string_array_out theValues); + void GetOperatorParameters (const char* theOperator, + GEOM::string_array_out theParams, + GEOM::string_array_out theValues); - GEOM::GEOM_Object_ptr SuppressFaces(GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theFaces); + GEOM::GEOM_Object_ptr SuppressFaces(GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theFaces); - GEOM::GEOM_Object_ptr CloseContour (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires, CORBA::Boolean isCommonVertex); + GEOM::GEOM_Object_ptr CloseContour (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires, + CORBA::Boolean isCommonVertex); - GEOM::GEOM_Object_ptr RemoveIntWires (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires); - - GEOM::GEOM_Object_ptr FillHoles (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires); + GEOM::GEOM_Object_ptr RemoveIntWires (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires); - GEOM::GEOM_Object_ptr Sew (GEOM::GEOM_Object_ptr theObject, CORBA::Double theTolerance); + GEOM::GEOM_Object_ptr FillHoles (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires); - GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, CORBA::Short theIndex, CORBA::Double theValue, CORBA::Boolean isByParameter); + GEOM::GEOM_Object_ptr Sew (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance); + + GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, + CORBA::Short theIndex, + CORBA::Double theValue, + CORBA::Boolean isByParameter); + + CORBA::Boolean GetFreeBoundary(GEOM::GEOM_Object_ptr theObject, + GEOM::ListOfGO_out theClosedWires, + GEOM::ListOfGO_out theOpenWires ); - CORBA::Boolean GetFreeBoundary(GEOM::GEOM_Object_ptr theObject, GEOM::ListOfGO_out theClosedWires, GEOM::ListOfGO_out theOpenWires ); - GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theObject); GEOM::GEOM_Object_ptr ChangeOrientationCopy (GEOM::GEOM_Object_ptr theObject); + GEOM::GEOM_Object_ptr LimitTolerance (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance); + ::GEOMImpl_IHealingOperations* GetOperations() { return (::GEOMImpl_IHealingOperations*)GetImpl(); } private: - Handle(TColStd_HArray1OfExtendedString) Convert( const GEOM::string_array& ); - Handle(TColStd_HArray1OfInteger) Convert( const GEOM::short_array& ); + Handle(TColStd_HArray1OfExtendedString) Convert( const GEOM::string_array& ); + Handle(TColStd_HArray1OfInteger) Convert( const GEOM::short_array& ); }; diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index 38238921e..f6ff7d0e2 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -18,7 +18,6 @@ // 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 @@ -411,6 +410,31 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFacesByList return GetObject(anObject); } +//============================================================================= +/*! + * GetExistingSubObjects + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetExistingSubObjects (GEOM::GEOM_Object_ptr theShape, + CORBA::Boolean theGroupsOnly) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + if (aShape.IsNull()) return aSeq._retn(); + + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetExistingSubObjects(aShape, theGroupsOnly); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index 5ae1ed2f0..fdc3e4ba0 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IShapesOperations_i_HeaderFile #define _GEOM_IShapesOperations_i_HeaderFile @@ -39,21 +38,21 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : { public: GEOM_IShapesOperations_i (PortableServer::POA_ptr thePOA, - GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IShapesOperations* theImpl); + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IShapesOperations* theImpl); ~GEOM_IShapesOperations_i(); GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr thePnt2); GEOM::GEOM_Object_ptr MakeWire (const GEOM::ListOfGO& theEdgesAndWires, const CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, - CORBA::Boolean isPlanarWanted); + CORBA::Boolean isPlanarWanted); GEOM::GEOM_Object_ptr MakeFaceWires (const GEOM::ListOfGO& theWires, - CORBA::Boolean isPlanarWanted); + CORBA::Boolean isPlanarWanted); GEOM::GEOM_Object_ptr MakeShell (const GEOM::ListOfGO& theFacesAndShells); @@ -64,34 +63,36 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeCompound (const GEOM::ListOfGO& theShapes); GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, + CORBA::Double theTolerance, CORBA::Boolean doKeepNonSolids); GEOM::ListOfGO* GetGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance); + CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeGlueFacesByList (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - const GEOM::ListOfGO& theFaces, - CORBA::Boolean doKeepNonSolids); + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces, + CORBA::Boolean doKeepNonSolids); + GEOM::ListOfGO* GetExistingSubObjects (GEOM::GEOM_Object_ptr theShape, + CORBA::Boolean theGroupsOnly); GEOM::ListOfGO* MakeExplode (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - CORBA::Boolean isSorted); + CORBA::Long theShapeType, + CORBA::Boolean isSorted); GEOM::ListOfLong* SubShapeAllIDs (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - CORBA::Boolean isSorted); + CORBA::Long theShapeType, + CORBA::Boolean isSorted); GEOM::GEOM_Object_ptr GetSubShape (GEOM::GEOM_Object_ptr theMainShape, - CORBA::Long theID); + CORBA::Long theID); CORBA::Long GetSubShapeIndex (GEOM::GEOM_Object_ptr theMainShape, - GEOM::GEOM_Object_ptr theSubShape); + GEOM::GEOM_Object_ptr theSubShape); CORBA::Long GetTopologyIndex (GEOM::GEOM_Object_ptr theMainShape, - GEOM::GEOM_Object_ptr theSubShape); + GEOM::GEOM_Object_ptr theSubShape); char* GetShapeTypeString (GEOM::GEOM_Object_ptr theShape); @@ -105,25 +106,25 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::ListOfLong* GetFreeFacesIDs (GEOM::GEOM_Object_ptr theShape); GEOM::ListOfGO* GetSharedShapes (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2, - CORBA::Long theShapeType); + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theShapeType); GEOM::ListOfGO* GetShapesOnPlane (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAx1, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnPlaneWithLocation(GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAx1, - GEOM::GEOM_Object_ptr thePnt, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::GEOM_Object_ptr thePnt, + GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnCylinder (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theRadius, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnCylinderWithLocation (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, @@ -133,10 +134,10 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnSphere (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theCenter, - CORBA::Double theRadius, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + CORBA::Double theRadius, + GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnQuadrangle (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, @@ -147,21 +148,21 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnPlaneIDs (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAx1, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnPlaneWithLocationIDs (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAx1, - GEOM::GEOM_Object_ptr thePnt, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::GEOM_Object_ptr thePnt, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnCylinderIDs (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theRadius, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnCylinderWithLocationIDs (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, @@ -171,10 +172,10 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnSphereIDs (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::GEOM_Object_ptr theCenter, - CORBA::Double theRadius, - GEOM::shape_state theState); + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + CORBA::Double theRadius, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnQuadrangleIDs (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, @@ -185,39 +186,39 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnBox (GEOM::GEOM_Object_ptr theBox, - GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnBoxIDs (GEOM::GEOM_Object_ptr theBox, - GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::shape_state theState); GEOM::ListOfGO* GetShapesOnShape (GEOM::GEOM_Object_ptr theSheckShape, - GEOM::GEOM_Object_ptr theShape, - CORBA::Short theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::shape_state theState); GEOM::GEOM_Object_ptr GetShapesOnShapeAsCompound (GEOM::GEOM_Object_ptr theSheckShape, - GEOM::GEOM_Object_ptr theShape, - CORBA::Short theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::shape_state theState); GEOM::ListOfLong* GetShapesOnShapeIDs (GEOM::GEOM_Object_ptr theCheckShape, - GEOM::GEOM_Object_ptr theShape, - CORBA::Short theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::shape_state theState); GEOM::GEOM_Object_ptr GetInPlace (GEOM::GEOM_Object_ptr theShapeWhere, - GEOM::GEOM_Object_ptr theShapeWhat); + GEOM::GEOM_Object_ptr theShapeWhat); GEOM::GEOM_Object_ptr GetInPlaceByHistory (GEOM::GEOM_Object_ptr theShapeWhere, - GEOM::GEOM_Object_ptr theShapeWhat); + GEOM::GEOM_Object_ptr theShapeWhat); GEOM::GEOM_Object_ptr GetSame (GEOM::GEOM_Object_ptr theShapeWhere, - GEOM::GEOM_Object_ptr theShapeWhat); + GEOM::GEOM_Object_ptr theShapeWhat); ::GEOMImpl_IShapesOperations* GetOperations() { return (::GEOMImpl_IShapesOperations*)GetImpl(); } diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc index f091c990f..0adae0632 100644 --- a/src/GEOM_I/GEOM_Object_i.cc +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -65,7 +65,7 @@ GEOM_Object_i::GEOM_Object_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr GEOM_Object_i::~GEOM_Object_i() { - //MESSAGE("GEOM_Object_i::~GEOM_Object_i"); + MESSAGE("GEOM_Object_i::~GEOM_Object_i"); GEOM_Engine::GetEngine()->RemoveObject(_impl); } @@ -372,16 +372,13 @@ SALOMEDS::TMPFile* GEOM_Object_i::GetShapeStream() BRepTools::Write(aShape, streamShape); //Returns the number of bytes that have been stored in the stream's buffer. int size = streamShape.str().size(); - char* buf = new char [size]; - //Get pointer on internal character array in ostrstream - const char* valueOfStream = streamShape.str().c_str(); - //Create copy of ostrstream content - memcpy(buf, valueOfStream, size); - - CORBA::Octet* OctetBuf = (CORBA::Octet*)buf; + //Allocate octect buffer of required size + CORBA::Octet* OctetBuf = SALOMEDS::TMPFile::allocbuf(size); + //Copy ostrstream content to the octect buffer + memcpy(OctetBuf, streamShape.str().c_str(), size); + //Create and return TMPFile SALOMEDS::TMPFile_var SeqFile = new SALOMEDS::TMPFile(size,size,OctetBuf,1); return SeqFile._retn(); - } diff --git a/src/GEOM_PY/Makefile.am b/src/GEOM_PY/Makefile.am new file mode 100644 index 000000000..a3b6695e7 --- /dev/null +++ b/src/GEOM_PY/Makefile.am @@ -0,0 +1,27 @@ +# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# +# 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 + +SUBDIRS= structelem + +salomepypkgdir = $(salomepythondir)/salome/geom +salomepypkg_PYTHON = \ + __init__.py \ + geomtools.py diff --git a/src/GEOM_PY/__init__.py b/src/GEOM_PY/__init__.py new file mode 100644 index 000000000..5d3edfa55 --- /dev/null +++ b/src/GEOM_PY/__init__.py @@ -0,0 +1 @@ +# -*- coding: iso-8859-1 -*- diff --git a/src/GEOM_PY/geomtools.py b/src/GEOM_PY/geomtools.py new file mode 100644 index 000000000..9693525f8 --- /dev/null +++ b/src/GEOM_PY/geomtools.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007-2009 EDF R&D +# +# This file is part of PAL_SRC. +# +# PAL_SRC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PAL_SRC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with PAL_SRC; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +""" +This module provides tools to facilitate the use of geom engine and geom +objects in Salome. +""" + +import salome +GEOM = None # GEOM module is loaded only when needed + +from salome.kernel.logger import Logger +from salome.kernel import termcolor +logger = Logger("salome.geom.geomtools", color = termcolor.RED) + +from salome.kernel.studyedit import getActiveStudyId, getStudyEditor + +_geompys = {} + +def getGeompy(studyId = None): + """ + Return an object behaving exactly like geompy module, except that it is + associated with the study `studyId`. If `studyId` is :const:`None`, return + a pseudo geompy object for the current study. + """ + # We can't use geompy module because it initializes GEOM with + # salome.myStudy, which may not exist. So we use this trick to create + # a pseudo geompy module. + salome.salome_init() + if studyId is None: + studyId = getActiveStudyId() + if not _geompys.has_key(studyId): + import geompyDC + _geompys[studyId] = salome.lcc.FindOrLoadComponent("FactoryServer", + "GEOM") + _geompys[studyId].ShapeType = geompyDC.ShapeType + _geompys[studyId].GEOM = geompyDC.GEOM + _geompys[studyId].kind = geompyDC.kind + _geompys[studyId].info = geompyDC.info + _geompys[studyId].PackData = geompyDC.PackData + _geompys[studyId].ReadTexture = geompyDC.ReadTexture + study = salome.myStudyManager.GetStudyByID(studyId) + _geompys[studyId].init_geom(study) + return _geompys[studyId] + + +class GeomStudyTools: + """ + This class provides several methods to manipulate geom objects in Salome + study. The parameter `studyEditor` defines a + :class:`~salome.kernel.studyedit.StudyEditor` object used to access the study. If + :const:`None`, the method returns a :class:`~salome.kernel.studyedit.StudyEditor` + object on the current study. + + .. attribute:: editor + + This instance attribute contains the underlying + :class:`~salome.kernel.studyedit.StudyEditor` object. It can be used to access + the study but the attribute itself should not be modified. + + """ + + def __init__(self, studyEditor = None): + global GEOM + if GEOM is None: + GEOM = __import__("GEOM") + if studyEditor is None: + studyEditor = getStudyEditor() + self.editor = studyEditor + + def displayShapeByName(self, shapeName, color = None): + """ + Display the geometrical shape whose name in the study is `shapeName`. + + :type shapeName: string + :param shapeName: name of the geometrical shape + + :type color: tuple (triplet) + :param color: RGB components of the color of the shape + + :return: True if the shape was found, False otherwise + """ + logger.debug("displayShapeByName in PAL: %s with color %s" % + (shapeName, color)) + listSO = self.editor.study.FindObjectByName(shapeName, "GEOM") + for sObj in listSO: + entry = sObj.GetID() + geomObj = self.editor.getOrLoadObject(sObj) + if geomObj: + shape = geomObj._narrow(GEOM.GEOM_Object) + if shape: + geomgui = salome.ImportComponentGUI("GEOM") + geomgui.createAndDisplayGO(entry) + geomgui.setDisplayMode(entry, 1) + if color is not None: + geomgui.setColor(entry, color[0], color[1], color[2]) + return True + return False diff --git a/src/GEOM_PY/structelem/Makefile.am b/src/GEOM_PY/structelem/Makefile.am new file mode 100644 index 000000000..cea34db04 --- /dev/null +++ b/src/GEOM_PY/structelem/Makefile.am @@ -0,0 +1,26 @@ +# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# +# 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 + +salomepypkgdir = $(salomepythondir)/salome/geom/structelem +salomepypkg_PYTHON = \ + __init__.py \ + parts.py \ + orientation.py diff --git a/src/GEOM_PY/structelem/__init__.py b/src/GEOM_PY/structelem/__init__.py new file mode 100644 index 000000000..e713832a5 --- /dev/null +++ b/src/GEOM_PY/structelem/__init__.py @@ -0,0 +1,486 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007-2009 EDF R&D +# +# This file is part of PAL_SRC. +# +# PAL_SRC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PAL_SRC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with PAL_SRC; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +""" +This package is used to create and visualize structural elements. It contains +three modules: + +* This module :mod:`salome.geom.structelem` defines the main classes + :class:`StructuralElement` and :class:`StructuralElementManager` that can be + directly used to build structural elements. +* The module :mod:`salome.geom.structelem.parts` defines the classes corresponding to + the different parts (beams, grids, etc.) that make up a structural element. + It is used to build the geometric shapes in the structural element. +* The module :mod:`salome.geom.structelem.orientation` defines the classes that are + used to compute the orientation of the structural element parts and to build + the corresponding markers. + +A structural element is a set of geometric shapes (beams, grids, etc.) that +are built semi-automatically along a set of geometric primitives (edges for +instance). They are visualized with the same color as their base primitives in +the geom viewer. + +Structural elements are generally created by the +:class:`StructuralElementManager` class, from a list of commands describing +the element to create. + +Example:: + + commandList = [('VisuPoutreGenerale', {'Group_Maille': 'Edge_1'}), + ('VisuBarreCercle', + {'R': 30, 'Group_Maille': 'Edge_1', 'EP': 15}), + ] + + structElemManager = StructuralElementManager() + elem = structElemManager.createElement(commandList) + elem.display() + salome.sg.updateObjBrowser(True) + +""" + +import types + +import salome + +from salome.kernel.logger import Logger +from salome.kernel import termcolor +logger = Logger("salome.geom.structelem", color = termcolor.RED) +from salome.kernel.studyedit import getStudyEditor + +__all__ = ["parts", "orientation"] + +from salome.geom.structelem import parts +from salome.geom.structelem.parts import InvalidParameterError + +class StructuralElementManager: + """ + This class manages the structural elements in the study. It is used to + create a new structural element from a list of commands. The parameter + `studyId` defines the ID of the study in which the manager will create + structural elements. If it is :const:`None` or not specified, it will use + the ID of the current study as defined by + :func:`salome.kernel.studyedit.getActiveStudyId` function. + """ + def __init__(self, studyId = None): + self._studyEditor = getStudyEditor(studyId) + + def createElement(self, commandList): + """ + Create a structural element from the list of commands `commandList`. + Each command in this list represent a part of the structural element, + that is a specific kind of shape (circular beam, grid, etc.) + associated with one or several geometrical primitives. A command must + be a tuple. The first element is the structural element part class + name or alias name. The second element is a dictionary containing the + parameters describing the part. Valid class names are all the classes + defined in the module :mod:`~salome.geom.structelem.parts` and inheriting + class :class:`~parts.StructuralElementPart`. There are also several + aliases for backward compatibility. Here is the complete list: + + * :class:`~parts.GeneralBeam` + * :class:`~parts.CircularBeam` + * :class:`~parts.RectangularBeam` + * :class:`~parts.ThickShell` + * :class:`~parts.Grid` + + * :func:`~parts.VisuPoutreGenerale` (alias for + :class:`~parts.GeneralBeam`) + * :func:`~parts.VisuPoutreCercle` (alias for + :class:`~parts.CircularBeam`) + * :func:`~parts.VisuPoutreRectangle` (alias for + :class:`~parts.RectangularBeam`) + * :func:`~parts.VisuBarreGenerale` (alias for + :class:`~parts.GeneralBeam`) + * :func:`~parts.VisuBarreRectangle` (alias for + :class:`~parts.RectangularBeam`) + * :func:`~parts.VisuBarreCercle` (alias for + :class:`~parts.CircularBeam`) + * :func:`~parts.VisuCable` (alias for :class:`~parts.CircularBeam`) + * :func:`~parts.VisuCoque` (alias for :class:`~parts.ThickShell`) + * :func:`~parts.VisuGrille` (alias for :class:`~parts.Grid`) + + * ``Orientation``: This identifier is used to specify the orientation + of one or several 1D structural element parts (i.e. beams). The + parameters are described in class + :class:`~orientation.Orientation1D`. + + The valid parameters in the dictionary depend on the type of the + structural element part, and are detailed in the documentation of + the corresponding class. The only parameter that is common to all the + classes is "MeshGroups" (that can also be named "Group_Maille"). It + defines the name of the geometrical object(s) in the study that will + be used as primitives to build the structural element part. This + parameter can be either a list of strings or a single string with + comma separated names. + """ + logger.debug("StructuralElementManager.createElement: START") + logger.debug("Command list: %s" % commandList) + + element = StructuralElement(self._studyEditor.studyId) + orientationCmdList = [] + for command in commandList: + (parttype, parameters) = command + if parttype == "Orientation": + orientationCmdList += [command] + elif parttype not in dir(parts): + logger.warning('Invalid structural element part name "%s"' + ' in command %s, this command will be ' + 'ignored.' % (parttype, command)) + else: + (meshGroupList, newparams) = self._extractMeshGroups(command) + for meshGroup in meshGroupList: + # Get the geometrical primitive object + groupSObj = self._studyEditor.study.FindObject(meshGroup) + groupGeomObj = None + if groupSObj is not None: + groupGeomObj = \ + self._studyEditor.getOrLoadObject(groupSObj) + if groupGeomObj is None: + logger.error("Can't get geom object corresponding to " + 'mesh group "%s", structural element ' + "part %s will not be built." % + (groupName, part)) + continue + + # Create the part + try: + part = parts.__dict__[parttype]( + self._studyEditor.studyId, meshGroup, + groupGeomObj, newparams) + element.addPart(part) + except InvalidParameterError, e: + logger.error("Invalid parameter error: %s" % e) + raise + except: + logger.exception("Can't create structural element" + " part with command %s." % + str(command)) + + # Orientations are parsed after the parts because they must be + # associated with existing parts. + for command in orientationCmdList: + (parttype, parameters) = command + (meshGroupList, orientParams) = self._extractMeshGroups(command) + for meshGroup in meshGroupList: + element.addOrientation(meshGroup, orientParams) + + element.build() + logger.debug("StructuralElementManager.createElement: END") + return element + + def _extractMeshGroups(self, command): + """ + This method extracts the names of the mesh groups (i.e. the + geometrical objects used to build the structural element part) in the + command in parameter. It returns a tuple containing the mesh groups as + a list of strings and the other parameters of the command as a new + dictionary. + """ + (parttype, parameters) = command + newparams = parameters.copy() + groupMailleParam = newparams.pop("Group_Maille", None) + meshGroupParam = newparams.pop("MeshGroups", None) + if groupMailleParam is None and meshGroupParam is None: + logger.warning("No mesh group specified in command %s, this " + "command will be ignored." % command) + return ([], newparams) + elif groupMailleParam is not None and meshGroupParam is not None: + logger.warning('Both "MeshGroups" and "Group_Maille" specified in' + ' command %s, only "MeshGroups" will be used.' % + command) + elif groupMailleParam is not None and meshGroupParam is None: + meshGroupParam = groupMailleParam + + meshGroupList = [] + if type(meshGroupParam) == types.StringType: + meshGroupList = self._getMeshGroupListFromString(meshGroupParam) + else: + for item in meshGroupParam: + meshGroupList += self._getMeshGroupListFromString(item) + + if len(meshGroupList) == 0: + logger.warning("Mesh group list is empty in command %s, this " + "command will be ignored." % command) + + return (meshGroupList, newparams) + + def _getMeshGroupListFromString(self, meshString): + """ + This method splits the string in parameter to extract comma separated + names. Those names are returned as a list of strings. + """ + meshGroupList = [] + list = meshString.split(",") + for item in list: + strippedItem = item.strip() + if len(strippedItem) > 0: + meshGroupList.append(strippedItem) + return meshGroupList + + +class StructuralElement: + """ + This class represents a structural element, i.e. a set of geometrical + objects built along geometrical primitives. The parameter `studyId` + defines the ID of the study that will contain the structural element. If + it is :const:`None` or not specified, the constructor will use the ID of + the active study as defined by :func:`salome.kernel.studyedit.getActiveStudyId` + function. Structural elements are normally created by the class + :class:`StructuralElementManager`, so this class should not be + instantiated directly in the general case. + """ + _counter = 1 + _mainFolderTag = 14725 + + def __init__(self, studyId = None): + # _parts is the dictionary mapping group name to structural element + # part. _shapeDict is the dictionary mapping SubShapeID objects to + # structural element parts. Both are used to avoid duplicate shapes + # in structural elements. + self._parts = {} + self._shapeDict = {} + self._id = StructuralElement._counter + StructuralElement._counter += 1 + self._studyEditor = getStudyEditor(studyId) + logger.debug("Creating structural element in study %s" % + self._studyEditor.studyId) + self._SObject = None + + def _getSObject(self): + """ + Find or create the study object corresponding to the structural + element. This object is named "SE_N" where N is a numerical ID. + """ + if self._SObject is None: + geomComponent = self._studyEditor.study.FindComponent("GEOM") + mainFolder = self._studyEditor.setItemAtTag(geomComponent, + StructuralElement._mainFolderTag, + name = "Structural Elements") + self._SObject = self._studyEditor.findOrCreateItem(mainFolder, + name = "SE_" + str(self._id)) + return self._SObject + + def addPart(self, newpart): + """ + Add a part to the structural element. + + :type newpart: :class:`~parts.StructuralElementPart` + :param newpart: the part to add to the structural element. + + """ + newshapes = newpart.baseShapesSet + + # Check duplicate groups + if self._parts.has_key(newpart.groupName): + logger.warning('Mesh group "%s" is used several times in the ' + 'structural element. Only the last definition ' + 'will be used.' % newpart.groupName) + else: + # Check duplicate shapes + intersect = newshapes.intersection(self._shapeDict.keys()) + while len(intersect) > 0: + shape, = intersect + oldpartwithshape = self._shapeDict[shape] + oldpartshapes = oldpartwithshape.baseShapesSet + intersectwitholdpart = intersect.intersection(oldpartshapes) + logger.warning('Some shapes are common to groups "%s" and ' + '"%s". For those, the parameters defined for ' + '"%s" will be used.' % + (oldpartwithshape.groupName, newpart.groupName, + newpart.groupName)) + oldpartwithshape.baseShapesSet = \ + oldpartshapes.difference(intersectwitholdpart) + intersect = intersect.difference(intersectwitholdpart) + + # Finally add the new part in the structural element + self._parts[newpart.groupName] = newpart + for shape in newshapes: + self._shapeDict[shape] = newpart + + def addOrientation(self, meshGroup, orientParams): + """ + Add orientation information to a part in the structural element. This + information will be used to build the corresponding markers. + + :type meshGroup: string + :param meshGroup: the name of a geometrical primitive. The orientation + information will apply to the structural element + part built along this primitive. + + :type orientParams: dictionary + :param orientParams: parameters defining the orientation of the + structural element part. Those parameters are + detailed in class + :class:`~orientation.Orientation1D`. + + """ + if self._parts.has_key(meshGroup): + self._parts[meshGroup].addOrientation(orientParams) + else: + logger.warning('Mesh group "%s" not found in structural element, ' + 'cannot set orientation.' % meshGroup) + + def build(self): + """ + Build the geometric shapes and the markers corresponding to the + different parts of the structural element, and add them to the study. + """ + gg = salome.ImportComponentGUI("GEOM") + for part in self._parts.itervalues(): + # Build the structural element part + logger.debug("Building %s" % part) + try: + (shape, markers) = part.build() + if shape is None: + logger.error("Part %s has not been built" % part) + continue + except: + logger.exception("Couldn't build part %s" % part) + continue + + # Add the new objects to the study + IOR = self._studyEditor.study.ConvertObjectToIOR(shape) + shapeSObjName = part.name + "_" + part.groupName + icon = None + if salome.hasDesktop(): + icon = gg.getShapeTypeIcon(IOR) + shapeSObj = self._studyEditor.createItem(self._getSObject(), + name = shapeSObjName, IOR = IOR, + icon = icon) + if markers is not None and len(markers) > 0: + i = 1 + for marker in markers: + markerIOR = \ + self._studyEditor.study.ConvertObjectToIOR(marker) + markerSObjName = "Orient_" + shapeSObjName + if len(markers) > 1: + markerSObjName += "_%d" % i + markerSObj = self._studyEditor.createItem( + self._getSObject(), + name = markerSObjName, + IOR = markerIOR, + icon = "ICON_OBJBROWSER_LCS") + i += 1 + + def display(self): + """ + Display the structural element in the geom view. + """ + StructuralElement.showElement(self._SObject) + + @staticmethod + def showElement(theSObject): + """ + Display the structural element corresponding to the study object + `theSObject` + """ + if theSObject is not None: + gg = salome.ImportComponentGUI("GEOM") + aStudy = theSObject.GetStudy() + editor = getStudyEditor(aStudy._get_StudyId()) + aIterator = aStudy.NewChildIterator(theSObject) + aIterator.Init() + while aIterator.More(): + sobj = aIterator.Value() + icon = editor.getIcon(sobj) + if icon != "ICON_OBJBROWSER_LCS": + entry = aIterator.Value().GetID() + gg.createAndDisplayGO(entry) + gg.setDisplayMode(entry, 1) + aIterator.Next() + + +def TEST_CreateGeometry(): + import geompy + import SALOMEDS + geompy.init_geom(salome.myStudy) + Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) + edges = geompy.SubShapeAllSorted(Box_1, geompy.ShapeType["EDGE"]) + edges[0].SetColor(SALOMEDS.Color(1.0,0.0,0.0)) + edges[1].SetColor(SALOMEDS.Color(0.0,1.0,0.0)) + edges[2].SetColor(SALOMEDS.Color(0.0,0.0,1.0)) + edges[3].SetColor(SALOMEDS.Color(1.0,0.0,1.0)) + edges[4].SetColor(SALOMEDS.Color(0.0,1.0,1.0)) + edges[5].SetColor(SALOMEDS.Color(0.5,0.0,0.0)) + edges[6].SetColor(SALOMEDS.Color(0.0,0.5,0.0)) + edges[7].SetColor(SALOMEDS.Color(0.0,0.0,0.5)) + geompy.addToStudy(Box_1, "Box_1") + for i in range(len(edges)): + geompy.addToStudyInFather(Box_1, edges[i], "Edge_%d" % i) + faces = geompy.SubShapeAllSorted(Box_1, geompy.ShapeType["FACE"]) + faces[3].SetColor(SALOMEDS.Color(1.0,0.5,0.0)) + faces[4].SetColor(SALOMEDS.Color(0.0,1.0,0.5)) + for i in range(len(faces)): + geompy.addToStudyInFather(Box_1, faces[i], "Face_%d" % i) + Cylinder_1 = geompy.MakeCylinderRH(50, 200) + geompy.TranslateDXDYDZ(Cylinder_1, 300, 300, 0) + cyl_faces = geompy.SubShapeAllSorted(Cylinder_1, geompy.ShapeType["FACE"]) + geompy.addToStudy(Cylinder_1, "Cylinder_1") + for i in range(len(cyl_faces)): + geompy.addToStudyInFather(Cylinder_1, cyl_faces[i], "CylFace_%d" % i) + Cylinder_2 = geompy.MakeTranslation(Cylinder_1, 100, 100, 0) + cyl_faces2 = geompy.SubShapeAllSorted(Cylinder_2, + geompy.ShapeType["FACE"]) + geompy.addToStudy(Cylinder_2, "Cylinder_2") + for i in range(len(cyl_faces2)): + geompy.addToStudyInFather(Cylinder_2, cyl_faces2[i], + "CylFace2_%d" % i) + + +def TEST_StructuralElement(): + salome.salome_init() + TEST_CreateGeometry() + liste_commandes = [('Orientation', {'MeshGroups': 'Edge_4', + 'VECT_Y': (1.0, 0.0, 1.0)}), + ('Orientation', {'MeshGroups': 'Edge_5', + 'ANGL_VRIL': 45.0}), + ('GeneralBeam', {'MeshGroups': 'Edge_1, Edge_7'}), + ('VisuPoutreCercle', {'MeshGroups': ['Edge_6'], + 'R1': 30, 'R2': 20}), + ('CircularBeam', {'MeshGroups': ['Edge_2', 'Edge_3'], + 'R': 40, 'EP': 20}), + ('RectangularBeam', {'MeshGroups': 'Edge_4, Edge_5', + 'HZ1': 60, 'HY1': 40, + 'EPZ1': 15, 'EPY1': 10, + 'HZ2': 40, 'HY2': 60, + 'EPZ2': 10, 'EPY2': 15}), + ('VisuCable', {'MeshGroups': 'Edge_7', 'R': 5}), + ('VisuCoque', {'MeshGroups': 'Face_4', + 'Epais': 10, 'Excentre': 5, + 'angleAlpha': 45, 'angleBeta': 60}), + ('VisuCoque', {'MeshGroups': 'CylFace_2', 'Epais': 5}), + ('VisuGrille', {'MeshGroups': 'Face_5', 'Excentre': 5, + 'angleAlpha': 45, 'angleBeta': 60}), + ('VisuGrille', {'MeshGroups': 'CylFace2_2', + 'Excentre': 5, 'origAxeX': 400, + 'origAxeY': 400, 'origAxeZ': 0, + 'axeX': 0, 'axeY': 0, 'axeZ': 100}), + ] + + structElemManager = StructuralElementManager() + elem = structElemManager.createElement(liste_commandes) + if salome.hasDesktop(): + elem.display() + salome.sg.updateObjBrowser(True) + + +# Main function only used to test the module +if __name__ == "__main__": + TEST_StructuralElement() diff --git a/src/GEOM_PY/structelem/orientation.py b/src/GEOM_PY/structelem/orientation.py new file mode 100644 index 000000000..1bf111791 --- /dev/null +++ b/src/GEOM_PY/structelem/orientation.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007-2009 EDF R&D +# +# This file is part of PAL_SRC. +# +# PAL_SRC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PAL_SRC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with PAL_SRC; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +""" +This module is used to compute the orientation of the different parts in a +structural element and to build the corresponding markers (trihedrons). +""" + +import math + +from salome.kernel.logger import Logger +from salome.kernel import termcolor +logger = Logger("__PAL_GEOM__.structelem.orientation", color = termcolor.RED) + + +class Orientation1D: + """ + This class is used to compute the orientation of 1D elements and to build + the corresponding markers. + """ + + def __init__(self): + self.geom = None + self._vectorYCoords = None + self._angle = 0.0 + + def __repr__(self): + reprdict = self.__dict__.copy() + del reprdict["geom"] + return '%s(%s)' % (self.__class__.__name__, reprdict) + + def addParams(self, params): + """ + Add orientation parameters. `params` is a dictionary containing one or + several orientation parameters. The valid parameters are: + + * "VECT_Y": Triplet defining the local Y axis (the X axis is the + main direction of the 1D element). + * "ANGL_VRIL": Angle of rotation along the X axis to define the local + coordinate system. + + The parameters can be specified several times. In this case, only the + first "VECT_Y" is taken into account, and the values of "ANGL_VRIL" + are added to obtain the total rotation angle. + """ + mydict = params.copy() + if mydict.has_key("VECT_Y"): + newVecCoords = mydict.pop("VECT_Y") + if self._vectorYCoords is None: + logger.debug("Setting orientation vector Y to %s" % + str(newVecCoords)) + self._vectorYCoords = newVecCoords + else: + logger.warning('Orientation parameter "VECT_Y" is specified ' + 'several times for the same mesh group, vector' + ' %s will be used' % str(self._vectorYCoords)) + if mydict.has_key("ANGL_VRIL"): + newAngle = mydict.pop("ANGL_VRIL") + self._angle += newAngle + logger.debug("Adding angle %f to orientation, new angle is %f." % + (newAngle, self._angle)) + if len(mydict) > 0: + logger.warning("Invalid orientation parameter(s) (ignored): %s" % + str(mydict)) + + def _buildDefaultMarker(self, center, vecX): + """ + Create the default marker, that use the main direction of the 1D + object as the local X axis and the global Z axis to determine the + local Z axis. + """ + xPoint = self.geom.MakeTranslationVector(center, vecX) + givenVecZ = self.geom.MakeVectorDXDYDZ(0.0, 0.0, 1.0) + angle = self.geom.GetAngleRadians(vecX, givenVecZ) + if abs(angle) < 1e-7 or abs(angle - math.pi) < 1e-7: + logger.warning("Beam X axis is colinear to absolute Z axis. " + "Absolute X axis will be used to determine " + "local Z axis.") + givenVecZ = self.geom.MakeVectorDXDYDZ(1.0, 0.0, 0.0) + zPoint = self.geom.MakeTranslationVector(center, givenVecZ) + locPlaneZX = self.geom.MakePlaneThreePnt(center, zPoint, xPoint, 1.0) + locY = self.geom.GetNormal(locPlaneZX) + marker = self.geom.MakeMarkerPntTwoVec(center,vecX,locY) + return marker + + def buildMarker(self, geom, center, vecX): + """ + Create a marker with origin `center` and X axis `vecX`. `geom` is the + pseudo-geompy object used to build the geometric shapes. + """ + self.geom = geom + marker = None + if self._vectorYCoords is None: + marker = self._buildDefaultMarker(center, vecX) + else: + xPoint = self.geom.MakeTranslationVector(center, vecX) + givenLocY = self.geom.MakeVectorDXDYDZ(self._vectorYCoords[0], + self._vectorYCoords[1], + self._vectorYCoords[2]) + angle = self.geom.GetAngleRadians(vecX, givenLocY) + if abs(angle) < 1e-7 or abs(angle - math.pi) < 1e-7: + logger.warning("Vector Y is colinear to the beam X axis, " + "using default LCS.") + marker = self._buildDefaultMarker(center, vecX) + else: + yPoint = self.geom.MakeTranslationVector(center, givenLocY) + locPlaneXY = self.geom.MakePlaneThreePnt(center, xPoint, + yPoint, 1.0) + locZ = self.geom.GetNormal(locPlaneXY) + zPoint = self.geom.MakeTranslationVector(center, locZ) + locPlaneZX = self.geom.MakePlaneThreePnt(center, zPoint, + xPoint, 1.0) + locY = self.geom.GetNormal(locPlaneZX) + marker = self.geom.MakeMarkerPntTwoVec(center,vecX,locY) + + if self._angle != 0.0: + angleRad = math.radians(self._angle) + marker = self.geom.Rotate(marker, vecX, angleRad) + + return marker + + +class Orientation2D: + """ + This class is used to compute the orientation of 2D elements and to build + the corresponding markers. Angles `alpha` and `beta` are used to determine + the local coordinate system for the 2D element. If `vect` is not + :const:`None`, it is used instead of `alpha` and `beta`. + """ + + def __init__(self, alpha, beta, vect): + self.geom = None + self._alpha = alpha + self._beta = beta + self._vect = vect + + def __repr__(self): + reprdict = self.__dict__.copy() + del reprdict["geom"] + return '%s(%s)' % (self.__class__.__name__, reprdict) + + def _buildDefaultMarker(self, center, normal, warnings = True): + """ + Create the default marker, that use the normal vector of the 2D object + as the local Z axis and the global X axis to determine the local X + axis. `warnings` can be used to enable or disable the logging of + warning messages. + """ + marker = None + globalVecX = self.geom.MakeVectorDXDYDZ(1.0, 0.0, 0.0) + angle = self.geom.GetAngleRadians(normal, globalVecX) + if abs(angle) < 1e-7 or abs(angle - math.pi) < 1e-7: + if warnings: + logger.warning("Face normal is colinear to absolute X axis. " + "Absolute Y axis will be used to determine " + "local X axis.") + globalVecY = self.geom.MakeVectorDXDYDZ(0.0, 1.0, 0.0) + marker = self._buildMarkerRefVecX(center, normal, globalVecY) + else: + marker = self._buildMarkerRefVecX(center, normal, globalVecX) + return marker + + def _buildMarkerRefVecX(self, center, normal, refVecX): + """ + Create a marker using `normal` as Z axis and `refVecX` to determine + the X axis. + """ + xPoint = self.geom.MakeTranslationVector(center, refVecX) + zPoint = self.geom.MakeTranslationVector(center, normal) + locPlaneZX = self.geom.MakePlaneThreePnt(center, zPoint, xPoint, 1.0) + locY = self.geom.GetNormal(locPlaneZX) + yPoint = self.geom.MakeTranslationVector(center, locY) + locPlaneYZ = self.geom.MakePlaneThreePnt(center, yPoint, zPoint, 1.0) + locX = self.geom.GetNormal(locPlaneYZ) + marker = self.geom.MakeMarkerPntTwoVec(center, locX, locY) + return marker + + def buildMarker(self, geom, center, normal, warnings = True): + """ + Create a marker with origin `center` and `normal` as Z axis. The other + axes are computed using the parameters alpha and beta of the + Orientation2D instance. `geom` is the pseudo-geompy object used to + build the geometric shapes. `warnings` can be used to enable or + disable the logging of warning messages. + """ + self.geom = geom + marker = None + refVecX = None + if self._vect is not None: + # Using vector parameter + if abs(self._vect[0]) <= 1e-7 and abs(self._vect[1]) <= 1e-7 and \ + abs(self._vect[2]) <= 1e-7: + if warnings: + logger.warning("Vector too small: %s, using default LCS" % + self._vect) + else: + refVecX = self.geom.MakeVectorDXDYDZ(self._vect[0], + self._vect[1], + self._vect[2]) + elif self._alpha is not None and self._beta is not None: + # Using alpha and beta angles + alphaRad = math.radians(self._alpha) + betaRad = math.radians(self._beta) + if abs(alphaRad) <= 1e-7 and abs(betaRad) <= 1e-7: + if warnings: + logger.warning("Angles too small: (%g, %g), using " + "default LCS" % (self._alpha, self._beta)) + else: + # rotate global CS with angles alpha and beta + refVecX = self.geom.MakeVectorDXDYDZ(1.0, 0.0, 0.0) + refVecY = self.geom.MakeVectorDXDYDZ(0.0, 1.0, 0.0) + globalVecZ = self.geom.MakeVectorDXDYDZ(0.0, 0.0, 1.0) + if abs(alphaRad) > 1e-7: + refVecX = self.geom.Rotate(refVecX, globalVecZ, alphaRad) + refVecY = self.geom.Rotate(refVecY, globalVecZ, alphaRad) + if abs(betaRad) > 1e-7: + refVecX = self.geom.Rotate(refVecX, refVecY, betaRad) + + if refVecX is not None: + # build local coordinate system + angle = self.geom.GetAngleRadians(normal, refVecX) + if abs(angle) < 1e-7 or abs(angle - math.pi) < 1e-7: + if warnings: + logger.warning("Face normal is colinear to the reference " + "X axis, using default LCS.") + else: + marker = self._buildMarkerRefVecX(center, normal, refVecX) + + if marker is None: + marker = self._buildDefaultMarker(center, normal, warnings) + + return marker diff --git a/src/GEOM_PY/structelem/parts.py b/src/GEOM_PY/structelem/parts.py new file mode 100644 index 000000000..0781f6d83 --- /dev/null +++ b/src/GEOM_PY/structelem/parts.py @@ -0,0 +1,969 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2007-2009 EDF R&D +# +# This file is part of PAL_SRC. +# +# PAL_SRC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PAL_SRC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with PAL_SRC; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +""" +This module defines the different structural element parts. It is used to +build the geometric shapes of the structural elements. It should not be used +directly in the general case. Structural elements should be created by the +class :class:`~salome.geom.structelem.StructuralElementManager`. +""" + +import salome + +from salome.kernel.logger import Logger +from salome.kernel import termcolor +logger = Logger("salome.geom.structelem.parts", color = termcolor.RED) +from salome.geom.geomtools import getGeompy + +import orientation + +# Filling for the beams +FULL = "FULL" +HOLLOW = "HOLLOW" + +# Minimum dimension for the shapes to extrude +MIN_DIM_FOR_EXTRUDED_SHAPE = 2e-4 +MIN_LENGTH_FOR_EXTRUSION = 1e-4 +MIN_THICKNESS = 1e-5 + + +class InvalidParameterError(Exception): + """ + This exception is raised when an invalid parameter is used to build a + structural element part. + """ + + def __init__(self, groupName, expression, minValue, value): + self.groupName = groupName + self.expression = expression + self.minValue = minValue + self.value = value + + def __str__(self): + return "%s < %g (%s = %g in %s)" % (self.expression, self.minValue, + self.expression, self.value, + self.groupName) + + +class SubShapeID: + """ + This class enables the use of subshapes in sets or as dictionary keys. + It implements __eq__ and __hash__ methods so that subshapes with the same + CORBA object `mainShape` and the same `id` are considered equal. + """ + + def __init__(self, mainShape, id): + self._mainShape = mainShape + self._id = id + + def getObj(self, geom): + """ + Return the subshape (GEOM object). `geom` is a pseudo-geompy object + used to find the geometrical object. + """ + return geom.GetSubShape(self._mainShape, [self._id]) + + def __eq__(self, other): + return self._mainShape._is_equivalent(other._mainShape) and \ + self._id == other._id + + def __hash__(self): + return self._mainShape._hash(2147483647) ^ self._id + + +class StructuralElementPart: + """ + This class is the base class for all structural element parts. It should + not be instantiated directly (consider it as an "abstract" class). + + :type studyId: integer + :param studyId: the ID of the study in which the part is created. + + :type groupName: string + :param groupName: the name of the underlying geometrical primitive in the + study. + + :type groupGeomObj: GEOM object + :param groupGeomObj: the underlying geometrical primitive. + + :type parameters: dictionary + :param parameters: parameters defining the structural element (see + subclasses for details). + + :type name: string + :param name: name to use for the created object in the study. + + """ + + DEFAULT_NAME = "StructElemPart" + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = DEFAULT_NAME): + self._parameters = parameters + self.groupName = groupName + self._groupGeomObj = groupGeomObj + self._orientation = None + self._paramUserName = {} + self.name = name + self.geom = getGeompy(studyId) + self.baseShapesSet = set() + mainShape = self.geom.GetMainShape(groupGeomObj) + listIDs = self.geom.GetObjectIDs(groupGeomObj) + if mainShape is not None and listIDs is not None: + for id in listIDs: + self.baseShapesSet.add(SubShapeID(mainShape, id)) + + def _getParameter(self, nameList, default = None): + """ + This method finds the value of a parameter in the parameters + dictionary. The argument is a list because some parameters can have + several different names. + """ + if len(nameList) > 0: + paramName = nameList[0] + for name in nameList: + if self._parameters.has_key(name): + self._paramUserName[paramName] = name + return self._parameters[name] + return default + + def _getParamUserName(self, paramName): + """ + This method finds the user name for a parameter. + """ + if self._paramUserName.has_key(paramName): + return self._paramUserName[paramName] + else: + return paramName + + def __repr__(self): + reprdict = self.__dict__.copy() + del reprdict["_parameters"] + del reprdict["groupName"] + del reprdict["_groupGeomObj"] + del reprdict["_paramUserName"] + del reprdict["name"] + del reprdict["geom"] + del reprdict["baseShapesSet"] + return '%s("%s", %s)' % (self.__class__.__name__, self.groupName, + reprdict) + + def addOrientation(self, orientParams): + """ + Add orientation information to the structural element part. See class + :class:`~salome.geom.structelem.orientation.Orientation1D` for the description + of the parameters. + """ + self._orientation.addParams(orientParams) + + def _checkSize(self, value, mindim, expression): + """ + This method checks that some parameters or some expressions involving + those parameters are greater than a minimum value. + """ + if value < mindim: + raise InvalidParameterError(self.groupName, expression, + mindim, value) + + def build(self): + """ + Build the geometric shapes and the markers corresponding to the + structural element part in the study `studyId`. + """ + shape = self._buildPart() + markers = self._buildMarkers() + shape.SetColor(self._groupGeomObj.GetColor()) + for marker in markers: + marker.SetColor(self._groupGeomObj.GetColor()) + return (shape, markers) + + def _buildPart(self): + """ + This abstract method must be implemented in subclasses and should + create the geometrical shape(s) of the structural element part. + """ + raise NotImplementedError("Method _buildPart not implemented in class" + " %s (it must be implemented in " + "StructuralElementPart subclasses)." % + self.__class__.__name__) + + def _buildMarkers(self): + """ + This abstract method must be implemented in subclasses and should + create the markers defining the orientation of the structural element + part. + """ + raise NotImplementedError("Method _buildMarker not implemented in " + "class %s (it must be implemented in " + "StructuralElementPart subclasses)." % + self.__class__.__name__) + + def _getSubShapes(self, minDim = MIN_LENGTH_FOR_EXTRUSION): + """ + Find and return the base subshapes in the structural element part. + """ + subShapes = [] + for subShapeID in self.baseShapesSet: + subShape = subShapeID.getObj(self.geom) + length = self.geom.BasicProperties(subShape)[0] + if length < minDim: + logger.warning("Length too short (%s - ID %s, length = %g), " + "subshape will not be used in structural " + "element" % (self.groupName, subShapeID._id, + length)) + else: + subShapes.append(subShape) + return subShapes + + +class Beam(StructuralElementPart): + """ + This class is an "abstract" class for all 1D structural element parts. It + should not be instantiated directly. See class + :class:`StructuralElementPart` for the description of the parameters. + """ + + DEFAULT_NAME = "Beam" + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = DEFAULT_NAME): + StructuralElementPart.__init__(self, studyId, groupName, groupGeomObj, + parameters, name) + self._orientation = orientation.Orientation1D() + + def _isReversed(self, path): + """ + This method checks if a 1D object is "reversed", i.e. if its + orientation is different than the orientation of the underlying OCC + object. + """ + fParam = 0. + lParam = 1. + fPoint = self.geom.MakeVertexOnCurve(path, fParam) + lPoint = self.geom.MakeVertexOnCurve(path, lParam) + + fNormal = self.geom.MakeTangentOnCurve(path, fParam) + lNormal = self.geom.MakeTangentOnCurve(path, lParam) + + fCircle = self.geom.MakeCircle(fPoint, fNormal, 10) + lCircle = self.geom.MakeCircle(lPoint, lNormal, 10) + + try: + pipe = self.geom.MakePipeWithDifferentSections([fCircle, lCircle], + [fPoint, lPoint], + path, False, False) + except RuntimeError, e: + # This dirty trick is needed if the wire is not oriented in the + # direction corresponding to parameters 0.0 -> 1.0. In this case, + # we catch the error and invert the ends of the wire. This trick + # will be removed when the function giving the orientation of an + # edge will be added in geompy (see issue 1144 in PAL bugtracker). + if (str(e) == "MakePipeWithDifferentSections : First location " + "shapes is not coincided with first vertex of " + "aWirePath"): + return True + else: + raise + return False + + def _getVertexAndTangentOnOrientedWire(self, path, param): + """ + Get a vertex and the corresponding tangent on a wire by parameter. + This method takes into account the "real" orientation of the wire + (i.e. the orientation of the underlying OCC object). + """ + if self._isReversed(path): + vertex = self.geom.MakeVertexOnCurve(path, 1.0 - param) + invtangent = self.geom.MakeTangentOnCurve(path, 1.0 - param) + tanpoint = self.geom.MakeTranslationVectorDistance(vertex, + invtangent, + -1.0) + tangent = self.geom.MakeVector(vertex, tanpoint) + else: + vertex = self.geom.MakeVertexOnCurve(path, param) + tangent = self.geom.MakeTangentOnCurve(path, param) + return (vertex, tangent) + + def _makeSolidPipeFromWires(self, wire1, wire2, point1, point2, path): + """ + Create a solid by the extrusion of section `wire1` to section `wire2` + along `path`. + """ + face1 = self.geom.MakeFace(wire1, True) + face2 = self.geom.MakeFace(wire2, True) + shell = self.geom.MakePipeWithDifferentSections([wire1, wire2], + [point1, point2], + path, False, False) + closedShell = self.geom.MakeShell([face1, face2, shell]) + solid = self.geom.MakeSolid([closedShell]) + return solid + + def _buildPart(self): + """ + Build the structural element part. + """ + # Get all the subshapes in the group (normally only edges and wires) + paths = self._getSubShapes() + listPipes = [] + withContact = False + withCorrection = False + + for path in paths: + # Build the sections (rectangular or circular) at each end of the + # beam + (fPoint, fNormal) = self._getVertexAndTangentOnOrientedWire(path, + 0.0) + (lPoint, lNormal) = self._getVertexAndTangentOnOrientedWire(path, + 1.0) + (outerWire1, innerWire1, outerWire2, innerWire2) = \ + self._makeSectionWires(fPoint, fNormal, lPoint, lNormal) + + # Create the resulting solid + outerSolid = self._makeSolidPipeFromWires(outerWire1, outerWire2, + fPoint, lPoint, path) + if self.filling == HOLLOW: + innerSolid = self._makeSolidPipeFromWires(innerWire1, + innerWire2, fPoint, + lPoint, path) + resultSolid = self.geom.MakeCut(outerSolid, innerSolid) + listPipes.append(resultSolid) + else: + listPipes.append(outerSolid) + + if len(listPipes) == 0: + return None + elif len(listPipes) == 1: + return listPipes[0] + else: + return self.geom.MakeCompound(listPipes) + + def _buildMarkers(self): + """ + Build the markers defining the orientation of the structural element + part. + """ + param = 0.5 + paths = self._getSubShapes() + listMarkers = [] + for path in paths: + (center, vecX) = self._getVertexAndTangentOnOrientedWire(path, + param) + marker = self._orientation.buildMarker(self.geom, center, vecX) + listMarkers.append(marker) + return listMarkers + + +class GeneralBeam(Beam): + """ + This class defines a beam with a generic section. It is represented only + as the underlying wire. See class :class:`StructuralElementPart` for the + description of the parameters. + """ + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = Beam.DEFAULT_NAME): + Beam.__init__(self, studyId, groupName, groupGeomObj, parameters, + name) + logger.debug(repr(self)) + + def _buildPart(self): + """ + Create a copy of the underlying wire. + """ + edges = self._getSubShapes(1e-7) + wire = None + if len(edges) > 0: + wire = self.geom.MakeWire(edges) + return wire + + +class CircularBeam(Beam): + """ + This class defines a beam with a circular section. It can be full or + hollow, and its radius and thickness can vary from one end of the beam to + the other. The valid parameters for circular beams are: + + * "R1" or "R": radius at the first end of the beam. + * "R2" or "R": radius at the other end of the beam. + * "EP1" or "EP" (optional): thickness at the first end of the beam. + If not specified or equal to 0, the beam is considered full. + * "EP2" or "EP" (optional): thickness at the other end of the beam. + If not specified or equal to 0, the beam is considered full. + + See class :class:`StructuralElementPart` for the description of the + other parameters. + + """ + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = Beam.DEFAULT_NAME): + Beam.__init__(self, studyId, groupName, groupGeomObj, parameters, + name) + + self.R1 = self._getParameter(["R1", "R"]) + self.R2 = self._getParameter(["R2", "R"]) + self.EP1 = self._getParameter(["EP1", "EP"]) + self.EP2 = self._getParameter(["EP2", "EP"]) + + if self.EP1 is None or self.EP2 is None or \ + self.EP1 == 0 or self.EP2 == 0: + self.filling = FULL + else: + self.filling = HOLLOW + + logger.debug(repr(self)) + + # Check parameters + self._checkSize(self.R1, MIN_DIM_FOR_EXTRUDED_SHAPE / 2.0, + self._getParamUserName("R1")) + self._checkSize(self.R2, MIN_DIM_FOR_EXTRUDED_SHAPE / 2.0, + self._getParamUserName("R2")) + if self.filling == HOLLOW: + self._checkSize(self.EP1, MIN_THICKNESS, + self._getParamUserName("EP1")) + self._checkSize(self.EP2, MIN_THICKNESS, + self._getParamUserName("EP2")) + self._checkSize(self.R1 - self.EP1, + MIN_DIM_FOR_EXTRUDED_SHAPE / 2.0, + "%s - %s" % (self._getParamUserName("R1"), + self._getParamUserName("EP1"))) + self._checkSize(self.R2 - self.EP2, + MIN_DIM_FOR_EXTRUDED_SHAPE / 2.0, + "%s - %s" % (self._getParamUserName("R2"), + self._getParamUserName("EP2"))) + + def _makeSectionWires(self, fPoint, fNormal, lPoint, lNormal): + """ + Create the circular sections used to build the pipe. + """ + outerCircle1 = self.geom.MakeCircle(fPoint, fNormal, self.R1) + outerCircle2 = self.geom.MakeCircle(lPoint, lNormal, self.R2) + if self.filling == HOLLOW: + innerCircle1 = self.geom.MakeCircle(fPoint, fNormal, + self.R1 - self.EP1) + innerCircle2 = self.geom.MakeCircle(lPoint, lNormal, + self.R2 - self.EP2) + else: + innerCircle1 = None + innerCircle2 = None + + return (outerCircle1, innerCircle1, outerCircle2, innerCircle2) + + +class RectangularBeam(Beam): + """ + This class defines a beam with a rectangular section. It can be full or + hollow, and its dimensions can vary from one end of the beam to the other. + The valid parameters for rectangular beams are: + + * "HY1", "HY", "H1" or "H": width at the first end of the beam. + * "HZ1", "HZ", "H1" or "H": height at the first end of the beam. + * "HY2", "HY", "H2" or "H": width at the other end of the beam. + * "HZ2", "HZ", "H2" or "H": height at the other end of the beam. + * "EPY1", "EPY", "EP1" or "EP" (optional): thickness in the width + direction at the first end of the beam. If not specified or equal to 0, + the beam is considered full. + * "EPZ1", "EPZ", "EP1" or "EP" (optional): thickness in the height + direction at the first end of the beam. If not specified or equal to 0, + the beam is considered full. + * "EPY2", "EPY", "EP2" or "EP" (optional): thickness in the width + direction at the other end of the beam. If not specified or equal to 0, + the beam is considered full. + * "EPZ2", "EPZ", "EP2" or "EP" (optional): thickness in the height + direction at the other end of the beam. If not specified or equal to 0, + the beam is considered full. + + See class :class:`StructuralElementPart` for the description of the + other parameters. + + """ + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = Beam.DEFAULT_NAME): + Beam.__init__(self, studyId, groupName, groupGeomObj, parameters, + name) + + self.HY1 = self._getParameter(["HY1", "HY", "H1", "H"]) + self.HZ1 = self._getParameter(["HZ1", "HZ", "H1", "H"]) + self.HY2 = self._getParameter(["HY2", "HY", "H2", "H"]) + self.HZ2 = self._getParameter(["HZ2", "HZ", "H2", "H"]) + self.EPY1 = self._getParameter(["EPY1", "EPY", "EP1", "EP"]) + self.EPZ1 = self._getParameter(["EPZ1", "EPZ", "EP1", "EP"]) + self.EPY2 = self._getParameter(["EPY2", "EPY", "EP2", "EP"]) + self.EPZ2 = self._getParameter(["EPZ2", "EPZ", "EP2", "EP"]) + + if self.EPY1 is None or self.EPZ1 is None or \ + self.EPY2 is None or self.EPZ2 is None or \ + self.EPY1 == 0 or self.EPZ1 == 0 or \ + self.EPY2 == 0 or self.EPZ2 == 0: + self.filling = FULL + else: + self.filling = HOLLOW + + logger.debug(repr(self)) + + # Check parameters + self._checkSize(self.HY1, MIN_DIM_FOR_EXTRUDED_SHAPE, + self._getParamUserName("HY1")) + self._checkSize(self.HZ1, MIN_DIM_FOR_EXTRUDED_SHAPE, + self._getParamUserName("HZ1")) + self._checkSize(self.HY2, MIN_DIM_FOR_EXTRUDED_SHAPE, + self._getParamUserName("HY2")) + self._checkSize(self.HZ2, MIN_DIM_FOR_EXTRUDED_SHAPE, + self._getParamUserName("HZ2")) + if self.filling == HOLLOW: + self._checkSize(self.EPY1, MIN_THICKNESS, + self._getParamUserName("EPY1")) + self._checkSize(self.EPZ1, MIN_THICKNESS, + self._getParamUserName("EPZ1")) + self._checkSize(self.EPY2, MIN_THICKNESS, + self._getParamUserName("EPY2")) + self._checkSize(self.EPZ2, MIN_THICKNESS, + self._getParamUserName("EPZ2")) + self._checkSize(self.HY1 - 2 * self.EPY1, + MIN_DIM_FOR_EXTRUDED_SHAPE, + "%s - 2 * %s" % (self._getParamUserName("HY1"), + self._getParamUserName("EPY1"))) + self._checkSize(self.HZ1 - 2 * self.EPZ1, + MIN_DIM_FOR_EXTRUDED_SHAPE, + "%s - 2 * %s" % (self._getParamUserName("HZ1"), + self._getParamUserName("EPZ1"))) + self._checkSize(self.HY2 - 2 * self.EPY2, + MIN_DIM_FOR_EXTRUDED_SHAPE, + "%s - 2 * %s" % (self._getParamUserName("HY2"), + self._getParamUserName("EPY2"))) + self._checkSize(self.HZ2 - 2 * self.EPZ2, + MIN_DIM_FOR_EXTRUDED_SHAPE, + "%s - 2 * %s" % (self._getParamUserName("HZ2"), + self._getParamUserName("EPZ2"))) + + def _makeRectangle(self, HY, HZ, planeSect): + """ + Create a rectangle in the specified plane. + """ + halfHY = HY / 2.0 + halfHZ = HZ / 2.0 + sketchStr = "Sketcher:F %g" % (-halfHZ) + " %g" % (-halfHY) + ":" + sketchStr += "TT %g" % (halfHZ) + " %g" % (-halfHY) + ":" + sketchStr += "TT %g" % (halfHZ) + " %g" % (halfHY) + ":" + sketchStr += "TT %g" % (-halfHZ) + " %g" % (halfHY) + ":WW" + logger.debug('Drawing rectangle: "%s"' % sketchStr) + sketch = self.geom.MakeSketcherOnPlane(sketchStr, planeSect) + return sketch + + def _makeSectionWires(self, fPoint, fNormal, lPoint, lNormal): + """ + Create the rectangular sections used to build the pipe. + """ + planeSect1 = self.geom.MakePlane(fPoint, fNormal, 1.0) + outerRect1 = self._makeRectangle(self.HY1, self.HZ1, planeSect1) + planeSect2 = self.geom.MakePlane(lPoint, lNormal, 1.0) + outerRect2 = self._makeRectangle(self.HY2, self.HZ2, planeSect2) + if self.filling == HOLLOW: + innerRect1 = self._makeRectangle(self.HY1 - 2 * self.EPY1, + self.HZ1 - 2 * self.EPZ1, + planeSect1) + innerRect2 = self._makeRectangle(self.HY2 - 2 * self.EPY2, + self.HZ2 - 2 * self.EPZ2, + planeSect2) + else: + innerRect1 = None + innerRect2 = None + + return (outerRect1, innerRect1, outerRect2, innerRect2) + + +class StructuralElementPart2D(StructuralElementPart): + """ + This class is an "abstract" class for all 2D structural element parts. It + should not be instantiated directly. See class + :class:`StructuralElementPart` for the description of the parameters. + """ + + DEFAULT_NAME = "StructuralElementPart2D" + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = DEFAULT_NAME): + StructuralElementPart.__init__(self, studyId, groupName, groupGeomObj, + parameters, name) + self._orientation = orientation.Orientation2D( + self._getParameter(["angleAlpha"]), + self._getParameter(["angleBeta"]), + self._getParameter(["Vecteur"])) + self.offset = self._getParameter(["Excentre"], 0.0) + + def _makeFaceOffset(self, face, offset, epsilon = 1e-6): + """ + Create a copy of a face at a given offset. + """ + if abs(offset) < epsilon: + return self.geom.MakeCopy(face) + else: + offsetObj = self.geom.MakeOffset(face, offset) + # We have to explode the resulting object into faces because it is + # created as a polyhedron and not as a single face + faces = self.geom.SubShapeAll(offsetObj, + self.geom.ShapeType["FACE"]) + return faces[0] + + def _buildMarkersWithOffset(self, offset): + """ + Build the markers for the structural element part with a given offset + from the base face. + """ + uParam = 0.5 + vParam = 0.5 + listMarkers = [] + subShapes = self._getSubShapes() + + for subShape in subShapes: + faces = self.geom.SubShapeAll(subShape, + self.geom.ShapeType["FACE"]) + for face in faces: + offsetFace = self._makeFaceOffset(face, offset) + # get tangent plane on surface by parameters + center = self.geom.MakeVertexOnSurface(offsetFace, + uParam, vParam) + tangPlane = self.geom.MakeTangentPlaneOnFace(offsetFace, + uParam, vParam, + 1.0) + normal = self.geom.GetNormal(tangPlane) + marker = self._orientation.buildMarker(self.geom, + center, normal) + listMarkers.append(marker) + + return listMarkers + + +class ThickShell(StructuralElementPart2D): + """ + This class defines a shell with a given thickness. It can be shifted from + the base face. The valid parameters for thick shells are: + + * "Epais": thickness of the shell. + * "Excentre": offset of the shell from the base face. + * "angleAlpha": angle used to build the markers (see class + :class:`~salome.geom.structelem.orientation.Orientation2D`) + * "angleBeta": angle used to build the markers (see class + :class:`~salome.geom.structelem.orientation.Orientation2D`) + * "Vecteur": vector used instead of the angles to build the markers (see + class :class:`~salome.geom.structelem.orientation.Orientation2D`) + + See class :class:`StructuralElementPart` for the description of the + other parameters. + """ + + DEFAULT_NAME = "ThickShell" + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = DEFAULT_NAME): + StructuralElementPart2D.__init__(self, studyId, groupName, + groupGeomObj, parameters, name) + self.thickness = self._getParameter(["Epais"]) + logger.debug(repr(self)) + + def _buildPart(self): + """ + Create the geometrical shapes corresponding to the thick shell. + """ + subShapes = self._getSubShapes() + listSolids = [] + + for subShape in subShapes: + faces = self.geom.SubShapeAll(subShape, + self.geom.ShapeType["FACE"]) + for face in faces: + shape = self._buildThickShellForFace(face) + listSolids.append(shape) + + if len(listSolids) == 0: + return None + elif len(listSolids) == 1: + return listSolids[0] + else: + return self.geom.MakeCompound(listSolids) + + def _buildThickShellForFace(self, face): + """ + Create the geometrical shapes corresponding to the thick shell for a + given face. + """ + epsilon = 1e-6 + if self.thickness < 2 * epsilon: + return self._makeFaceOffset(face, self.offset, epsilon) + + upperOffset = self.offset + self.thickness / 2.0 + lowerOffset = self.offset - self.thickness / 2.0 + ruledMode = True + modeSolid = False + + upperFace = self._makeFaceOffset(face, upperOffset, epsilon) + lowerFace = self._makeFaceOffset(face, lowerOffset, epsilon) + listShapes = [upperFace, lowerFace] + upperWires = self.geom.SubShapeAll(upperFace, + self.geom.ShapeType["WIRE"]) + lowerWires = self.geom.SubShapeAll(lowerFace, + self.geom.ShapeType["WIRE"]) + if self.geom.KindOfShape(face)[0] == self.geom.kind.CYLINDER2D: + # if the face is a cylinder, we remove the extra side edge + upperWires = self._removeCylinderExtraEdge(upperWires) + lowerWires = self._removeCylinderExtraEdge(lowerWires) + for i in range(len(upperWires)): + resShape = self.geom.MakeThruSections([upperWires[i], + lowerWires[i]], + modeSolid, epsilon, + ruledMode) + listShapes.append(resShape) + resultShell = self.geom.MakeShell(listShapes) + resultSolid = self.geom.MakeSolid([resultShell]) + return resultSolid + + def _removeCylinderExtraEdge(self, wires): + """ + Remove the side edge in a cylinder. + """ + result = [] + for wire in wires: + edges = self.geom.SubShapeAll(wire, self.geom.ShapeType["EDGE"]) + for edge in edges: + if self.geom.KindOfShape(edge)[0] == self.geom.kind.CIRCLE: + result.append(edge) + return result + + def _buildMarkers(self): + """ + Build the markers defining the orientation of the thick shell. + """ + return self._buildMarkersWithOffset(self.offset + + self.thickness / 2.0) + + +class Grid(StructuralElementPart2D): + """ + This class defines a grid. A grid is represented by a 2D face patterned + with small lines in the main direction of the grid frame. The valid + parameters for grids are: + + * "Excentre": offset of the grid from the base face. + * "angleAlpha": angle used to build the markers (see class + :class:`~salome.geom.structelem.orientation.Orientation2D`) + * "angleBeta": angle used to build the markers (see class + :class:`~salome.geom.structelem.orientation.Orientation2D`) + * "Vecteur": vector used instead of the angles to build the markers (see + class :class:`~salome.geom.structelem.orientation.Orientation2D`) + * "origAxeX": X coordinate of the origin of the axis used to determine the + orientation of the frame in the case of a cylindrical grid. + * "origAxeY": Y coordinate of the origin of the axis used to determine the + orientation of the frame in the case of a cylindrical grid. + * "origAxeZ": Z coordinate of the origin of the axis used to determine the + orientation of the frame in the case of a cylindrical grid. + * "axeX": X coordinate of the axis used to determine the orientation of + the frame in the case of a cylindrical grid. + * "axeY": Y coordinate of the axis used to determine the orientation of + the frame in the case of a cylindrical grid. + * "axeZ": Z coordinate of the axis used to determine the orientation of + the frame in the case of a cylindrical grid. + + See class :class:`StructuralElementPart` for the description of the + other parameters. + """ + + DEFAULT_NAME = "Grid" + + def __init__(self, studyId, groupName, groupGeomObj, parameters, + name = DEFAULT_NAME): + StructuralElementPart2D.__init__(self, studyId, groupName, + groupGeomObj, parameters, name) + self.xr = self._getParameter(["origAxeX"]) + self.yr = self._getParameter(["origAxeY"]) + self.zr = self._getParameter(["origAxeZ"]) + self.vx = self._getParameter(["axeX"]) + self.vy = self._getParameter(["axeY"]) + self.vz = self._getParameter(["axeZ"]) + logger.debug(repr(self)) + + def _buildPart(self): + """ + Create the geometrical shapes representing the grid. + """ + subShapes = self._getSubShapes() + listGridShapes = [] + + for subShape in subShapes: + faces = self.geom.SubShapeAll(subShape, + self.geom.ShapeType["FACE"]) + for face in faces: + if self.geom.KindOfShape(face)[0] == \ + self.geom.kind.CYLINDER2D and \ + self.xr is not None and self.yr is not None and \ + self.zr is not None and self.vx is not None and \ + self.vy is not None and self.vz is not None: + shape = self._buildGridForCylinderFace(face) + else: + shape = self._buildGridForNormalFace(face) + listGridShapes.append(shape) + + if len(listGridShapes) == 0: + return None + elif len(listGridShapes) == 1: + return listGridShapes[0] + else: + return self.geom.MakeCompound(listGridShapes) + + def _buildGridForNormalFace(self, face): + """ + Create the geometrical shapes representing the grid for a given + non-cylindrical face. + """ + baseFace = self._makeFaceOffset(face, self.offset) + gridList = [baseFace] + + # Compute display length for grid elements + p1 = self.geom.MakeVertexOnSurface(baseFace, 0.0, 0.0) + p2 = self.geom.MakeVertexOnSurface(baseFace, 0.1, 0.1) + length = self.geom.MinDistance(p1, p2) / 2.0 + + for u in range(1, 10): + uParam = u * 0.1 + for v in range(1, 10): + vParam = v * 0.1 + # get tangent plane on surface by parameters + center = self.geom.MakeVertexOnSurface(baseFace, + uParam, vParam) + tangPlane = self.geom.MakeTangentPlaneOnFace(baseFace, uParam, + vParam, 1.0) + + # use the marker to get the orientation of the frame + normal = self.geom.GetNormal(tangPlane) + marker = self._orientation.buildMarker(self.geom, center, + normal, False) + [Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz] = self.geom.GetPosition(marker) + xPoint = self.geom.MakeTranslation(center, Xx * length, + Xy * length, Xz * length) + gridLine = self.geom.MakeLineTwoPnt(center, xPoint) + gridList.append(gridLine) + grid = self.geom.MakeCompound(gridList) + return grid + + def _buildGridForCylinderFace(self, face): + """ + Create the geometrical shapes representing the grid for a given + cylindrical face. + """ + baseFace = self._makeFaceOffset(face, self.offset) + gridList = [baseFace] + + # Compute display length for grid elements + p1 = self.geom.MakeVertexOnSurface(baseFace, 0.0, 0.0) + p2 = self.geom.MakeVertexOnSurface(baseFace, 0.1, 0.1) + length = self.geom.MinDistance(p1, p2) / 2.0 + + # Create reference vector V + origPoint = self.geom.MakeVertex(self.xr, self.yr, self.zr) + vPoint = self.geom.MakeTranslation(origPoint, + self.vx, self.vy, self.vz) + refVec = self.geom.MakeVector(origPoint, vPoint) + + for u in range(10): + uParam = u * 0.1 + for v in range(1, 10): + vParam = v * 0.1 + + # Compute the local orientation of the frame + center = self.geom.MakeVertexOnSurface(baseFace, + uParam, vParam) + locPlaneYZ = self.geom.MakePlaneThreePnt(origPoint, center, + vPoint, 1.0) + locOrient = self.geom.GetNormal(locPlaneYZ) + xPoint = self.geom.MakeTranslationVectorDistance(center, + locOrient, + length) + gridLine = self.geom.MakeLineTwoPnt(center, xPoint) + gridList.append(gridLine) + + grid = self.geom.MakeCompound(gridList) + return grid + + def _buildMarkers(self): + """ + Create the markers defining the orientation of the grid. + """ + return self._buildMarkersWithOffset(self.offset) + + +def VisuPoutreGenerale(studyId, groupName, groupGeomObj, parameters, + name = "POUTRE"): + """ + Alias for class :class:`GeneralBeam`. + """ + return GeneralBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuPoutreCercle(studyId, groupName, groupGeomObj, parameters, + name = "POUTRE"): + """ + Alias for class :class:`CircularBeam`. + """ + return CircularBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuPoutreRectangle(studyId, groupName, groupGeomObj, parameters, + name = "POUTRE"): + """ + Alias for class :class:`RectangularBeam`. + """ + return RectangularBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuBarreGenerale(studyId, groupName, groupGeomObj, parameters, + name = "BARRE"): + """ + Alias for class :class:`GeneralBeam`. + """ + return GeneralBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuBarreRectangle(studyId, groupName, groupGeomObj, parameters, + name = "BARRE"): + """ + Alias for class :class:`RectangularBeam`. + """ + return RectangularBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuBarreCercle(studyId, groupName, groupGeomObj, parameters, + name = "BARRE"): + """ + Alias for class :class:`CircularBeam`. + """ + return CircularBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuCable(studyId, groupName, groupGeomObj, parameters, name = "CABLE"): + """ + Alias for class :class:`CircularBeam`. + """ + return CircularBeam(studyId, groupName, groupGeomObj, parameters, name) + +def VisuCoque(studyId, groupName, groupGeomObj, parameters, name = "COQUE"): + """ + Alias for class :class:`ThickShell`. + """ + return ThickShell(studyId, groupName, groupGeomObj, parameters, name) + +def VisuGrille(studyId, groupName, groupGeomObj, parameters, name = "GRILLE"): + """ + Alias for class :class:`Grid`. + """ + return Grid(studyId, groupName, groupGeomObj, parameters, name) diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index 9098f1207..e11291430 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -437,6 +437,14 @@ def TestAll (geompy, math): nameS = geompy.SubShapeName(SubFaceS, Box) id_SubFace = geompy.addToStudyInFather(Box, SubFaceS, nameS) + # GetExistingSubObjects + SubObjsAll = geompy.GetExistingSubObjects(Box, True) + print "For now, Box has the following created sub-objects:", SubObjsAll + + # GetGroups + SubGrpsAll = geompy.GetGroups(Box) + print "For now, Box has the following created groups:", SubGrpsAll + # SubShapeAll SubEdgeList = geompy.SubShapeAll(SubFace, geompy.ShapeType["EDGE"]) i=0 diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py index ca37dd30b..a1607cd43 100644 --- a/src/GEOM_SWIG/GEOM_TestOthers.py +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -500,6 +500,17 @@ def TestOtherOperations (geompy, math): geompy.addToStudyInFather(blocksComp, pb0_top_1, "point from blocksComp (-50, 50, 50)") geompy.addToStudyInFather(blocksComp, pb0_bot_1, "point from blocksComp (-50, -50, -50)") + # GetVertexNearPoint(theShape, thePoint) + pb0_top_2_near = geompy.MakeVertex(40, 40, 40) + pb0_top_2 = geompy.GetVertexNearPoint(blocksComp, pb0_top_2_near) + + geompy.addToStudyInFather(blocksComp, pb0_top_2, "point from blocksComp near (40, 40, 40)") + + # GetEdge(theShape, thePoint1, thePoint2) + edge_top_y50 = geompy.GetEdge(blocksComp, pb0_top_1, pb0_top_2) + + geompy.addToStudyInFather(blocksComp, edge_top_y50, "edge from blocksComp by two points") + # GetEdgeNearPoint(theShape, thePoint) pmidle = geompy.MakeVertex(50, 0, 50) edge1 = geompy.GetEdgeNearPoint(blocksComp, pmidle) @@ -511,6 +522,11 @@ def TestOtherOperations (geompy, math): geompy.addToStudyInFather(blocksComp, b0_image, "b0 image") + # GetShapesNearPoint(theShape, thePoint, theShapeType, theTolerance) + b0_faces_plus = geompy.GetShapesNearPoint(blocksComp, pb0_top_2_near, geompy.ShapeType["FACE"], 0.01) + + geompy.addToStudyInFather(blocksComp, b0_faces_plus, "faces near point (40, 40, 40)") + # GetShapesOnPlane faces_on_pln = geompy.GetShapesOnPlane(blocksComp, geompy.ShapeType["FACE"], v_0pp, geompy.GEOM.ST_ONIN) diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 67657dce1..954896f5e 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -448,7 +448,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return New GEOM_Object, containing the created point. # # @ref tui_creation_point "Example" - def MakeVertex(self,theX, theY, theZ): + def MakeVertex(self, theX, theY, theZ): # Example: see GEOM_TestAll.py theX,theY,theZ,Parameters = ParseParameters(theX, theY, theZ) anObj = self.BasicOp.MakePointXYZ(theX, theY, theZ) @@ -1358,13 +1358,13 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theTol3D a 3d tolerance to be reached # @param theNbIter a number of iteration of approximation algorithm # @param theMethod Kind of method to perform filling operation: - # 0 - Default - standard behaviour - # 1 - Use edges orientation - orientation of edges are - # used: if edge is reversed curve from this edge - # is reversed before using in filling algorithm. - # 2 - Auto-correct orientation - change orientation - # of curves using minimization of sum of distances - # between ends points of edges. + # GEOM.FOM_Default - Default - standard behaviour + # /GEOM.FOM_UseOri - Use edges orientation - orientation of edges is + # used: if the edge is reversed, the curve from this edge + # is reversed before using it in the filling algorithm. + # /GEOM.FOM_AutoCorrect - Auto-correct orientation - changes the orientation + # of the curves using minimization of sum of distances + # between the end points of the edges. # @param isApprox if True, BSpline curves are generated in the process # of surface construction. By default it is False, that means # the surface is created using Besier curves. The usage of @@ -2052,6 +2052,32 @@ class geompyDC(GEOM._objref_GEOM_Gen): ## @addtogroup l4_decompose ## @{ + ## Get all sub-shapes and groups of \a theShape, + # that were created already by any other methods. + # @param theShape Any shape. + # @param theGroupsOnly If this parameter is TRUE, only groups will be + # returned, else all found sub-shapes and groups. + # @return List of existing sub-objects of \a theShape. + # + # @ref swig_all_decompose "Example" + def GetExistingSubObjects(self, theShape, theGroupsOnly = False): + # Example: see GEOM_TestAll.py + ListObj = self.ShapesOp.GetExistingSubObjects(theShape, theGroupsOnly) + RaiseIfFailed("GetExistingSubObjects", self.ShapesOp) + return ListObj + + ## Get all groups of \a theShape, + # that were created already by any other methods. + # @param theShape Any shape. + # @return List of existing groups of \a theShape. + # + # @ref swig_all_decompose "Example" + def GetGroups(self, theShape): + # Example: see GEOM_TestAll.py + ListObj = self.ShapesOp.GetExistingSubObjects(theShape, True) + RaiseIfFailed("GetExistingSubObjects", self.ShapesOp) + return ListObj + ## Explode a shape on subshapes of a given type. # @param aShape Shape to be exploded. # @param aType Type of sub-shapes to be retrieved. @@ -2266,11 +2292,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return New GEOM_Object, containing processed shape. # # @ref swig_todo "Example" - def ChangeOrientationShellCopy(self,theObject): + def ChangeOrientationShellCopy(self, theObject): anObj = self.HealOp.ChangeOrientationCopy(theObject) RaiseIfFailed("ChangeOrientationCopy", self.HealOp) return anObj + ## Try to limit tolerance of the given object by value \a theTolerance. + # @param theObject Shape to be processed. + # @param theTolerance Required tolerance value. + # @return New GEOM_Object, containing processed shape. + # + # @ref tui_limit_tolerance "Example" + def LimitTolerance(self, theObject, theTolerance = 1e-07): + anObj = self.HealOp.LimitTolerance(theObject, theTolerance) + RaiseIfFailed("LimitTolerance", self.HealOp) + return anObj + ## Get a list of wires (wrapped in GEOM_Object-s), # that constitute a free boundary of the given shape. # @param theObject Shape to get free boundary of. @@ -2280,7 +2317,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # theOpenWires: Open wires on the free boundary of the given shape. # # @ref tui_measurement_tools_page "Example" - def GetFreeBoundary(self,theObject): + def GetFreeBoundary(self, theObject): # Example: see GEOM_TestHealing.py anObj = self.HealOp.GetFreeBoundary(theObject) RaiseIfFailed("GetFreeBoundary", self.HealOp) @@ -3620,19 +3657,31 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return New GEOM_Object, containing the found vertex. # # @ref swig_GetPoint "Example" - def GetPoint(self,theShape, theX, theY, theZ, theEpsilon): + def GetPoint(self, theShape, theX, theY, theZ, theEpsilon): # Example: see GEOM_TestOthers.py anObj = self.BlocksOp.GetPoint(theShape, theX, theY, theZ, theEpsilon) RaiseIfFailed("GetPoint", self.BlocksOp) return anObj + ## Find a vertex of the given shape, which has minimal distance to the given point. + # @param theShape Any shape. + # @param thePoint Point, close to the desired vertex. + # @return New GEOM_Object, containing the found vertex. + # + # @ref swig_GetVertexNearPoint "Example" + def GetVertexNearPoint(self, theShape, thePoint): + # Example: see GEOM_TestOthers.py + anObj = self.BlocksOp.GetVertexNearPoint(theShape, thePoint) + RaiseIfFailed("GetVertexNearPoint", self.BlocksOp) + return anObj + ## Get an edge, found in the given shape by two given vertices. # @param theShape Block or a compound of blocks. # @param thePoint1,thePoint2 Points, close to the ends of the desired edge. # @return New GEOM_Object, containing the found edge. # - # @ref swig_todo "Example" - def GetEdge(self,theShape, thePoint1, thePoint2): + # @ref swig_GetEdge "Example" + def GetEdge(self, theShape, thePoint1, thePoint2): # Example: see GEOM_Spanner.py anObj = self.BlocksOp.GetEdge(theShape, thePoint1, thePoint2) RaiseIfFailed("GetEdge", self.BlocksOp) @@ -3644,7 +3693,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return New GEOM_Object, containing the found edge. # # @ref swig_GetEdgeNearPoint "Example" - def GetEdgeNearPoint(self,theShape, thePoint): + def GetEdgeNearPoint(self, theShape, thePoint): # Example: see GEOM_TestOthers.py anObj = self.BlocksOp.GetEdgeNearPoint(theShape, thePoint) RaiseIfFailed("GetEdgeNearPoint", self.BlocksOp) @@ -3692,7 +3741,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return New GEOM_Object, containing the found face. # # @ref swig_GetFaceNearPoint "Example" - def GetFaceNearPoint(self,theShape, thePoint): + def GetFaceNearPoint(self, theShape, thePoint): # Example: see GEOM_Spanner.py anObj = self.BlocksOp.GetFaceNearPoint(theShape, thePoint) RaiseIfFailed("GetFaceNearPoint", self.BlocksOp) @@ -3710,6 +3759,23 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("GetFaceByNormale", self.BlocksOp) return anObj + ## Find all subshapes of type \a theShapeType of the given shape, + # which have minimal distance to the given point. + # @param theShape Any shape. + # @param thePoint Point, close to the desired shape. + # @param theShapeType Defines what kind of subshapes is searched. + # @param theTolerance The tolerance for distances comparison. All shapes + # with distances to the given point in interval + # [minimal_distance, minimal_distance + theTolerance] will be gathered. + # @return New GEOM_Object, containing a group of all found shapes. + # + # @ref swig_GetShapesNearPoint "Example" + def GetShapesNearPoint(self, theShape, thePoint, theShapeType, theTolerance = 1e-07): + # Example: see GEOM_TestOthers.py + anObj = self.BlocksOp.GetShapesNearPoint(theShape, thePoint, theShapeType, theTolerance) + RaiseIfFailed("GetShapesNearPoint", self.BlocksOp) + return anObj + # end of l3_blocks_op ## @} diff --git a/src/GroupGUI/GroupGUI_GroupDlg.cxx b/src/GroupGUI/GroupGUI_GroupDlg.cxx index 6ff6b6a0e..3aa2195c8 100644 --- a/src/GroupGUI/GroupGUI_GroupDlg.cxx +++ b/src/GroupGUI/GroupGUI_GroupDlg.cxx @@ -473,7 +473,7 @@ void GroupGUI_GroupDlg::SelectionIntoArgument() } } else { // an attempt to synchronize list box selection with 3d viewer - if (myBusy) { + if ( myBusy || myMainObj->_is_nil() ) { return; } @@ -617,7 +617,8 @@ int GroupGUI_GroupDlg::getSelectedSubshapes (TColStd_IndexedMapOfInteger& theMap theMapIndex.Clear(); SalomeApp_Application* app = myGeomGUI->getApp(); - if (!app) return 0; + if ( !app || myMainObj->_is_nil() ) + return 0; LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); SALOME_ListIO aSelList; @@ -787,6 +788,7 @@ void GroupGUI_GroupDlg::activateSelection() myIsShapeType) // check if shape type is already choosen by user { GEOM_Displayer* aDisplayer = getDisplayer(); + int prevDisplayMode = aDisplayer->SetDisplayMode(0); SUIT_ViewWindow* aViewWindow = 0; SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); @@ -831,6 +833,7 @@ void GroupGUI_GroupDlg::activateSelection() } } aDisplayer->UpdateViewer(); + aDisplayer->SetDisplayMode(prevDisplayMode); } globalSelection(GEOM_ALLSHAPES); diff --git a/src/IGESImport/IGESImport.cxx b/src/IGESImport/IGESImport.cxx index 2c4eb04a9..a9ee6b7c6 100644 --- a/src/IGESImport/IGESImport.cxx +++ b/src/IGESImport/IGESImport.cxx @@ -19,12 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File: IGESImport.cxx +// Created: Wed May 19 14:36:35 2004 +// Author: Pavel TELKOV -// File: IGESImport.cxx -// Created: Wed May 19 14:36:35 2004 -// Author: Pavel TELKOV -// -// #include "utilities.h" #include @@ -32,15 +30,26 @@ #include #include #include +#include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include #include +#include +#include #include #include #include -#include #ifdef WNT #if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS @@ -72,7 +81,7 @@ IGESIMPORT_EXPORT TopoDS_Shape Import (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatName, TCollection_AsciiString& theError, - const TDF_Label&) + const TDF_Label& theShapeLabel) { // Set "C" numeric locale to save numbers correctly Kernel_Utils::Localizer loc; @@ -85,19 +94,19 @@ IGESIMPORT_EXPORT if (status == IFSelect_RetDone) { - if( theFormatName == "IGES_UNIT" ) { - Handle(IGESData_IGESModel) aModel = + if (theFormatName == "IGES_UNIT") { + Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel)::DownCast(aReader.Model()); gp_Pnt P(1.0,0.0,0.0); - if(!aModel.IsNull()) { - Handle(TCollection_HAsciiString) aUnitName = + if (!aModel.IsNull()) { + Handle(TCollection_HAsciiString) aUnitName = aModel->GlobalSection().UnitName(); //cout<<"aUnitName = "<ToCString()<String()=="MM") { P = gp_Pnt(0.001,0.0,0.0); } - else if( aUnitName->String()=="CM" ) { + else if (aUnitName->String()=="CM") { P = gp_Pnt(0.01,0.0,0.0); } } @@ -107,12 +116,12 @@ IGESIMPORT_EXPORT aResShape = V; return aResShape; } - if( theFormatName == "IGES_SCALE" ) { + if (theFormatName == "IGES_SCALE") { //cout<<"need re-scale a model"<GlobalSection(); aGS.SetUnitFlag(6); aModel->SetGlobalSection(aGS); @@ -129,6 +138,38 @@ IGESIMPORT_EXPORT MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes()); aResShape = aReader.OneShape(); + // BEGIN: Store names of sub-shapes from file + Handle(Interface_InterfaceModel) Model = aReader.WS()->Model(); + Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader(); + if (!TR.IsNull()) { + Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess(); + Standard_Integer nb = Model->NbEntities(); + for (Standard_Integer i = 1; i <= nb; i++) { + Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast(Model->Value(i)); + if (ent.IsNull() || ! ent->HasName()) continue; + + // find target shape + Handle(Transfer_Binder) binder = TP->Find(ent); + if (binder.IsNull()) continue; + TopoDS_Shape S = TransferBRep::ShapeResult(binder); + if (S.IsNull()) continue; + + // create label and set shape + TDF_Label L; + TDF_TagSource aTag; + L = aTag.NewChild(theShapeLabel); + TNaming_Builder tnBuild (L); + tnBuild.Generated(S); + + // set a name + TCollection_AsciiString string = ent->NameValue()->String(); + string.LeftAdjust(); + string.RightAdjust(); + TCollection_ExtendedString str (string); + TDataStd_Name::Set(L, str); + } + } + // END: Store names } else { // switch (status) { // case IFSelect_RetVoid: diff --git a/src/IGESImport/Makefile.am b/src/IGESImport/Makefile.am index 3f3b3815d..7613b4c16 100644 --- a/src/IGESImport/Makefile.am +++ b/src/IGESImport/Makefile.am @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # - # File : Makefile.in # Author : Pavel TELKOV # Modified by : Alexander BORODIN (OCN) - autotools usage # Module : GEOM # $Header$ -# + include $(top_srcdir)/adm_local/unix/make_common_starter.am # Libraries targets @@ -37,7 +36,7 @@ libIGESImport_la_CPPFLAGS = \ $(CAS_CPPFLAGS) \ $(KERNEL_CXXFLAGS) -libIGESImport_la_LDFLAGS = \ - $(STDLIB) \ - $(CAS_LDPATH) -lTKIGES \ +libIGESImport_la_LDFLAGS = \ + $(STDLIB) \ + $(CAS_LDPATH) -lTKIGES -lTKCAF -lTKLCAF \ $(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics diff --git a/src/Makefile.am b/src/Makefile.am index 446af680c..968fbdd33 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,7 +24,7 @@ SUBDIRS = ARCHIMEDE NMTDS NMTTools GEOMAlgo SKETCHER OCC2VTK GEOM \ BREPExport BREPImport IGESExport IGESImport STEPExport \ STEPImport STLExport VTKExport ShHealOper GEOMImpl GEOM_I \ - GEOMClient GEOM_I_Superv GEOM_SWIG + GEOMClient GEOM_I_Superv GEOM_SWIG GEOM_PY if GEOM_ENABLE_GUI SUBDIRS += OBJECT DlgRef GEOMFiltersSelection GEOMGUI GEOMBase GEOMToolsGUI \ @@ -40,4 +40,4 @@ DIST_SUBDIRS = ARCHIMEDE NMTDS NMTTools GEOMAlgo SKETCHER OCC2VTK GEOM BREPExpor GEOMToolsGUI DisplayGUI BasicGUI PrimitiveGUI GenerationGUI \ EntityGUI BuildGUI BooleanGUI TransformationGUI OperationGUI \ RepairGUI MeasureGUI GroupGUI BlocksGUI AdvancedGUI \ - GEOM_SWIG_WITHIHM + GEOM_SWIG_WITHIHM GEOM_PY diff --git a/src/MeasureGUI/Makefile.am b/src/MeasureGUI/Makefile.am index d495ab36b..e555d2d2f 100644 --- a/src/MeasureGUI/Makefile.am +++ b/src/MeasureGUI/Makefile.am @@ -118,5 +118,5 @@ libMeasureGUI_la_CPPFLAGS = \ libMeasureGUI_la_LDFLAGS = \ $(CAS_LDFLAGS) -lTKGeomBase \ - ../GEOMBase/libGEOMBase.la + ../GEOMBase/libGEOMBase.la ../DlgRef/libDlgRef.la diff --git a/src/MeasureGUI/MeasureGUI_AngleDlg.cxx b/src/MeasureGUI/MeasureGUI_AngleDlg.cxx index e59a4498e..b49a52284 100644 --- a/src/MeasureGUI/MeasureGUI_AngleDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_AngleDlg.cxx @@ -196,7 +196,9 @@ void MeasureGUI_AngleDlg::processObject() double anAngle = 0.; if (getParameters(anAngle)) { - myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(anAngle)); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "angle_precision", 6 ); + myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(anAngle, aPrecision)); redisplayPreview(); } else { diff --git a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx index 5794fae1f..501517307 100644 --- a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx @@ -30,6 +30,7 @@ #include "GeometryGUI.h" #include +#include #include #include @@ -143,14 +144,17 @@ void MeasureGUI_BndBoxDlg::processObject() myGrp->LineEdit32->setText( "" ); } else { - myGrp->LineEdit11->setText( tr( "%1" ).arg( aXMin, 12, 'f', 6 ) ); - myGrp->LineEdit12->setText( tr( "%1" ).arg( aXMax, 12, 'f', 6 ) ); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); - myGrp->LineEdit21->setText( tr( "%1" ).arg( aYMin, 12, 'f', 6 ) ); - myGrp->LineEdit22->setText( tr( "%1" ).arg( aYMax, 12, 'f', 6 ) ); + myGrp->LineEdit11->setText( DlgRef::PrintDoubleValue( aXMin, aPrecision ) ); + myGrp->LineEdit12->setText( DlgRef::PrintDoubleValue( aXMax, aPrecision ) ); - myGrp->LineEdit31->setText( tr( "%1" ).arg( aZMin, 12, 'f', 6 ) ); - myGrp->LineEdit32->setText( tr( "%1" ).arg( aZMax, 12, 'f', 6 ) ); + myGrp->LineEdit21->setText( DlgRef::PrintDoubleValue( aYMin, aPrecision ) ); + myGrp->LineEdit22->setText( DlgRef::PrintDoubleValue( aYMax, aPrecision ) ); + + myGrp->LineEdit31->setText( DlgRef::PrintDoubleValue( aZMin, aPrecision ) ); + myGrp->LineEdit32->setText( DlgRef::PrintDoubleValue( aZMax, aPrecision ) ); } } diff --git a/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx index 451743a53..b4a909c68 100644 --- a/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx @@ -244,9 +244,12 @@ void MeasureGUI_CenterMassDlg::processObject() getParameters( x, y, z ); myGrp->LineEdit1->setText( GEOMBase::GetName( myObj ) ); - myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( x ) ); - myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( y ) ); - myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( z ) ); + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( x, aPrecision ) ); + myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( y, aPrecision ) ); + myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( z, aPrecision ) ); displayPreview(); } diff --git a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx index 3be5f624a..baf8a5897 100644 --- a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx @@ -180,12 +180,15 @@ void MeasureGUI_DistanceDlg::processObject() gp_Pnt aPnt1, aPnt2; double aDist = 0.; if (getParameters(aDist, aPnt1, aPnt2)) { - myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist)); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + + myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist, aPrecision)); gp_XYZ aVec = aPnt2.XYZ() - aPnt1.XYZ(); - myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X())); - myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y())); - myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z())); + myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X(), aPrecision)); + myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y(), aPrecision)); + myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z(), aPrecision)); redisplayPreview(); } diff --git a/src/MeasureGUI/MeasureGUI_InertiaDlg.cxx b/src/MeasureGUI/MeasureGUI_InertiaDlg.cxx index 9d2c323c4..f6beab88a 100644 --- a/src/MeasureGUI/MeasureGUI_InertiaDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_InertiaDlg.cxx @@ -28,6 +28,7 @@ #include "MeasureGUI_Widgets.h" #include +#include #include @@ -142,21 +143,21 @@ void MeasureGUI_InertiaDlg::processObject() myGrp->LineEdit43->setText( "" ); } else { - myGrp->LineEdit11->setText( QString( "%1" ).arg( aMat( 1, 1 ), 12, 'e', 4 ) ); - myGrp->LineEdit12->setText( QString( "%1" ).arg( aMat( 1, 2 ), 12, 'e', 4 ) ); - myGrp->LineEdit13->setText( QString( "%1" ).arg( aMat( 1, 3 ), 12, 'e', 4 ) ); + myGrp->LineEdit11->setText( DlgRef::PrintDoubleValue( aMat( 1, 1 ), -6 ) ); + myGrp->LineEdit12->setText( DlgRef::PrintDoubleValue( aMat( 1, 2 ), -6 ) ); + myGrp->LineEdit13->setText( DlgRef::PrintDoubleValue( aMat( 1, 3 ), -6 ) ); - myGrp->LineEdit21->setText( QString( "%1" ).arg( aMat( 2, 1 ), 12, 'e', 4 ) ); - myGrp->LineEdit22->setText( QString( "%1" ).arg( aMat( 2, 2 ), 12, 'e', 4 ) ); - myGrp->LineEdit23->setText( QString( "%1" ).arg( aMat( 2, 3 ), 12, 'e', 4 ) ); + myGrp->LineEdit21->setText( DlgRef::PrintDoubleValue( aMat( 2, 1 ), -6 ) ); + myGrp->LineEdit22->setText( DlgRef::PrintDoubleValue( aMat( 2, 2 ), -6 ) ); + myGrp->LineEdit23->setText( DlgRef::PrintDoubleValue( aMat( 2, 3 ), -6 ) ); - myGrp->LineEdit31->setText( QString( "%1" ).arg( aMat( 3, 1 ), 12, 'e', 4 ) ); - myGrp->LineEdit32->setText( QString( "%1" ).arg( aMat( 3, 2 ), 12, 'e', 4 ) ); - myGrp->LineEdit33->setText( QString( "%1" ).arg( aMat( 3, 3 ), 12, 'e', 4 ) ); + myGrp->LineEdit31->setText( DlgRef::PrintDoubleValue( aMat( 3, 1 ), -6 ) ); + myGrp->LineEdit32->setText( DlgRef::PrintDoubleValue( aMat( 3, 2 ), -6 ) ); + myGrp->LineEdit33->setText( DlgRef::PrintDoubleValue( aMat( 3, 3 ), -6 ) ); - myGrp->LineEdit41->setText( QString( "%1" ).arg( anIXYZ.X(), 12, 'e', 4 ) ); - myGrp->LineEdit42->setText( QString( "%1" ).arg( anIXYZ.Y(), 12, 'e', 4 ) ); - myGrp->LineEdit43->setText( QString( "%1" ).arg( anIXYZ.Z(), 12, 'e', 4 ) ); + myGrp->LineEdit41->setText( DlgRef::PrintDoubleValue( anIXYZ.X(), -6 ) ); + myGrp->LineEdit42->setText( DlgRef::PrintDoubleValue( anIXYZ.Y(), -6 ) ); + myGrp->LineEdit43->setText( DlgRef::PrintDoubleValue( anIXYZ.Z(), -6 ) ); } } diff --git a/src/MeasureGUI/MeasureGUI_MaxToleranceDlg.cxx b/src/MeasureGUI/MeasureGUI_MaxToleranceDlg.cxx index b9a04fd2a..f3a6d0d46 100644 --- a/src/MeasureGUI/MeasureGUI_MaxToleranceDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_MaxToleranceDlg.cxx @@ -26,6 +26,7 @@ // #include "MeasureGUI_MaxToleranceDlg.h" #include "MeasureGUI_Widgets.h" +#include "DlgRef.h" #include #include @@ -131,14 +132,17 @@ void MeasureGUI_MaxToleranceDlg::processObject() double invalidMin = RealLast(); double invalidMax = -RealLast(); - myGrp->LineEdit11->setText( aMinFaceToler != invalidMin ? QString( "%1" ).arg( aMinFaceToler, 5, 'e', 8 ) : QString("") ); - myGrp->LineEdit12->setText( aMaxFaceToler != invalidMax ? QString( "%1" ).arg( aMaxFaceToler, 5, 'e', 8 ) : QString("") ); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "len_tol_precision", -9); - myGrp->LineEdit21->setText( aMinEdgeToler != invalidMin ? QString( "%1" ).arg( aMinEdgeToler, 5, 'e', 8 ) : QString("") ); - myGrp->LineEdit22->setText( aMaxEdgeToler != invalidMax ? QString( "%1" ).arg( aMaxEdgeToler, 5, 'e', 8 ) : QString("") ); + myGrp->LineEdit11->setText( aMinFaceToler != invalidMin ? DlgRef::PrintDoubleValue( aMinFaceToler, aPrecision ) : QString("") ); + myGrp->LineEdit12->setText( aMaxFaceToler != invalidMax ? DlgRef::PrintDoubleValue( aMaxFaceToler, aPrecision ) : QString("") ); - myGrp->LineEdit31->setText( aMinVertexToler != invalidMin ? QString( "%1" ).arg( aMinVertexToler, 5, 'e', 8 ) : QString("") ); - myGrp->LineEdit32->setText( aMaxVertexToler != invalidMax ? QString( "%1" ).arg( aMaxVertexToler, 5, 'e', 8 ) : QString("") ); + myGrp->LineEdit21->setText( aMinEdgeToler != invalidMin ? DlgRef::PrintDoubleValue( aMinEdgeToler, aPrecision ) : QString("") ); + myGrp->LineEdit22->setText( aMaxEdgeToler != invalidMax ? DlgRef::PrintDoubleValue( aMaxEdgeToler, aPrecision ) : QString("") ); + + myGrp->LineEdit31->setText( aMinVertexToler != invalidMin ? DlgRef::PrintDoubleValue( aMinVertexToler, aPrecision ) : QString("") ); + myGrp->LineEdit32->setText( aMaxVertexToler != invalidMax ? DlgRef::PrintDoubleValue( aMaxVertexToler, aPrecision ) : QString("") ); } //================================================================================= diff --git a/src/MeasureGUI/MeasureGUI_PointDlg.cxx b/src/MeasureGUI/MeasureGUI_PointDlg.cxx index c7ea535f0..c7064a96b 100644 --- a/src/MeasureGUI/MeasureGUI_PointDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_PointDlg.cxx @@ -172,9 +172,11 @@ void MeasureGUI_PointDlg::SelectionIntoArgument() if ( !aPoint.IsNull() ) { gp_Pnt aPnt = BRep_Tool::Pnt( aPoint ); myGrp->LineEdit1->setText( aName ); - myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( aPnt.X() ) ); - myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( aPnt.Y() ) ); - myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( aPnt.Z() ) ); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( aPnt.X(), aPrecision ) ); + myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( aPnt.Y(), aPrecision ) ); + myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( aPnt.Z(), aPrecision ) ); } } catch( ... ) diff --git a/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx b/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx index 861658e28..9621487ed 100644 --- a/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx @@ -139,9 +139,11 @@ void MeasureGUI_PropertiesDlg::processObject() myGrp->LineEdit4->setText( "" ); } else { - myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( aLength ) ); - myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( anArea ) ); - myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( aVolume ) ); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myGrp->LineEdit2->setText( DlgRef::PrintDoubleValue( aLength, aPrecision ) ); + myGrp->LineEdit3->setText( DlgRef::PrintDoubleValue( anArea, aPrecision ) ); + myGrp->LineEdit4->setText( DlgRef::PrintDoubleValue( aVolume, aPrecision ) ); } } diff --git a/src/MeasureGUI/MeasureGUI_WhatisDlg.cxx b/src/MeasureGUI/MeasureGUI_WhatisDlg.cxx index 04f91fb9e..b0d9695d6 100644 --- a/src/MeasureGUI/MeasureGUI_WhatisDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_WhatisDlg.cxx @@ -232,6 +232,9 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) QString aKindStr(""); theParameters = ""; + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aLenPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + if ( myObj->_is_nil() ) return aKindStr; @@ -253,7 +256,7 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) if ( !anOper->IsDone() ) return aKindStr; -#define PRINT_DOUBLE(val) QString(" %1").arg( DlgRef::PrintDoubleValue( val ) ) +#define PRINT_DOUBLE(val, tol) DlgRef::PrintDoubleValue( val, tol ) switch ( aKind ) { case GEOM::GEOM_IKindOfShape::COMPOUND: @@ -284,84 +287,84 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) case GEOM::GEOM_IKindOfShape::SPHERE: aKindStr = tr( "GEOM_SPHERE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[3] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::CYLINDER: aKindStr = tr( "GEOM_CYLINDER" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::BOX: aKindStr = tr( "GEOM_BOX" ); theParameters = tr( "GEOM_CENTER") + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + "Ax :" + PRINT_DOUBLE( aDbls[3] ) + - "\n" + "Ay :" + PRINT_DOUBLE( aDbls[4] ) + - "\n" + "Az :" + PRINT_DOUBLE( aDbls[5] ); + "\n" + "Ax :" + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + "Ay :" + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + "Az :" + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::ROTATED_BOX: aKindStr = tr( "GEOM_BOX" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\nZ Axis:" + - "\n" + "Zx :" + PRINT_DOUBLE( aDbls[3] ) + - "\n" + "Zy :" + PRINT_DOUBLE( aDbls[4] ) + - "\n" + "Zz :" + PRINT_DOUBLE( aDbls[5] ) + + "\n" + "Zx :" + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + "Zy :" + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + "Zz :" + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\nX Axis:" + - "\n" + tr( "GEOM_X_I" ).arg( "x" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_X_I" ).arg( "y" ) + PRINT_DOUBLE( aDbls[7] ) + - "\n" + tr( "GEOM_X_I" ).arg( "z" ) + PRINT_DOUBLE( aDbls[8] ) + + "\n" + tr( "GEOM_X_I" ).arg( "x" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_X_I" ).arg( "y" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ) + + "\n" + tr( "GEOM_X_I" ).arg( "z" ) + PRINT_DOUBLE( aDbls[8], aLenPrecision ) + "\nDimensions along local axes:" + - "\n" + "Ax :" + PRINT_DOUBLE( aDbls[9] ) + - "\n" + "Ay :" + PRINT_DOUBLE( aDbls[10] ) + - "\n" + "Az :" + PRINT_DOUBLE( aDbls[11] ); + "\n" + "Ax :" + PRINT_DOUBLE( aDbls[9], aLenPrecision ) + + "\n" + "Ay :" + PRINT_DOUBLE( aDbls[10], aLenPrecision ) + + "\n" + "Az :" + PRINT_DOUBLE( aDbls[11], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::TORUS: aKindStr = tr( "GEOM_TORUS" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::CONE: aKindStr = tr( "GEOM_CONE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7] ) + - "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[8] ); + "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ) + + "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[8], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::POLYHEDRON: aKindStr = tr( "GEOM_POLYHEDRON" ); @@ -373,114 +376,114 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) case GEOM::GEOM_IKindOfShape::SPHERE2D: aKindStr = tr( "GEOM_SURFSPHERE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[3] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::CYLINDER2D: aKindStr = tr( "GEOM_SURFCYLINDER" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::TORUS2D: aKindStr = tr( "GEOM_SURFTORUS" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::CONE2D: aKindStr = tr( "GEOM_SURFCONE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_AXIS" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7] ) + - "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[8] ); + "\n" + tr( "GEOM_RADIUS_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ) + + "\n" + tr( "GEOM_HEIGHT" ) + PRINT_DOUBLE( aDbls[8], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::DISK_CIRCLE: aKindStr = tr( "GEOM_DISK_CIRCLE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::DISK_ELLIPSE: aKindStr = tr( "GEOM_DISK_ELLIPSE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::POLYGON: aKindStr = tr( "GEOM_POLYGON" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ); + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::PLANE: aKindStr = tr( "GEOM_PLANE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ); + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::PLANAR: aKindStr = tr( "GEOM_PLANAR_FACE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ); + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::FACE: aKindStr = tr( "GEOM_FACE" ); @@ -489,94 +492,94 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) case GEOM::GEOM_IKindOfShape::CIRCLE: aKindStr = tr( "GEOM_CIRCLE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6] ); + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::ARC_CIRCLE: aKindStr = tr( "GEOM_ARC" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6] ) + + "\n" + tr( "GEOM_RADIUS" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + "\n" + tr( "GEOM_POINT_I" ).arg( 1 ) + - "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[7] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[8] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[9] ) + + "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[8], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[9], aLenPrecision ) + "\n" + tr( "GEOM_POINT_I" ).arg( 2 ) + - "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[10] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[11] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[12] ); + "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[10], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[11], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[12], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::ELLIPSE: aKindStr = tr( "GEOM_ELLIPSE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7] ); + "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::ARC_ELLIPSE: aKindStr = tr( "GEOM_ARC_ELLIPSE" ); theParameters = tr( "GEOM_CENTER" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_NORMAL" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ) + + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ) + "\n" + tr( "GEOM_DIMENSIONS" ) + - "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6] ) + - "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7] ) + + "\n" + tr( "GEOM_RADIUS_MAJOR" ) + PRINT_DOUBLE( aDbls[6], aLenPrecision ) + + "\n" + tr( "GEOM_RADIUS_MINOR" ) + PRINT_DOUBLE( aDbls[7], aLenPrecision ) + "\n" + tr( "GEOM_POINT_I" ).arg( 1 ) + - "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[8] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[9] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[10] ) + + "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[8], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[9], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[10], aLenPrecision ) + "\n" + tr( "GEOM_POINT_I" ).arg( 2 ) + - "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[11] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[12] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[13] ); + "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[11], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[12], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[13], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::LINE: aKindStr = tr( "GEOM_LINE" ); theParameters = tr( "GEOM_POSITION" ) + - "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 0 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_DIRECTION" ) + - "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5] ); + "\n" + tr( "GEOM_DX" ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_DY" ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_DZ" ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::SEGMENT: aKindStr = tr( "GEOM_SEGMENT" ); theParameters = tr( "GEOM_POINT_I" ).arg( 1 ) + - "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[2] ) + + "\n" + tr( "GEOM_X_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 1 ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ) + "\n" + tr( "GEOM_POINT_I" ).arg( 2 ) + - "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[3] ) + - "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[4] ) + - "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[5] ); + "\n" + tr( "GEOM_X_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[3], aLenPrecision ) + + "\n" + tr( "GEOM_Y_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[4], aLenPrecision ) + + "\n" + tr( "GEOM_Z_I" ).arg( 2 ) + PRINT_DOUBLE( aDbls[5], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::EDGE: aKindStr = tr( "GEOM_EDGE" ); @@ -584,9 +587,9 @@ QString MeasureGUI_WhatisDlg::getKindOfShape( QString& theParameters ) case GEOM::GEOM_IKindOfShape::VERTEX: aKindStr = tr( "GEOM_VERTEX" ); theParameters = tr( "GEOM_COORDINATES" ) + - "\n" + tr( "GEOM_X" ) + PRINT_DOUBLE( aDbls[0] ) + - "\n" + tr( "GEOM_Y" ) + PRINT_DOUBLE( aDbls[1] ) + - "\n" + tr( "GEOM_Z" ) + PRINT_DOUBLE( aDbls[2] ); + "\n" + tr( "GEOM_X" ) + PRINT_DOUBLE( aDbls[0], aLenPrecision ) + + "\n" + tr( "GEOM_Y" ) + PRINT_DOUBLE( aDbls[1], aLenPrecision ) + + "\n" + tr( "GEOM_Z" ) + PRINT_DOUBLE( aDbls[2], aLenPrecision ); break; case GEOM::GEOM_IKindOfShape::ADVANCED: { diff --git a/src/RepairGUI/Makefile.am b/src/RepairGUI/Makefile.am index c59c15056..7f8a4fcbe 100644 --- a/src/RepairGUI/Makefile.am +++ b/src/RepairGUI/Makefile.am @@ -38,6 +38,7 @@ salomeinclude_HEADERS = \ RepairGUI_FreeFacesDlg.h \ RepairGUI_ChangeOrientationDlg.h \ RepairGUI_GlueDlg.h \ + RepairGUI_LimitToleranceDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h # Libraries targets @@ -56,6 +57,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_FreeFacesDlg.h \ RepairGUI_ChangeOrientationDlg.h \ RepairGUI_GlueDlg.h \ + RepairGUI_LimitToleranceDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h \ \ RepairGUI.cxx \ @@ -70,6 +72,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_FreeFacesDlg.cxx \ RepairGUI_ChangeOrientationDlg.cxx \ RepairGUI_GlueDlg.cxx \ + RepairGUI_LimitToleranceDlg.cxx \ RepairGUI_RemoveExtraEdgesDlg.cxx MOC_FILES = \ @@ -84,6 +87,7 @@ MOC_FILES = \ RepairGUI_FreeFacesDlg_moc.cxx \ RepairGUI_ChangeOrientationDlg_moc.cxx \ RepairGUI_GlueDlg_moc.cxx \ + RepairGUI_LimitToleranceDlg_moc.cxx \ RepairGUI_RemoveExtraEdgesDlg_moc.cxx nodist_libRepairGUI_la_SOURCES = \ diff --git a/src/RepairGUI/RepairGUI.cxx b/src/RepairGUI/RepairGUI.cxx index 652cdb63a..ebfc75fb4 100644 --- a/src/RepairGUI/RepairGUI.cxx +++ b/src/RepairGUI/RepairGUI.cxx @@ -19,11 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// GEOM GEOMGUI : GUI for Geometry component +// File : RepairGUI.cxx +// Author : Damien COQUERET, Open CASCADE S.A.S. -// GEOM GEOMGUI : GUI for Geometry component -// File : RepairGUI.cxx -// Author : Damien COQUERET, Open CASCADE S.A.S. -// #include "RepairGUI.h" #include @@ -43,8 +42,9 @@ #include "RepairGUI_FreeBoundDlg.h" // Method FREE BOUNDARIES #include "RepairGUI_FreeFacesDlg.h" // Method FREE FACES #include "RepairGUI_GlueDlg.h" // Method GLUE FACES +#include "RepairGUI_LimitToleranceDlg.h" // Method LIMIT TOLERANCE #include "RepairGUI_ChangeOrientationDlg.h" // Method CHANGE ORIENTATION -#include "RepairGUI_RemoveExtraEdgesDlg.h" // Method REMOVE EXTRA EDGES +#include "RepairGUI_RemoveExtraEdgesDlg.h" // Method REMOVE EXTRA EDGES //======================================================================= // function : RepairGUI() @@ -66,7 +66,7 @@ RepairGUI::~RepairGUI() //======================================================================= // function : OnGUIEvent() -// purpose : +// purpose : //======================================================================= bool RepairGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) { @@ -77,18 +77,19 @@ bool RepairGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) QDialog* aDlg = NULL; switch ( theCommandID ) { - case GEOMOp::OpSewing: aDlg = new RepairGUI_SewingDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpGlueFaces: aDlg = new RepairGUI_GlueDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpSuppressFaces: aDlg = new RepairGUI_SuppressFacesDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpSuppressHoles: aDlg = new RepairGUI_RemoveHolesDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpShapeProcess: aDlg = new RepairGUI_ShapeProcessDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpCloseContour: aDlg = new RepairGUI_CloseContourDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpRemoveIntWires: aDlg = new RepairGUI_RemoveIntWiresDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpAddPointOnEdge: aDlg = new RepairGUI_DivideEdgeDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpFreeBoundaries: aDlg = new RepairGUI_FreeBoundDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpFreeFaces: aDlg = new RepairGUI_FreeFacesDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpOrientation: aDlg = new RepairGUI_ChangeOrientationDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpRemoveExtraEdges: aDlg = new RepairGUI_RemoveExtraEdgesDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpSewing: aDlg = new RepairGUI_SewingDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpGlueFaces: aDlg = new RepairGUI_GlueDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpLimitTolerance: aDlg = new RepairGUI_LimitToleranceDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpSuppressFaces: aDlg = new RepairGUI_SuppressFacesDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpSuppressHoles: aDlg = new RepairGUI_RemoveHolesDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpShapeProcess: aDlg = new RepairGUI_ShapeProcessDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpCloseContour: aDlg = new RepairGUI_CloseContourDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpRemoveIntWires: aDlg = new RepairGUI_RemoveIntWiresDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpAddPointOnEdge: aDlg = new RepairGUI_DivideEdgeDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpFreeBoundaries: aDlg = new RepairGUI_FreeBoundDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpFreeFaces: aDlg = new RepairGUI_FreeFacesDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpOrientation: aDlg = new RepairGUI_ChangeOrientationDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpRemoveExtraEdges: aDlg = new RepairGUI_RemoveExtraEdgesDlg (getGeometryGUI(), parent); break; default: app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); break; diff --git a/src/RepairGUI/RepairGUI_LimitToleranceDlg.cxx b/src/RepairGUI/RepairGUI_LimitToleranceDlg.cxx new file mode 100644 index 000000000..19cfe7a02 --- /dev/null +++ b/src/RepairGUI/RepairGUI_LimitToleranceDlg.cxx @@ -0,0 +1,441 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// GEOM RepairGUI : GUI for Geometry component +// File : RepairGUI_LimitToleranceDlg.cxx + +#include "RepairGUI_LimitToleranceDlg.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#define DEFAULT_TOLERANCE_VALUE 1e-07 + +//================================================================================= +// class : RepairGUI_LimitToleranceDlg() +// purpose : Constructs a RepairGUI_LimitToleranceDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_LimitToleranceDlg::RepairGUI_LimitToleranceDlg(GeometryGUI* theGeometryGUI, + QWidget* parent, bool modal) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal) +{ + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_LIMIT_TOLERANCE"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setWindowTitle(tr("GEOM_LIMIT_TOLERANCE_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_LIMIT_TOLERANCE_TITLE")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->close(); + + GroupPoints = new DlgRef_1SelExt(centralWidget()); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setIcon(image1); + GroupPoints->LineEdit1->setReadOnly(true); + + QLabel* aTolLab = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints->Box); + myTolEdt = new SalomeApp_DoubleSpinBox(GroupPoints->Box); + initSpinBox(myTolEdt, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision"); + myTolEdt->setValue(DEFAULT_TOLERANCE_VALUE); + + QGridLayout* boxLayout = new QGridLayout(GroupPoints->Box); + boxLayout->setMargin(0); boxLayout->setSpacing(6); + boxLayout->addWidget(aTolLab, 0, 0); + boxLayout->addWidget(myTolEdt, 0, 2); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(GroupPoints); + + setHelpFileName("limit_tolerance_operation_page.html"); + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_LimitToleranceDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_LimitToleranceDlg::~RepairGUI_LimitToleranceDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_LimitToleranceDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + + //myGeomGUI->SetState(0); + //globalSelection(GEOM_COMPOUND); + + mainFrame()->GroupBoxPublish->show(); + + /* signals and slots connections */ + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + initName(tr("LIMIT_TOLERANCE_NEW_OBJ_NAME")); + + ConstructorsClicked(0); + + activateSelection(); + updateButtonState(); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void RepairGUI_LimitToleranceDlg::ConstructorsClicked(int constructorId) +{ + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + + GroupPoints->show(); + GroupPoints->LineEdit1->setText(""); + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setFocus(); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + + updateButtonState(); + activateSelection(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_LimitToleranceDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_LimitToleranceDlg::ClickOnApply() +{ + if (!onAcceptLocal()) + return false; + + initName(); + + ConstructorsClicked(0); + + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void RepairGUI_LimitToleranceDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() == 1) { + Handle(SALOME_InteractiveObject) anIO = aSelList.First(); + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject(anIO, aRes); + if (aRes) + myEditCurrentArgument->setText(GEOMBase::GetName(myObject)); + } + updateButtonState(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_LimitToleranceDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if (send == GroupPoints->PushButton1) { + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_LimitToleranceDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if (send == GroupPoints->LineEdit1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_LimitToleranceDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + activateSelection(); +} + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_LimitToleranceDlg::enterEvent(QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_LimitToleranceDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_LimitToleranceDlg::isValid(QString& msg) +{ + double v = myTolEdt->value(); + bool ok = myTolEdt->isValid(msg, true); + return !myObject->_is_nil() && (v > 0.) && ok; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_LimitToleranceDlg::execute(ObjectList& objects) +{ + bool aResult = false; + objects.clear(); + + GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var anObj = anOper->LimitTolerance(myObject, myTolEdt->value()); + aResult = !anObj->_is_nil(); + if (aResult) { + QStringList aParameters; + aParameters << myTolEdt->text(); + anObj->SetParameters(aParameters.join(":").toLatin1().constData()); + objects.push_back(anObj._retn()); + } + + return aResult; +} + +//================================================================ +// Function : onAccept +// Purpose : This method should be called from dialog's slots onOk() and onApply() +// It perfroms user input validation, then it +// performs a proper operation and manages transactions, etc. +//================================================================ +bool RepairGUI_LimitToleranceDlg::onAcceptLocal() +{ + if (!getStudy() || !(getStudy()->studyDS())) + return false; + + _PTR(Study) aStudy = getStudy()->studyDS(); + + bool aLocked = aStudy->GetProperties()->IsLocked(); + if (aLocked) { + MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("WRN_STUDY_LOCKED"), tr("BUT_OK")); + return false; + } + + QString msg; + if (!isValid(msg)) { + showError(msg); + return false; + } + + try { + if (openCommand()) { + SUIT_OverrideCursor wc; + + myGeomGUI->getApp()->putInfo(""); + ObjectList objects; + + if (!execute(objects)) { + wc.suspend(); + abortCommand(); + showError(); + } + else { + const int nbObjs = objects.size(); + for (ObjectList::iterator it = objects.begin(); it != objects.end(); ++it) { + QString aName = getNewObjectName(); + if (nbObjs > 1) { + if (aName.isEmpty()) + aName = getPrefix(*it); + aName = GEOMBase::GetDefaultName(aName); + } + else { + // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() + if (aName.isEmpty()) + aName = GEOMBase::GetDefaultName(getPrefix(*it)); + } + addInStudy(*it, aName.toLatin1().data()); + display(*it, false); + } + + if (nbObjs) { + commitCommand(); + updateObjBrowser(); + myGeomGUI->getApp()->putInfo(QObject::tr("GEOM_PRP_DONE")); + } + else { + abortCommand(); + } + + // JFA 28.12.2004 BEGIN // To enable warnings + GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); + if (!CORBA::is_nil(anOper) && !anOper->IsDone()) { + wc.suspend(); + QString msgw = QObject::tr(anOper->GetErrorCode()); + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), msgw, tr("BUT_OK")); + } + // JFA 28.12.2004 END + } + } + } + catch(const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + abortCommand(); + } + + updateViewer(); + activateSelection(); + updateButtonState(); + + return true; +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection +//================================================================================= +void RepairGUI_LimitToleranceDlg::activateSelection() +{ + disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + globalSelection(GEOM_ALLSHAPES); + if (myObject->_is_nil()) + SelectionIntoArgument(); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + updateViewer(); +} + +//================================================================================= +// function : updateButtonState +// purpose : Update button state +//================================================================================= +void RepairGUI_LimitToleranceDlg::updateButtonState() +{ + bool hasMainObj = !myObject->_is_nil(); + buttonOk()->setEnabled(hasMainObj); + buttonApply()->setEnabled(hasMainObj); +} + +//================================================================================= +// function : restoreSubShapes +// purpose : +//================================================================================= +void RepairGUI_LimitToleranceDlg::restoreSubShapes(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) +{ + if (mainFrame()->CheckBoxRestoreSS->isChecked()) { + // empty list of arguments means that all arguments should be restored + getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(), + GEOM::FSM_GetInPlace, /*theInheritFirstArg=*/true, + mainFrame()->CheckBoxAddPrefix->isChecked()); + } +} diff --git a/src/RepairGUI/RepairGUI_LimitToleranceDlg.h b/src/RepairGUI/RepairGUI_LimitToleranceDlg.h new file mode 100644 index 000000000..bba1dbfff --- /dev/null +++ b/src/RepairGUI/RepairGUI_LimitToleranceDlg.h @@ -0,0 +1,83 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// GEOM GEOMGUI : GUI for Geometry component +// File : RepairGUI_LimitToleranceDlg.h + +#ifndef REPAIRGUI_LIMITTOLERANCEDLG_H +#define REPAIRGUI_LIMITTOLERANCEDLG_H + +#include + +class DlgRef_1SelExt; +class SalomeApp_DoubleSpinBox; +class QPushButton; +class QCheckBox; + +//================================================================================= +// class : RepairGUI_LimitToleranceDlg +// purpose : +//================================================================================= +class RepairGUI_LimitToleranceDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + RepairGUI_LimitToleranceDlg (GeometryGUI*, QWidget* = 0, bool = false); + ~RepairGUI_LimitToleranceDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual void restoreSubShapes (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); + +private: + void Init(); + void enterEvent (QEvent*); + void initSelection(); + + bool onAcceptLocal(); + + void activateSelection(); + void updateButtonState(); + +private: + GEOM::GEOM_Object_var myObject; + + DlgRef_1SelExt* GroupPoints; + SalomeApp_DoubleSpinBox* myTolEdt; + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + + void ActivateThisDialog(); + + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + + void ConstructorsClicked( int ); +}; + +#endif // REPAIRGUI_LIMITTOLERANCEDLG_H diff --git a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx index 51afbd167..90c9a3d9c 100644 --- a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx +++ b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx @@ -252,6 +252,7 @@ void RepairGUI_RemoveExtraEdgesDlg::enterEvent(QEvent* e) void RepairGUI_RemoveExtraEdgesDlg::activateSelection() { TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_SHELL ); aTypes.Add( GEOM_SOLID ); aTypes.Add( GEOM_COMPOUND ); globalSelection( aTypes ); diff --git a/src/STEPImport/Makefile.am b/src/STEPImport/Makefile.am index 6a912182e..06b1224ba 100644 --- a/src/STEPImport/Makefile.am +++ b/src/STEPImport/Makefile.am @@ -43,4 +43,4 @@ libSTEPImport_la_CPPFLAGS = \ libSTEPImport_la_LDFLAGS = \ $(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics \ $(STDLIB) \ - $(CAS_LDPATH) -lTKSTEP + $(CAS_LDPATH) -lTKSTEP -lTKCAF -lTKLCAF -lTKSTEPBase diff --git a/src/STEPImport/STEPImport.cxx b/src/STEPImport/STEPImport.cxx index e6819dcb2..0ba785429 100644 --- a/src/STEPImport/STEPImport.cxx +++ b/src/STEPImport/STEPImport.cxx @@ -19,12 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File: STEPImport.cxx +// Created: Wed May 19 14:41:10 2004 +// Author: Pavel TELKOV -// File: STEPImport.cxx -// Created: Wed May 19 14:41:10 2004 -// Author: Pavel TELKOV -// -// #include "utilities.h" #include @@ -34,13 +32,31 @@ #include #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include #include #include #include #include +#include #include +#include +#include +#include +#include + #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -70,11 +86,11 @@ extern "C" { -STEPIMPORT_EXPORT + STEPIMPORT_EXPORT TopoDS_Shape Import (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& /*theFormatName*/, TCollection_AsciiString& theError, - const TDF_Label&) + const TDF_Label& theShapeLabel) { MESSAGE("Import STEP model from file " << theFileName.ToCString()); // Set "C" numeric locale to save numbers correctly @@ -87,7 +103,7 @@ STEPIMPORT_EXPORT //VRV: OCC 4.0 migration TopoDS_Compound compound; BRep_Builder B; - B.MakeCompound( compound ); + B.MakeCompound(compound); try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; @@ -95,13 +111,13 @@ STEPIMPORT_EXPORT IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { - Standard_Boolean failsonly = Standard_False ; - aReader.PrintCheckLoad (failsonly, IFSelect_ItemsByEntity); + Standard_Boolean failsonly = Standard_False; + aReader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity); /* Root transfers */ Standard_Integer nbr = aReader.NbRootsForTransfer(); - aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); + aReader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity); - for ( Standard_Integer n=1; n <= nbr; n++) { + for (Standard_Integer n = 1; n <= nbr; n++) { Standard_Boolean ok = aReader.TransferRoot(n); /* Collecting resulting entities */ Standard_Integer nbs = aReader.NbShapes(); @@ -116,22 +132,76 @@ STEPIMPORT_EXPORT break; } - for ( Standard_Integer i=1; i<=nbs; i++ ) { + for (Standard_Integer i = 1; i <= nbs; i++) { TopoDS_Shape aShape = aReader.Shape(i); - if ( aShape.IsNull() ) { + if (aShape.IsNull()) { // THROW_SALOME_CORBA_EXCEPTION("Null shape in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM) ; //return aResShape; continue; } else { - B.Add( compound, aShape ) ; + B.Add(compound, aShape); } } } - if ( aResShape.IsNull() ) + if (aResShape.IsNull()) aResShape = compound; - } else { + // BEGIN: Store names of sub-shapes from file + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aResShape, anIndices); + + Handle(Interface_InterfaceModel) Model = aReader.WS()->Model(); + Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader(); + if (!TR.IsNull()) { + Handle(Transfer_TransientProcess) TP = TR->TransientProcess(); + Handle(Standard_Type) tPD = STANDARD_TYPE(StepBasic_ProductDefinition); + + Standard_Integer nb = Model->NbEntities(); + for (Standard_Integer ie = 1; ie <= nb; ie++) { + Handle(Standard_Transient) enti = Model->Value(ie); + if (enti->DynamicType() != tPD) continue; + + Handle(StepBasic_ProductDefinition) PD = + Handle(StepBasic_ProductDefinition)::DownCast(enti); + if (PD.IsNull()) continue; + + Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct(); + if (Prod->Name()->UsefullLength() <= 0) continue; + + Handle(TCollection_HAsciiString) aName = Prod->Name(); + TCollection_ExtendedString aNameExt (aName->ToCString()); + + // find target shape + Handle(Transfer_Binder) binder = TP->Find(enti); + if (binder.IsNull()) continue; + TopoDS_Shape S = TransferBRep::ShapeResult(binder); + if (S.IsNull()) continue; + + // as PRODUCT can be included in the main shape + // several times, we look here for all iclusions. + Standard_Integer isub, nbSubs = anIndices.Extent(); + for (isub = 1; isub <= nbSubs; isub++) + { + TopoDS_Shape aSub = anIndices.FindKey(isub); + if (aSub.IsPartner(S)) { + // create label and set shape + TDF_Label L; + TDF_TagSource aTag; + L = aTag.NewChild(theShapeLabel); + TNaming_Builder tnBuild (L); + //tnBuild.Generated(S); + tnBuild.Generated(aSub); + + // set a name + TDataStd_Name::Set(L, aNameExt); + } + } + } + } + // END: Store names + } + else { // switch (status) { // case IFSelect_RetVoid: // theError = "Nothing created or No data to process"; -- 2.39.2
  • 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 HXXF11LPsPa literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/salome-geom-structuralelements.png b/doc/salome/gui/GEOM/images/salome-geom-structuralelements.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed41b12f9ace3c5ac932c478fdef0d35a64c349 GIT binary patch literal 171661 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/geompypkg.doc b/doc/salome/gui/GEOM/input/geompypkg.doc new file mode 100644 index 000000000..bd507959a --- /dev/null +++ b/doc/salome/gui/GEOM/input/geompypkg.doc @@ -0,0 +1,44 @@ +/*! + +\page geompypkg_page Programming Interface of GEOM python package + +Sorry, but the documentation is not available yet in doxygen format. + +Fortunately, a documentation exists in restructured format and then +can be generated here using sphinx, in the expectative of the doxygen +version. This documentation is available +here. + +Here is a sample generated from the doxygen format: + +The GEOM python package essentially contains: + +