]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Merge from V6_2_BR 23/12/2010
authorinv <inv@opencascade.com>
Fri, 24 Dec 2010 08:16:18 +0000 (08:16 +0000)
committerinv <inv@opencascade.com>
Fri, 24 Dec 2010 08:16:18 +0000 (08:16 +0000)
53 files changed:
Makefile.am
configure.ac
doc/docutils/Makefile.am
doc/docutils/conf.py [deleted file]
doc/docutils/conf.py.in [new file with mode: 0644]
doc/salome/gui/GEOM/Makefile.am
doc/salome/gui/GEOM/input/common_operation.doc
doc/salome/gui/GEOM/input/cut_operation.doc
doc/salome/gui/GEOM/input/fuse_operation.doc
doc/salome/gui/GEOM/input/index.doc
doc/salome/gui/GEOM/input/partition.doc
doc/salome/gui/GEOM/input/related_docs.doc [new file with mode: 0644]
doc/salome/gui/GEOM/input/section_operation.doc
doc/salome/gui/GEOM/input/tui_measurement_tools.doc
doc/salome/gui/GEOM/input/using_boolean_operations.doc
doc/salome/gui/GEOM/static/SALOME_BOA_PA.pdf [new file with mode: 0755]
idl/GEOM_Gen.idl
src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx
src/GEOMAlgo/GEOMAlgo_Builder_1.cxx
src/GEOMAlgo/GEOMAlgo_Builder_2.cxx
src/GEOMAlgo/GEOMAlgo_Builder_3.cxx
src/GEOMAlgo/GEOMAlgo_ShapeSet.cdl
src/GEOMAlgo/GEOMAlgo_ShapeSet.cxx
src/GEOMAlgo/GEOMAlgo_ShapeSet.hxx
src/GEOMAlgo/GEOMAlgo_Tools3D.cxx
src/GEOMClient/GEOM_Client.cxx
src/GEOMClient/GEOM_Client.hxx
src/GEOMGUI/GEOMGUI_Selection.cxx
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GEOM_msg_fr.ts
src/GEOMImpl/GEOMImpl_IRotate.hxx
src/GEOMImpl/GEOMImpl_IShapesOperations.cxx
src/GEOMImpl/GEOMImpl_ITransformOperations.cxx
src/GEOMImpl/GEOMImpl_ITransformOperations.hxx
src/GEOMImpl/GEOMImpl_RotateDriver.cxx
src/GEOMImpl/GEOMImpl_TranslateDriver.cxx
src/GEOM_I/GEOM_Gen_i.cc
src/GEOM_I/GEOM_ITransformOperations_i.cc
src/GEOM_I/GEOM_ITransformOperations_i.hh
src/GEOM_I/GEOM_Object_i.cc
src/GEOM_I/GEOM_Object_i.hh
src/GEOM_SWIG/GEOM_TestMeasures.py
src/GEOM_SWIG/GEOM_TestOthers.py
src/GEOM_SWIG/geompyDC.py
src/OBJECT/GEOM_AISShape.cxx
src/OCC2VTK/GEOM_EdgeSource.cxx
src/OCC2VTK/GEOM_EdgeSource.h
src/OperationGUI/OperationGUI_GetSharedShapesDlg.cxx
src/OperationGUI/OperationGUI_GetSharedShapesDlg.h
src/OperationGUI/OperationGUI_PartitionDlg.cxx
src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx
src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx

index ce1de12db1f27b1fb42958b9ef444ca7a6bdb0d4..7805363def13d50b4c0983722a7aaee4e3f521b6 100644 (file)
@@ -37,7 +37,7 @@ SUBDIRS = idl adm_local resources src doc bin
 
 DIST_SUBDIRS = idl adm_local resources src doc bin 
 
-DISTCLEANFILES = a.out aclocal.m4 configure local-install.sh
+DISTCLEANFILES = a.out aclocal.m4 configure local-install.sh hack_libtool
 
 salomeinclude_DATA = GEOM_version.h
 
index e2c9c42d26f6f3e36ce2ef4d2be6a40515dc1a2b..576198231b3ae3d24e4200c41e492d9fa983351d 100644 (file)
@@ -389,6 +389,9 @@ sed -i "s%^CC=\"\(.*\)\"%hack_libtool (){ \n\
   $(pwd)/hack_libtool \1 \"\$[@]\" \n\
 }\n\
 CC=\"hack_libtool\"%g" libtool
+sed -i "s%\(\s*\)for searchdir in \$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path; do%\1searchdirs=\"\$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path\"\n\1for searchdir in \$searchdirs; do%g" libtool
+sed -i "s%\(\s*\)searchdirs=\"\$newlib_search_path \$lib_search_path \(.*\)\"%\1searchdirs=\"\$newlib_search_path \$lib_search_path\"\n\1sss_beg=\"\"\n\1sss_end=\"\2\"%g" libtool
+sed -i "s%\(\s*\)\(for searchdir in \$searchdirs; do\)%\1for sss in \$searchdirs; do\n\1  if ! test -d \$sss; then continue; fi\n\1  ssss=\$(cd \$sss; pwd)\n\1  if test \"\$ssss\" != \"\" \&\& test -d \$ssss; then\n\1    case \$ssss in\n\1      /usr/lib | /usr/lib64 ) ;;\n\1      * ) sss_beg=\"\$sss_beg \$ssss\" ;;\n\1    esac\n\1  fi\n\1done\n\1searchdirs=\"\$sss_beg \$sss_end\"\n\1\2%g" libtool
 ],[])
 
 # This list is initiated using autoscan and must be updated manually
@@ -405,6 +408,7 @@ AC_OUTPUT([ \
   GEOM_version.h \
   doc/Makefile \
   doc/docutils/Makefile \
+  doc/docutils/conf.py \
   doc/salome/Makefile \
   doc/salome/gui/Makefile \
   doc/salome/gui/GEOM/Makefile \
index 9b16cc04d994b432c8ced01002924ae0925edc0b..8a744e38847aa3d16bf9581ac563e722a81b5874 100644 (file)
@@ -49,7 +49,7 @@ htm:
        mkdir -p html doctrees
        PYTHONPATH=$(SPHINX_PYTHONPATH):${PYTHONPATH} \
        LD_LIBRARY_PATH=$(SPHINX_LD_LIBRARY_PATH):${LD_LIBRARY_PATH} \
-       $(SPHINXBUILD) -W -b html $(ALLSPHINXOPTS) html
+       $(SPHINXBUILD) -c $(top_builddir)/doc/docutils -W -b html $(ALLSPHINXOPTS) html
        @echo
        @echo "Build finished. The HTML pages are in html."
 
@@ -57,7 +57,7 @@ latex:
        mkdir -p latex doctrees
        PYTHONPATH=$(SPHINX_PYTHONPATH):${PYTHONPATH} \
        LD_LIBRARY_PATH=$(SPHINX_LD_LIBRARY_PATH):${LD_LIBRARY_PATH} \
-       $(SPHINXBUILD) -W -b latex $(ALLSPHINXOPTS) latex
+       $(SPHINXBUILD) -c $(top_builddir)/doc/docutils -W -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" \
@@ -73,9 +73,6 @@ RSTFILES= \
 
 EXTRA_DIST+= $(RSTFILES)
 
-EXTRA_DIST+= \
-       conf.py 
-
 install-data-local: html/index.html
        test -z $(pydocdir) || mkdir -p $(DESTDIR)$(pydocdir)
        if test -d "html"; then b=; else b="$(srcdir)/"; fi; \
diff --git a/doc/docutils/conf.py b/doc/docutils/conf.py
deleted file mode 100644 (file)
index c7e2c6e..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-# -*- 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 = '6.2.0'
-# The full version, including alpha/beta/rc tags.
-release = '6.2.0'
-
-# 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
-# "<project> v<release> 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/<name>.
-html_copy_source = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> 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/conf.py.in b/doc/docutils/conf.py.in
new file mode 100644 (file)
index 0000000..da8e3e2
--- /dev/null
@@ -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 = '@VERSION@'
+# The full version, including alpha/beta/rc tags.
+release = '@VERSION@'
+
+# 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
+# "<project> v<release> 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/<name>.
+html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> 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
index 9740ec3ec02ea9b45604bfb19d3d80901670f6c2..73f4f232d435ed54c5382ace1a49abe11bd54f6f 100755 (executable)
 #
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
-EXTRA_DIST += images input static/footer.html static/doxygen.css
+EXTRA_DIST += images input static/footer.html static/doxygen.css static/SALOME_BOA_PA.pdf
 
 guidocdir = $(docdir)/gui/GEOM
-guidoc_DATA = images/head.png
+guidoc_DATA = images/head.png static/SALOME_BOA_PA.pdf
 
 usr_docs: doxyfile_tui doxyfile_py doxyfile
        echo "===========================================" ;                    \
index dfefce0dfd9799e5732548532f9ff245f772aa7d..15a3607ffa9aeaf47683888cd550be49b2135e66 100644 (file)
@@ -2,19 +2,25 @@
 
 \page common_operation_page Common
 
-\n To produce a \b Common operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Common</b>
+For detail description of the Boolean operations please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
 
-\n This operation cuts the common part of two shapes and transforms it into an independent geometrical object.
+To produce a \b Common operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Common</b>
 
-\n The \b Result will be any \b GEOM_Object.
-\n <b>TUI Command:</b> <em>geompy.MakeCommon(s1, s2)</em>
-\n <b>Arguments:</b> Name + 2 shapes.
-\n <b>Advanced option:</b>
-   \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
+This operation cuts the common part of two shapes and transforms it into an independent geometrical object.
+
+The \b Result will be any \b GEOM_Object.
+<b>TUI Command:</b> <em>geompy.MakeCommon(s1, s2)</em>
+<b>Arguments:</b> Name + 2 shapes.
+<b>Advanced option:</b>
+\ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
 
 \image html bool2.png
 
-\n <b>Example:</b>
+<b>Example:</b>
 
 \image html fusesn1.png "The initial shapes"
 
index bab9ca7b80b9f837bc954f64e07177cf5d096570..3eee98514b2016a3ee594b2a8eae22dbcf927878 100644 (file)
@@ -2,19 +2,25 @@
 
 \page cut_operation_page Cut
 
-\n To produce a \b Cut operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Cut</b>
+For detail description of the Boolean operations please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
 
-\n This operation cuts a shape with another one.
-\n The \b Result will be any \b GEOM_Object.
-\n <b>Arguments:</b> Name + 2 shapes.
-\n <b>Advanced option:</b>
-   \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
+To produce a \b Cut operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Cut</b>
 
-\n <b>Dialog Box:</b>
+This operation cuts a shape with another one.
+The \b Result will be any \b GEOM_Object.
+<b>Arguments:</b> Name + 2 shapes.
+<b>Advanced option:</b>
+\ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
+
+<b>Dialog Box:</b>
 
 \image html bool3.png
 
-\n <b>Example:</b>
+<b>Example:</b>
 
 \image html fusesn1.png "The initial shapes"
 
index ece199c5c3832c75a4bfce791340b69ceb37a126..42026ee9990e0cbe6af6000793df19ca17d6c545 100644 (file)
@@ -2,20 +2,26 @@
 
 \page fuse_operation_page Fuse
 
-\n To produce a \b Fuse operation in the <b>Main Menu</b> select
+For detail description of the Boolean operations please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
+
+To produce a \b Fuse operation in the <b>Main Menu</b> select
 <b>Operations - > Boolean - > Fuse</b>
 
-\n This operation creates a shape from two shapes.
+This operation creates a shape from two shapes.
 
-\n The \b Result will be any \b GEOM_Object.
-\n <b>TUI Command:</b> <em>geompy.MakeFuse(s1, s2)</em>
-\n <b>Arguments:</b> Name + 2 shapes.
-\n <b>Advanced option:</b>
-   \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
+The \b Result will be any \b GEOM_Object.
+<b>TUI Command:</b> <em>geompy.MakeFuse(s1, s2)</em>
+<b>Arguments:</b> Name + 2 shapes.
+<b>Advanced option:</b>
+\ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
 
 \image html bool1.png
 
-\n <b>Example:</b>
+<b>Example:</b>
 
 \image html fusesn1.png "The initial shapes"
 
index 856e03a54dc607580b73ae862598fad27f7c6952..b4368cbcd8ee28ce3ea646ccd9cfc2d18b16a240 100644 (file)
@@ -27,5 +27,7 @@ Also it can be useful to have a look at the \subpage geompypkg_page "documentati
 
 \image html image3.png "Example of Geometry module usage for engineering tasks"
 
+There are also \subpage related_docs_page "additional reference documents"
+for Geometry module that can be useful.
 
 */
index c802d76118b98466db24643ad916561a55603f23..446d525afb642228bc9e36130452f449ea44aac1 100644 (file)
@@ -2,6 +2,12 @@
 
 \page partition_page Partition
 
+For detail description of the Partition operation please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
+
 To produce a \b Partition in the <b>Main Menu</b> select <b>Operations - > Partition</b>
 
 This operation builds a compound by intersection of several shapes
diff --git a/doc/salome/gui/GEOM/input/related_docs.doc b/doc/salome/gui/GEOM/input/related_docs.doc
new file mode 100644 (file)
index 0000000..fea4ba0
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+\page related_docs_page Related Documents
+
+Here you can find additional reference documents for Geometry module
+that can be useful for reading.
+
+<a href="SALOME_BOA_PA.pdf">General Fuse Algorithm, Partition
+Algorithm, Boolean Operations Algorithm. Backgrounds.</a>
+
+*/
index c4f450d3071cd9e2f759b172dd2886107be58ccb..6dd99f642c05766f433a56a38ae95348a00268eb 100644 (file)
@@ -2,20 +2,26 @@
 
 \page section_opeartion_page Section
 
-\n To produce a \b Section operation in the <b>Main Menu</b> select
+For detail description of the Boolean operations please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
+
+To produce a \b Section operation in the <b>Main Menu</b> select
 <b>Operations - > Boolean - > Section</b>
 
-\n This operation creates the section between 2 shapes.
+This operation creates the section between 2 shapes.
 
-\n The \b Result will be any \b GEOM_Object (EDGE or WIRE).
-\n <b>TUI Command:</b> <em>geompy.MakeSection(s1, s2)</em>
-\n <b>Arguments:</b> Name + 2 shapes.
-\n <b>Advanced option:</b>
-   \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
+The \b Result will be any \b GEOM_Object (EDGE or WIRE).
+<b>TUI Command:</b> <em>geompy.MakeSection(s1, s2)</em>
+<b>Arguments:</b> Name + 2 shapes.
+<b>Advanced option:</b>
+\ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments".
 
 \image html neo-section.png
 
-\n <b>Example:</b>
+<b>Example:</b>
 
 \image html fusesn1.png "The initial shapes"
 
index 0112bd0da4420525ac24b1c74deafc5dced56cd8..f8dbcd38c42efef3fcdc4b6ee12e2a7567c7837c 100644 (file)
@@ -357,6 +357,20 @@ print "\nBox 100x30x100 description:"
 print Descr
 \endcode
 
+<br><h2>NbShapes and ShapeInfo</h2>
+
+\code
+import geompy
+
+# create a box
+box = geompy.MakeBoxDXDYDZ(100,30,100)
+nbSolids = geompy.NbShapes(box, geompy.ShapeType["SOLID"])
+print "\nBox 100x30x100 quantity of solids:", nbSolids
+boxInfo = geompy.ShapeInfo(box)
+print "\nBox 100x30x100 shapes:"
+print boxInfo
+\endcode
+
 <br><h2>Check Shape</h2>
 
 \code
index c7fd67b75c75c6365be91f5d3a5e93094952a8b8..cfbb5f4446d3d7f612020c7d3df353ef1a31a8ba 100644 (file)
@@ -2,7 +2,13 @@
 
 \page using_boolean_operations_page Using Boolean Operations
 
-\n You can use the following boolean operations for construction of more
+For detail description of the Boolean operations please refer to
+<a href="SALOME_BOA_PA.pdf">this document</a>. 
+It provides a general review of the Partition and Boolean
+operations algorithms, describes the usage methodology and highlighs
+major limitations of these operations.
+
+You can use the following boolean operations for construction of more
 complex geometrical objects (2D & 3D elements):
 
 <ul>
@@ -38,7 +44,7 @@ Shape2 is the second argument of Cut operation;
 <em>geompy.MakeSection(Shape1, Shape2)</em>, where \em Shape1 and \em
 Shape2 is the second argument of Section operation;
 
-\n Our <b>TUI Scripts</b> provide you with useful examples of the use of 
+Our <b>TUI Scripts</b> provide you with useful examples of the use of 
 \ref tui_boolean_operations_page "Boolean Operations".
 
 */
diff --git a/doc/salome/gui/GEOM/static/SALOME_BOA_PA.pdf b/doc/salome/gui/GEOM/static/SALOME_BOA_PA.pdf
new file mode 100755 (executable)
index 0000000..f0da9b2
Binary files /dev/null and b/doc/salome/gui/GEOM/static/SALOME_BOA_PA.pdf differ
index 868dc7f92c9e1fb273a94e9cc46556c8f05cea03..18efa2a0cda928bfd6b79356b9b826e09a79f58d 100644 (file)
@@ -111,7 +111,12 @@ module GEOM
     FSM_GetShapesOnShape,
 
     /*! Use GetInPlaceByHistory method (can work only after Partition) */
-    FSM_GetInPlaceByHistory
+    FSM_GetInPlaceByHistory,
+
+    /*! To be used only for multi-transformation result.
+     *  Only this method can be used after multi-transformation.
+     */
+    FSM_MultiTransformed
   };
 
   /*!
@@ -180,10 +185,19 @@ module GEOM
      *  This function is useful for the compounds only; for simple shapes it
      *  exactly the same value as GetShapeType().
      *  Note, that compounds are procesed recursively.
-     *  \sa GetShapeType(), GetTopologyType()
+     *  \sa GetShapeType(), GetTopologyType(), GetMaxShapeType()
      */
     shape_type GetMinShapeType();
 
+    /*!
+     *  Get a maximal type of the top-level shapes contained in the object.
+     *  This function is useful for the compounds only; for simple shapes it
+     *  exactly the same value as GetShapeType().
+     *  Note, that compounds are procesed recursively.
+     *  \sa GetShapeType(), GetTopologyType(), GetMinShapeType()
+     */
+    shape_type GetMaxShapeType();
+    
     /*!
      *  Set name of the object.
      *  \param theName is a name which will be associated with this object.
@@ -968,13 +982,23 @@ module GEOM
      *        \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);
 
+    /*!
+     *  Transform the shape in the same way what was used for the sample shape creation.
+     *  \param theObject The object to be transformed.
+     *  \param theSample The object containing information about required transformation.
+     *  \note Implementation of this method is limited by multi-transformations now.
+     *  \note Internal method.
+     *  \return New GEOM_Object, containing the transformed shape.
+     */
+    GEOM_Object TransformLikeOtherCopy (in GEOM_Object theObject,
+                                        in GEOM_Object theSample);
+
     /*!
      *  Recompute the shape from its arguments.
      *  \param theObject The object to be recomputed.
index 2bc49887d4fb2ecbc73ced113fa9156055587458..07be8c7fbe22aa6a068c3a5a58276ca07d0ac694 100755 (executable)
@@ -95,10 +95,14 @@ static
   void MakeInternalShells(const TopTools_MapOfShape& ,
                           TopTools_ListOfShape& );
 
-//modified by NIZNHY-PKV Tue Aug  5 15:06:50 2008f
 static
-  Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell);
-//modified by NIZNHY-PKV Tue Aug  5 15:06:57 2008t
+  Standard_Boolean IsClosedShell(const TopoDS_Shell& );
+
+//modified by NIZNHY-PKV Tue Oct 26 13:30:39 2010f
+static
+  Standard_Boolean RefineShell(const TopoDS_Shell& , 
+                              TopoDS_Shell& );
+//modified by NIZNHY-PKV Tue Oct 26 13:30:42 2010t
 
 //=======================================================================
 //function : 
@@ -187,15 +191,17 @@ static
       if (!myShapesToAvoid.Contains(aF)) {
         TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
       }
-      else {
-        int a=0;
+      /*
+      else { 
+       int a=0; 
       }
+      */
     }
     aNbE=aMEF.Extent();
     //
     // 2. myFacesToAvoid
     for (i=1; i<=aNbE; ++i) {
-      const TopoDS_Edge& aE=TopoDS::Edge(aMEF.FindKey(i));
+      const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aMEF.FindKey(i)));
       if (BRep_Tool::Degenerated(aE)) {
         continue;
       }
@@ -209,7 +215,7 @@ static
       //
       aOrE=aE.Orientation();
       //
-      const TopoDS_Face& aF1=TopoDS::Face(aLF.First());
+      const TopoDS_Face& aF1=*((TopoDS_Face*)(&aLF.First()));
       if (aNbF==1) {
         if (aOrE==TopAbs_INTERNAL) {
           continue;
@@ -218,7 +224,7 @@ static
         myShapesToAvoid.Add(aF1);
       }
       else if (aNbF==2) {
-        const TopoDS_Face& aF2=TopoDS::Face(aLF.Last());
+        const TopoDS_Face& aF2=*((TopoDS_Face*)(&aLF.Last()));
         if (aF2.IsSame(aF1)) {
           if (BRep_Tool::IsClosed(aE, aF1)) {
             continue;
@@ -233,7 +239,7 @@ static
           myShapesToAvoid.Add(aF2);
         }
       }
-      //DEB
+      /*//DEB         
       else {
         TopTools_ListIteratorOfListOfShape aItLF;
         //
@@ -243,7 +249,7 @@ static
           int a=0;
         }
       }
-      //DEB
+      *///DEB
     }// for (i=1; i<=aNbE; ++i) {
     //
     if (!bFound) {
@@ -262,12 +268,12 @@ static
   //
   myLoops.Clear();
   //
-  Standard_Integer aNbLF, aNbOff, aNbFP, aNbFA;
+  Standard_Integer aNbLF, aNbOff, aNbFP;
   TopAbs_Orientation anOr;
   TopoDS_Edge aEL;
   BRep_Builder aBB;
   NMTTools_CoupleOfShape aCSOff;
-  TopTools_MapOfOrientedShape AddedFacesMap;//, aMFP;
+  TopTools_MapOfOrientedShape AddedFacesMap;
   TopTools_IndexedDataMapOfShapeListOfShape aEFMap, aMEFP;
   TopTools_ListIteratorOfListOfShape aItF, aIt;
   TopTools_MapIteratorOfMapOfOrientedShape aItM;
@@ -304,12 +310,12 @@ static
     // loop on faces added to Shell; add their neighbor faces to Shell and so on
     TopoDS_Iterator aItAddedF (aShell);
     for (; aItAddedF.More(); aItAddedF.Next()) {
-      const TopoDS_Face& aF = TopoDS::Face(aItAddedF.Value());
+      const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value()));
       //
       // loop on edges of aF; find a good neighbor face of aF by aE
       TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE);
       for (; aEdgeExp.More(); aEdgeExp.Next()) {
-        const TopoDS_Edge& aE = TopoDS::Edge(aEdgeExp.Current());
+        const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aEdgeExp.Current()));
         //
         //1
         if (aMEFP.Contains(aE)) {
@@ -344,7 +350,7 @@ static
         //
         aItLF.Initialize(aLF);
         for (; aItLF.More(); aItLF.Next()) { 
-          const TopoDS_Face& aFL=TopoDS::Face(aItLF.Value());
+          const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItLF.Value()));
           if (myShapesToAvoid.Contains(aFL)) {
             continue;
           }
@@ -372,7 +378,7 @@ static
         //
         TopoDS_Face aSelF;
         if (aNbOff==1) {
-          aSelF=TopoDS::Face(aLCSOff.First().Shape2());
+          aSelF=*((TopoDS_Face*)(&aLCSOff.First().Shape2()));
         }
         else if (aNbOff>1){
           GEOMAlgo_Tools3D::GetFaceOff(aE, aF, aLCSOff, aSelF);
@@ -384,24 +390,22 @@ static
         }
       } // for (; aEdgeExp.More(); aEdgeExp.Next()) { 
     } //for (; aItAddedF.More(); aItAddedF.Next()) {
-    //modified by NIZNHY-PKV Tue Aug  5 15:07:08 2008f
-    //myLoops.Append(aShell);
+    //
     if (IsClosedShell(aShell)) {
       myLoops.Append(aShell);
     }
-    /*
+    //modified by NIZNHY-PKV Wed Oct 27 07:10:41 2010f
     else {
-      TopoDS_Iterator aItS;
-      aItS.Initialize(aShell);
-      for (; aItS.More(); aItS.Next()) {
-        const TopoDS_Shape& aFs=aItS.Value();
-        aMFP.Add(aFs);
+      Standard_Boolean bRefine;
+      TopoDS_Shell aShx;
+      //
+      bRefine=RefineShell(aShell, aShx);
+      if (bRefine) {
+       myLoops.Append(aShx);
       }
     }
-    */
-    //modified by NIZNHY-PKV Tue Aug  5 15:07:30 2008t
-  } // for (; aItF.More(); aItF.Next()) {
-  //modified by NIZNHY-PKV Tue Aug  5 15:07:35 2008f
+    //modified by NIZNHY-PKV Wed Oct 27 07:10:44 2010t
+  } // for (; aItF.More(); aItF.Next()) { 
   //
   // Post Treatment
   TopTools_MapOfOrientedShape aMP;
@@ -417,14 +421,14 @@ static
     }
   }
   // 
-  // b. collect all edges that are to avoid
+  // b. collect all faces that are to avoid
   aItM.Initialize(myShapesToAvoid);
   for (; aItM.More(); aItM.Next()) {
     const TopoDS_Shape& aF=aItM.Key();
     aMP.Add(aF);
   }
   //
-  // c. add all edges that are not processed to myShapesToAvoid
+  // c. add all faces that are not processed to myShapesToAvoid
   aIt.Initialize (myShapes);
   for (; aIt.More(); aIt.Next()) {
     const TopoDS_Shape& aF=aIt.Value();
@@ -432,7 +436,6 @@ static
       myShapesToAvoid.Add(aF);
     }
   }
-  //modified by NIZNHY-PKV Tue Aug  5 15:07:44 2008t
   //=================================================
   //
   // 2.Internal Shells
@@ -442,8 +445,6 @@ static
   aEFMap.Clear();
   AddedFacesMap.Clear();
   //
-  aNbFA=myShapesToAvoid.Extent();
-  //
   aItM.Initialize(myShapesToAvoid);
   for (; aItM.More(); aItM.Next()) {
     const TopoDS_Shape& aFF=aItM.Key();
@@ -464,15 +465,15 @@ static
     //
     TopoDS_Iterator aItAddedF (aShell);
     for (; aItAddedF.More(); aItAddedF.Next()) {
-      const TopoDS_Face& aF = TopoDS::Face(aItAddedF.Value());
+      const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value()));
       //
       TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE);
       for (; aEdgeExp.More(); aEdgeExp.Next()) {
-        const TopoDS_Edge& aE = TopoDS::Edge(aEdgeExp.Current());
+        const TopoDS_Edge& aE = *((TopoDS_Edge*)(&aEdgeExp.Current()));
         const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE);
         aItF.Initialize(aLF);
         for (; aItF.More(); aItF.Next()) { 
-          const TopoDS_Face& aFL=TopoDS::Face(aItF.Value());
+          const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItF.Value()));
           if (AddedFacesMap.Add(aFL)){
             aBB.Add(aShell, aFL);
           }
@@ -518,10 +519,8 @@ static
     }
     else{
       // check if a shell is a hole
-      //XX
       bIsHole=IsHole(aShell, myContext);
-      //bIsHole=GEOMAlgo_BuilderTools::IsHole(aShell);
-      //XX
+      //
       if (bIsHole) {
         aHoleShells.Append(aShell);
         TopExp::MapShapes(aShell, TopAbs_FACE, aMHF);
@@ -581,7 +580,7 @@ static
   // 3. Add aHoles to Solids
   aItMSH.Initialize(aMSH);
   for (; aItMSH.More(); aItMSH.Next()) {
-    TopoDS_Solid aSolid=TopoDS::Solid(aItMSH.Key());
+    TopoDS_Solid aSolid=*((TopoDS_Solid*)(&aItMSH.Key()));
     //
     const TopTools_ListOfShape& aLH=aItMSH.Value();
     aShellIt.Initialize(aLH);
@@ -637,7 +636,7 @@ static
   // 2 Process solids
   aSolidIt.Initialize(myAreas);
   for ( ; aSolidIt.More(); aSolidIt.Next()) {
-    TopoDS_Solid& aSolid=TopoDS::Solid(aSolidIt.Value());
+    TopoDS_Solid& aSolid=*((TopoDS_Solid*)(&aSolidIt.Value()));
     //
     aMEF.Clear();
     TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMEF);
@@ -646,7 +645,7 @@ static
     aMFP.Clear();
     aItMF.Initialize(aMF);
     for (; aItMF.More(); aItMF.Next()) {
-      const TopoDS_Face& aF=TopoDS::Face(aItMF.Key());
+      const TopoDS_Face& aF=*((TopoDS_Face*)(&aItMF.Key()));
       if (GEOMAlgo_Tools3D::IsInternalFace(aF, aSolid, aMEF, 1.e-14, *myContext)) {
         aMFP.Add(aF);
       }
@@ -792,7 +791,6 @@ Standard_Boolean IsGrowthShell(const TopoDS_Shape& theShell,
   }
   return bRet;
 }
-//modified by NIZNHY-PKV Tue Aug  5 15:07:50 2008f
 //=======================================================================
 //function : IsClosedShell
 //purpose  : 
@@ -811,18 +809,15 @@ Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell)
     const TopoDS_Face& aF=TopoDS::Face(aIt.Value());
     aExp.Init(aF, TopAbs_EDGE);
     for (; aExp.More(); aExp.Next()) {
-      const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current());
+      const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aExp.Current()));
       if (BRep_Tool::Degenerated(aE)) {
         continue;
       }
-      /*
-      if (BRep_Tool::IsClosed(aE, aF)) {
-        continue;
-      }
-      */
+      //
       if (aE.Orientation()==TopAbs_INTERNAL) {
         continue;
       }
+      //
       if (!aM.Add(aE)) {
         aM.Remove(aE);
       }
@@ -835,8 +830,89 @@ Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell)
   }
   return bRet;
 }
-//modified by NIZNHY-PKV Tue Aug  5 15:08:07 2008t
-//BRepTools::Write(aFF, "ff");
+//modified by NIZNHY-PKV Tue Oct 26 13:30:23 2010f
+//=======================================================================
+//function : RefineShell
+//purpose  :
+//=======================================================================
+  Standard_Boolean RefineShell(const TopoDS_Shell& aShell,
+                              TopoDS_Shell& aShx)
+                              
+{
+  Standard_Boolean bRet;
+  Standard_Integer i, aNbE, aNbF;
+  TopAbs_Orientation aOrE;
+  TopTools_IndexedDataMapOfShapeListOfShape aMEF;
+  TopTools_MapOfOrientedShape aMFx;
+  // 
+  bRet=Standard_False;
+  //
+  TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
+  aNbE=aMEF.Extent();
+  for (i=1; i<=aNbE; ++i) {
+    const TopoDS_Edge &aE=*((TopoDS_Edge*)(&aMEF.FindKey(i)));
+    //
+    if (BRep_Tool::Degenerated(aE)) {
+      continue;
+    }
+    //
+    aOrE=aE.Orientation();
+    //
+    const TopTools_ListOfShape& aLF=aMEF(i);
+    aNbF=aLF.Extent();
+    if (!aNbF) {
+      continue;
+    }
+    //
+    const TopoDS_Face& aF1=*((TopoDS_Face*)(&aLF.First()));
+    if (aNbF==1) {
+      if (aOrE==TopAbs_INTERNAL) {
+       continue;
+      }
+      aMFx.Add(aF1);
+    }
+    //
+    else if (aNbF==2) {
+      const TopoDS_Face& aF2=*((TopoDS_Face*)(&aLF.Last()));
+      if (aF2.IsSame(aF1)) {
+       if (BRep_Tool::IsClosed(aE, aF1)) {
+         continue;
+       }
+       if (aOrE==TopAbs_INTERNAL) {
+         continue;
+       }
+       aMFx.Add(aF1);
+       aMFx.Add(aF2);
+      }
+    }
+  }
+  //
+  aNbF=aMFx.Extent();
+  if (!aNbF) {
+    return bRet;
+  } 
+  //
+  BRep_Builder aBB;
+  TopoDS_Iterator aIt;
+  //
+  aNbF=0;
+  aBB.MakeShell(aShx);
+  aIt.Initialize(aShell);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aF=aIt.Value();
+    if (!aMFx.Contains(aF)) {
+      aBB.Add(aShx, aF);
+      ++aNbF;
+    }
+  }
+  //
+  if (aNbF) {
+    bRet=IsClosedShell(aShx);
+  }
+  //
+  return bRet;
+}
+//modified by NIZNHY-PKV Tue Oct 26 13:30:26 2010t
 //
 //  ErrorStatus :
 // 11 - Null Context
index a6a2885ea565758672938a2778abbaa5d6db6df8..2c9f3d66e46f2dc75e6ff37a11640af2b10efa73 100755 (executable)
@@ -116,7 +116,7 @@ static
   IntTools_Context& aCtx=pPF->ChangeContext();
   //
   Standard_Boolean bToReverse;
-  Standard_Integer i, aNb, aNbSp, nSp, nSpR, nSpx, aIsCB;
+  Standard_Integer i, aNb, aNbSp, nSp, nSpR, nSpx, aIsCB, aNbLB;
   TColStd_ListIteratorOfListOfInteger aItLB;
   TColStd_ListOfInteger aLB;
   TopoDS_Edge aEE, aESpR;
@@ -150,16 +150,17 @@ static
       nSp=aPB.Edge();
       const TopoDS_Shape& aSp=aDS.Shape(nSp);
       //
-      //modified by NIZNHY-PKV Fri Nov 30 10:40:36 2007 f
-      //const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB, aLB);
       const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB, aLB, aIsCB);
-      //modified by NIZNHY-PKV Fri Nov 30 10:40:48 2007t
+      //modified by NIZNHY-PKV Wed Oct 27 11:19:30 2010f
+      aNbLB=aLB.Extent();
+      if (aIsCB && aNbLB<2) {
+       aIsCB=0;
+      }
+      //modified by NIZNHY-PKV Wed Oct 27 11:19:34 2010t
+      //
       nSpR=aPBR.Edge();
       const TopoDS_Shape& aSpR=aDS.Shape(nSpR);
-      //modified by NIZNHY-PKV Fri Nov 30 10:41:39 2007f
-      //if (aSpR.IsSame(aSp) && aSpR.IsSame(aE)) {
       if (aSpR.IsSame(aSp) && aSpR.IsSame(aE) && !aIsCB) {
-        //modified by NIZNHY-PKV Fri Nov 30 10:41:46 2007t
         continue;
       }
       //
@@ -183,10 +184,7 @@ static
       aIt.Initialize(aLPB);
       for (; aIt.More(); aIt.Next()) {
         const BOPTools_PaveBlock& aPB=aIt.Value();
-        //modified by NIZNHY-PKV Fri Nov 30 10:42:15 2007f
-        //const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB, aLB);
         const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB, aLB, aIsCB);
-        //modified by NIZNHY-PKV Fri Nov 30 10:42:20 2007t
         nSpR=aPBR.Edge();
         const TopoDS_Shape& aSpR=aDS.Shape(nSpR);
         //
@@ -203,7 +201,6 @@ static
           const TopoDS_Shape& aSpx=aDS.Shape(nSpx);
           mySameDomainShapes.Add(aSpx ,aSpR);
         }
-        //
       }
     }
     //
index b35ec2975a2f2414ec2a40c6a1c87e13f631e8ef..2aa155bb5c74c856a7814bca51c9f9beba779a73 100755 (executable)
@@ -70,6 +70,8 @@
 #include <BOPTools_CArray1OfESInterference.hxx>
 
 #include <NMTDS_ShapesDataStructure.hxx>
+#include <NMTDS_InterfPool.hxx>
+
 #include <NMTTools_PaveFiller.hxx>
 #include <NMTTools_ListOfCoupleOfShape.hxx>
 #include <NMTTools_Tools.hxx>
@@ -84,7 +86,8 @@
 #include <GEOMAlgo_Tools3D.hxx>
 #include <GEOMAlgo_WireEdgeSet.hxx>
 #include <GEOMAlgo_BuilderFace.hxx>
-#include <NMTDS_InterfPool.hxx>
+
+#include <GEOMAlgo_ShapeSet.hxx>
 
 static
   void UpdateCandidates(const Standard_Integer ,
@@ -254,6 +257,9 @@ static
         aNbSE=aLSE.Extent();
         if (aNbSE) {
           aMFP.Add(i);
+         //modified by NIZNHY-PKV Wed Oct 27 11:40:57 2010f
+         break;
+         //modified by NIZNHY-PKV Wed Oct 27 11:41:07 2010t
         }
       }
     }
@@ -358,46 +364,35 @@ static
     }
     //
     // 2.2. Build images Faces
-    GEOMAlgo_BuilderFace aBF;
+    TopTools_ListOfShape aLFR;
+    GEOMAlgo_ShapeSet aS1, aS2;
     //
-    aBF.SetFace(aFF);
-    aBF.SetContext(aCtx);
     const TopTools_ListOfShape& aSE=aWES.StartElements();
-    //
-    //DEB f
-    /*
-    {
-      TopoDS_Compound aCx;
-      BRep_Builder aBBx;
-      TopTools_ListIteratorOfListOfShape aItx;
+    //modified by NIZNHY-PKV Thu Oct 28 08:30:41 2010f
+    aS1.Add(aSE);
+    aS2.Add(aFF, TopAbs_EDGE);
+    if (aS1.IsEqual(aS2)) {
+      aLFR.Append(aF);
+    }
+    //modified by NIZNHY-PKV Thu Oct 28 08:30:42 2010t
+    else {
+      GEOMAlgo_BuilderFace aBF;
       //
-      aBBx.MakeCompound(aCx);
-      aBBx.Add(aCx, aFF);
-      aItx.Initialize(aSE);
-      for (; aItx.More(); aItx.Next()) {
-        TopoDS_Shape& aEx=aItx.Value();
-        aBBx.Add(aCx, aEx);
-      }
-      int a=0;
-    }
-    */
-    //DEB t
-    //
-    aBF.SetShapes(aSE);
-    //
-    aBF.Perform();
-    //
-    const TopTools_ListOfShape& aLF=aBF.Areas();
-    //
-    TopTools_ListOfShape aLFR;
-    //
-    aIt.Initialize(aLF);
-    for (; aIt.More(); aIt.Next()) {
-      TopoDS_Shape& aFR=aIt.Value();
-      if (anOriF==TopAbs_REVERSED) {
-        aFR.Orientation(TopAbs_REVERSED);
+      aBF.SetFace(aFF);
+      aBF.SetContext(aCtx);
+      aBF.SetShapes(aSE);
+      // <-DEB
+      aBF.Perform();
+      //
+      const TopTools_ListOfShape& aLF=aBF.Areas();
+      aIt.Initialize(aLF);
+      for (; aIt.More(); aIt.Next()) {
+       TopoDS_Shape& aFR=aIt.Value();
+       if (anOriF==TopAbs_REVERSED) {
+         aFR.Orientation(TopAbs_REVERSED);
+       }
+       aLFR.Append(aFR);
       }
-      aLFR.Append(aFR);
     }
     //
     // 2.3. Collect draft images Faces
@@ -530,7 +525,7 @@ static
 //=======================================================================
   void GEOMAlgo_Builder::FillImagesFaces1()
 {
-  Standard_Integer i, aNb, iSense;
+  Standard_Integer i, aNb, iSense, aNbLFx;
   TopoDS_Face aF, aFSp, aFSD;
   TopTools_ListOfShape aLFx;
   TopTools_ListIteratorOfListOfShape aIt;
@@ -568,7 +563,16 @@ static
         aLFx.Append(aFSD);
       }
     }
-    if (!myImages.HasImage(aF)) {//XX
+    if (!myImages.HasImage(aF)) {
+      //modified by NIZNHY-PKV Wed Oct 27 14:41:34 2010f
+      aNbLFx=aLFx.Extent();
+      if (aNbLFx==1) {
+       const TopoDS_Shape& aFx=aLFx.First();
+       if (aF.IsSame(aFx)) {
+         continue;
+       }
+      }
+      //modified by NIZNHY-PKV Wed Oct 27 14:41:36 2010t
       myImages.Bind(aF, aLFx);
     }
   }
@@ -803,3 +807,20 @@ void UpdateCandidates(const Standard_Integer theNF,
     theMFMV.Add(theNF, aMV);
   }
 }
+
+/*
+    {
+      TopoDS_Compound aCx;
+      BRep_Builder aBBx;
+      TopTools_ListIteratorOfListOfShape aItx;
+      //
+      aBBx.MakeCompound(aCx);
+      aBBx.Add(aCx, aFF);
+      aItx.Initialize(aSE);
+      for (; aItx.More(); aItx.Next()) {
+        TopoDS_Shape& aEx=aItx.Value();
+        aBBx.Add(aCx, aEx);
+      }
+      int a=0;
+    }
+    */
index ea602fe605202b383a97dd11602eebc1c97a0d74..68393f472b414742947214abdc465b1435ceb652 100755 (executable)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File    : GEOMAlgo_Builder_3.cxx
+//  Created :
+//  Author  : Peter KURNEV
 
-// File:        GEOMAlgo_Builder_3.cxx
-// Created:     
-// Author:      Peter KURNEV
-//
 #include <GEOMAlgo_Builder.hxx>
 
 #include <TopAbs_State.hxx>
@@ -75,7 +74,7 @@ static
 
 //=======================================================================
 //function : FillImagesSolids
-//purpose  : 
+//purpose  :
 //=======================================================================
   void GEOMAlgo_Builder::FillImagesSolids()
 {
@@ -87,9 +86,9 @@ static
 }
 //=======================================================================
 //function : BuildDraftSolid
-//purpose  : 
+//purpose  :
 //=======================================================================
-  void GEOMAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
+void GEOMAlgo_Builder::BuildDraftSolid (const TopoDS_Shape& theSolid,
                                         TopoDS_Shape& theDraftSolid,
                                         TopTools_ListOfShape& theLIF)
 {
@@ -103,7 +102,7 @@ static
   Standard_Integer  iFlag;
   TopAbs_Orientation aOrF, aOrSh, aOrSd;
   TopoDS_Iterator aIt1, aIt2;
-  TopTools_ListIteratorOfListOfShape aItS;      
+  TopTools_ListIteratorOfListOfShape aItS;
   BRep_Builder aBB;
   TopoDS_Shell aShD;
   TopoDS_Shape aFSDx, aFx;
@@ -142,7 +141,7 @@ static
               theLIF.Append(aFSDx);
             }
             else {
-              bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx); 
+              bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
               if (bToReverse) {
                 aFSDx.Reverse();
               }
@@ -182,7 +181,7 @@ static
 }
 //=======================================================================
 //function : FillIn3DParts
-//purpose  : 
+//purpose  :
 //=======================================================================
   void GEOMAlgo_Builder::FillIn3DParts()
 {
@@ -193,16 +192,16 @@ static
   IntTools_Context& aCtx= pPF->ChangeContext();
   //
   Standard_Boolean bIsIN, bHasImage;
-  Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;// k,
-  TopAbs_ShapeEnum aType;  
+  Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;
+  TopAbs_ShapeEnum aType;
   TopAbs_State aState;
   TopTools_IndexedMapOfShape aMSolids, aMS, aMFaces, aMFIN;
   TopTools_MapOfShape aMFDone;
   TopTools_IndexedDataMapOfShapeListOfShape aMEF;
-  TopTools_ListIteratorOfListOfShape aItS;      
+  TopTools_ListIteratorOfListOfShape aItS;
   TopoDS_Iterator aIt, aItF;
   BRep_Builder aBB;
-  TopoDS_Solid aSolidSp; 
+  TopoDS_Solid aSolidSp;
   TopoDS_Face aFP;
   //
   myDraftSolids.Clear();
@@ -212,7 +211,7 @@ static
     const TopoDS_Shape& aS=aDS.Shape(i);
     //
     aType=aS.ShapeType();
-    if (aType==TopAbs_SOLID) { 
+    if (aType==TopAbs_SOLID) {
       // all solids from DS
       aMSolids.Add(aS);
     }
@@ -284,6 +283,9 @@ static
       else {
         //aMS.Add(aShell);
         TopExp::MapShapes(aShell, TopAbs_FACE, aMS);
+        //modified by NIZNHY-PKV Fri Dec 03 11:18:45 2010f
+        TopExp::MapShapes(aShell, TopAbs_EDGE, aMS);
+        //modified by NIZNHY-PKV Fri Dec 03 11:18:51 2010t
         TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
       }
     }
@@ -304,9 +306,9 @@ static
     }
     //
     // among all faces from aMEFP select these that have same edges
-    // with the solid (i.e aMEF). These faces will be treated first 
+    // with the solid (i.e aMEF). These faces will be treated first
     // to prevent the usage of 3D classifier.
-    // The full list of faces to process is aLFP1. 
+    // The full list of faces to process is aLFP1.
     aNbEFP=aMEFP.Extent();
     for (j=1; j<=aNbEFP; ++j) {
       const TopoDS_Shape& aE=aMEFP.FindKey(j);
@@ -349,7 +351,7 @@ static
       if (!aMFDone.Add(aSP)) {
         continue;
       }
-      
+
       //
       // first face to process
       aFP=TopoDS::Face(aSP);
@@ -367,12 +369,12 @@ static
         }
       }
       //
-      // Connexity Block that spreads from aFP the Bound 
+      // Connexity Block that spreads from aFP the Bound
       // or till the end of the block itself
       aLCBF.Clear();
       GEOMAlgo_Tools3D::MakeConnexityBlock(aLFP, aMS, aLCBF);
       //
-      // fill states for the Connexity Block 
+      // fill states for the Connexity Block
       aItS.Initialize(aLCBF);
       for (; aItS.More(); aItS.Next()) {
         const TopoDS_Shape& aSx=aItS.Value();
@@ -412,12 +414,12 @@ static
 }
 //=======================================================================
 //function : BuildSplitSolids
-//purpose  : 
+//purpose  :
 //=======================================================================
   void GEOMAlgo_Builder::BuildSplitSolids()
 {
   myErrorStatus=0;
-  // 
+  //
   const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
   NMTTools_PaveFiller* pPF=myPaveFiller;
   IntTools_Context& aCtx= pPF->ChangeContext();
@@ -432,8 +434,6 @@ static
   GEOMAlgo_DataMapOfShapeShapeSet aMSS;
   GEOMAlgo_ShapeSet aSSi;
   //
-  //modified by NIZNHY-PKV Wed Dec  6 17:08:03 2006f
-  //
   // 0. Find same domain solids for non-interferred solids
   aNbS=aDS.NumberOfShapesOfTheObject();
   for (i=1; i<=aNbS; ++i) {
@@ -452,12 +452,9 @@ static
     aSSi.Add(aS, TopAbs_FACE);
     //
     aMSS.Bind(aS, aSSi);
-  } //for (i=1; i<=aNbS; ++i) 
-  //
-  //modified by NIZNHY-PKV Wed Dec  6 17:08:09 2006t
+  } //for (i=1; i<=aNbS; ++i)
   //
   // 1. Build solids for interferred source solids
-  //
   aSB.SetContext(aCtx);
   aNbS=myDraftSolids.Extent();
   for (i=1; i<=aNbS; ++i) {
@@ -468,7 +465,7 @@ static
     //
     // 1.1 Fill Shell Faces Set
     aSFS.Clear();
-    
+
     aExp.Init(aSD, TopAbs_FACE);
     for (; aExp.More(); aExp.Next()) {
       const TopoDS_Shape& aF=aExp.Current();
@@ -489,15 +486,15 @@ static
     aNbSFS=aSFS.Extent();
     //
     // 1.2
-    // Check whether aSFS contains a subsets of faces 
-    // of solids that have been already built. 
+    // Check whether aSFS contains a subsets of faces
+    // of solids that have been already built.
     // If yes, shrink aSFS by these subsets.
     aSSi.Clear();
     aSSi.Add(aSFS);
     //
     aItSS.Initialize(aMSS);
     for (; aItSS.More(); aItSS.Next()) {
-      const TopoDS_Shape& aSR=aItSS.Key(); 
+      const TopoDS_Shape& aSR=aItSS.Key();
       const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
       if (aSSi.Contains(aSSR)) {
         // the aSR is SD solid for aS
@@ -516,6 +513,11 @@ static
     }
     const TopTools_ListOfShape& aSFS1=aSSi.GetSet();
     aNbSFS=aSFS1.Extent();
+    //modified by NIZNHY-PKV Wed Oct 27 09:53:15 2010f
+    if (!aNbSFS) {
+      continue;
+    }
+    //modified by NIZNHY-PKV Wed Oct 27 09:53:18 2010t
     //
     // 1.3 Build new solids
     aSB.SetShapes(aSFS1);
@@ -528,7 +530,7 @@ static
     //
     const TopTools_ListOfShape& aLSR=aSB.Areas();
     //
-    // 1.4 Collect resulting solids and theirs set of faces 
+      // 1.4 Collect resulting solids and theirs set of faces
     aIt.Initialize(aLSR);
     for (; aIt.More(); aIt.Next()) {
       const TopoDS_Shape& aSR=aIt.Value();
@@ -550,42 +552,10 @@ static
       myImages.Bind(aS, aLSR);
     }
   } // for (i=1; i<=aNbS; ++i) {
-  //modified by NIZNHY-PKV Wed Dec  6 17:07:47 2006f
-  /*
-  //
-  // 2. Find same domain solids for non-interferred solids
-  aNbS=aDS.NumberOfShapesOfTheObject();
-  for (i=1; i<=aNbS; ++i) {
-    const TopoDS_Shape& aS=aDS.Shape(i);
-    if (aS.ShapeType()!=TopAbs_SOLID) {
-      continue;
-    }
-    if (!aMFence.Add(aS)) {
-      continue;
-    }
-    if(myImages.HasImage(aS)) {
-      continue;
-    }
-    //
-    aSSi.Clear();
-    aSSi.Add(aS, TopAbs_FACE);
-    //
-    aItSS.Initialize(aMSS);
-    for (; aItSS.More(); aItSS.Next()) {
-      const TopoDS_Shape& aSR=aItSS.Key(); 
-      const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
-      if (aSSi.Contains(aSSR)) {
-        myImages.Bind(aS, aSR);
-        break;
-      }
-    }
-  } //for (i=1; i<=aNbS; ++i) 
-  */
-  //modified by NIZNHY-PKV Wed Dec  6 17:07:55 2006t
 }
 //=======================================================================
-//function :FillInternalShapes 
-//purpose  : 
+//function :FillInternalShapes
+//purpose  :
 //=======================================================================
   void GEOMAlgo_Builder::FillInternalShapes()
 {
@@ -610,7 +580,7 @@ static
   //
   // 1. Shapes to process
   //
-  // 1.1 Shapes from pure arguments aMSI 
+  // 1.1 Shapes from pure arguments aMSI
   // 1.1.1 vertex, edge
   for (i=0; i<2; ++i) {
     jT=(Standard_Integer)aT[i];
@@ -624,7 +594,7 @@ static
     }
   }
   // 1.1.2 wire
-  {  
+  {
     jT=(Standard_Integer)TopAbs_WIRE;
     const TopTools_ListOfShape &aLW=myShapes1[jT];
     aIt.Initialize(aLW);
@@ -639,7 +609,7 @@ static
       }
     }
   }
-  // 1.1.3 theirs images/sources 
+  // 1.1.3 theirs images/sources
   aIt1.Initialize(aLSI);
   for (; aIt1.More(); aIt1.Next()) {
     const TopoDS_Shape& aS=aIt1.Value();
@@ -693,7 +663,7 @@ static
         aIt.Initialize(aLSp);
         for (; aIt.More(); aIt.Next()) {
           const TopoDS_Shape& aSp=aIt.Value();
-          if (aMFence.Add(aSp)) { 
+          if (aMFence.Add(aSp)) {
             TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
             TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_FACE, aMSx);
             TopExp::MapShapesAndAncestors(aSp, TopAbs_EDGE  , TopAbs_FACE, aMSx);
@@ -707,7 +677,7 @@ static
           TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_FACE, aMSx);
           TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE  , TopAbs_FACE, aMSx);
           aLSd.Append(aS);
-          aMSOr.Add(aS); 
+          aMSOr.Add(aS);
         }
       }
     }//if (aType==TopAbs_SOLID)
@@ -715,9 +685,9 @@ static
   //
   aNbSd=aLSd.Extent();
   //
-  // 3. Some shapes of aMSI can be already tied with faces of 
+  // 3. Some shapes of aMSI can be already tied with faces of
   //    split solids
-  aItM.Initialize(aMSI); 
+  aItM.Initialize(aMSI);
   for (; aItM.More(); aItM.Next()) {
     const TopoDS_Shape& aSI=aItM.Key();
     if (aMSx.Contains(aSI)) {
@@ -741,7 +711,7 @@ static
   for (; aIt.More(); aIt.Next()) {
     TopoDS_Solid aSd=TopoDS::Solid(aIt.Value());
     //
-    aItM.Initialize(aMSI); 
+    aItM.Initialize(aMSI);
     for (; aItM.More(); aItM.Next()) {
       TopoDS_Shape aSI=aItM.Key();
       aSI.Orientation(TopAbs_INTERNAL);
@@ -777,7 +747,7 @@ static
 }
 //=======================================================================
 //function : OwnInternalShapes
-//purpose  : 
+//purpose  :
 //=======================================================================
   void OwnInternalShapes(const TopoDS_Shape& theS,
                          TopTools_IndexedMapOfShape& theMx)
@@ -795,4 +765,3 @@ static
 //
 // ErrorStatus
 // 30 - SolidBuilder failed
-
index 14744f7f43fa7ac4af73bfbf8ca2b0c6b74d45c0..31c89d75478b30b4be8cbaad8e354a694a4f679d 100755 (executable)
@@ -73,7 +73,14 @@ is
        ---Purpose: Returns the Set  
        returns ListOfShape from TopTools; 
     ---C++: return const &              
-
+    --modified by NIZNHY-PKV Wed Oct 28 13:51:45 2010f 
+    IsEqual(me; 
+           theOther: ShapeSet from GEOMAlgo) 
+       ---Purpose: Returns True if the Set==theSet 
+       returns Boolean from Standard;  
+    ---C++: alias operator == 
+    --modified by NIZNHY-PKV Wed Oct 28 13:51:50 2010t 
+     
 fields 
     myMap  : MapOfOrientedShape from TopTools is protected;   
     myList : ListOfShape        from TopTools is protected;
index 32f16eebd7202a329d1740b2342c46954cac2d50..2a1310070ab84bfbe0c6534788b84cc931765763 100755 (executable)
 //=======================================================================
   const TopTools_ListOfShape& GEOMAlgo_ShapeSet::GetSet()const
 {
-  /*
-  TopTools_ListOfShape *pL;
-  TopTools_MapIteratorOfMapOfOrientedShape aIt;
-  //
-  pL=(TopTools_ListOfShape *)&myList;
-  pL->Clear();
-  aIt.Initialize(myMap);
-  for (; aIt.More(); aIt.Next()) {
-    pL->Append(aIt.Key());
-  }
-  */
   return myList;
 }
 //=======================================================================
 //=======================================================================
   void GEOMAlgo_ShapeSet::Subtract(const GEOMAlgo_ShapeSet& theOther)
 {
-  /*
-  TopTools_MapIteratorOfMapOfOrientedShape aIt;
-  //
-  aIt.Initialize(theOther.myMap);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS=aIt.Key();
-    myMap.Remove(aS);
-  }
-  */
-  //
   TopTools_ListIteratorOfListOfShape aIt;
   TopTools_ListOfShape aLS;
   //
   //
   myList=aLS;
 }
+//modified by NIZNHY-PKV Wed Oct 28 13:51:36 2010f
+//=======================================================================
+//function : IsEqual
+//purpose  : 
+//=======================================================================
+  Standard_Boolean GEOMAlgo_ShapeSet::IsEqual(const GEOMAlgo_ShapeSet& theOther)const
+{
+  Standard_Boolean bRet;
+  Standard_Integer aNb1, aNb2;
+  TopAbs_Orientation aOr;
+  TopTools_ListIteratorOfListOfShape aIt;
+  //
+  bRet=Standard_True;
+  aNb1=myList.Extent();
+  const TopTools_ListOfShape& aLS2=theOther.GetSet();
+  aNb2=aLS2.Extent();
+  if (aNb1!=aNb2) {
+    return !bRet;
+  }
+  //
+  aIt.Initialize(myList);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aS=aIt.Value();
+    if(!theOther.myMap.Contains(aS)) {
+      bRet=!bRet;
+      break;
+    }
+  }
+  return bRet;
+}
+//modified by NIZNHY-PKV Wed Oct 28 13:51:38 2010t
index 7c9136641f845dfef8a060e7c56120d77844f4c6..618a4dee3e7087853d7320a733d9cb0117247aad 100644 (file)
 #ifndef _GEOMAlgo_ShapeSet_HeaderFile
 #define _GEOMAlgo_ShapeSet_HeaderFile
 
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
 #ifndef _TopTools_MapOfOrientedShape_HeaderFile
 #include <TopTools_MapOfOrientedShape.hxx>
 #endif
@@ -39,59 +46,48 @@ class TopTools_ListOfShape;
 class TopoDS_Shape;
 
 
-#ifndef _Standard_HeaderFile
-#include <Standard.hxx>
-#endif
-#ifndef _Standard_Macro_HeaderFile
-#include <Standard_Macro.hxx>
-#endif
-
 //! Implementation some formal <br>
 //!          opereations with Set of shapes <br>
 class GEOMAlgo_ShapeSet  {
-
 public:
 
-    void* operator new(size_t,void* anAddress) 
-      {
-        return anAddress;
-      }
-    void* operator new(size_t size) 
-      { 
-        return Standard::Allocate(size); 
-      }
-    void  operator delete(void *anAddress) 
-      { 
-        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
-      }
- // Methods PUBLIC
- // 
-
-//! Empty constructor <br>
-Standard_EXPORT GEOMAlgo_ShapeSet();
-
-//! Adds shapes from the list theLS to the Set <br>
-Standard_EXPORT   void Add(const TopTools_ListOfShape& theLS) ;
-
-//! Adds shape theShape to the Set <br>
-Standard_EXPORT   void Add(const TopoDS_Shape& theShape) ;
-
-//! Adds sub-shapes of shape theShape, <br>
+  void* operator new(size_t,void* anAddress) 
+  {
+    return anAddress;
+  }
+  void* operator new(size_t size) 
+  {
+    return Standard::Allocate(size); 
+  }
+  void  operator delete(void *anAddress) 
+  {
+    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+  }
+
+  //! Empty constructor <br>
+  Standard_EXPORT   GEOMAlgo_ShapeSet();
+  //! Adds shapes from the list theLS to the Set <br>
+  Standard_EXPORT     void Add(const TopTools_ListOfShape& theLS) ;
+  //! Adds shape theShape to the Set <br>
+  Standard_EXPORT     void Add(const TopoDS_Shape& theShape) ;
+  //! Adds sub-shapes of shape theShape, <br>
 //!          that have type theType to the Set <br>
-Standard_EXPORT   void Add(const TopoDS_Shape& theShape,const TopAbs_ShapeEnum theType) ;
-
-//! Removes shapes of theSet from the Set <br>
-Standard_EXPORT   void Subtract(const GEOMAlgo_ShapeSet& theSet) ;
-
-//! Clears internal fields <br>
-Standard_EXPORT   void Clear() ;
-
-//! Returns True if the Set contains <br>
+  Standard_EXPORT     void Add(const TopoDS_Shape& theShape,const TopAbs_ShapeEnum theType) ;
+  //! Removes shapes of theSet from the Set <br>
+  Standard_EXPORT     void Subtract(const GEOMAlgo_ShapeSet& theSet) ;
+  //! Clears internal fields <br>
+  Standard_EXPORT     void Clear() ;
+  //! Returns True if the Set contains <br>
 //!          all shapes of theSet <br>
-Standard_EXPORT   Standard_Boolean Contains(const GEOMAlgo_ShapeSet& theSet) const;
-
-//! Returns the Set <br>
-Standard_EXPORT  const TopTools_ListOfShape& GetSet() const;
+  Standard_EXPORT     Standard_Boolean Contains(const GEOMAlgo_ShapeSet& theSet) const;
+  //! Returns the Set <br>
+  Standard_EXPORT    const TopTools_ListOfShape& GetSet() const;
+  //! Returns True if the Set==theSet <br>
+  Standard_EXPORT     Standard_Boolean IsEqual(const GEOMAlgo_ShapeSet& theOther) const;
+    Standard_Boolean operator ==(const GEOMAlgo_ShapeSet& theOther) const
+{
+  return IsEqual(theOther);
+}
 
 
 
@@ -99,24 +95,16 @@ Standard_EXPORT  const TopTools_ListOfShape& GetSet() const;
 
 protected:
 
- // Methods PROTECTED
- // 
 
 
- // Fields PROTECTED
- //
 TopTools_MapOfOrientedShape myMap;
 TopTools_ListOfShape myList;
 
 
-private: 
+private:
 
- // Methods PRIVATE
- // 
 
 
- // Fields PRIVATE
- //
 
 
 };
@@ -126,7 +114,6 @@ private:
 
 
 // other Inline functions and methods (like "C++: function call" methods)
-//
 
 
 #endif
index b273ae5feb0de34b0644e73b8f638c62c29badc5..865c68794309f9b3f26fa5c891679bb0338e0a5e 100755 (executable)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File    : GEOMAlgo_Tools3D.cxx
+//  Created :
+//  Author  : Peter KURNEV
 
-// File:        GEOMAlgo_Tools3D.cxx
-// Created:     
-// Author:      Peter KURNEV
-//
 #include <GEOMAlgo_Tools3D.ixx>
 
 #include <Precision.hxx>
@@ -103,16 +102,16 @@ static
                              const gp_Dir& );
 
 static
-  void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aE, 
-                                    const TopoDS_Face& aF, 
-                                    Standard_Real aT, 
-                                    gp_Pnt& aPF, 
+  void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aE,
+                                    const TopoDS_Face& aF,
+                                    Standard_Real aT,
+                                    gp_Pnt& aPF,
                                     gp_Dir& aDNF,
                                     IntTools_Context& aCtx);
 
 //=======================================================================
 //function : IsInternalFace
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
                                                    const TopoDS_Solid& theSolid,
@@ -135,7 +134,7 @@ static
     if (!theMEF.Contains(aE)) {
       continue;
     }
-    // 
+    //
     const TopTools_ListOfShape& aLF=theMEF.FindFromKey(aE);
     aNbF=aLF.Extent();
     if (!aNbF) {
@@ -179,7 +178,7 @@ static
 }
 //=======================================================================
 //function : IsInternalFace
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
                                                     const TopoDS_Edge& theEdge,
@@ -221,7 +220,7 @@ static
 }
 //=======================================================================
 //function : IsInternalFace
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
                                                     const TopoDS_Edge& theEdge,
@@ -246,7 +245,7 @@ static
   aDt2D=BOPTools_Tools3D::MinStepIn2d();
   aDt2Dx=10.*aDt2D;
   BOPTools_Tools3D::PointNearEdge (theEdge, theFace, aT, aDt2Dx, aPF2D, aPF);
-  // 
+  //
   // 2. E1, E2
   GEOMAlgo_Tools3D::GetEdgeOnFace(theEdge, theFace1, aE1);
   if (aE1.Orientation()==TopAbs_INTERNAL) {
@@ -287,7 +286,7 @@ static
   if (aA12<0.) {
     aA12=aA12+aTwoPI;
   }
-  
+
   aA1x=AngleWithRef(aDBF1, aDBF , aDTF1);
   if (aA1x<0.) {
     aA1x=aA1x+aTwoPI;
@@ -301,7 +300,7 @@ static
 }
 //=======================================================================
 //function : GetFaceOff
-//purpose  : 
+//purpose  :
 //=======================================================================
   void GEOMAlgo_Tools3D::GetFaceOff(const TopoDS_Edge& theE1,
                                    const TopoDS_Face& theF1,
@@ -355,7 +354,7 @@ static
 }
 //=======================================================================
 //function : GetEdgeOnFace
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOnFace(const TopoDS_Edge& theE1,
                                                   const TopoDS_Face& theF2,
@@ -383,12 +382,12 @@ static
 }
 //=======================================================================
 //function : GetEdgeOff
-//purpose  : 
+//purpose  :
 //=======================================================================
-  Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOff(const TopoDS_Edge& theE1,
+Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOff (const TopoDS_Edge& theE1,
                                                const TopoDS_Face& theF2,
                                                TopoDS_Edge& theE2)
-     
+
 {
   Standard_Boolean bFound;
   TopAbs_Orientation aOr1, aOr1C, aOr2;
@@ -414,7 +413,7 @@ static
 }
 //=======================================================================
 // function:  ComputeState
-// purpose: 
+// purpose:
 //=======================================================================
   TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Face& theF,
                                              const TopoDS_Solid& theRef,
@@ -423,10 +422,10 @@ static
                                              IntTools_Context& theCtx)
 {
   TopAbs_State aState;
-  TopExp_Explorer aExp; 
+  TopExp_Explorer aExp;
   TopoDS_Edge aE1;
   gp_Pnt2d aP2D;
-  gp_Pnt aP3D; 
+  gp_Pnt aP3D;
   //
   aState=TopAbs_UNKNOWN;
   //
@@ -456,7 +455,7 @@ static
 }
 //=======================================================================
 // function:  ComputeStateByOnePoint
-// purpose: 
+// purpose:
 //=======================================================================
   TopAbs_State GEOMAlgo_Tools3D::ComputeStateByOnePoint(const TopoDS_Shape& theS,
                                                        const TopoDS_Solid& theRef,
@@ -480,7 +479,7 @@ static
 }
 //=======================================================================
 // function:  ComputeState
-// purpose: 
+// purpose:
 //=======================================================================
   TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Vertex& theV,
                                              const TopoDS_Solid& theRef,
@@ -488,7 +487,7 @@ static
                                              IntTools_Context& theCtx)
 {
   TopAbs_State aState;
-  gp_Pnt aP3D; 
+  gp_Pnt aP3D;
   //
   aP3D=BRep_Tool::Pnt(theV);
   aState=GEOMAlgo_Tools3D::ComputeState(aP3D, theRef, theTol, theCtx);
@@ -496,7 +495,7 @@ static
 }
 //=======================================================================
 // function:  ComputeState
-// purpose: 
+// purpose:
 //=======================================================================
   TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Edge& theE,
                                              const TopoDS_Solid& theRef,
@@ -506,7 +505,7 @@ static
   Standard_Real aT1, aT2, aT = 0.;
   TopAbs_State aState;
   Handle(Geom_Curve) aC3D;
-  gp_Pnt aP3D; 
+  gp_Pnt aP3D;
   //
   aC3D = BRep_Tool::Curve(theE, aT1, aT2);
   //
@@ -546,7 +545,7 @@ static
 }
 //=======================================================================
 // function:  ComputeState
-// purpose: 
+// purpose:
 //=======================================================================
   TopAbs_State GEOMAlgo_Tools3D::ComputeState(const gp_Pnt& theP,
                                              const TopoDS_Solid& theRef,
@@ -564,7 +563,7 @@ static
 }
 //=======================================================================
 // function: IsSplitToReverse
-// purpose: 
+// purpose:
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Shape& theSp,
                                                      const TopoDS_Shape& theSr,
@@ -598,7 +597,7 @@ static
 }
 //=======================================================================
 //function :IsSplitToReverse
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Face& theFSp,
                                                      const TopoDS_Face& theFSr,
@@ -644,7 +643,7 @@ static
   aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
   BOPTools_Tools3D::GetApproxNormalToFaceOnEdge(aESp, theFSp, aT, aPFSp, aDNFSp);
   //
-  // Parts of theContext.ComputeVS(..) 
+  // Parts of theContext.ComputeVS(..)
   GeomAPI_ProjectPointOnSurf& aProjector=theContext.ProjPS(theFSr);
   aProjector.Perform(aPFSp);
   if (!aProjector.IsDone()) {
@@ -659,9 +658,9 @@ static
   }
   //
   aSr->D1(aU, aV, aPFSr, aD1U, aD1V);
-  gp_Dir aDD1U(aD1U); 
+  gp_Dir aDD1U(aD1U);
   gp_Dir aDD1V(aD1V);
-  gp_Dir aDNFSr=aDD1U^aDD1V; 
+  gp_Dir aDNFSr=aDD1U^aDD1V;
   if (theFSr.Orientation()==TopAbs_REVERSED){
     aDNFSr.Reverse();
   }
@@ -673,7 +672,7 @@ static
 }
 //=======================================================================
 //function :IsSplitToReverse
-//purpose  : 
+//purpose  :
 //=======================================================================
   Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Edge& theSplit,
                                                      const TopoDS_Edge& theEdge,
@@ -688,7 +687,7 @@ static
   //
   bRet=Standard_False;
   //
-  bIsDegenerated=(BRep_Tool::Degenerated(theSplit) || 
+  bIsDegenerated=(BRep_Tool::Degenerated(theSplit) ||
                   BRep_Tool::Degenerated(theEdge));
   if (bIsDegenerated) {
     return bRet;
@@ -721,7 +720,7 @@ static
 
 //=======================================================================
 // function: Sense
-// purpose: 
+// purpose:
 //=======================================================================
   Standard_Integer GEOMAlgo_Tools3D::Sense (const TopoDS_Face& theF1,
                                            const TopoDS_Face& theF2)
@@ -767,7 +766,7 @@ static
 }
 //=======================================================================
 // function: CopyFace
-// purpose: 
+// purpose:
 //=======================================================================
   void GEOMAlgo_Tools3D::CopyFace (const TopoDS_Face& theF1,
                                   TopoDS_Face& theF2)
@@ -793,7 +792,7 @@ static
 }
 //=======================================================================
 // function: MakeContainer
-// purpose: 
+// purpose:
 //=======================================================================
   void GEOMAlgo_Tools3D::MakeContainer(const TopAbs_ShapeEnum theType,
                                       TopoDS_Shape& theC)
@@ -819,7 +818,7 @@ static
       TopoDS_Solid aSolid;
       aBB.MakeSolid(aSolid);
       theC=aSolid;
-    }  
+    }
       break;
       //
       //
@@ -827,7 +826,7 @@ static
       TopoDS_Shell aShell;
       aBB.MakeShell(aShell);
       theC=aShell;
-    }  
+    }
       break;
       //
     case TopAbs_WIRE: {
@@ -843,7 +842,7 @@ static
 }
 //=======================================================================
 // function: MakeConnexityBlock.
-// purpose: 
+// purpose:
 //=======================================================================
   void GEOMAlgo_Tools3D::MakeConnexityBlock (const TopTools_ListOfShape& theLFIn,
                                              const TopTools_IndexedMapOfShape& theMEAvoid,
@@ -860,7 +859,7 @@ static
   aNbF=theLFIn.Extent();
   aIt.Initialize(theLFIn);
   for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aF=aIt.Value();      
+    const TopoDS_Shape& aF=aIt.Value();
     TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
   }
   //
@@ -911,7 +910,7 @@ static
     }
     //
   }//while(1) {
-  
+
   //
   aNbF=aMCB.Extent();
   aItM.Initialize(aMCB);
@@ -922,7 +921,7 @@ static
 }
 //=======================================================================
 //function : FindFacePairs
-//purpose  : 
+//purpose  :
 //=======================================================================
 Standard_Boolean FindFacePairs (const TopoDS_Edge& theE,
                                 const TopTools_ListOfShape& thLF,
@@ -943,7 +942,7 @@ Standard_Boolean FindFacePairs (const TopoDS_Edge& theE,
   //
   // Preface aLCEF
   aItLF.Initialize(thLF);
-  for (; aItLF.More(); aItLF.Next()) { 
+  for (; aItLF.More(); aItLF.Next()) {
     const TopoDS_Face& aFL=TopoDS::Face(aItLF.Value());
     //
     bFound=GEOMAlgo_Tools3D::GetEdgeOnFace(theE, aFL, aEL);
@@ -1014,7 +1013,7 @@ Standard_Boolean FindFacePairs (const TopoDS_Edge& theE,
 //
 //=======================================================================
 //function : AngleWithRef
-//purpose  : 
+//purpose  :
 //=======================================================================
 Standard_Real AngleWithRef(const gp_Dir& theD1,
                            const gp_Dir& theD2,
@@ -1047,17 +1046,17 @@ Standard_Real AngleWithRef(const gp_Dir& theD1,
 }
 //=======================================================================
 //function : GetApproxNormalToFaceOnEdge
-//purpose  : 
+//purpose  :
 //=======================================================================
-void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx, 
-                                  const TopoDS_Face& aFx, 
-                                  Standard_Real aT, 
-                                  gp_Pnt& aPF, 
+void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
+                                  const TopoDS_Face& aFx,
+                                  Standard_Real aT,
+                                  gp_Pnt& aPF,
                                   gp_Dir& aDNF,
-                                  IntTools_Context& )//aCtx)
+                                  IntTools_Context& aCtx)
 {
   Standard_Boolean bReverse;
-  Standard_Real aT1, aT2, dT;//, aU, aV;
+  Standard_Real aT1, aT2, dT, aU, aV;
   gp_Dir aDTT, aDNFT, aDBT;
   gp_Pnt aPFT, aPFx;
   Handle(Geom_Curve) aC3D;
@@ -1083,7 +1082,7 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
   //
   // Normal at aT
   BOPTools_Tools3D::GetNormalToFaceOnEdge (aE, aF, aT, aDNFT);
-  
+
   // Tangent at aT
   BOPTools_Tools3D::GetTangentToEdge(aE, aT, aDTT);
   //
@@ -1099,7 +1098,7 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
     aTS=aGAS.GetType();
     if (aTS==GeomAbs_BSplineSurface ||
         aTS==GeomAbs_BezierSurface ||
-        aTS==GeomAbs_Plane) {
+        aTS==GeomAbs_Plane){
       Standard_Real aTolEx, aTolFx, aTol, dUR, dVR, dR;
       //
       aTolEx=BRep_Tool::Tolerance(aEx);
@@ -1112,6 +1111,19 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
         dT=dR;
       }
     }
+    //modified by NIZNHY-PKV Thu Dec 02 10:39:09 2010f
+    else if (GeomAbs_Torus ||
+             aTS==GeomAbs_Cylinder){
+      Standard_Real aTolEx, aTolFx, aTol;
+      //
+      aTolEx=BRep_Tool::Tolerance(aEx);
+      aTolFx=BRep_Tool::Tolerance(aFx);
+      aTol=2.*aTolEx+aTolFx;
+      if (aTol>dT) {
+        dT=aTol;
+      }
+    }
+    //modified by NIZNHY-PKV Thu Dec 02 10:39:13 2010t
   }
   //----------------------------------------------
   //
@@ -1123,8 +1135,6 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
     aDNF.Reverse();
   }
   //
-  //modified by NIZNHY-PKV Wed Sep 22 10:52:54 2010f
-  /*
   GeomAPI_ProjectPointOnSurf& aProjector=aCtx.ProjPS(aF);
   //
   aProjector.Perform(aPFx);
@@ -1136,6 +1146,4 @@ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
       aDNF.Reverse();
     }
   }
-  */
-  //modified by NIZNHY-PKV Wed Sep 22 10:52:59 2010t
 }
index 3e047e220b8c602fcef5c2db61a28967eaf2e872..c1e43f616bbd285e59b68c10b9904107087da8d9 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-
 //  GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
 //  File   : GEOM_Client.cxx
 //  Author : Yves FRICAUD/Lucien PIGNOLONI
 //  Module : GEOM
-//  $Header$
-//
+
 #include <Standard_Stream.hxx>
 
 #include <Standard_Stream.hxx>
@@ -78,7 +76,7 @@ TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr a
     /* get sequence of bytes of resulting brep shape from GEOM server */
     TopoDS_Shape S;
     SALOMEDS::TMPFile_var SeqFile = aShape->GetShapeStream();
-    int sizebuf = SeqFile->length();
+    /*int sizebuf = */SeqFile->length();
     char* buf;
     buf = (char*) &SeqFile[0];
     std::istringstream streamBrep(buf);
@@ -102,6 +100,19 @@ GEOM_Client::GEOM_Client()
 #endif
 }
 
+//=======================================================================
+// function : Create()
+// purpose  : Copy constructor
+//=======================================================================
+GEOM_Client::GEOM_Client(const GEOM_Client& client)
+{
+  myIORs = client.myIORs;
+  myShapes = client.myShapes;
+  _myIndexes = client._myIndexes;
+  _mySubShapes = client._mySubShapes;
+  pid_client = client.pid_client;
+}
+
 //=======================================================================
 // function : Create()
 // purpose  :
@@ -111,18 +122,35 @@ GEOM_Client::GEOM_Client(Engines::Container_ptr client)
   pid_client = client->getPID();
 }
 
+//=======================================================================
+// function : get_client()
+// purpose  : Static method to have the only one instance of GEOM_Client
+//=======================================================================
+#ifdef SINGLE_CLIENT
+GEOM_Client& GEOM_Client::get_client()
+{
+  static GEOM_Client a;
+  return a;
+}
+#else
+GEOM_Client GEOM_Client::get_client()
+{
+  return GEOM_Client();
+}
+#endif
+
 //=======================================================================
 // function : Find()
 // purpose  :
 //=======================================================================
 Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S )
 {
-  if(_myIndexes.count(IOR) != 0)
-    {
-      Standard_Integer i =_myIndexes[IOR];
-      S = myShapes.Value(i);
-      return i;
-    }
+  if (_myIndexes.count(IOR) != 0)
+  {
+    Standard_Integer i = _myIndexes[IOR];
+    S = myShapes.Value(i);
+    return i;
+  }
   return 0;
 }
 
@@ -149,7 +177,7 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape&
 {
   myIORs.Append(IOR);
   myShapes.Append(S);
-  _myIndexes[IOR]=myIORs.Length();
+  _myIndexes[IOR] = myIORs.Length();
 }
 
 //=======================================================================
@@ -169,7 +197,6 @@ void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
     _myIndexes.erase(IOR);
     _mySubShapes.erase(IOR);
   }
-  return;
 }
 
 //=======================================================================
@@ -221,20 +248,20 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
   TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape());
   GEOM::ListOfLong_var list = aShape->GetSubShapeIndices();
 
-  TopTools_IndexedMapOfShape anIndices;
   CORBA::String_var aMainIOR = geom->GetStringFromIOR(aShape->GetMainShape());
   TCollection_AsciiString mainIOR = (char*)aMainIOR.in();
 
   //find subshapes only one time
   if(_mySubShapes.count(mainIOR)==0)
+  {
+    TopTools_IndexedMapOfShape anIndices;
+    TopExp::MapShapes(aMainShape, anIndices);
+    Standard_Integer ii = 1, nbSubSh = anIndices.Extent();
+    for (; ii <= nbSubSh; ii++)
     {
-      TopExp::MapShapes(aMainShape, anIndices);
-      Standard_Integer ii = 1, nbSubSh = anIndices.Extent();
-      for (; ii <= nbSubSh; ii++) 
-        {
-          _mySubShapes[mainIOR].push_back(anIndices.FindKey(ii));
-        }
+      _mySubShapes[mainIOR].push_back(anIndices.FindKey(ii));
     }
+  }
 
   /* Case of only one subshape */
   if (list->length() == 1 && list[0] > 0) {
@@ -245,7 +272,7 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
     TopoDS_Compound aCompound;
     B.MakeCompound(aCompound);
     for (int i = 0; i < list->length(); i++) {
-      if (0 < list[i] && list[i] <= anIndices.Extent()) {
+      if (0 < list[i] && list[i] <= _mySubShapes[mainIOR].size()) {
         TopoDS_Shape aSubShape = _mySubShapes[mainIOR][list[i]-1];
         B.Add(aCompound, aSubShape);
       }
index d200297195aade71902ee05bde4f29da26f95e19..796f6ec4db621ff8b7c5b9040c03528f39481df3 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-
 //  GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
 //  File   : GEOM_Client.hxx
 //  Author : Yves FRICAUD
 //  Module : GEOM
-//  $Header$
-//
+
 #ifndef _GEOM_Client_HeaderFile
 #define _GEOM_Client_HeaderFile
 
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(GEOM_Gen)
-#
+
 #ifdef HAVE_FINITE
 #undef HAVE_FINITE // E.A. fix a warning about redefinition of HAVE_FINITE in re-inclusion of Standard_values.h
 #endif
 #ifndef _Standard_Integer_HeaderFile
 #include <Standard_Integer.hxx>
 #endif
+
 class TCollection_AsciiString;
 class TopoDS_Shape;
 
-
 #ifndef _Standard_HeaderFile
 #include <Standard.hxx>
 #endif
@@ -85,53 +83,56 @@ class TopoDS_Shape;
  * and the SHAPE_READER macro defines also a new object
  */
 #define SINGLE_CLIENT
+
 //=====================================================================
 // GEOM_Client : class definition
 //=====================================================================
 class GEOMCLIENT_EXPORT GEOM_Client  {
 
-public:
-  
-  inline void* operator new(size_t,void* anAddress) 
+ public:
+
+  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);
   }
   // Methods PUBLIC
-  // 
-   //Standard_EXPORT   
+  //
+  //Standard_EXPORT
   GEOM_Client();
-  //Standard_EXPORT   
+  //Standard_EXPORT
   GEOM_Client(Engines::Container_ptr client);
-  //Standard_EXPORT   
+  //Standard_EXPORT
+  GEOM_Client(const GEOM_Client& client);
+  //Standard_EXPORT
   Standard_Integer Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) ;
-  //Standard_EXPORT   
+  //Standard_EXPORT
   Standard_Integer Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) ;
-  //Standard_EXPORT   
+  //Standard_EXPORT
   void Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) ;
-  //Standard_EXPORT   
+  //Standard_EXPORT
   TopoDS_Shape GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape );
-  //Standard_EXPORT   
+  //Standard_EXPORT
   void RemoveShapeFromBuffer( const TCollection_AsciiString& IOR ) ;
-  //Standard_EXPORT   
+  //Standard_EXPORT
   void ClearClientBuffer() ;
-  //Standard_EXPORT   
+  //Standard_EXPORT
   unsigned int BufferLength() ;
   TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape);
 #ifdef SINGLE_CLIENT
-  static GEOM_Client& get_client() { static GEOM_Client a;return a; }
+  static GEOM_Client& get_client();
 #else
-  static GEOM_Client get_client() { return GEOM_Client(); }
+  static GEOM_Client get_client();
 #endif
 
-private: 
+ private:
   // Fields PRIVATE
   //
   TColStd_SequenceOfAsciiString myIORs ;
index f4aeb8ccfec76545ed58681fcbc389bf00cfee68..1730ce2009638972e33856d995835b1daf9ee4c8 100644 (file)
@@ -281,21 +281,8 @@ bool GEOMGUI_Selection::isCompoundOfVertices( GEOM::GEOM_Object_ptr obj )
   bool ret = false;
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
     (SUIT_Session::session()->activeApplication()->activeStudy());
-  if ( appStudy && !CORBA::is_nil( obj ) && obj->GetShapeType() == GEOM::COMPOUND ) {
-    GEOM::GEOM_IMeasureOperations_var anOper = GeometryGUI::GetGeomGen()->GetIMeasureOperations( appStudy->id() );
-    QString whatIs = anOper->WhatIs( obj );
-    QStringList data = whatIs.split( "\n", QString::SkipEmptyParts );
-    int nbVertices = 0, nbCompounds = 0, nbOther = 0;
-    foreach ( QString s, data ) {
-      QString type = s.section( ":", 0, 0 ).trimmed().toLower();
-      int cnt = s.section( ":", 1, 1 ).trimmed().toInt();
-      if ( type == "vertex" ) nbVertices += cnt;
-      else if ( type == "compound" ) nbCompounds += cnt;
-      else if ( type != "shape" ) nbOther += cnt;
-    }
-    ret = nbVertices > 0 && nbCompounds == 1 && nbOther == 0;
-    anOper->Destroy();
-  }
+  if ( appStudy && !CORBA::is_nil( obj ) )
+    ret = obj->GetShapeType() == GEOM::COMPOUND && obj->GetMaxShapeType() == GEOM::VERTEX;
   return ret;
 }
 
index eb0cf2658045d72f652a3c4509ab34d0dac3afc4..5cd4b18d9bcb738dd4e10d4f58b1426d745c7b9b 100644 (file)
@@ -129,36 +129,35 @@ static inline int getTopAbsMode( const int implType )
   }
 }
 
-static bool isCompoundOfVertices( const TopoDS_Shape& theShape )
+static int getMinMaxShapeType( const TopoDS_Shape& shape, bool ismin )
 {
-  bool ret = false;
-  if ( !theShape.IsNull() ) {
-    int iType, nbTypes [TopAbs_SHAPE];
-    for (iType = 0; iType < TopAbs_SHAPE; ++iType)
-      nbTypes[iType] = 0;
-    nbTypes[theShape.ShapeType()]++;
-
-    TopTools_MapOfShape aMapOfShape;
-    aMapOfShape.Add(theShape);
-    TopTools_ListOfShape aListOfShape;
-    aListOfShape.Append(theShape);
-
-    TopTools_ListIteratorOfListOfShape itL (aListOfShape);
-    for (; itL.More(); itL.Next()) {
-      TopoDS_Iterator it (itL.Value());
-      for (; it.More(); it.Next()) {
-        TopoDS_Shape s = it.Value();
-        if (aMapOfShape.Add(s)) {
-          aListOfShape.Append(s);
-          nbTypes[s.ShapeType()]++;
-        }
-      }
+  if ( shape.IsNull() )
+    return TopAbs_SHAPE;
+
+  int ret = shape.ShapeType();
+
+  if ( shape.ShapeType() == TopAbs_COMPOUND || shape.ShapeType() == TopAbs_COMPSOLID ) {
+    TopoDS_Iterator it(shape, Standard_True, Standard_False);
+    for (; it.More(); it.Next()) {
+      TopoDS_Shape sub_shape = it.Value();
+      if ( sub_shape.IsNull() ) continue;
+      int stype = getMinMaxShapeType( sub_shape, ismin );
+      if ( stype == TopAbs_SHAPE ) continue;
+      if ( ismin && stype > ret )
+       ret = stype;
+      else if ( !ismin && ( ret < TopAbs_SOLID || stype < ret ) )
+       ret = stype;
     }
-    ret = nbTypes[TopAbs_VERTEX] > 0 && nbTypes[TopAbs_COMPOUND] == 1;
   }
+
   return ret;
 }
 
+static bool isCompoundOfVertices( const TopoDS_Shape& theShape )
+{
+  return theShape.ShapeType() == TopAbs_COMPOUND && getMinMaxShapeType( theShape, false ) == TopAbs_VERTEX;
+}
+
 //================================================================
 // Function : getFilter
 // Purpose  : Get filter corresponding to the type of object
index 5a4e70bdee19eeff12f3a700ad2599ca0b0c04d9..51d7be6b26f2f112aa8ad8a51d982c9177bfa2ca 100644 (file)
@@ -285,7 +285,6 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_CENTER_POINT</source>
         <translation>Center Point</translation>
     </message>
-
     <message>
         <source>GEOM_CENTRAL_POINT</source>
         <translation>Central Point</translation>
@@ -1508,15 +1507,15 @@ Please, select face, shell or solid and try again</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_ADD_PARAMS</source>
-       <translation>Additionnal Parameters</translation>
+        <translation>Additionnal Parameters</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_ANGLE</source>
-       <translation>Angle</translation>
+        <translation>Angle</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_ANGLE2</source>
-       <translation>Angle :</translation>
+        <translation>Angle :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_APPLY</source>
@@ -1528,12 +1527,12 @@ Please, select face, shell or solid and try again</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_CENTER</source>
-       <translation>Center</translation>
+        <translation>Center</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_CENTER2</source>
         <translation>Center :</translation>
-    </message>  
+    </message>
     <message>
         <source>GEOM_SKETCHER_CENTER_X</source>
         <translation>Center X coord. :</translation>
@@ -1604,7 +1603,7 @@ Please, select face, shell or solid and try again</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_END_POINT2</source>
-       <translation>End Point :</translation>
+        <translation>End Point :</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_RADIUS</source>
@@ -1958,7 +1957,6 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_AXIS_DEFAULT</source>
         <translation>(Z axis by default)</translation>
     </message>
-
     <message>
         <source>GEOM_VECTOR_LENGTH</source>
         <translation>Vector Length :</translation>
@@ -4146,8 +4144,7 @@ Otherwise the dimensions will be kept without modifications.</translation>
     </message>
     <message>
         <source>GEOM_PRECISION_HINT</source>
-        <translation>
-Input value precision can be adjusted using
+        <translation>Input value precision can be adjusted using
 &apos;%1&apos; parameter in Geometry module preferences.</translation>
     </message>
     <message>
@@ -4213,7 +4210,7 @@ Input value precision can be adjusted using
     <message>
         <source>GEOM_PLUGINS_OTHER</source>
         <translation>Other</translation>
-    </message>  
+    </message>
 </context>
 <context>
     <name>BasicGUI_CurveDlg</name>
@@ -4467,7 +4464,7 @@ Number of sketch points too small</translation>
     <message>
         <source>SHOW_ALL_SUB_SHAPES</source>
         <translation>Show all sub-shapes</translation>
-    </message> 
+    </message>
     <message>
         <source>SELECT_ALL</source>
         <translation>Select All</translation>
index 42e44bc1fcb954dfbf7fc1c647b2bda911819a69..c6c66a45b93c540dffa6cab109ac60f850d225d6 100644 (file)
@@ -1505,6 +1505,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>GEOM_SKETCHER_ABS</source>
         <translation>Absolu</translation>
     </message>
+    <message>
+        <source>GEOM_SKETCHER_ADD_PARAMS</source>
+        <translation>TODO</translation>
+    </message>
     <message>
         <source>GEOM_SKETCHER_ANGLE</source>
         <translation>Angle</translation>
@@ -1521,6 +1525,30 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>GEOM_SKETCHER_ARC</source>
         <translation>Arc</translation>
     </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER</source>
+        <translation>Center</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER2</source>
+        <translation>Centre :</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER_X</source>
+        <translation>Centre coord. X :</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER_Y</source>
+        <translation>Centre coord. Y :</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER_DX</source>
+        <translation>Centre coord. DX :</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_CENTER_DY</source>
+        <translation>Centre coord. DY :</translation>
+    </message>
     <message>
         <source>GEOM_SKETCHER_DEST</source>
         <translation>Destination</translation>
@@ -1557,6 +1585,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>GEOM_SKETCHER_LENGTH2</source>
         <translation>Longueur :</translation>
     </message>
+    <message>
+        <source>GEOM_SKETCHER_NONE</source>
+        <translation>Aucun (Tangentiel)</translation>
+    </message>
     <message>
         <source>GEOM_SKETCHER_PER</source>
         <translation>Perpendiculaire</translation>
@@ -1571,7 +1603,11 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_END_POINT2</source>
-       <translation>End Point :</translation>
+        <translation>End Point :</translation>
+    </message>
+    <message>
+        <source>GEOM_SKETCHER_RADIUS</source>
+        <translation>Rayon</translation>
     </message>
     <message>
         <source>GEOM_SKETCHER_RADIUS2</source>
@@ -4042,17 +4078,29 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <translation>INOUT</translation>
     </message>
     <message>
-        <source>TOP_GET_SHAPES_ON_SHAPES</source>
+        <source>TOP_GET_SHAPES_ON_SHAPE</source>
         <translation>Trouver les éléments d&apos;un objet</translation>
     </message>
     <message>
-        <source>MEN_GET_SHAPES_ON_SHAPES</source>
+        <source>MEN_GET_SHAPES_ON_SHAPE</source>
         <translation>Trouver les éléments d&apos;un objet</translation>
     </message>
     <message>
-        <source>STB_GET_SHAPES_ON_SHAPES</source>
+        <source>STB_GET_SHAPES_ON_SHAPE</source>
+        <translation>Trouve les éléments d&apos;un objet</translation>
+    </message>
+    <message>
+        <source>TOP_GET_SHARED_SHAPES</source>
         <translation>Trouver les éléments d&apos;un objet</translation>
     </message>
+    <message>
+        <source>MEN_GET_SHARED_SHAPES</source>
+        <translation>Trouver les éléments partagés</translation>
+    </message>
+    <message>
+        <source>STB_GET_SHARED_SHAPES</source>
+        <translation>Trouve les éléments partagés</translation>
+    </message>
     <message>
         <source>GEOM_PUBLISH_RESULT_GRP</source>
         <translation>Options avancées</translation>
@@ -4638,6 +4686,29 @@ Voulez-vous continuer?</translation>
         <translation>Ouvrir une Texture</translation>
     </message>
 </context>
+<context>
+    <name>OperationGUI_GetSharedShapesDlg</name>
+    <message>
+        <source>GEOM_SHARED_SHAPES_TITLE</source>
+        <translation>Trouver les éléments partagés</translation>
+    </message>
+    <message>
+        <source>GEOM_GET_SHARED_SHAPES</source>
+        <translation>Eléments partagés</translation>
+    </message>
+    <message>
+        <source>GEOM_SHARED_SHAPES_INPUT</source>
+        <translation>Paramètres d&apos;entrée</translation>
+    </message>
+    <message>
+        <source>MSG_SHARED_SHAPES_TOO_FEW_SHAPES</source>
+        <translation>Pas assez d'éléments sélectionnés</translation>
+    </message>
+    <message>
+        <source>GEOM_SHARED_SHAPE</source>
+        <translation>Partagé_%1</translation>
+    </message>
+</context>
 <context>
     <name>AdvancedGUI_PipeTShapeDlg</name>
     <message>
index c60ad507bbb438edb176892022ee3181bdbbfe22..002b25c4dfd9520edb8b55df3037c03de4a7a929 100644 (file)
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
-//NOTE: This is an intreface to a function for the Rotate operation.
-//
+//  NOTE: This is an interface to a function for the Rotate operation.
+
 #include "GEOM_Function.hxx"
 
+#include <gp_XYZ.hxx>
+
 #define ROTATE_ANGLE    1  
 #define ROTATE_AXIS     2
 #define ROTATE_ORGN     3
 #define ROTATE_STEP1      4
-#define ROTATE_NBITER1   5
-#define ROTATE_NBITER2   6
+#define ROTATE_NBITER1    5
+#define ROTATE_NBITER2    6
 #define ROTATE_CENTRAL_POINT    7  
 #define ROTATE_POINT1           8
 #define ROTATE_POINT2           9
+#define ROTATE_DIR2_X     10
+#define ROTATE_DIR2_Y     11
+#define ROTATE_DIR2_Z     12
 
 class GEOMImpl_IRotate
 {
@@ -64,7 +68,7 @@ class GEOMImpl_IRotate
 
   Handle(GEOM_Function) GetOriginal() { return _func->GetReference(ROTATE_ORGN); }
 
-  void SetStep(double theStep) { return _func->SetReal(ROTATE_STEP1, theStep); }
+  void SetStep(double theStep) { _func->SetReal(ROTATE_STEP1, theStep); }
 
   double GetStep() { return _func->GetReal(ROTATE_STEP1); }
 
@@ -76,6 +80,21 @@ class GEOMImpl_IRotate
 
   int GetNbIter2() { return _func->GetInteger(ROTATE_NBITER2); } 
 
+  void SetDir2 (gp_XYZ theDir2)
+  {
+    _func->SetReal(ROTATE_DIR2_X, theDir2.X());
+    _func->SetReal(ROTATE_DIR2_Y, theDir2.Y());
+    _func->SetReal(ROTATE_DIR2_Z, theDir2.Z());
+  }
+
+  gp_XYZ GetDir2()
+  {
+    gp_XYZ aRes (0., 0., 0.);
+    aRes.SetX(_func->GetReal(ROTATE_DIR2_X));
+    aRes.SetY(_func->GetReal(ROTATE_DIR2_Y));
+    aRes.SetZ(_func->GetReal(ROTATE_DIR2_Z));
+    return aRes;
+  }
   
  private:
   
index 6e34f80a03e7f0960a68f971965cd597d3112cac..e916f423202d39dd4fb1c055c29e6a85cd6a8919 100644 (file)
@@ -3271,7 +3271,7 @@ namespace {
    */
   //================================================================================
 
-  gp_Vec GetNormal(const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
+  gp_Vec GetNormal (const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
   {
     gp_Vec defaultNorm(1,0,0); // to have same normals on different faces
     try {
@@ -3304,12 +3304,35 @@ namespace {
     }
     return defaultNorm;
   }
+
+  //================================================================================
+  /*!
+   * \brief Return type of shape for explode. In case of compound it will be a type of sub shape.
+   */
+  //================================================================================
+
+  TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape)
+  {
+    TopAbs_ShapeEnum aType = theShape.ShapeType();
+    if      (aType == TopAbs_VERTEX)                             return TopAbs_VERTEX;
+    else if (aType == TopAbs_EDGE  || aType == TopAbs_WIRE)      return TopAbs_EDGE;
+    else if (aType == TopAbs_FACE  || aType == TopAbs_SHELL)     return TopAbs_FACE;
+    else if (aType == TopAbs_SOLID || aType == TopAbs_COMPSOLID) return TopAbs_SOLID;
+    else if (aType == TopAbs_COMPOUND) {
+      // Only the iType of the first shape in the compound is taken into account
+      TopoDS_Iterator It (theShape, Standard_False, Standard_False);
+      if (It.More()) {
+        return GetTypeOfSimplePart(It.Value());
+      }
+    }
+    return TopAbs_SHAPE;
+  }
 }
 
 //=============================================================================
 /*!
   case GetInPlace:
   default:
*  case GetInPlace:
*  default:
  */
 //=============================================================================
 Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object) theShapeWhere,
@@ -3344,8 +3367,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object)
   Handle(GEOM_Object) aResult;
 
   bool isFound = false;
-  Standard_Integer iType = TopAbs_SOLID;
-  Standard_Integer compType = TopAbs_SOLID;
+  TopAbs_ShapeEnum iType = TopAbs_SOLID;
   //Standard_Real    aWhat_Mass = 0., aWhere_Mass = 0.;
   Standard_Real    tab_aWhat[4],    tab_aWhere[4];
   Standard_Real    dl_l = 1e-3;
@@ -3356,6 +3378,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object)
   GProp_GProps     aProps;
 
   // Find the iType of the aWhat shape
+  /*
   if      ( aWhat.ShapeType() == TopAbs_VERTEX )                                         iType = TopAbs_VERTEX;
   else if ( aWhat.ShapeType() == TopAbs_EDGE  || aWhat.ShapeType() == TopAbs_WIRE )      iType = TopAbs_EDGE;
   else if ( aWhat.ShapeType() == TopAbs_FACE  || aWhat.ShapeType() == TopAbs_SHELL )     iType = TopAbs_FACE;
@@ -3367,7 +3390,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object)
       SetErrorCode("Error: theShapeWhat is an empty COMPOUND.");
       return NULL;
     }
-    compType = It.Value().ShapeType();
+    TopAbs_ShapeEnum compType = It.Value().ShapeType();
     if      ( compType == TopAbs_VERTEX )                               iType = TopAbs_VERTEX;
     else if ( compType == TopAbs_EDGE  || compType == TopAbs_WIRE )     iType = TopAbs_EDGE;
     else if ( compType == TopAbs_FACE  || compType == TopAbs_SHELL)     iType = TopAbs_FACE;
@@ -3377,10 +3400,16 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object)
     SetErrorCode("Error: An attempt to extract a shape of not supported type.");
     return NULL;
   }
+  */
+  iType = GetTypeOfSimplePart(aWhat);
+  if (iType == TopAbs_SHAPE) {
+    SetErrorCode("Error: An attempt to extract a shape of not supported type.");
+    return NULL;
+  }
 
-  TopExp_Explorer Exp_aWhat( aWhat,   TopAbs_ShapeEnum( iType ) );
-  TopExp_Explorer Exp_aWhere( aWhere, TopAbs_ShapeEnum( iType ) );
-  TopExp_Explorer Exp_Edge( aWhere,   TopAbs_EDGE );
+  TopExp_Explorer Exp_aWhat  ( aWhat,  iType );
+  TopExp_Explorer Exp_aWhere ( aWhere, iType );
+  TopExp_Explorer Exp_Edge   ( aWhere, TopAbs_EDGE );
 
   // Find the shortest edge in theShapeWhere shape
   BRepBndLib::Add(aWhere, BoundingBox);
index 42ab3f44fd3d07f68be91a2b5279a34f585cab95..b5731bfc1f8580d5e54d98b147c83c67274fa5e5 100644 (file)
@@ -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 <Standard_Stream.hxx>
 
 #include <OpUtil.hxx>
 #include <Utils_ExceptHandlers.hxx>
 
-#include <TFunction_DriverTable.hxx>
-#include <TFunction_Driver.hxx>
-#include <TFunction_Logbook.hxx>
-#include <TDF_Tool.hxx>
-
 #include <GEOM_Function.hxx>
 #include <GEOM_PythonDump.hxx>
 
 
 #include <GEOMImpl_Types.hxx>
 
+#include <TFunction_DriverTable.hxx>
+#include <TFunction_Driver.hxx>
+#include <TFunction_Logbook.hxx>
+#include <TDF_Tool.hxx>
+
+#include <BRep_Tool.hxx>
+#include <BRep_Builder.hxx>
+#include <TopExp.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Compound.hxx>
+#include <gp_Pnt.hxx>
+#include <gp_Vec.hxx>
+#include <gp_Trsf.hxx>
+
+#include <StdFail_NotDone.hxx>
 #include <Standard_Failure.hxx>
 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
 
@@ -560,7 +571,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
   //Check if the function is set correctly
   if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL;
 
-  GEOMImpl_ITranslate aTI(aFunction);
+  GEOMImpl_ITranslate aTI (aFunction);
   aTI.SetVector(theVector->GetLastFunction());
   aTI.SetVector2(theVector2->GetLastFunction());
   aTI.SetOriginal(aLastFunction);
@@ -594,6 +605,148 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
   return aCopy;
 }
 
+//=============================================================================
+/*!
+ *  TranslateShape1D
+ */
+//=============================================================================
+/*
+TopoDS_Shape GEOMImpl_ITransformOperations::TranslateShape1D (const TopoDS_Shape&  theShape,
+                                                              GEOMImpl_ITranslate* theTI)
+{
+  TopoDS_Shape aRes;
+
+  // Vector
+  Handle(GEOM_Function) aVector = theTI->GetVector();
+  if (aVector.IsNull()) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+  TopoDS_Shape aV = aVector->GetValue();
+  if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+  TopoDS_Edge anEdge = TopoDS::Edge(aV);
+
+  gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
+  gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge));
+  if (aP1.Distance(aP2) < gp::Resolution()) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+
+  // Step and Nb.times
+  Standard_Real step = theTI->GetStep1();
+  Standard_Integer nbtimes = theTI->GetNbIter1();
+
+  // Make multi-translation
+  gp_Trsf aTrsf;
+  gp_Vec aVec;
+  TopoDS_Compound aCompound;
+  BRep_Builder B;
+  B.MakeCompound(aCompound);
+
+  gp_Vec Vec (aP1, aP2);
+  Vec.Normalize();
+
+  TopLoc_Location aLocOrig = theShape.Location();
+  gp_Trsf aTrsfOrig = aLocOrig.Transformation();
+
+  for (int i = 0; i < nbtimes; i++) {
+    aVec = Vec * (i * step);
+    aTrsf.SetTranslation(aVec);
+    //NPAL18620: performance problem: multiple locations are accumulated
+    //           in shape and need a great time to process
+    //BRepBuilderAPI_Transform aTransformation(theShape, aTrsf, Standard_False);
+    //B.Add(aCompound, aTransformation.Shape());
+    TopLoc_Location aLocRes (aTrsf * aTrsfOrig);
+    B.Add(aCompound, theShape.Located(aLocRes));
+  }
+  aRes = aCompound;
+
+  return aRes;
+}
+*/
+
+//=============================================================================
+/*!
+ *  TranslateShape2D
+ */
+//=============================================================================
+/*
+TopoDS_Shape GEOMImpl_ITransformOperations::TranslateShape2D (const TopoDS_Shape&  theShape,
+                                                              GEOMImpl_ITranslate* theTI)
+{
+  TopoDS_Shape aRes;
+
+  // Vectors
+  Handle(GEOM_Function) aVector1 = theTI->GetVector();
+  Handle(GEOM_Function) aVector2 = theTI->GetVector2();
+
+  if (aVector1.IsNull() || aVector2.IsNull()) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+
+  TopoDS_Shape aV1 = aVector1->GetValue();
+  TopoDS_Shape aV2 = aVector2->GetValue();
+
+  if (aV1.IsNull() || aV1.ShapeType() != TopAbs_EDGE ||
+      aV2.IsNull() || aV2.ShapeType() != TopAbs_EDGE) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+
+  TopoDS_Edge anEdge1 = TopoDS::Edge(aV1);
+  TopoDS_Edge anEdge2 = TopoDS::Edge(aV2);
+
+  gp_Pnt aP11 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge1));
+  gp_Pnt aP12 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge1));
+  gp_Pnt aP21 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge2));
+  gp_Pnt aP22 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge2));
+
+  if (aP11.Distance(aP12) < gp::Resolution() ||
+      aP21.Distance(aP22) < gp::Resolution()) {
+    StdFail_NotDone::Raise("Invalid object is given for vector argument");
+  }
+
+  gp_Vec Vec1 (aP11, aP12);
+  gp_Vec Vec2 (aP21, aP22);
+
+  Vec1.Normalize();
+  Vec2.Normalize();
+
+  // Step and Nb.times
+  Standard_Real step1 = theTI->GetStep1(), step2 = theTI->GetStep2();
+  Standard_Integer nbtimes1 = theTI->GetNbIter1(), nbtimes2 = theTI->GetNbIter2();
+
+  // Make multi-translation
+  gp_Trsf aTrsf;
+  gp_Vec aVec;
+  Standard_Real DX, DY, DZ;
+  TopoDS_Compound aCompound;
+  BRep_Builder B;
+  B.MakeCompound(aCompound);
+
+  TopLoc_Location aLocOrig = theShape.Location();
+  gp_Trsf aTrsfOrig = aLocOrig.Transformation();
+
+  for (int i = 0; i < nbtimes1; i++) {
+    for (int j = 0; j < nbtimes2; j++) {
+      DX = i * step1 * Vec1.X() + j * step2 * Vec2.X();
+      DY = i * step1 * Vec1.Y() + j * step2 * Vec2.Y();
+      DZ = i * step1 * Vec1.Z() + j * step2 * Vec2.Z();
+      aVec.SetCoord(DX, DY, DZ);
+      aTrsf.SetTranslation(aVec);
+      //NPAL18620: performance problem: multiple locations are accumulated
+      //           in shape and need a great time to process
+      //BRepBuilderAPI_Transform aBRepTransformation(theShape, aTrsf, Standard_False);
+      //B.Add(aCompound, aBRepTransformation.Shape());
+      TopLoc_Location aLocRes (aTrsf * aTrsfOrig);
+      B.Add(aCompound, theShape.Located(aLocRes));
+    }
+  }
+  aRes = aCompound;
+
+  return aRes;
+}
+*/
 
 //=============================================================================
 /*!
@@ -1538,7 +1691,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
   aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D);
   if (aFunction.IsNull()) return NULL;
 
-    //Check if the function is set correctly
+  //Check if the function is set correctly
   if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL;
 
   GEOMImpl_IRotate aRI(aFunction);
@@ -1750,3 +1903,148 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateThreePointsCopy (Handle
   return aCopy;
 }
 
+//=============================================================================
+/*!
+ *  TransformLikeOtherCopy
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_ITransformOperations::TransformLikeOtherCopy
+                                                (Handle(GEOM_Object) theObject, 
+                                                 Handle(GEOM_Object) theSample)
+{
+  SetErrorCode(KO);
+
+  if (theObject.IsNull() || theSample.IsNull()) return NULL;
+
+  Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
+  if (aLastFunction.IsNull()) return NULL; // There is no function which creates an object to be transformed
+
+  Handle(GEOM_Function) aSampleFunc = theSample->GetLastFunction();
+  if (aSampleFunc.IsNull()) return NULL; // There is no function which creates a sample object
+
+  // Add a new Copy object
+  Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType());
+
+  // Add a transform function (depends on theSample function)
+  Handle(GEOM_Function) aFunction =
+    aCopy->AddFunction(aSampleFunc->GetDriverGUID(), aSampleFunc->GetType());
+  if (aFunction.IsNull()) return NULL;
+
+  // Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != aSampleFunc->GetDriverGUID()) return NULL;
+
+  if (aSampleFunc->GetDriverGUID() == GEOMImpl_TranslateDriver::GetID()) {
+    switch (aSampleFunc->GetType()) {
+    case TRANSLATE_1D:
+      {
+        GEOMImpl_ITranslate aRI_sample (aSampleFunc);
+        GEOMImpl_ITranslate aRI_target (aFunction);
+
+        aRI_target.SetVector(aRI_sample.GetVector());
+        aRI_target.SetStep1(aRI_sample.GetStep1());
+        aRI_target.SetNbIter1(aRI_sample.GetNbIter1());
+
+        aRI_target.SetOriginal(aLastFunction);
+      }
+      break;
+    case TRANSLATE_2D:
+      {
+        GEOMImpl_ITranslate aRI_sample (aSampleFunc);
+        GEOMImpl_ITranslate aRI_target (aFunction);
+
+        aRI_target.SetVector(aRI_sample.GetVector());
+        aRI_target.SetStep1(aRI_sample.GetStep1());
+        aRI_target.SetNbIter1(aRI_sample.GetNbIter1());
+
+        aRI_target.SetVector2(aRI_sample.GetVector2());
+        aRI_target.SetStep2(aRI_sample.GetStep2());
+        aRI_target.SetNbIter2(aRI_sample.GetNbIter2());
+
+        aRI_target.SetOriginal(aLastFunction);
+      }
+      break;
+    default:
+      {
+        SetErrorCode("Not implemented case of TransformLikeOtherCopy");
+        return NULL;
+      }
+    }
+  }
+  else if (aSampleFunc->GetDriverGUID() == GEOMImpl_RotateDriver::GetID()) {
+    switch (aSampleFunc->GetType()) {
+    case ROTATE_1D:
+      {
+        GEOMImpl_IRotate aRI_sample (aSampleFunc);
+        GEOMImpl_IRotate aRI_target (aFunction);
+
+        aRI_target.SetAxis(aRI_sample.GetAxis());
+        aRI_target.SetNbIter1(aRI_sample.GetNbIter1());
+
+        aRI_target.SetOriginal(aLastFunction);
+      }
+      break;
+    case ROTATE_2D:
+      {
+        GEOMImpl_IRotate aRI_sample (aSampleFunc);
+        GEOMImpl_IRotate aRI_target (aFunction);
+
+        aRI_target.SetAxis(aRI_sample.GetAxis());
+
+        aRI_target.SetNbIter1(aRI_sample.GetNbIter1());
+        aRI_target.SetNbIter2(aRI_sample.GetNbIter2());
+
+        aRI_target.SetAngle(aRI_sample.GetAngle());
+        aRI_target.SetStep(aRI_sample.GetStep());
+
+        aRI_target.SetDir2(aRI_sample.GetDir2());
+
+        aRI_target.SetOriginal(aLastFunction);
+      }
+      break;
+    case ROTATE_THREE_POINTS_COPY:
+      {
+        GEOMImpl_IRotate aRI_sample (aSampleFunc);
+        GEOMImpl_IRotate aRI_target (aFunction);
+
+        aRI_target.SetCentPoint(aRI_sample.GetCentPoint());
+        aRI_target.SetPoint1(aRI_sample.GetPoint1());
+        aRI_target.SetPoint2(aRI_sample.GetPoint2());
+
+        aRI_target.SetOriginal(aLastFunction);
+      }
+      break;
+    default:
+      {
+        SetErrorCode("Not implemented case of TransformLikeOtherCopy");
+        return NULL;
+      }
+    }
+  }
+  else {
+    SetErrorCode("Not implemented case of TransformLikeOtherCopy");
+    return NULL;
+  }
+
+  // Compute the transformation
+  try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+    OCC_CATCH_SIGNALS;
+#endif
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("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) << aCopy << " = geompy.TransformLikeOtherCopy("
+  //                             << theObject << ", " << theSample << ")";
+
+  SetErrorCode(OK);
+  return aCopy;
+}
index 8ac9ad4d9c8cf6b6b093a80f4675166aa4773cbf..bdac1b1bda67e2d7897a9bddea964798ba308f5f 100644 (file)
@@ -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_ITransformOperations_HXX_
 #define _GEOMImpl_ITransformOperations_HXX_
 #include "GEOM_IOperations.hxx"
 #include "GEOM_Engine.hxx"
 #include "GEOM_Object.hxx"
+
 #include <TDocStd_Document.hxx>
+#include <TopoDS_Shape.hxx>
+
+class GEOMImpl_ITranslate;
+class GEOMImpl_IRotate;
 
 class GEOMImpl_ITransformOperations : public GEOM_IOperations
 {
@@ -73,6 +77,14 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
                                                    double theStep2,
                                                    Standard_Integer theNbTimes2);
 
+  /*
+  Standard_EXPORT static TopoDS_Shape TranslateShape1D (const TopoDS_Shape&  theShape,
+                                                        GEOMImpl_ITranslate* theTI);
+
+  Standard_EXPORT static TopoDS_Shape TranslateShape2D (const TopoDS_Shape&  theShape,
+                                                        GEOMImpl_ITranslate* theTI);
+  */
+
   Standard_EXPORT Handle(GEOM_Object) MirrorPlane (Handle(GEOM_Object) theObject,
                                                    Handle(GEOM_Object) thePlane);
 
@@ -155,6 +167,9 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
                                                              Handle(GEOM_Object) thePoint1,
                                                              Handle(GEOM_Object) thePoint2);
 
+  Standard_EXPORT Handle(GEOM_Object) TransformLikeOtherCopy (Handle(GEOM_Object) theObject,
+                                                              Handle(GEOM_Object) theSample);
+
 };
 
 #endif
index 914fcc95264755a11e9b36761df7f2a3b46a780d..a11e17b0c0ad3c67a3076cff99f91c6b34681f76 100644 (file)
@@ -205,35 +205,45 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
 
     gp_Ax1 AX1(aP1, D);
 
-
     gp_Trsf aTrsf1;
     gp_Trsf aTrsf2;
-    gp_Pnt P1;
-    GProp_GProps System;
 
-    if (anOriginal.ShapeType() == TopAbs_VERTEX) {
-      P1 = BRep_Tool::Pnt(TopoDS::Vertex( anOriginal ));
-    }
-    else if ( anOriginal.ShapeType() == TopAbs_EDGE || anOriginal.ShapeType() == TopAbs_WIRE ) {
-      BRepGProp::LinearProperties(anOriginal, System);
-      P1 = System.CentreOfMass();
-    }
-    else if ( anOriginal.ShapeType() == TopAbs_FACE || anOriginal.ShapeType() == TopAbs_SHELL ) {
-      BRepGProp::SurfaceProperties(anOriginal, System);
-      P1 = System.CentreOfMass();
-    }
-    else {
-      BRepGProp::VolumeProperties(anOriginal, System);
-      P1 = System.CentreOfMass();
-    }
+    gp_XYZ aDir2 = RI.GetDir2(); // can be set by previous execution
+    if (aDir2.Modulus() < gp::Resolution()) {
+      // Calculate direction as vector from the axis to the shape's center
+      gp_Pnt P1;
+      GProp_GProps System;
+
+      if (anOriginal.ShapeType() == TopAbs_VERTEX) {
+        P1 = BRep_Tool::Pnt(TopoDS::Vertex( anOriginal ));
+      }
+      else if ( anOriginal.ShapeType() == TopAbs_EDGE || anOriginal.ShapeType() == TopAbs_WIRE ) {
+        BRepGProp::LinearProperties(anOriginal, System);
+        P1 = System.CentreOfMass();
+      }
+      else if ( anOriginal.ShapeType() == TopAbs_FACE || anOriginal.ShapeType() == TopAbs_SHELL ) {
+        BRepGProp::SurfaceProperties(anOriginal, System);
+        P1 = System.CentreOfMass();
+      }
+      else {
+        BRepGProp::VolumeProperties(anOriginal, System);
+        P1 = System.CentreOfMass();
+      }
 
-    Handle(Geom_Line) Line = new Geom_Line(AX1);
-    GeomAPI_ProjectPointOnCurve aPrjTool( P1, Line );
-    gp_Pnt P2 = aPrjTool.NearestPoint();
+      Handle(Geom_Line) Line = new Geom_Line(AX1);
+      GeomAPI_ProjectPointOnCurve aPrjTool( P1, Line );
+      gp_Pnt P2 = aPrjTool.NearestPoint();
 
-    if ( P1.IsEqual(P2, Precision::Confusion() ) ) return 0;
+      if ( P1.IsEqual(P2, Precision::Confusion() ) ) return 0;
+
+      aDir2 = gp_XYZ(P1.X()-P2.X(), P1.Y()-P2.Y(), P1.Z()-P2.Z());
+
+      // Attention: this abnormal action is done for good working of
+      // TransformLikeOther(), used by RestoreSubShapes functionality
+      RI.SetDir2(aDir2);
+    }
 
-    gp_Vec Vec (P1.X()-P2.X(), P1.Y()-P2.Y(), P1.Z()-P2.Z());
+    gp_Vec Vec (aDir2);
     Vec.Normalize();
 
     Standard_Integer nbtimes2 = RI.GetNbIter2();
index f6d4fb0ebe5c3bc643cc5476eb99d66e712c7847..a3b54774ba60a3581da10ce82a64051b12c73b50 100644 (file)
 //  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 <Standard_Stream.hxx>
 
 #include <GEOMImpl_TranslateDriver.hxx>
 #include <GEOMImpl_ITranslate.hxx>
+#include <GEOMImpl_ITransformOperations.hxx>
 #include <GEOMImpl_Types.hxx>
 #include <GEOM_Function.hxx>
 
@@ -79,7 +79,7 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
 
   if (aFunction.IsNull()) return 0;
 
-  GEOMImpl_ITranslate TI(aFunction);
+  GEOMImpl_ITranslate TI (aFunction);
   gp_Trsf aTrsf;
   gp_Pnt aP1, aP2;
   Standard_Integer aType = aFunction->GetType();
@@ -197,6 +197,7 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
       B.Add(aCompound, anOriginal.Located(aLocRes));
     }
     aShape = aCompound;
+    //aShape = GEOMImpl_ITransformOperations::TranslateShape1D(anOriginal, &TI);
   }
   else if (aType == TRANSLATE_2D) {
     Standard_Integer nbtimes1 = TI.GetNbIter1(), nbtimes2 = TI.GetNbIter2();
@@ -242,7 +243,8 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
         B.Add(aCompound, anOriginal.Located(aLocRes));
       }
     }
-   aShape = aCompound;
+    aShape = aCompound;
+    //aShape = GEOMImpl_ITransformOperations::TranslateShape2D(anOriginal, &TI);
   }
   else return 0;
 
index 49292bda414c14ae054eee9905e8585a2882508d..5606d8bfc91367a31b5456de295bb9438ce81e66 100644 (file)
@@ -966,8 +966,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
   }
   else {
     // Get interface, containing method, which we will use to reconstruct sub-shapes
-    GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-    GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+    GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
     // Reconstruct arguments and tree of sub-shapes of the arguments
     CORBA::String_var anIOR;
@@ -996,6 +997,64 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
             aSubO = aShapesOp->GetInPlace(theObject, anArgO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anArgO, theObject);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf);
+            }
+            /*
+            Handle(GEOM_Function) anOFun = theObject->GetLastFunction();
+            if (!anOFun.IsNull()) {
+              CORBA::String_var entryArg = anArgO->GetEntry();
+              Handle(GEOM_Object) anArgOImpl = _impl->GetObject(anArgO->GetStudyID(), entryArg);
+              if (!anArgOImpl.IsNull()) {
+                TopoDS_Shape anArgOShape = anArgOImpl->GetValue();
+                TopoDS_Shape aMultiArgShape;
+                //GEOM::GEOM_Object_var anArgOMulti; // ???
+                switch (anOFun->GetType()) {
+                case TRANSLATE_1D:
+                  {
+                    GEOMImpl_ITranslate aTI (anOFun);
+                    aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape1D(anArgOShape, &aTI);
+                    //anArgOMulti = aTrsfOp->Translate1D(anArgO, , , );
+                  }
+                  break;
+                case TRANSLATE_2D:
+                  {
+                    GEOMImpl_ITranslate aTI (anOFun);
+                    aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                case ROTATE_1D:
+                  {
+                    GEOMImpl_IRotate aTI (anOFun);
+                    //aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                case ROTATE_2D:
+                  {
+                    GEOMImpl_IRotate aTI (anOFun);
+                    //aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                default:
+                  {}
+                }
+                GEOM::GEOM_Object_var anArgOMulti = (aMultiArgShape); // TODO
+                Handle(GEOM_Function) anArgOMultiFun = anArgOMulti->GetLastFunction();
+                anArgOMultiFun->SetDescription("");
+                aSubO = aShapesOp->GetInPlace(theObject, anArgOMulti);
+              }
+            }
+            */
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1183,6 +1242,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
     switch (theFindMethod) {
     case GEOM::FSM_GetInPlace:
       pd << "FSM_GetInPlace"; break;
+    case GEOM::FSM_MultiTransformed:
+      pd << "FSM_MultiTransformed"; break;
     case GEOM::FSM_Transformed:
       pd << "FSM_Transformed"; break;
     case GEOM::FSM_GetSame:
@@ -1221,8 +1282,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesOneLevel (SALOMEDS::Study_ptr     th
   SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
 
   // Get interface, containing method, which we will use to reconstruct sub-shapes
-  GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-  GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+  GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
   // Reconstruct published sub-shapes
   SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator(theOldSO);
@@ -1253,6 +1315,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesOneLevel (SALOMEDS::Study_ptr     th
             aNewSubO = aShapesOp->GetInPlace(theNewO, anOldSubO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anOldSubO, theNewO);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1482,8 +1557,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
   }
   else {
     // Get interface, containing method, which we will use to reconstruct sub-shapes
-    GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-    GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+    GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
     // Reconstruct arguments and tree of sub-shapes of the arguments
     CORBA::String_var anIOR;
@@ -1512,6 +1588,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
             aSubO = aShapesOp->GetInPlace(theObject, anArgO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anArgO, theObject);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1691,6 +1780,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
     switch (theFindMethod) {
     case GEOM::FSM_GetInPlace:
       pd << "FSM_GetInPlace"; break;
+    case GEOM::FSM_MultiTransformed:
+      pd << "FSM_MultiTransformed"; break;
     case GEOM::FSM_Transformed:
       pd << "FSM_Transformed"; break;
     case GEOM::FSM_GetSame:
@@ -1729,8 +1820,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesOneLevel (SALOMEDS::Study_ptr
   SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
 
   // Get interface, containing method, which we will use to reconstruct sub-shapes
-  GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-  GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+  GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
   // Reconstruct published sub-shapes
   SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator(theOldSO);
@@ -1769,6 +1861,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesOneLevel (SALOMEDS::Study_ptr
             aNewSubO = aShapesOp->GetInPlace(theNewO, anOldSubO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anOldSubO, theNewO);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
index ef9b61ea6602f897e0fa452653b62d83c8375b5e..568c0e010a9914cc422c2df06b27134a45aa1384 100644 (file)
@@ -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 <Standard_Stream.hxx>
 
@@ -1130,6 +1129,37 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateThreePointsCopy
   return GetObject(anObject);
 }
 
+//=============================================================================
+/*!
+ *  TransformLikeOtherCopy
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TransformLikeOtherCopy
+                                             (GEOM::GEOM_Object_ptr theObject,
+                                              GEOM::GEOM_Object_ptr theSample)
+{
+  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();
+
+  //Get the sample object
+  Handle(GEOM_Object) aSample = GetObjectImpl(theSample);
+  if (aSample.IsNull()) return aGEOMObject._retn();
+
+  //Perform the transformation
+  Handle(GEOM_Object) aResObject =
+    GetOperations()->TransformLikeOtherCopy(anObject, aSample);
+  if (!GetOperations()->IsDone() || aResObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(aResObject);
+}
+
 //=============================================================================
 /*!
  *  RecomputeObject
index 5c1a40038934d2dd465084c28f5af61b3db136b7..a26d3db5409a8b5fc891a2515a93891e1cdda902 100644 (file)
@@ -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_ITransformOperations_i_HeaderFile
 #define _GEOM_ITransformOperations_i_HeaderFile
@@ -51,10 +50,12 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
                                                GEOM::GEOM_Object_ptr thePoint1,
                                                GEOM::GEOM_Object_ptr thePoint2);
 
-  GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
+  GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject,
+                                         CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
 
 
-  GEOM::GEOM_Object_ptr TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject,  CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
+  GEOM::GEOM_Object_ptr TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject,
+                                             CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
 
   GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject,
                                         GEOM::GEOM_Object_ptr theVector);
@@ -67,10 +68,15 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
                                                 CORBA::Double theDistance,
                                                 CORBA::Boolean theCopy);
 
-  GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theVector, CORBA::Double theStep, CORBA::Long theNbTimes);
+  GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject,
+                                          GEOM::GEOM_Object_ptr theVector,
+                                          CORBA::Double theStep, CORBA::Long theNbTimes);
 
-  GEOM::GEOM_Object_ptr MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theVector1, CORBA::Double theStep1, CORBA::Long theNbTimes1,
-                                                      GEOM::GEOM_Object_ptr theVector2, CORBA::Double theStep2, CORBA::Long theNbTimes2);
+  GEOM::GEOM_Object_ptr MultiTranslate2D (GEOM::GEOM_Object_ptr theObject,
+                                          GEOM::GEOM_Object_ptr theVector1,
+                                          CORBA::Double theStep1, CORBA::Long theNbTimes1,
+                                          GEOM::GEOM_Object_ptr theVector2,
+                                          CORBA::Double theStep2, CORBA::Long theNbTimes2);
 
   GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject,
                                 GEOM::GEOM_Object_ptr theAxis,
@@ -159,6 +165,9 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
                                               GEOM::GEOM_Object_ptr thePoint1,
                                               GEOM::GEOM_Object_ptr thePoint2);
 
+  GEOM::GEOM_Object_ptr TransformLikeOtherCopy (GEOM::GEOM_Object_ptr theObject,
+                                                GEOM::GEOM_Object_ptr theSample);
+
   GEOM::GEOM_Object_ptr RecomputeObject (GEOM::GEOM_Object_ptr theObject);
 
 
index ad139cb773e8b6136d4b72849cb5e6669ab867a6..0dd22bdf4a0f28284cd7500133e77132296302c9 100644 (file)
@@ -141,7 +141,7 @@ GEOM::shape_type GEOM_Object_i::GetTopologyType()
   return (GEOM::shape_type)shape.ShapeType();
 }
 
-static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
+static GEOM::shape_type getMinMaxShapeType( const TopoDS_Shape& shape, bool ismin )
 {
   if ( shape.IsNull() )
     return GEOM::SHAPE;
@@ -153,8 +153,11 @@ static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
     for (; it.More(); it.Next()) {
       TopoDS_Shape sub_shape = it.Value();
       if ( sub_shape.IsNull() ) continue;
-      GEOM::shape_type stype = (GEOM::shape_type)sub_shape.ShapeType();
-      if ( stype != GEOM::SHAPE && stype > ret )
+      GEOM::shape_type stype = (GEOM::shape_type)getMinMaxShapeType( sub_shape, ismin );
+      if ( stype == GEOM::SHAPE ) continue;
+      if ( ismin && stype > ret )
+       ret = stype;
+      else if ( !ismin && ( ret < GEOM::SOLID || stype < ret ) )
        ret = stype;
     }
   }
@@ -169,7 +172,17 @@ static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
 //=============================================================================
 GEOM::shape_type GEOM_Object_i::GetMinShapeType()
 {
-  return getMinShapeType( _impl->GetValue() );
+  return getMinMaxShapeType( _impl->GetValue(), true );
+}
+
+//=============================================================================
+/*!
+ *  GetMaxShapeType
+ */
+//=============================================================================
+GEOM::shape_type GEOM_Object_i::GetMaxShapeType()
+{
+  return getMinMaxShapeType( _impl->GetValue(), false );
 }
 
 //=============================================================================
index d47306aada225cf868ffdd3ea0ea1751024e6821..c7ed4c7583158acb50d80784cadaf9fc6e858bc0 100644 (file)
@@ -55,6 +55,8 @@ class GEOM_I_EXPORT GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public
 
   virtual GEOM::shape_type GetMinShapeType();
 
+  virtual GEOM::shape_type GetMaxShapeType();
+
   virtual void SetName(const char* theName);
 
   virtual char* GetName();
index 3d7bcc844fcc1556d0dd363fdf8e6c97d8aeaee6..8eca09311fd749326e12c8e641d78e86c704640e 100644 (file)
@@ -53,6 +53,17 @@ def TestMeasureOperations (geompy, math):
   print "\nBox 10x30x70 description:"
   print Descr
 
+  ####### NbShapes #######
+
+  NbSolids = geompy.NbShapes(box, geompy.ShapeType["SOLID"])
+  print "\nBox 10x30x70 quantity of solids:", NbSolids
+
+  ####### ShapeInfo #######
+
+  BoxInfo = geompy.ShapeInfo(box)
+  print "\nBox 10x30x70 shapes:"
+  print BoxInfo
+
   ####### BasicProperties #######
 
   Props = geompy.BasicProperties(box)
index e0050e398ab45f6d0e5ae53e2fe535a6f9ef711c..1b09785d08b805a6d3cc180a542c01a0ed9d5668 100644 (file)
@@ -654,10 +654,10 @@ def TestOtherOperations (geompy, math):
   pcyl = geompy.MakeVertex(50, 50, -50)
   cyli = geompy.MakeCylinder(pcyl, vz, 40, 100)
   fuse = geompy.MakeFuse(sph1, cyli)
-  fuse = geompy.MakeFuse(fuse, sph2)
+  sh_1 = geompy.MakeFuse(fuse, sph2)
   # As after Fuse we have a compound, we need to obtain a solid from it
-  shsh = geompy.SubShapeAll(fuse, geompy.ShapeType["SOLID"])
-  sh_1 = shsh[0]
+  #shsh = geompy.SubShapeAll(fuse, geompy.ShapeType["SOLID"])
+  #sh_1 = shsh[0]
   geompy.addToStudy(sh_1, "sh_1")
 
   # GetShapesOnShape
index e99f710aa288a1022a7d369aa1b487b6fd2c4080..9a5e3fa4a8c5b4a32b97eda5820e5a75bb3f9a03 100644 (file)
@@ -2251,6 +2251,21 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             anObj = self.GetSubShape(aShape, ListOfIDs)
             return anObj
 
+        ## Extract shapes (main shape or sub-shape) of given type
+        # @param aShape shape
+        # @param aType  shape type
+        def ExtractShapes(self, aShape, aType, sorted = False):
+            ret = []
+            t = aShape.GetShapeType()._v
+            if hasattr(aType, "_v"): aType = aType._v
+            if t == aType:
+                ret.append(aShape )
+            elif sorted:
+                ret = self.SubShapeAllSortedCentres(aShape, aType)
+            else:
+                ret = self.SubShapeAll(aShape, aType)
+            return ret
+        
         # end of l4_decompose_d
         ## @}
 
@@ -2566,8 +2581,8 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             # Example: see GEOM_TestAll.py
             if Limit == ShapeType["AUTO"]:
                 # automatic detection of the most appropriate shape limit type
-                lim = GEOM.SOLID
-                for s in ListShapes: lim = max( lim, s.GetMinShapeType() )
+                lim = GEOM.SHAPE
+                for s in ListShapes: lim = min( lim, s.GetMaxShapeType() )
                 Limit = lim._v
                 pass
             anObj = self.BoolOp.MakePartition(ListShapes, ListTools,
@@ -2596,8 +2611,8 @@ class geompyDC(GEOM._objref_GEOM_Gen):
                                                  ListMaterials=[], KeepNonlimitShapes=0):
             if Limit == ShapeType["AUTO"]:
                 # automatic detection of the most appropriate shape limit type
-                lim = GEOM.SOLID
-                for s in ListShapes: lim = max( lim, s.GetMinShapeType() )
+                lim = GEOM.SHAPE
+                for s in ListShapes: lim = min( lim, s.GetMaxShapeType() )
                 Limit = lim._v
                 pass
             anObj = self.BoolOp.MakePartitionNonSelfIntersectedShape(ListShapes, ListTools,
@@ -3425,6 +3440,42 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             RaiseIfFailed("WhatIs", self.MeasuOp)
             return aDescr
 
+        ## Obtain quantity of shapes of the given type in \a theShape.
+        #  If \a theShape is of type \a theType, it is also counted.
+        #  @param theShape Shape to be described.
+        #  @return Quantity of shapes of type \a theType in \a theShape.
+        #
+        #  @ref tui_measurement_tools_page "Example"
+        def NbShapes (self, theShape, theType):
+            # Example: see GEOM_TestMeasures.py
+            listSh = self.SubShapeAllIDs(theShape, theType)
+            Nb = len(listSh)
+            if theShape.GetShapeType()._v == theType:
+                Nb = Nb + 1
+                pass
+            return Nb
+
+        ## Obtain quantity of shapes of each type in \a theShape.
+        #  The \a theShape is also counted.
+        #  @param theShape Shape to be described.
+        #  @return Dictionary of shape types with bound quantities of shapes.
+        #
+        #  @ref tui_measurement_tools_page "Example"
+        def ShapeInfo (self, theShape):
+            # Example: see GEOM_TestMeasures.py
+            aDict = {}
+            for typeSh in ShapeType:
+                if typeSh != "AUTO" and typeSh != "SHAPE":
+                    listSh = self.SubShapeAllIDs(theShape, ShapeType[typeSh])
+                    Nb = len(listSh)
+                    if theShape.GetShapeType()._v == ShapeType[typeSh]:
+                        Nb = Nb + 1
+                        pass
+                    aDict[typeSh] = Nb
+                    pass
+                pass
+            return aDict
+
         ## Get a point, situated at the centre of mass of theShape.
         #  @param theShape Shape to define centre of mass of.
         #  @return New GEOM_Object, containing the created point.
@@ -3637,7 +3688,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             #RaiseIfFailed("Import", self.InsertOp)
             # recieve name using returned vertex
             UnitName = "M"
-            vertices = self.SubShapeAll(anObj,ShapeType["VERTEX"])
+            if anObj.GetShapeType() == GEOM.VERTEX:
+                vertices = [anObj]
+            else:
+                vertices = self.SubShapeAll(anObj,ShapeType["VERTEX"])
             if len(vertices)>0:
                 p = self.PointCoordinates(vertices[0])
                 if abs(p[0]-0.01) < 1.e-6:
index 2317414ad4e4339c1489964faf2e866abfa79c9b..451babeb8f3cc211e7ea9ca327bade598a9b46e0 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "GEOM_AISShape.ixx"
 #include "SALOME_InteractiveObject.hxx"
+#include "GEOM_AISVector.hxx"
 
 // Open CASCADE Includes
 #include <AIS_Drawer.hxx>
@@ -210,10 +211,14 @@ void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresent
 
   if (isShowVectors())
   {
+    const bool isVector = IsKind(STANDARD_TYPE(GEOM_AISVector));
     TopExp_Explorer Exp ( myshape, TopAbs_EDGE );
     for ( ; Exp.More(); Exp.Next() ) {
       TopoDS_Vertex aV1, aV2;
       TopoDS_Edge anEdgeE = TopoDS::Edge(Exp.Current());
+      if ( !isVector )
+        // draw curve direction (issue 0021087)
+        anEdgeE.Orientation( TopAbs_FORWARD );
 
       if ( anEdgeE.IsNull() ) continue;
 
index e44cc81e0c019ce52bac5d08c9e70962c0695ec5..54f4ece23204cfe600308d1b35aa137b991cc985 100755 (executable)
@@ -65,8 +65,11 @@ Execute()
 
   TEdgeSet::Iterator anIter (myEdgeSet);
   for (; anIter.More(); anIter.Next()) {
-    const TopoDS_Edge& anEdge = anIter.Value();
-    OCC2VTK(anEdge,aPolyData,aPts,myIsVector);
+    TopoDS_Edge anEdge = anIter.Value();
+    if ( !myIsVector )
+      // draw curve direction (issue 0021087)
+      anEdge.Orientation( TopAbs_FORWARD );
+    OCC2VTK(anEdge,aPolyData,aPts,myIsVector||myIsVectorMode);
   }
 }
 
@@ -263,10 +266,10 @@ void GEOM_EdgeSource::OCC2VTK (const TopoDS_Edge& theEdge,
 
 void GEOM_EdgeSource::SetVectorMode (bool theMode)
 {
-  myIsVector = theMode;
+  myIsVectorMode = theMode;
 }
 
 bool GEOM_EdgeSource::GetVectorMode ()
 {
-  return myIsVector;
+  return !myIsVector && myIsVectorMode;
 }
index 9ef08683f65e75183546ab6dc0cb98a35763ee49..6ea230d55bd18d99064b13b11814d3978d8438a8 100755 (executable)
@@ -57,7 +57,7 @@ protected:
   TEdgeSet myEdgeSet;
   // The <myIsVector> flag is common for all edges, because the shape,
   // representing a vector, can have only one edge.
-  bool myIsVector;
+  bool myIsVector, myIsVectorMode;
  
   void Execute(); 
  
index fae221528bb529cbc7237bb7124e7d426e1fe4d4..2d483cae70f3a8a3846561f638a9cc6960fb42af 100644 (file)
@@ -129,7 +129,8 @@ void OperationGUI_GetSharedShapesDlg::Init()
   connect(myGeomGUI->getApp()->selectionMgr(),
            SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
 
-  initName(getNewObjectName());
+  //initName(getNewObjectName());
+  initName(getPrefixByType());
 
   ConstructorsClicked(0);
   GroupPoints->PushButton1->click();
@@ -181,7 +182,8 @@ bool OperationGUI_GetSharedShapesDlg::ClickOnApply()
   if (!onAccept())
     return false;
 
-  initName(getNewObjectName());
+  //initName(getNewObjectName());
+  initName(getPrefixByType());
 
   return true;
 }
@@ -261,7 +263,8 @@ void OperationGUI_GetSharedShapesDlg::enterEvent(QEvent*)
 //=======================================================================
 void OperationGUI_GetSharedShapesDlg::ComboTextChanged()
 {
-  initName(getNewObjectName());
+  //initName(getNewObjectName());
+  initName(getPrefixByType());
 }
 
 //=================================================================================
@@ -319,6 +322,9 @@ bool OperationGUI_GetSharedShapesDlg::execute (ObjectList& objects)
   if (!aList->length())
     return false;
 
+  if (aList->length() > 1)
+    myMainFrame->ResultName->setText(getPrefixByType());
+
   for (int i = 0, n = aList->length(); i < n; i++)
     objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i]));
 
@@ -339,24 +345,24 @@ GEOM::GEOM_Object_ptr OperationGUI_GetSharedShapesDlg::getFather (GEOM::GEOM_Obj
 }
 
 //================================================================
-// Function : getNewObjectName
+// Function : getPrefixByType
 // Purpose  :
 //================================================================
-QString OperationGUI_GetSharedShapesDlg::getNewObjectName() const
+QString OperationGUI_GetSharedShapesDlg::getPrefixByType () const
 {
+  QString aPref;
+
   int aLimit = GroupPoints->ComboBox1->currentIndex();
-  //QString aName = tr("GEOM_SHARED_SHAPE");
-  QString aName;
 
   switch (aLimit) {
-  case 0:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SOLID")) ; break;
-  case 1:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHELL")) ; break;
-  case 2:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_FACE"))  ; break;
-  case 3:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_WIRE"))  ; break;
-  case 4:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_EDGE"))  ; break;
-  case 5:  aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_VERTEX")); break;
-  default: aName = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHAPE")) ;
+  case 0:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SOLID")) ; break;
+  case 1:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHELL")) ; break;
+  case 2:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_FACE"))  ; break;
+  case 3:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_WIRE"))  ; break;
+  case 4:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_EDGE"))  ; break;
+  case 5:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_VERTEX")); break;
+  default: aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHAPE")) ;
   }
 
-  return aName;
+  return aPref;
 }
index 4ac5f07b4076229854a7cfede55a07c18cb45e2b..0e0d601318902437a2f8259f10746a1c16849748 100644 (file)
@@ -48,7 +48,7 @@ protected:
   virtual bool                       isValid (QString&);
   virtual bool                       execute (ObjectList&);
   virtual GEOM::GEOM_Object_ptr      getFather (GEOM::GEOM_Object_ptr);
-  virtual QString                    getNewObjectName() const;
+  QString                            getPrefixByType() const;
 
 private:
   void                               Init();
index 6c4ad4bda12e58796508dc768ab6c80d13c48773..18e456af23af3f04fcf8ff4e61f17984e8a20617 100644 (file)
@@ -293,9 +293,9 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
     GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true);
     //myListMaterials.length( 0 ); // obsolete
     
-    GEOM::shape_type type = GEOM::SOLID;
+    GEOM::shape_type type = GEOM::SHAPE;
     for (int i = 0; i < myListShapes.length(); i++)
-      type = qMax( type, myListShapes[i]->GetMinShapeType() );
+      type = qMin( type, myListShapes[i]->GetMaxShapeType() );
     int idx = qMax( 0, GroupPoints->ComboBox1->findData( type ) );
     GroupPoints->ComboBox1->setCurrentIndex( idx );
 
index aebe44d8263eac9c331907aa82a957eb605486bf..f1fbc770a3fd991fecd36a1937f9a7bf303338df 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  GEOM GEOMGUI : GUI for Geometry component
+//  File   : TransformationGUI_MultiRotationDlg.cxx
+//  Author : Damien COQUERET, Open CASCADE S.A.S.
 
-// GEOM GEOMGUI : GUI for Geometry component
-// File   : TransformationGUI_MultiRotationDlg.cxx
-// Author : Damien COQUERET, Open CASCADE S.A.S.
-//
 #include "TransformationGUI_MultiRotationDlg.h"
 
 #include <DlgRef.h>
@@ -196,7 +195,7 @@ void TransformationGUI_MultiRotationDlg::Init()
 void TransformationGUI_MultiRotationDlg::SetDoubleSpinBoxStep (double step)
 {
   GroupDimensions->SpinBox_DX2->setSingleStep(step);
-  
+
   // san: Commented so as not to override specific step settings
   //GroupPoints->SpinBox_DX->setSingleStep((int)step);
   //GroupDimensions->SpinBox_DX1->setSingleStep(step);
@@ -549,11 +548,11 @@ bool TransformationGUI_MultiRotationDlg::isValid (QString& msg)
   case 0:
     ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) && ok;
     break;
-  case 1:                                           
+  case 1:
     ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) && ok;
     ok = GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) && ok;
     ok = GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) && ok;
-    ok = GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) && ok;        
+    ok = GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) && ok;
     break;
   }
   return !(myBase->_is_nil() || myVector->_is_nil()) && ok;
@@ -638,7 +637,7 @@ void TransformationGUI_MultiRotationDlg::restoreSubShapes (SALOMEDS::Study_ptr
     anArgs->length(1);
     anArgs[0] = myBase;
     getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
-                                        /*theFindMethod=*/GEOM::FSM_Transformed,
+                                        /*theFindMethod=*/GEOM::FSM_MultiTransformed,
                                         /*theInheritFirstArg=*/true,
                                         mainFrame()->CheckBoxAddPrefix->isChecked());
   }
index 36f2a54dc729fe47e58df0d638710f19079b1806..77c4a7bb5a6eff2786e6d5c1ae96b4997097b4fb 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  GEOM GEOMGUI : GUI for Geometry component
+//  File   : TransformationGUI_MultiTranslationDlg.cxx
+//  Author : Damien COQUERET, Open CASCADE S.A.S.
 
-// GEOM GEOMGUI : GUI for Geometry component
-// File   : TransformationGUI_MultiTranslationDlg.cxx
-// Author : Damien COQUERET, Open CASCADE S.A.S.
-//
 #include "TransformationGUI_MultiTranslationDlg.h"
 
 #include <DlgRef.h>
@@ -197,13 +196,13 @@ void TransformationGUI_MultiTranslationDlg::Init()
   connect(GroupDimensions->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
   connect(GroupDimensions->SpinBox_DY2, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
 
-  connect(GroupPoints->SpinBox_DX,      SIGNAL(textChanged(const QString& )), 
+  connect(GroupPoints->SpinBox_DX,      SIGNAL(textChanged(const QString& )),
           this, SLOT(TextValueChangedInSpinBox(const QString& )));
-  connect(GroupDimensions->SpinBox_DX1, SIGNAL(textChanged(const QString& )), 
+  connect(GroupDimensions->SpinBox_DX1, SIGNAL(textChanged(const QString& )),
           this, SLOT(TextValueChangedInSpinBox(const QString& )));
-  connect(GroupDimensions->SpinBox_DX2, SIGNAL(textChanged(const QString& )), 
+  connect(GroupDimensions->SpinBox_DX2, SIGNAL(textChanged(const QString& )),
           this, SLOT(TextValueChangedInSpinBox(const QString& )));
-  
+
   connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double)));
 
   connect(GroupPoints->CheckButton1,     SIGNAL(toggled(bool)), this, SLOT(ReverseStepU()));
@@ -222,9 +221,9 @@ void TransformationGUI_MultiTranslationDlg::Init()
 void TransformationGUI_MultiTranslationDlg::SetDoubleSpinBoxStep (double step)
 {
   GroupPoints->SpinBox_DX->setSingleStep(step);
-  GroupDimensions->SpinBox_DX1->setSingleStep(step);  
+  GroupDimensions->SpinBox_DX1->setSingleStep(step);
   GroupDimensions->SpinBox_DX2->setSingleStep(step);
-  
+
   // san : Commented so as not to override specific step settings
   //GroupPoints->SpinBox_DY->setSingleStep((int)step);
   //GroupDimensions->SpinBox_DY1->setSingleStep((int)step);
@@ -536,25 +535,25 @@ void TransformationGUI_MultiTranslationDlg::TextValueChangedInSpinBox( const QSt
 {
   QObject* send = (QObject*)sender();
   bool isDigit = true;
-  
+
   switch (getConstructorId()) {
-  case 0: 
+  case 0:
     GroupPoints->SpinBox_DX->text().toDouble(&isDigit);
     if(!isDigit){
       GroupPoints->CheckButton1->setChecked(false);
     }
     GroupPoints->CheckButton1->setEnabled(isDigit);
     break;
-  case 1: 
+  case 1:
     if (send == GroupDimensions->SpinBox_DX1) {
       GroupDimensions->SpinBox_DX1->text().toDouble(&isDigit);
-      if(!isDigit) 
+      if(!isDigit)
         GroupDimensions->CheckButton1->setChecked(false);
       GroupDimensions->CheckButton1->setEnabled(isDigit);
     }
     else if(send == GroupDimensions->SpinBox_DX2){
       GroupDimensions->SpinBox_DX2->text().toDouble(&isDigit);
-      if(!isDigit) 
+      if(!isDigit)
         GroupDimensions->CheckButton2->setChecked(false);
       GroupDimensions->CheckButton2->setEnabled(isDigit);
     }
@@ -655,7 +654,7 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperatio
 bool TransformationGUI_MultiTranslationDlg::isValid (QString& msg)
 {
   int aConstructorId = getConstructorId();
-  
+
   if (aConstructorId == 0) {
     bool ok = true;
     ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) && ok;
@@ -762,7 +761,7 @@ void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_pt
     anArgs->length(1);
     anArgs[0] = myBase;
     getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
-                                        /*theFindMethod=*/GEOM::FSM_Transformed,
+                                        /*theFindMethod=*/GEOM::FSM_MultiTransformed,
                                         /*theInheritFirstArg=*/true,
                                         mainFrame()->CheckBoxAddPrefix->isChecked());
   }
@@ -784,7 +783,7 @@ void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Objec
     TopoDS_Shape aVector = BRepBuilderAPI_MakeEdge(BRep_Tool::Pnt(aFirst), BRep_Tool::Pnt(aLast)).Shape();
     const char* aName = "tmpVector";
     Handle(GEOM_AISVector) anIO = new GEOM_AISVector( aVector, aName );
-    
+
     // add Prs to preview
     SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
     SOCC_Prs* aPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0));