Merge from V7_3_BR branch 18/12/2013

This commit is contained in:
vsr 2013-12-18 14:23:59 +00:00
parent 48ccce2bf0
commit bb545186fa
61 changed files with 1894 additions and 942 deletions

View File

@ -30,7 +30,7 @@ CMAKE_POLICY(SET CMP0003 NEW)
STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC)
SET(${PROJECT_NAME_UC}_MAJOR_VERSION 7) SET(${PROJECT_NAME_UC}_MAJOR_VERSION 7)
SET(${PROJECT_NAME_UC}_MINOR_VERSION 2) SET(${PROJECT_NAME_UC}_MINOR_VERSION 3)
SET(${PROJECT_NAME_UC}_PATCH_VERSION 0) SET(${PROJECT_NAME_UC}_PATCH_VERSION 0)
SET(${PROJECT_NAME_UC}_VERSION SET(${PROJECT_NAME_UC}_VERSION
${${PROJECT_NAME_UC}_MAJOR_VERSION}.${${PROJECT_NAME_UC}_MINOR_VERSION}.${${PROJECT_NAME_UC}_PATCH_VERSION}) ${${PROJECT_NAME_UC}_MAJOR_VERSION}.${${PROJECT_NAME_UC}_MINOR_VERSION}.${${PROJECT_NAME_UC}_PATCH_VERSION})

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -2,29 +2,38 @@
\page common_operation_page Common \page common_operation_page Common
To produce a \b Common operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Common</b> \b Common operation cuts the common part of a list of shapes and transforms it into an independent geometrical object.
This operation cuts the common part of a list of shapes and transforms it into an independent geometrical object. To produce it, select in the main menu <b>Operations - > Boolean - > Common</b>.
The \b Result will be a \b GEOM_Object.
<b>TUI Command:</b> <em>geompy.MakeCommonList(theShapesList, checkSelfInte)</em>\n
<b>Arguments:</b> Name + a list of shapes + an optional flag for self-intersection check.\n
<b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\image html bool2.png "Common dialog" \image html bool2.png "Common dialog"
\note This algorithm doesn't find all types of self-intersections. It is tuned In this dialog:
- Input or accept the default \b Name of the resulting shape.
- Click the arrow button and select in the Object Browser or in the Viewer the <b>Objects</b> the common part which of should be found.
- Activate the corresponding check-box if you wish to <b> Detect Self-intersections </b>
- Activate \ref restore_presentation_parameters_page "Advanced options" if required.
- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object).
\note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
This operation can be performed using a <b>TUI Command:</b>
For a particular case with two shapes for the Common operation there is the following TUI command: <em>geompy.MakeCommonList(theShapesList, checkSelfInte)</em>
<b>Arguments:</b> Name + a list of shapes + an optional flag for self-intersection check.
There is also a special <b>TUI Command</b> for the Common operation on two shapes :
<em>geompy.MakeCommon(s1, s2, checkSelfInte)</em>
<b>TUI Command:</b> <em>geompy.MakeCommon(s1, s2, checkSelfInte)</em>\n
<b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check. <b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check.
<b>Example:</b> <b>Example:</b>
@ -38,8 +47,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b> <b> More details </b>
For a detailed description of the Boolean operations please refer to Please, refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
<a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights operations algorithms, describes the usage methodology and highlights
major limitations of these operations. major limitations of these operations.

View File

@ -2,21 +2,30 @@
\page create_isoline_page Isoline \page create_isoline_page Isoline
To create an \b Isoline in the <b>Main Menu</b> select <b>New Entity - > \b Isoline is a 3D curve built on a bounded face limited by <em> [Umin, Umax] </em> and <em> [Vmin, Vmax] </em>
Basic - > Isoline</b> values of U and V parameters. For all points of the isoline U or V parameter value is constant.
\n The \b Result of this operation will be a GEOM_Object. To create an \b Isoline of a face in the <b>Main Menu</b> select <b>New Entity - > Basic - > Isoline</b>.
It may be either an edge or a compound of several edges.
\n You can define an Isoline by a \b Face, \b Type and \b Parameter.
\n <b>TUI Command:</b> <em>geompy.MakeIsoline(theFace, IsUIsoline, theParameter)</em>
\n <b>Arguments:</b> Name + Face + Type (True for U-Isoline; False for V-Isoline) + Parameter.
\image html isoline1.png \image html isoline1.png
In this dialog:
- Input or accept the default \b Name of the resulting shape.
- Click the arrow button and select in the Object Browser or in the Viewer the \b Face, for which the Isoline is built.
- Select along which coordinate: \b U-Isoline or \b V-Isoline the Isoline is built;
- Set \b Parameter (ranging from 0 to 1), which defines the proportion, at which a face is divided by the isoline.
If Parameter=0.5, the isoline is a median.
- Press "Apply" or "Apply & Close" button to get the result (an edge or a compound of several edges).
This operation can be performed using a <b>TUI Command:</b>
<em>geompy.MakeIsoline(theFace, IsUIsoline, theParameter)</em>
<b>Arguments:</b> Name + Face + Type (True for U-Isoline; False for V-Isoline) + Parameter.
<b>Example:</b> <b>Example:</b>
\image html isoline2.png "Isoline on face" \image html isoline2.png "Isoline on a rectangle face"
Our <b>TUI Scripts</b> provide you with useful examples of creation of Our <b>TUI Scripts</b> provide you with useful examples of creation of
\ref tui_creation_curve "Basic Geometric Objects". \ref tui_creation_curve "Basic Geometric Objects".

View File

@ -1,18 +1,15 @@
/*! /*!
\page create_smoothingsurface_page SmoothingSurface \page create_smoothingsurface_page Smoothing Surface
To create a \b SmoothingSurface in the <b>Main Menu</b> select <b>New Entity - > To create a <b> Smoothing Surface</b> in the <b>Main Menu</b> select <b>New Entity - >
Advanced - > SmoothingSurface </b> Advanced - > SmoothingSurface </b>
Specify the parameters of the SmoothingSurface object creation in the opened dialog Specify the \b Name of the surface and the list of \b Points, from which it is approximated and press "Apply" or "Apply & Close" button.
box and press "Apply" or "Apply & Close" button.
Result of each operation will be a GEOM_Object.
<b>TUI Command:</b> <em>geompy.MakeSmoothingSurface(lPoints)</em> The result of the operation will be a GEOM_Object(Surface).
<b>Arguments:</b> <b>TUI Command:</b> <em>geompy.MakeSmoothingSurface(Points)</em>
- \b Points - list of points
\image html smoothingsurface_dlg.png \image html smoothingsurface_dlg.png

View File

@ -2,29 +2,37 @@
\page cut_operation_page Cut \page cut_operation_page Cut
To produce a \b Cut operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Cut</b> \b Cut operation cuts a shape with a list of other shapes.
This operation cuts a shape with a list of other shapes. To produce it, select in the main menu <b>Operations - > Boolean - > Cut</b>
The \b Result will be a \b GEOM_Object.
<b>TUI Command:</b> <em>geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte)</em>\n
<b>Arguments:</b> Name + a main shape + a list of other shapes + an optional flag for self-intersection check.\n
<b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\image html bool3.png "Cut dialog" \image html bool3.png "Cut dialog"
\note This algorithm doesn't find all types of self-intersections. It is tuned In this dialog:
- Input or accept the default \b Name of the resulting shape.
- Click the arrow button and select in the Object Browser or in the Viewer the <b>Main Object</b>, which will be cut by tool objects.
- Select the <b>Tool objects</b>, which will cut the main object.
- Activate the corresponding check-box if you wish to <b> Detect Self-intersections </b>.
- Activate \ref restore_presentation_parameters_page "Advanced options" if required.
- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object).
\note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
For a particular case with two shapes (object and tool) for the Cut operation there is the following TUI command: This operation can be performed using a <b>TUI Command:</b>
<em>geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte)</em>
<b>Arguments:</b> Name + a main shape + a list of other shapes + an optional flag for self-intersection check.
There is also a special <b>TUI Command:</b> for the Cut operation on two shapes (object and tool) :
<em>geompy.MakeCut(s1, s2, checkSelfInte)</em>
<b>TUI Command:</b> <em>geompy.MakeCut(s1, s2, checkSelfInte)</em>\n
<b>Arguments:</b> Name + the object + the tool + an optional flag for self-intersection check. <b>Arguments:</b> Name + the object + the tool + an optional flag for self-intersection check.
<b>Example:</b> <b>Example:</b>
@ -38,8 +46,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b> <b> More details </b>
For a detailed description of the Boolean operations please refer to Please refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
<a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights operations algorithms, describes the usage methodology and highlights
major limitations of these operations. major limitations of these operations.

View File

@ -2,30 +2,36 @@
\page fuse_operation_page Fuse \page fuse_operation_page Fuse
To produce a \b Fuse operation in the <b>Main Menu</b> select \b Fuse operation creates one shape from a list of shapes.
<b>Operations - > Boolean - > Fuse</b>.
This operation creates one shape from a list of shapes. To produce it, select in the Main Menu <b>Operations - > Boolean - > Fuse</b>.
The \b Result will be a \b GEOM_Object.
<b>TUI Command:</b> <em>geompy.MakeFuseList(theShapesList, checkSelfInte)</em>\n
<b>Arguments:</b> Name + a list of shapes + an optional flag for self-intersection check.\n
<b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\image html bool1.png "Fuse dialog" \image html bool1.png "Fuse dialog"
\note This algorithm doesn't find all types of self-intersections. It is tuned In this dialog:
- Input or accept the default \b Name of the resulting shape.
- Click the arrow button and select in the Object Browser or in the Viewer the <b>Objects</b> to be fused.
- Activate the corresponding check-box if you wish to <b> Detect Self-intersections </b>.
- Activate \ref restore_presentation_parameters_page "Advanced options" if required.
- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object).
\note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
This operation can be performed using a <b>TUI Command:</b>
For a particular case with two shapes to be fused there is the following TUI command: <em>geompy.MakeFuseList(theShapesList, checkSelfInte)</em>
<b>Arguments:</b> Name + a list of shapes + an optional flag for self-intersection check.
There is also a special <b>TUI Command</b> for \b Fuse operation on two shapes :
<em>geompy.MakeFuse(s1, s2, checkSelfInte)</em>
<b>TUI Command:</b> <em>geompy.MakeFuse(s1, s2, checkSelfInte)</em>\n
<b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check. <b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check.
<b>Example:</b> <b>Example:</b>
@ -38,13 +44,13 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
\ref tui_fuse "Boolean Operations". \ref tui_fuse "Boolean Operations".
<b> More details </b> <b> More details </b>
<ul>
<li>For a detailed description of the Boolean operations please refer to Please, refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
<a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights operations algorithms, describes the usage methodology and highlights
major limitations of these operations.</li> major limitations of these operations.
<li>Perhaps you also ask yourself : \ref partition_explanation "What is the difference between partition, compounds and fuse operation ?"</li>
</ul> Perhaps you also ask yourself : \ref partition_explanation "What is the difference between partition, compounds and fuse operation ?"
*/ */

View File

@ -44,32 +44,32 @@ predefined materials.</li>
<li><b>Isolines width</b> - allows to define default width of the isolines.</li> <li><b>Isolines width</b> - allows to define default width of the isolines.</li>
<li><b>Preview edges width</b> - allows to define width of the edges for preview.</li> <li><b>Preview edges width</b> - allows to define width of the edges for preview.</li>
<li><b>Measures line width</b> - allows to define lines width of measurements tools.</li> <li><b>Measures line width</b> - allows to define lines width of measurements tools.</li>
<li><b>Automatic bring to front</b> - when option is ON: the objects selected by the user will be automatically <li><b>Automatic bring to front</b> - when the option is on, the objects selected by the user automatically become "top-level".</li>
made "top-level".</li>
</ul> </ul>
</ul> </ul>
<ul> <ul>
<li><b>Number of isolines</b></li> - this submenu allows to specify the <li><b>Number of isolines</b> - allows to specify the number of isolines along <b>Along U</b> and <b>Along V</b> coordinate axes. They are shown on each selected face. For example:
number of isolines along the axes of coordinates:
<ul> \image html isos.png
<li><b>Along U</b>
<li><b>Along V</b> This preference is not related with <b>Create Isoline</b> operation.
</ul> By default <b>Along U</b> and <b>Along V</b> are null and isolines are not drawn. </li>
</ul> </ul>
<ul> <ul>
<li><b>Input fields precision</b></li> <li><b>Input fields precision</b></li>
<ul> <ul>
<li><b>Length precision</b> - allows to ajust input precision of coordinates and dimensions.</li> <li><b>Length precision</b> - allows to adjust input precision of coordinates and dimensions.</li>
<li><b>Angular precision</b> - allows to ajust input precision of angles.</li> <li><b>Angular precision</b> - allows to adjust input precision of angles.</li>
<li><b>Length tolerance precision</b> - allows to ajust input precision of tolerance of coordinates and dimensions.</li> <li><b>Length tolerance precision</b> - allows to adjust input precision of tolerance of coordinates and dimensions.</li>
<li><b>Angular tolerance precision</b> - allows to ajust input precision of tolerance of angles.</li> <li><b>Angular tolerance precision</b> - allows to adjust input precision of tolerance of angles.</li>
<li><b>Weight precision</b> - allows to ajust input precision of weight and mass.</li> <li><b>Weight precision</b> - allows to adjust input precision of weight and mass.</li>
<li><b>Density precision</b> - allows to ajust input precision of density.</li> <li><b>Density precision</b> - allows to a just input precision of density.</li>
<li><b>Parametric precision</b> - allows to ajust input precision of parametric values.</li> <li><b>Parametric precision</b> - allows to adjust input precision of parametric values.</li>
<li><b>Parametric tolerance precision</b> - allows to ajust input precision of tolerance in parametric space.</li> <li><b>Parametric tolerance precision</b> - allows to adjust input precision of tolerance in parametric space.</li>
</ul> </ul>
</ul> </ul>

View File

@ -8,6 +8,8 @@ are implemented via plug-ins, which gives the opportunity to
expand the range of available formats by adding more plug-ins (for expand the range of available formats by adding more plug-ins (for
example, CATIA 5). example, CATIA 5).
The \subpage xao_format_page "import and export of shapes in XAO format" is implemented differently.
<em>To import geometrical objects from a BREP, IGES, STEP, ACIS or STL file:</em> <em>To import geometrical objects from a BREP, IGES, STEP, ACIS or STL file:</em>
\par \par

View File

@ -14,17 +14,14 @@
- \subpage transform_geom_obj_page "transformation of geometrical objects" - \subpage transform_geom_obj_page "transformation of geometrical objects"
using various algorithms; using various algorithms;
- \subpage repairing_operations_page "optimization of geometrical objects"; - \subpage repairing_operations_page "optimization of geometrical objects";
- viewing \subpage geometrical_obj_prop_page "geometrical object properties" - viewing information about geometrical objects using
and other information about geometrical objects using
\subpage using_measurement_tools_page "measurement tools"; \subpage using_measurement_tools_page "measurement tools";
- \subpage pictures_page "designing shapes from pictures"; - \subpage pictures_page "designing shapes from pictures";
- easily setting parameters via the variables predefined in
It is possible to easily set parameters via the variables predefined in
\subpage using_notebook_geom_page "SALOME notebook". \subpage using_notebook_geom_page "SALOME notebook".
Also, there is a possibility to customize an
The possibility to classify the created geometrical objects by moving it into early created container (folder) is detailed on \subpage arranging_study_objects_page "arrangement of the geometrical objects in the SALOME study".
\subpage arranging_study_objects_page section.
XAO format describing a shape with its topology, groups and fields is detailed on \subpage xao_format_page section.
Geometry module preferences are described in the Geometry module preferences are described in the
\subpage geometry_preferences_page section of SALOME Geometry Help. \subpage geometry_preferences_page section of SALOME Geometry Help.

View File

@ -1,6 +1,6 @@
/*! /*!
\page material_page Material properties \page material_page Material
<ul> <ul>
<li>\ref material_general_description_anchor "General Description"</li> <li>\ref material_general_description_anchor "General Description"</li>
@ -16,12 +16,11 @@
be changed in the future versions of SALOME Geometry module. be changed in the future versions of SALOME Geometry module.
You can change the material properties of the selected shape(s) in You can change the material properties of the selected shape(s) in
the dedicated dialog box. This dialog box can be invoked from the the context menu dialog. The layout of context menu can be customized via
context popup menu. The layout of context menu can be customized via
"Show predefined materials in popup menu" preferences option. "Show predefined materials in popup menu" preferences option.
If this option is switched off, only "Material properties" item will If this option is switched off, only "Material properties" item will
be shown in the popup menu. If this option is on (by default), "Material be shown in the popup menu. If this option is on (by default), "Material
properties" item in the popup menu will open a submenu with list of predefined properties" item in the popup menu will open a sub-menu with a list of predefined
materials: materials:
\image html hide_predef_material.png \image html hide_predef_material.png
@ -44,9 +43,9 @@ the materials is different:
- shape presentation in OCC and VTK viewers is not fully identical; - shape presentation in OCC and VTK viewers is not fully identical;
- some material attributes can affect the presentation in a different way. - some material attributes can affect the presentation in a different way.
\anchor material_opengl_model_anchor <h2>OpenGL ligthing model</h2> \anchor material_opengl_model_anchor <h2>OpenGL lighting model</h2>
The material is specifed by several attributes of the lighting The material is specified by several attributes of the lighting
model. More details can be found in the documentation related to the model. More details can be found in the documentation related to the
OpenGL programming, for example, here: http://www.glprogramming.com/red/chapter05.html. OpenGL programming, for example, here: http://www.glprogramming.com/red/chapter05.html.
@ -54,7 +53,7 @@ In the OpenGL lighting model, the light in a scene comes from several
light sources; the light sources have an effect only when there are light sources; the light sources have an effect only when there are
surfaces that absorb and reflect light. Each surface is assumed to be surfaces that absorb and reflect light. Each surface is assumed to be
composed of a material with various properties. A material might emit composed of a material with various properties. A material might emit
its own light (like headlights on an automobile), it might scatter its own light (like headlights of a vehicle), it might scatter
some incoming light in all directions, and it might reflect a some incoming light in all directions, and it might reflect a
portion of the incoming light in a preferential direction like a portion of the incoming light in a preferential direction like a
mirror or other shiny surface. mirror or other shiny surface.
@ -120,7 +119,7 @@ predefined and custom.
models are specified by the user and can be modified at any moment. models are specified by the user and can be modified at any moment.
</li> </li>
<li>The widgets to the right allow modifyng different properties of the material model: <li>The widgets to the right allow modifying different properties of the material model:
- \b Ambient color and coefficient (floating point value between 0 and 1) - \b Ambient color and coefficient (floating point value between 0 and 1)
- \b Diffuse color and coefficient (floating point value between 0 and 1) - \b Diffuse color and coefficient (floating point value between 0 and 1)
- \b Specular color and coefficient (floating point value between 0 and 1) - \b Specular color and coefficient (floating point value between 0 and 1)
@ -143,7 +142,7 @@ to change the name of material model.</li>
\image html material.png \image html material.png
In addition to the functionality of <b>Materials library</b>, this In addition to the functionality of <b>Materials library</b>, this
dialog provides objects selection mechanizm and \b Color property. dialog provides objects selection mechanism and \b Color property.
If the material model is specified as a \em physical (\em Gold, If the material model is specified as a \em physical (\em Gold,
for example), the shape color (more precisely its \em ambient color) for example), the shape color (more precisely its \em ambient color)
@ -151,7 +150,7 @@ cannot be modified. If you assign a physical material model to the
shape, the "Color" menu item will not be available in the popup menu. shape, the "Color" menu item will not be available in the popup menu.
If the model is non-physical (\em artificial), the color can be changed If the model is non-physical (\em artificial), the color can be changed
to any appopriate one, only other attributes will be constant. In the to any appropriate one, only other attributes will be constant. In the
dialog box you will be able to modify the color of the shape via the dialog box you will be able to modify the color of the shape via the
"Color" button. "Ambient color" button will be disabled to signalize "Color" button. "Ambient color" button will be disabled to signalize
that this attribute of the model is ignored. Also, it will be possible that this attribute of the model is ignored. Also, it will be possible

View File

@ -2,15 +2,11 @@
\page partition_page Partition \page partition_page Partition
<ul> For a detailed description of the Partition operation please refer to <a href="SALOME_BOA_PA.pdf">this document</a>.
<li>For a detailed description of the Partition operation please refer to It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights
<a href="SALOME_BOA_PA.pdf">this document</a>. major limitations of these operations.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights Perhaps you also ask yourself : \ref partition_explanation "What's the difference between partition, compounds and fuse operation ?"
major limitations of these operations.</li>
<li>Perhaps you also ask yourself : \ref partition_explanation "What's the difference between partition, compounds and fuse operation ?"</li>
</ul>
To produce a \b Partition in the <b>Main Menu</b> select <b>Operations - > Partition</b> To produce a \b Partition in the <b>Main Menu</b> select <b>Operations - > Partition</b>
@ -28,7 +24,7 @@ Resulting Type of shape.
As far as the intersection of two objects can produce any type of As far as the intersection of two objects can produce any type of
geometrical objects, <b>Resulting type</b> box allows choosing the geometrical objects, <b>Resulting type</b> box allows choosing the
preferrable result, i.e. a solid, a shell, a list of faces, etc. preferable result, i.e. a solid, a shell, a list of faces, etc.
The <b>Resulting type</b> has to be equal or lower than the type of the The <b>Resulting type</b> has to be equal or lower than the type of the
\em Objects. In other words, if the \em Objects don't contain any \em Objects. In other words, if the \em Objects don't contain any
@ -47,28 +43,27 @@ face (there will be a hole in the resulting face, where the original
face intersects with the box, see the corresponding \ref partition_picture_3 "picture" below). face intersects with the box, see the corresponding \ref partition_picture_3 "picture" below).
<b>No sub-shapes intersection (Compounds only)</b> check box affects <b>No sub-shapes intersection (Compounds only)</b> check box affects
only input shapes of the Compound type. If this option is switched off (default only input shapes of the Compound type.
behavior) each input compound will be automatically exploded into - If this option is switched off (default behavior) each input compound will be automatically
sub-shapes and the intersection between these shapes will be also exploded into sub-shapes and the intersection between these shapes will be also computed.
computed. If this option is switched on, the intersection between - If this option is switched on, the intersection between sub-shapes will not be performed.
sub-shapes will not be performed. In this case the Partition algorithm In this case the Partition algorithm will work faster, but the result might differ from the
will work faster, but the result might differ from the default behavior. default behavior.
<b>Detect Self-intersections</b> check box is used to check arguments <b>Detect Self-intersections</b> check box is used to check self-intersection of arguments.
self-intersections. If this option is switched on (default behavior) - If this option is switched on (by default), each input shape is checked for self-intersection.
each input shape is checked for self-intersection. In case of its detection If self-intersection is detected, the operation is aborted.
the operation is aborted. If this option is switched off, the partition - If this option is switched off, the partition algorithm is performed without self-intersection
algorithm is performed without self-intersection checks. checks.
\note This algorithm doesn't find all types of self-intersections. It is tuned \note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections please use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
<b>Advanced option:</b> - Activate \ref restore_presentation_parameters_page "Advanced options" if required.
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\note Partition is a complex operation, so its result of it depends \note Partition is a complex operation, so its result of it depends
on the quality of the initial shapes. Sometimes, if partition fails, on the quality of the initial shapes. Sometimes, if partition fails,
@ -95,7 +90,7 @@ Here,
- \em Limit is a Type of resulting shapes - \em Limit is a Type of resulting shapes
- \em KeepNonlimitShapes is a flag that allows to preserve standalone - \em KeepNonlimitShapes is a flag that allows to preserve standalone
shapes of low dimension (than \em Limit) in the result. shapes of low dimension (than \em Limit) in the result.
- \em checkSelfInte is a flag that tells if the arguments should - \em checkSelfInte is a flag that indicates if the arguments should
be checked for self-intersection prior to the operation. be checked for self-intersection prior to the operation.
- Other parameters are obsolete and kept only for compatibility with - Other parameters are obsolete and kept only for compatibility with
previous versions of SALOME. previous versions of SALOME.
@ -106,15 +101,14 @@ previous versions of SALOME.
<b>Arguments:</b> Name + 1 shape to be intersected + 1 cutting plane. <b>Arguments:</b> Name + 1 shape to be intersected + 1 cutting plane.
<b>Advanced option:</b> Activate \ref restore_presentation_parameters_page "Advanced options" if required.
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
<b>TUI Command:</b> <b>TUI Command:</b>
<em>geompy.MakeHalfPartition(Shape, Plane, checkSelfInte)</em>, where: <em>geompy.MakeHalfPartition(Shape, Plane, checkSelfInte)</em>, where:
- \em Shape is a source shape to be intersected by the \em Plane - \em Shape is a source shape to be intersected by the \em Plane
- \em Plane is a tool shape, to intersect the \em Shape. - \em Plane is a tool shape, to intersect the \em Shape.
- \em checkSelfInte is a flag that tells if the arguments should - \em checkSelfInte is a flag that indicates if the arguments should
be checked for self-intersection prior to the operation. be checked for self-intersection prior to the operation.
<b>Examples:</b> <b>Examples:</b>

View File

@ -6,7 +6,7 @@
<b>Repair - > Remove internal faces</b>. <b>Repair - > Remove internal faces</b>.
\n This operation removes all shared faces from a compound to obtain \n This operation removes all shared faces from a compound to obtain
one or more bigger solids from the set of smaller solids. one or more bigger solids from a set of smaller solids.
\image html remove_webs.png \image html remove_webs.png
@ -15,8 +15,8 @@ one or more bigger solids from the set of smaller solids.
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\note Only shared faces will be removed. Coincident but not shared \note Only shared faces will be removed. Coincident but not shared
faces will stay as is, use GlueFaces or MakePartition before faces will stay as is, use Glue Faces or Partition before
RemoveInternalFaces if you need to remove them. Remove Internal Faces if you need to remove them.
\n <b>TUI Command:</b> <em>geompy.RemoveInternalFaces(theCompound)</em>, \n <b>TUI Command:</b> <em>geompy.RemoveInternalFaces(theCompound)</em>,
where <em>theCompound</em> is a compound of solids. where <em>theCompound</em> is a compound of solids.

View File

@ -26,15 +26,15 @@ splits an edge in two.</li>
<li>\subpage change_orientation_operation_page "Change orientation" - <li>\subpage change_orientation_operation_page "Change orientation" -
reverses the normals of the selected faces.</li> reverses the normals of the selected faces.</li>
<li>\subpage remove_webs_operation_page "Remove internal faces" - <li>\subpage remove_webs_operation_page "Remove internal faces" -
rebuilds the topology of a compound of solids by removing of the faces rebuilds the topology of a compound of solids by removing the faces
that are shared by several solids.</li> are shared by several solids.</li>
<li>\subpage remove_extra_edges_operation_page "Remove extra edges" - <li>\subpage remove_extra_edges_operation_page "Remove extra edges" -
removes seam and degenerated edges from the given shape.</li> removes seam and degenerated edges from the given shape.</li>
<li>\subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" - <li>\subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" -
removes selected vertices from a given wire in case if adjacent edges removes selected vertices from a given wire in case if adjacent edges
are C1 continuous.</li> are C1 continuous.</li>
<li>\subpage union_faces_operation_page "Union faces" - <li>\subpage union_faces_operation_page "Union faces" -
unites all faces sharing one surface on a given shape.</li> unites on a given shape all faces sharing the same surface.</li>
</ul> </ul>
*/ */

View File

@ -2,26 +2,31 @@
\page section_opeartion_page Section \page section_opeartion_page Section
To produce a \b Section operation in the <b>Main Menu</b> select \b Section operation creates an edge or a wire representing the intersection of surfaces of two shapes.
<b>Operations - > Boolean - > Section</b>
This operation creates the section between 2 shapes. To produce it, select in the main menu <b>Operations - > Boolean - > Section</b>
The \b Result will be any \b GEOM_Object (EDGE or WIRE).
<b>TUI Command:</b> <em>geompy.MakeSection(s1, s2, checkSelfInte)</em>\n
<b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check.\n
<b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\image html neo-section.png "Section dialog" \image html neo-section.png "Section dialog"
\note This algorithm doesn't find all types of self-intersections. It is tuned In this dialog:
- Input or accept the default \b Name of the resulting shape.
- Click the arrow button and select in the Object Browser or in the Viewer the intersecting <b>Objects</b>.
- Activate the corresponding check-box if you wish to <b> Detect Self-intersections </b>.
- Activate \ref restore_presentation_parameters_page "Advanced options" if required.
- Press "Apply" or "Apply & Close" button to get the result (EDGE or WIRE).
\note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
This operation can be performed using a <b>TUI Command:</b>
<em>geompy.MakeSection(s1, s2, checkSelfInte)</em>
<b>Arguments:</b> Name + 2 shapes + an optional flag for self-intersection check.
<b>Example:</b> <b>Example:</b>
@ -34,8 +39,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b> <b> More details </b>
For a detailed description of the Boolean operations please refer to Please refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
<a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights operations algorithms, describes the usage methodology and highlights
major limitations of these operations. major limitations of these operations.

View File

@ -2,26 +2,28 @@
\page sewing_operation_page Sewing \page sewing_operation_page Sewing
\n To produce a \b Sewing operation in the <b>Main Menu</b> select <b>Repair - > Sewing</b>. To produce a \b Sewing operation in the <b>Main Menu</b> select <b>Repair - > Sewing</b>.
\n It is possible to sew only compounds of faces or shells. The \b Result will be a \b GEOM_Object.
\n The \b Result will be a \b GEOM_Object.
\n <b>TUI Command:</b> <em>geompy.MakeSewing(ListOfShape, Precision, AllowNonManifold=False),</em>
where \em ListOfShape is list of faces or shells to be sewed, \em Precision is a
precision for sewing, \em AllowNonManifold flag that allows non-manifold sewing.
\image html repair6.png \image html repair6.png
\n <b>Arguments:</b> Name + 1 or more shapes + 1 value (sew In this dialog:
precision). - Click on the "Arrow" button and select in the Object Browser or in the viewer one or more \b Shapes (faces or shells) to be sewn.
\n \b Detect button allows to display the number of free boundaries in - Activate <b>Allow Non Manifold </b> check-box to produce non-manifold sewing, if required.
your shape: - Define precision for sewing in \b Tolerance field.
- Activate <b> Detect Free boundaries</b> button to display the number of free boundaries in the shape:
\image html neo-detect2.png
- Click \b Apply or <b>Apply and Close</b> button.
\image html neo-detect2.png This operation can be also launched using a <b>TUI Command:</b>
\n <b>Example:</b> <em>geompy.MakeSewing(ListOfShape, Precision, AllowNonManifold=False),</em>
where \em ListOfShape is a list of faces or shells to be sewn, \em Precision is a
precision for sewing, \em AllowNonManifold is a flag that allows non-manifold sewing.
<b>Example:</b>
\image html image112.png "The initial faces" \image html image112.png "The initial faces"

View File

@ -2,20 +2,21 @@
\page union_faces_operation_page Union Faces \page union_faces_operation_page Union Faces
\n To <b>Union Faces</b> in the <b>Main Menu</b> select This operation unites on a given shape all faces sharing the same surface.
<b>Repair - > Union Faces</b>.
\n This operation unites all faces sharing one surface on a given
shape.
\n <b>TUI Command:</b> <em>geompy.UnionFaces(theShape)</em>, To <b>Union Faces</b> in the <b>Main Menu</b> select <b>Repair - > Union Faces</b>.
where <em>theShape</em> is a compound or a single solid.
\n <b>Arguments:</b> Name + one shape + a flag.
\n <b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
\image html union_faces.png \image html union_faces.png
\n <b>Example:</b> In this dialog:
- Click on the "Arrow" button and select in the Object Browser or in the viewer one or more \b Shapes (compounds or single solids).
- If necessary, activate \ref restore_presentation_parameters_page "Advanced Transformation Options".
- Click \b Apply or <b>Apply and Close</b> button.
This operation can be also launched using a <b>TUI Command:</b> <em>geompy.UnionFaces(theShape)</em>,
where <em>theShape</em> is a compound or a single solid.
<b>Example:</b>
\image html union_faces1.png \image html union_faces1.png
<center><em>Shape with not united faces</em></center> <center><em>Shape with not united faces</em></center>

View File

@ -2,10 +2,10 @@
\page using_boolean_operations_page Boolean Operations \page using_boolean_operations_page Boolean Operations
For detail description of the Boolean operations please refer to For a detailed description of Boolean operations refer to
<a href="SALOME_BOA_PA.pdf">this document</a>. <a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlighs operations algorithms, describes the usage methodology and highlights
major limitations of these operations. major limitations of these operations.
You can use the following boolean operations for construction of more You can use the following boolean operations for construction of more
@ -44,7 +44,7 @@ operation.
\par \par
<em>geompy.MakeBoolean(Shape1, Shape2, Operation, checkSelfInte),</em> where \em <em>geompy.MakeBoolean(Shape1, Shape2, Operation, checkSelfInte),</em> where \em
Shape1 is the first argument and \em Shape2 is the second argument of Shape1 is the first argument and \em Shape2 is the second argument of
Boolean operation, \em Operation is a type of the Boolean operation (1 a Boolean operation, \em Operation is the type of a Boolean operation (1
&mdash; Common, 2 &mdash; Cut, 3 &mdash; Fuse, 4 &mdash; Section). &mdash; Common, 2 &mdash; Cut, 3 &mdash; Fuse, 4 &mdash; Section).
@ -60,17 +60,17 @@ argument and \em Shape2 is the second argument of Common operation;
<em>geompy.MakeCut(Shape1, Shape2, checkSelfInte)</em>, where \em Shape1 is the first <em>geompy.MakeCut(Shape1, Shape2, checkSelfInte)</em>, where \em Shape1 is the first
argument and \em Shape2 is the second argument of Cut operation; argument and \em Shape2 is the second argument of Cut operation;
The flag \em checkSelfInte tells whether arguments should be checked for The flag \em checkSelfInte indicates whether the arguments should be checked for
self-intersection prior to an operation. Its default value is \em False which self-intersection prior to an operation. Its default value is \em False, which
means that there is no need to check it. This option is provided to ensure that means that there is no need to check it. This option is provided to ensure that
an operation is performed on not self-intersected shapes as these shapes are an operation is performed on not self-intersected shapes as they are
not valid for boolean operations. not valid for boolean operations.
\note This algorithm doesn't find all types of self-intersections. It is tuned \note This algorithm does not find all types of self-intersections. It is tuned
to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face
intersections. Face/face intersections detection is switched off as it intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page all self-intersections use \ref check_self_intersections_page
"Detect Self-intersection tool". "Detect Self-intersection tool".
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

View File

@ -1,9 +1,10 @@
/*! /*!
\page using_measurement_tools_page Measuring objects properties \page using_measurement_tools_page Object properties
\n Measurement tools in GEOM are necessary for getting different data \n The key property of an object is its \subpage geometrical_obj_prop_page "Geometrical Type"
concerning created or imported geometrical objects :
\n There are also various <b> Measurement tools </b> for getting data about created or imported geometrical objects :
<ul> <ul>
<li>\subpage point_coordinates_page "Point coordinates"</li> <li>\subpage point_coordinates_page "Point coordinates"</li>

View File

@ -101,10 +101,9 @@ and then displays only the children of the selected object(s).
Switch the checkbox near the appropriate object and Switch the checkbox near the appropriate object and
click <b>Publish</b> or <b>Publish And Close</b> button. click <b>Publish</b> or <b>Publish And Close</b> button.
"Eye" icons in this dialog box allow previewing unpublished objects in the viewer. All "Eye" icons in this dialog box allow previewing unpublished objects in the viewer. By default all
unpublished objects are by default sorted by the name in ascending order. It is possible unpublished objects are sorted by name in ascending order. It is possible
to change order of sorting (ascending / descending) by clicking the corresponding title to change the order (ascending / descending) by clicking the corresponding title bar of the objects list.
bar of the objects list.
</li> </li>
</ul> </ul>
@ -115,8 +114,7 @@ window providing some information on a selected geometric object:
- <b>Creation operation</b> shows a name of the operation - <b>Creation operation</b> shows a name of the operation
used to create the selected object. used to create the selected object.
- In a table under <b>Creation operation</b>, \b Parameter and \b - The table below lists \b Parameters used to create the
Value are a name and a value of a parameter used to create the selected object and their \b Values.
selected object.
*/ */

View File

@ -1,10 +1,24 @@
/*! /*!
\page xao_format_page The XAO format \page xao_format_page Import and export of shapes in XAO format
XAO is a file format which describes a shape with its topology, groups and fields. XAO is a file format which describes a shape with its topology, groups and fields.
- \subpage export_xao_page "Export" To import a shape in the \b XAO format, in the <b>Main Menu</b> select <b>New Entity ->
- \subpage import_xao_page "Import" Import / Export -> Import XAO. </b>
To export a shape in the \b XAO format, in the <b>Main Menu</b> select <b>New Entity ->
Import / Export -> Export XAO. </b>
\image html exportxao_dlg.png
In this dialog:
- Click the arrow button and select in the Object Browser or in the Viewer the <b>Shape</b> to be exported.
- Input the <b>File name</b> to create a new file or click browse button to save in an existing file.
- Select the \b Groups of the chosen shape to be exported.
- Select the \b Fields of the chosen shape to be exported.
- Press "Apply" or "Apply & Close" button to get the result.
It also possible to export a shape using the TUI Command: <em>geompy.MakeExportXAO(Shape, FileName, Groups, Fields)</em>
*/ */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 855 B

After

Width:  |  Height:  |  Size: 860 B

View File

@ -871,18 +871,45 @@ bool AdvancedGUI_PipeTShapeDlg::isValid (QString& msg)
ok = LReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = LReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok;
ok = LReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = LReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok;
ok = LReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; ok = LReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok;
if(MainTubeGroupParams->SpinBox_DX->value() == LReductionGroupParams->SpinBox1->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L") + "\n";
ok = false;
}
if(MainTubeGroupParams->SpinBox_DX->value() + MainTubeGroupParams->SpinBox_DY->value() ==
LReductionGroupParams->SpinBox1->value() + LReductionGroupParams->SpinBox2->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L") + "\n";
ok = false;
}
} }
if (RReductionGroupParams->GroupBox1->isChecked()) { if (RReductionGroupParams->GroupBox1->isChecked()) {
ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok;
ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok;
ok = RReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok;
ok = RReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok;
if(MainTubeGroupParams->SpinBox_DX->value() == RReductionGroupParams->SpinBox1->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R") + "\n";
ok = false;
}
if(MainTubeGroupParams->SpinBox_DX->value() + MainTubeGroupParams->SpinBox_DY->value() ==
RReductionGroupParams->SpinBox1->value() + RReductionGroupParams->SpinBox2->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R") + "\n";
ok = false;
}
} }
if (IReductionGroupParams->GroupBox1->isChecked()) { if (IReductionGroupParams->GroupBox1->isChecked()) {
ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok;
ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok;
ok = IReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok;
ok = IReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok;
if(IncidentTubeGroupParams->SpinBox_DX->value() == IReductionGroupParams->SpinBox1->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I") + "\n";
ok = false;
}
if(IncidentTubeGroupParams->SpinBox_DX->value() + IncidentTubeGroupParams->SpinBox_DY->value() ==
IReductionGroupParams->SpinBox1->value() + IReductionGroupParams->SpinBox2->value()) {
msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I") + "\n";
ok = false;
}
} }
ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok;

View File

@ -246,6 +246,30 @@
<source>GEOM_PIPETSHAPE_GROUPPOS</source> <source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>Position</translation> <translation>Position</translation>
</message> </message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L</source>
<translation>Main pipe Radius can't be equal to Left thickness reduction Radius (rL)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L</source>
<translation>Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R</source>
<translation>Main pipe Radius can't be equal to Right thickness reduction Radius (rR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R</source>
<translation>Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I</source>
<translation>Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I</source>
<translation>Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)!</translation>
</message>
</context> </context>
<context> <context>
<name>AdvancedGUI_SmoothingSurfaceDlg</name> <name>AdvancedGUI_SmoothingSurfaceDlg</name>

View File

@ -246,6 +246,30 @@
<source>GEOM_PIPETSHAPE_GROUPPOS</source> <source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>Position</translation> <translation>Position</translation>
</message> </message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L</source>
<translation type="unfinished">Main pipe Radius can't be equal to Left thickness reduction Radius (rL)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L</source>
<translation type="unfinished">Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R</source>
<translation type="unfinished">Main pipe Radius can't be equal to Right thickness reduction Radius (rR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R</source>
<translation type="unfinished">Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I</source>
<translation type="unfinished">Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I</source>
<translation type="unfinished">Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)!</translation>
</message>
</context> </context>
<context> <context>
<name>AdvancedGUI_SmoothingSurfaceDlg</name> <name>AdvancedGUI_SmoothingSurfaceDlg</name>

View File

@ -5,269 +5,293 @@
<name>@default</name> <name>@default</name>
<message> <message>
<source>GEOM_ADVANCED</source> <source>GEOM_ADVANCED</source>
<translation>GEOM_ADVANCED</translation> <translation>高度な形状: タイプ %1</translation>
</message> </message>
<message> <message>
<source>GEOM_ADVANCED_201</source> <source>GEOM_ADVANCED_201</source>
<translation>GEOM_ADVANCED_201</translation> <translation>T型パイプ</translation>
</message> </message>
<message> <message>
<source>GEOM_ADVANCED_202</source> <source>GEOM_ADVANCED_202</source>
<translation>GEOM_ADVANCED_202</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_ADVANCED_203</source> <source>GEOM_ADVANCED_203</source>
<translation>GEOM_ADVANCED_203</translation> <translation> </translation>
</message> </message>
<message> <message>
<source>GEOM_DIVIDEDDISK</source> <source>GEOM_DIVIDEDDISK</source>
<translation>GEOM_DIVIDEDDISK</translation> <translation>Divided_Disk</translation>
</message> </message>
<message> <message>
<source>GEOM_DIVIDEDDISK_TITLE</source> <source>GEOM_DIVIDEDDISK_TITLE</source>
<translation>GEOM_DIVIDEDDISK_TITLE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_DIVIDEDCYLINDER</source> <source>GEOM_DIVIDEDCYLINDER</source>
<translation>GEOM_DIVIDEDCYLINDER</translation> <translation>Divided_Cylinder</translation>
</message> </message>
<message> <message>
<source>GEOM_DIVIDEDCYLINDER_TITLE</source> <source>GEOM_DIVIDEDCYLINDER_TITLE</source>
<translation>GEOM_DIVIDEDCYLINDER_TITLE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>MEN_DIVIDEDCYLINDER</source> <source>MEN_DIVIDEDCYLINDER</source>
<translation>MEN_DIVIDEDCYLINDER</translation> <translation></translation>
</message> </message>
<message> <message>
<source>TOP_DIVIDEDCYLINDER</source> <source>TOP_DIVIDEDCYLINDER</source>
<translation>TOP_DIVIDEDCYLINDER</translation> <translation></translation>
</message> </message>
<message> <message>
<source>STB_DIVIDEDCYLINDER</source> <source>STB_DIVIDEDCYLINDER</source>
<translation>STB_DIVIDEDCYLINDER</translation> <translation></translation>
</message> </message>
<message> <message>
<source>MEN_DIVIDEDDISK</source> <source>MEN_DIVIDEDDISK</source>
<translation>MEN_DIVIDEDDISK</translation> <translation></translation>
</message> </message>
<message> <message>
<source>TOP_DIVIDEDDISK</source> <source>TOP_DIVIDEDDISK</source>
<translation>TOP_DIVIDEDDISK</translation> <translation></translation>
</message> </message>
<message> <message>
<source>STB_DIVIDEDDISK</source> <source>STB_DIVIDEDDISK</source>
<translation>STB_DIVIDEDDISK</translation> <translation></translation>
</message> </message>
<message> <message>
<source>TOP_PIPETSHAPE</source> <source>TOP_PIPETSHAPE</source>
<translation>TOP_PIPETSHAPE</translation> <translation>T型パイプを作成</translation>
</message> </message>
<message> <message>
<source>MEN_PIPETSHAPE</source> <source>MEN_PIPETSHAPE</source>
<translation>MEN_PIPETSHAPE</translation> <translation>T型パイプを作成</translation>
</message> </message>
<message> <message>
<source>STB_PIPETSHAPE</source> <source>STB_PIPETSHAPE</source>
<translation>STB_PIPETSHAPE</translation> <translation>T型パイプを作成</translation>
</message> </message>
<message> <message>
<source>TOP_SMOOTHINGSURFACE</source> <source>TOP_SMOOTHINGSURFACE</source>
<translation>TOP_SMOOTHINGSURFACE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>MEN_SMOOTHINGSURFACE</source> <source>MEN_SMOOTHINGSURFACE</source>
<translation>MEN_SMOOTHINGSURFACE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>STB_SMOOTHINGSURFACE</source> <source>STB_SMOOTHINGSURFACE</source>
<translation>STB_SMOOTHINGSURFACE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>HALF_LENGTH_MAIN_PIPE</source> <source>HALF_LENGTH_MAIN_PIPE</source>
<translation>HALF_LENGTH_MAIN_PIPE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>HALF_LENGTH_INCIDENT_PIPE</source> <source>HALF_LENGTH_INCIDENT_PIPE</source>
<translation>HALF_LENGTH_INCIDENT_PIPE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>CIRCULAR_QUARTER_PIPE</source> <source>CIRCULAR_QUARTER_PIPE</source>
<translation>CIRCULAR_QUARTER_PIPE</translation> <translation>/4</translation>
</message> </message>
<message> <message>
<source>THICKNESS</source> <source>THICKNESS</source>
<translation>THICKNESS</translation> <translation></translation>
</message> </message>
<message> <message>
<source>FLANGE</source> <source>FLANGE</source>
<translation>FLANGE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>CHAMFER_OR_FILLET</source> <source>CHAMFER_OR_FILLET</source>
<translation>CHAMFER_OR_FILLET</translation> <translation> </translation>
</message> </message>
<message> <message>
<source>CHAMFER</source> <source>CHAMFER</source>
<translation>CHAMFER</translation> <translation></translation>
</message> </message>
<message> <message>
<source>FILLET</source> <source>FILLET</source>
<translation>FILLET</translation> <translation></translation>
</message> </message>
<message> <message>
<source>JUNCTION_FACE_1</source> <source>JUNCTION_FACE_1</source>
<translation>JUNCTION_FACE_1</translation> <translation>Junction 1</translation>
</message> </message>
<message> <message>
<source>JUNCTION_FACE_2</source> <source>JUNCTION_FACE_2</source>
<translation>JUNCTION_FACE_2</translation> <translation>Junction 2</translation>
</message> </message>
<message> <message>
<source>JUNCTION_FACE_3</source> <source>JUNCTION_FACE_3</source>
<translation>JUNCTION_FACE_3</translation> <translation>Junction 3</translation>
</message> </message>
<message> <message>
<source>INTERNAL_FACES</source> <source>INTERNAL_FACES</source>
<translation>INTERNAL_FACES</translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
<name>AdvancedGUI_PipeTShapeDlg</name> <name>AdvancedGUI_PipeTShapeDlg</name>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I</source>
<translation type="unfinished">Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I</source>
<translation type="unfinished">Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R</source>
<translation type="unfinished">Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R</source>
<translation type="unfinished">Main pipe Radius can't be equal to Right thickness reduction Radius (rR)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L</source>
<translation type="unfinished">Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)!</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L</source>
<translation type="unfinished">Main pipe Radius can't be equal to Left thickness reduction Radius (rL)!</translation>
</message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_TITLE</source> <source>GEOM_PIPE_TSHAPE_TITLE</source>
<translation>GEOM_PIPE_TSHAPE_TITLE</translation> <translation>T型パイプの作成</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE</source> <source>GEOM_PIPE_TSHAPE</source>
<translation>GEOM_PIPE_TSHAPE</translation> <translation>PipeTShape</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_MPIPE</source> <source>GEOM_PIPE_TSHAPE_MPIPE</source>
<translation>GEOM_PIPE_TSHAPE_MPIPE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_R</source> <source>GEOM_PIPE_TSHAPE_R</source>
<translation>GEOM_PIPE_TSHAPE_R</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_W</source> <source>GEOM_PIPE_TSHAPE_W</source>
<translation>GEOM_PIPE_TSHAPE_W</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_L</source> <source>GEOM_PIPE_TSHAPE_L</source>
<translation>GEOM_PIPE_TSHAPE_L</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_IPIPE</source> <source>GEOM_PIPE_TSHAPE_IPIPE</source>
<translation>GEOM_PIPE_TSHAPE_IPIPE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_CHAMFER</source> <source>GEOM_PIPE_TSHAPE_CHAMFER</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_CHAMFER_H</source> <source>GEOM_PIPE_TSHAPE_CHAMFER_H</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER_H</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_CHAMFER_W</source> <source>GEOM_PIPE_TSHAPE_CHAMFER_W</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER_W</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_FILLET</source> <source>GEOM_PIPE_TSHAPE_FILLET</source>
<translation>GEOM_PIPE_TSHAPE_FILLET</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_HEX</source> <source>GEOM_PIPE_TSHAPE_HEX</source>
<translation>GEOM_PIPE_TSHAPE_HEX</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION</source> <source>GEOM_PIPE_TSHAPE_POSITION</source>
<translation>GEOM_PIPE_TSHAPE_POSITION</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION_P1</source> <source>GEOM_PIPE_TSHAPE_POSITION_P1</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P1</translation> <translation> P1</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION_P2</source> <source>GEOM_PIPE_TSHAPE_POSITION_P2</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P2</translation> <translation> P2</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION_P3</source> <source>GEOM_PIPE_TSHAPE_POSITION_P3</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P3</translation> <translation> P3</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION_LBL_L1</source> <source>GEOM_PIPE_TSHAPE_POSITION_LBL_L1</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_LBL_L1</translation> <translation>New L1</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_POSITION_LBL_L2</source> <source>GEOM_PIPE_TSHAPE_POSITION_LBL_L2</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_LBL_L2</translation> <translation>New L2</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_LEFT_TR</source> <source>GEOM_PIPE_TSHAPE_LEFT_TR</source>
<translation>GEOM_PIPE_TSHAPE_LEFT_TR</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_RIGHT_TR</source> <source>GEOM_PIPE_TSHAPE_RIGHT_TR</source>
<translation>GEOM_PIPE_TSHAPE_RIGHT_TR</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_INCI_TR</source> <source>GEOM_PIPE_TSHAPE_INCI_TR</source>
<translation>GEOM_PIPE_TSHAPE_INCI_TR</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_TR_R</source> <source>GEOM_PIPE_TSHAPE_TR_R</source>
<translation>GEOM_PIPE_TSHAPE_TR_R</translation> <translation> (r%1)</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_TR_W</source> <source>GEOM_PIPE_TSHAPE_TR_W</source>
<translation>GEOM_PIPE_TSHAPE_TR_W</translation> <translation> (w%1)</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_TR_L_TRANS</source> <source>GEOM_PIPE_TSHAPE_TR_L_TRANS</source>
<translation>GEOM_PIPE_TSHAPE_TR_L_TRANS</translation> <translation> (ltrans %1)</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPE_TSHAPE_TR_L_THIN</source> <source>GEOM_PIPE_TSHAPE_TR_L_THIN</source>
<translation>GEOM_PIPE_TSHAPE_TR_L_THIN</translation> <translation> (lthin %1)</translation>
</message> </message>
<message> <message>
<source>GEOM_PIPETSHAPE_GROUPMAIN</source> <source>GEOM_PIPETSHAPE_GROUPMAIN</source>
<translation>GEOM_PIPETSHAPE_GROUPMAIN</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPETSHAPE_GROUPREDUCT</source> <source>GEOM_PIPETSHAPE_GROUPREDUCT</source>
<translation>GEOM_PIPETSHAPE_GROUPREDUCT</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_PIPETSHAPE_GROUPPOS</source> <source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>GEOM_PIPETSHAPE_GROUPPOS</translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
<name>AdvancedGUI_SmoothingSurfaceDlg</name> <name>AdvancedGUI_SmoothingSurfaceDlg</name>
<message> <message>
<source>GEOM_SMOOTHINGSURFACE_TITLE</source> <source>GEOM_SMOOTHINGSURFACE_TITLE</source>
<translation>GEOM_SMOOTHINGSURFACE_TITLE</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_SMOOTHINGSURFACE</source> <source>GEOM_SMOOTHINGSURFACE</source>
<translation>GEOM_SMOOTHINGSURFACE</translation> <translation> lissee</translation>
</message> </message>
<message> <message>
<source>GEOM_SMOOTHINGSURFACE_RESULT</source> <source>GEOM_SMOOTHINGSURFACE_RESULT</source>
<translation>GEOM_SMOOTHINGSURFACE_RESULT</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_SMOOTHINGSURFACE_ARG</source> <source>GEOM_SMOOTHINGSURFACE_ARG</source>
<translation>GEOM_SMOOTHINGSURFACE_ARG</translation> <translation></translation>
</message> </message>
<message> <message>
<source>GEOM_SMOOTHINGSURFACE_ARG_POINTS</source> <source>GEOM_SMOOTHINGSURFACE_ARG_POINTS</source>
<translation>GEOM_SMOOTHINGSURFACE_ARG_POINTS</translation> <translation></translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@ -233,6 +233,41 @@ static Standard_Boolean IsFacesOfSameSolids
return isSame; return isSame;
} }
//=======================================================================
//function : IsEdgeValidToMerge
//purpose : Edge is valid if it is not seam or if it is a seam and the face
// has another seam edge.
//=======================================================================
static Standard_Boolean IsEdgeValidToMerge(const TopoDS_Edge &theEdge,
const TopoDS_Face &theFace)
{
Standard_Boolean isValid = Standard_True;
if (BRep_Tool::IsClosed(theEdge, theFace)) {
// This is a seam edge. Check if there are another seam edges on the face.
TopExp_Explorer anExp(theFace, TopAbs_EDGE);
for (; anExp.More(); anExp.Next()) {
const TopoDS_Shape &aShEdge = anExp.Current();
// Skip same edge.
if (theEdge.IsSame(aShEdge)) {
continue;
}
// Check if this edge is a seam.
TopoDS_Edge anEdge = TopoDS::Edge(aShEdge);
if (BRep_Tool::IsClosed(anEdge, theFace)) {
isValid = Standard_False;
break;
}
}
}
return isValid;
}
//======================================================================= //=======================================================================
//function : Perform //function : Perform
//purpose : //purpose :
@ -302,7 +337,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
Standard_Integer i; Standard_Integer i;
for (i = 1; i <= edges.Length(); i++) { for (i = 1; i <= edges.Length(); i++) {
TopoDS_Edge edge = TopoDS::Edge(edges(i)); TopoDS_Edge edge = TopoDS::Edge(edges(i));
if (BRep_Tool::Degenerated(edge) || BRep_Tool::IsClosed(edge, aFace)) if (BRep_Tool::Degenerated(edge) || !IsEdgeValidToMerge(edge, aFace))
continue; continue;
const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge);
@ -315,7 +350,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
if (aProcessed.Contains(anCheckedFace)) if (aProcessed.Contains(anCheckedFace))
continue; continue;
if (BRep_Tool::IsClosed(edge, anCheckedFace)) { if (!IsEdgeValidToMerge(edge, anCheckedFace)) {
// Skip seam edge. // Skip seam edge.
continue; continue;
} }

View File

@ -32,6 +32,7 @@
#include <GEOMImpl_Types.hxx> #include <GEOMImpl_Types.hxx>
#include <SUIT_MessageBox.h>
#include <SUIT_ResourceMgr.h> #include <SUIT_ResourceMgr.h>
#include <SUIT_Session.h> #include <SUIT_Session.h>
#include <SalomeApp_Application.h> #include <SalomeApp_Application.h>
@ -260,8 +261,17 @@ bool BuildGUI_ShellDlg::execute( ObjectList& objects )
GEOM::GEOM_Object_var anObj = anOper->MakeShell( objlist.in() ); GEOM::GEOM_Object_var anObj = anOper->MakeShell( objlist.in() );
if ( !anObj->_is_nil() ) if ( !anObj->_is_nil() ) {
TopoDS_Shape aShell;
GEOMBase::GetShape(anObj, aShell, TopAbs_SHELL);
if (aShell.IsNull()) {
SUIT_MessageBox::warning(this,
QObject::tr("GEOM_WRN_WARNING"),
QObject::tr("GEOM_WRN_FACES_NOT_SHELL"));
}
objects.push_back( anObj._retn() ); objects.push_back( anObj._retn() );
}
return true; return true;
} }

View File

@ -105,6 +105,9 @@ bool DisplayGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES
SetDisplayMode( 2 ); SetDisplayMode( 2 );
break; break;
case GEOMOp::OpDMTexture: // MENU VIEW - DISPLAY MODE - TEXTURE
SetDisplayMode( 3 );
break;
case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
getGeometryGUI()->EmitSignalDeactivateDialog(); getGeometryGUI()->EmitSignalDeactivateDialog();
DisplayAll(); DisplayAll();

View File

@ -1701,8 +1701,8 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub
std::string Angle_str = doubleToString(theAngle); std::string Angle_str = doubleToString(theAngle);
// Construction of the plane // Construction of the plane
gce_MakePln gce_MP2(P0, P1, P2); //gce_MakePln gce_MP2(P0, P1, P2);
Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value()); //Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value());
TopoDS_Vertex V0 = BRepBuilderAPI_MakeVertex(P0); TopoDS_Vertex V0 = BRepBuilderAPI_MakeVertex(P0);
TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1); TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1);
@ -1725,7 +1725,7 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub
// todo : port // todo : port
Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2, aPlane->Pln() ); Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2 );
anIO->SetCustomValue( theAngle ); anIO->SetCustomValue( theAngle );

View File

@ -282,7 +282,16 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
myWidgets.insert( HIST_TYPE, histType ); myWidgets.insert( HIST_TYPE, histType );
QDoubleSpinBox* thresholdValue = new QDoubleSpinBox(); QDoubleSpinBox* thresholdValue = new QDoubleSpinBox();
thresholdValue->setRange( 0, 254 ); thresholdValue->setRange( 0, 254 );
thresholdValue->setValue( 128 ); // 1 is a good default value for the threshold. It means that we are very permissive
// about what will be considered INSIDE the zone we want to find the frontier of
// This makes the algorithm more robust against a bit inhomogeneous parts in the zone
// that we want to delimitate.
// The drawback is if we want to delimitate a zone wich color is very similar to the zone
// we consider as the OUTSIDE, the result will be bad.
// The current use cases are more of the first form :
// - Strongly contrasted INSIDE and OUTSIDE zones
// - Small inhomogenities in each zone
thresholdValue->setValue( 1 );
myWidgets.insert( THRESHOLD_VALUE, thresholdValue ); myWidgets.insert( THRESHOLD_VALUE, thresholdValue );
QDoubleSpinBox* maxThreshold = new QDoubleSpinBox(); QDoubleSpinBox* maxThreshold = new QDoubleSpinBox();
maxThreshold->setRange( 1, 255 ); maxThreshold->setRange( 1, 255 );
@ -327,7 +336,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
// mainFrame()->GroupBoxName->hide(); // mainFrame()->GroupBoxName->hide();
// Build an instance of detection used to perform image processing operations // Build an instance of detection used to perform image processing operations
aDetector = new ShapeRec_FeatureDetector(); myDetector = new ShapeRec_FeatureDetector();
setHelpFileName( "shape_recognition_page.html" ); setHelpFileName( "shape_recognition_page.html" );
@ -341,7 +350,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
//================================================================================= //=================================================================================
EntityGUI_FeatureDetectorDlg::~EntityGUI_FeatureDetectorDlg() EntityGUI_FeatureDetectorDlg::~EntityGUI_FeatureDetectorDlg()
{ {
delete myDetector;
} }
//================================================================================= //=================================================================================
@ -447,9 +456,9 @@ void EntityGUI_FeatureDetectorDlg::SelectionIntoArgument()
return ; return ;
// Setting the image caracteristics // Setting the image caracteristics
aDetector->SetPath( theImgFileName ); myDetector->SetPath( theImgFileName );
height = aDetector->GetImgHeight(); height = myDetector->GetImgHeight();
width = aDetector->GetImgWidth(); width = myDetector->GetImgWidth();
pictureLeft = -0.5 * width; // X coordinate of the top left corner of the background image in the view pictureLeft = -0.5 * width; // X coordinate of the top left corner of the background image in the view
pictureTop = 0.5 * height; // Y coordinate of both top corners pictureTop = 0.5 * height; // Y coordinate of both top corners
@ -674,7 +683,7 @@ void EntityGUI_FeatureDetectorDlg::setEndPnt(const gp_Pnt& theEndPnt)
{ {
myEndPnt = theEndPnt; myEndPnt = theEndPnt;
MESSAGE("myEndPnt = ("<<theEndPnt.X()<<", "<<theEndPnt.Y()<<")") MESSAGE("myEndPnt = ("<<theEndPnt.X()<<", "<<theEndPnt.Y()<<")")
if (setSelectionRect() && aDetector->GetImgHeight() > 0) if (setSelectionRect() && myDetector->GetImgHeight() > 0)
showImageSample(); showImageSample();
} }
@ -705,8 +714,8 @@ bool EntityGUI_FeatureDetectorDlg::setSelectionRect()
void EntityGUI_FeatureDetectorDlg::showImageSample() void EntityGUI_FeatureDetectorDlg::showImageSample()
{ {
// Cropp the image to the selection rectangle given by the user // Cropp the image to the selection rectangle given by the user
aDetector->SetROI( myRect ); myDetector->SetROI( myRect );
std::string samplePicturePath = aDetector->CroppImage(); std::string samplePicturePath = myDetector->CroppImage();
// Display the result // Display the result
QPixmap pixmap(QString(samplePicturePath.c_str())); QPixmap pixmap(QString(samplePicturePath.c_str()));
@ -753,9 +762,9 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
subPictureLeft = pictureLeft; subPictureLeft = pictureLeft;
subPictureTop = pictureTop; subPictureTop = pictureTop;
} }
aDetector->ComputeCorners( useROI, parameters ); myDetector->ComputeCorners( useROI, parameters );
CvPoint2D32f* corners = aDetector->GetCorners(); CvPoint2D32f* corners = myDetector->GetCorners();
int cornerCount = aDetector->GetCornerCount(); int cornerCount = myDetector->GetCornerCount();
int i; int i;
// Build the geom objects associated to the detected corners and returned by execute // Build the geom objects associated to the detected corners and returned by execute
@ -794,9 +803,9 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
{ {
GEOM::GEOM_ICurvesOperations_var aCurveOperations = myGeomGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); GEOM::GEOM_ICurvesOperations_var aCurveOperations = myGeomGUI->GetGeomGen()->GetICurvesOperations( getStudyId() );
aDetector->ComputeContours( useROI, parameters ); myDetector->ComputeContours( useROI, parameters );
std::vector< std::vector<cv::Point> > contours = aDetector->GetContours(); std::vector< std::vector<cv::Point> > contours = myDetector->GetContours();
std::vector<cv::Vec4i> hierarchy = aDetector->GetContoursHierarchy(); std::vector<cv::Vec4i> hierarchy = myDetector->GetContoursHierarchy();
std::vector< cv::Point > contour; std::vector< cv::Point > contour;
int idx = 0; int idx = 0;
@ -914,8 +923,8 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
// else if(myConstructorId ==LINES) // else if(myConstructorId ==LINES)
// { // {
// aDetector->ComputeLines(); // myDetector->ComputeLines();
// std::vector<cv::Vec4i> lines = aDetector->GetLines(); // std::vector<cv::Vec4i> lines = myDetector->GetLines();
// GEOM::GEOM_Object_var Pnt1; // GEOM::GEOM_Object_var Pnt1;
// GEOM::GEOM_Object_var Pnt2; // GEOM::GEOM_Object_var Pnt2;
// GEOM::GEOM_Object_var aLine; // GEOM::GEOM_Object_var aLine;

View File

@ -84,7 +84,7 @@ private slots:
private: private:
ShapeRec_FeatureDetector* aDetector; ShapeRec_FeatureDetector* myDetector;
gp_Ax3 myWPlane; gp_Ax3 myWPlane;
gp_Ax3 aGlobalCS; gp_Ax3 aGlobalCS;

View File

@ -184,12 +184,15 @@ bool EntityGUI_PictureImportDlg::execute( ObjectList& objects )
int height = pixmap->height(); int height = pixmap->height();
int width = pixmap->width(); int width = pixmap->width();
delete pixmap;
GEOM::GEOM_Object_var P1 = aBasicOperations->MakePointXYZ( -0.5*width, -0.5*height, 0 ); GEOM::GEOM_Object_var P1 = aBasicOperations->MakePointXYZ( -0.5*width, -0.5*height, 0 );
GEOM::GEOM_Object_var P2 = aBasicOperations->MakePointXYZ( -0.5*width, 0.5*height, 0 ); GEOM::GEOM_Object_var P2 = aBasicOperations->MakePointXYZ( -0.5*width, 0.5*height, 0 );
GEOM::GEOM_Object_var P3 = aBasicOperations->MakePointXYZ( 0.5*width, 0.5*height, 0 ); GEOM::GEOM_Object_var P3 = aBasicOperations->MakePointXYZ( 0.5*width, 0.5*height, 0 );
GEOM::GEOM_Object_var P4 = aBasicOperations->MakePointXYZ( 0.5*width, -0.5*height, 0 ); GEOM::GEOM_Object_var P4 = aBasicOperations->MakePointXYZ( 0.5*width, -0.5*height, 0 );
GEOM::GEOM_Object_var aFace = aBlocksOperations->MakeQuad4Vertices(P1,P2,P3,P4); GEOM::GEOM_Object_var aFace = aBlocksOperations->MakeQuad4Vertices(P1,P2,P3,P4);
getDisplayer()->SetDisplayMode(3);
getDisplayer()->SetTexture(theImgFileName.toStdString()); getDisplayer()->SetTexture(theImgFileName.toStdString());
if ( !aFace->_is_nil() ) if ( !aFace->_is_nil() )
@ -198,8 +201,7 @@ bool EntityGUI_PictureImportDlg::execute( ObjectList& objects )
} }
res=true; res=true;
return res; return res;
} }

View File

@ -589,10 +589,58 @@ void EntityGUI_SubShapeDlg::showOnlySelected()
Handle(SALOME_InteractiveObject) io = Handle(SALOME_InteractiveObject) io =
new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
if (view->isVisible(io)) myIsHiddenMain = true; if (view->isVisible(io)) myIsHiddenMain = true;
}
aDisplayer->EraseAll(/*forced = false, updateViewer = true*/); //keep the selected entry and IO in the map for checking
aDisplayer->Display(aSelList, true); std::map<QString, Handle(SALOME_InteractiveObject)> aSelEntriesMap;
SALOME_ListIteratorOfListIO aSelIt(aSelList);
for ( ; aSelIt.More(); aSelIt.Next() ) {
//fill map <entry, io>
Handle(SALOME_InteractiveObject) anSelIO = aSelIt.Value();
aSelEntriesMap[anSelIO->getEntry()] = anSelIO;
}
//get the displayed sub-shapes
SALOME_ListIO displayed;
view->GetVisible(displayed);
// Erase all, except the selected shapes
std::map<QString, Handle(SALOME_InteractiveObject)>::iterator
aSelDispIter = aSelEntriesMap.end();
SALOME_ListIteratorOfListIO aDispIt( displayed );
for ( ; aDispIt.More(); aDispIt.Next() ) {
Handle(SALOME_InteractiveObject) anIO = aDispIt.Value();
aSelDispIter = aSelEntriesMap.find( anIO->getEntry() );
if ( aSelDispIter != aSelEntriesMap.end() ) {
//sub-shape is selected, so erase it's record from map to keep in it not displayed, but selected sub-shapes only
aSelEntriesMap.erase(aSelDispIter);
} else {
//sub-shape is not in the map of selected, then erase it from view
aDisplayer->Erase( anIO, /*forced = */false, /*updateViewer = */false );
}
}
if ( !aSelEntriesMap.empty() ) {
// Build a presentation of the selected, but not displayed sub-shapes
TopTools_IndexedMapOfShape aSubShapesMap;
TopExp::MapShapes(myShape, aSubShapesMap);
QString anEntryBase = aMainEntry.in();
TopExp_Explorer anExp (myShape, (TopAbs_ShapeEnum)shapeType());
for (; anExp.More(); anExp.Next())
{
TopoDS_Shape aSubShape = anExp.Current();
int index = aSubShapesMap.FindIndex(aSubShape);
QString anEntry = QString( "TEMP_" ) + anEntryBase + QString("_%1").arg(index);
if ( aSelEntriesMap.find( anEntry ) == aSelEntriesMap.end() ) {
//skip not selected sub-shapes
continue;
}
SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, view);
if (aPrs) {
displayPreview(aPrs, true, false); // append, do not update
}
}
}
aDisplayer->UpdateViewer();
}
// Mantis issue 0021421: do not hide main shape, if explode on VERTEX // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX && myIsHiddenMain) { if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX && myIsHiddenMain) {

View File

@ -635,12 +635,10 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
aP2=aNodes(aN2).Transformed(aTrsf); aP2=aNodes(aN2).Transformed(aTrsf);
// //
if (aType==GeomAbs_Cylinder) { if (aType==GeomAbs_Cylinder) {
Standard_Real aTolSM;
gp_Cylinder aCyl; gp_Cylinder aCyl;
// //
aTolSM=1.523e-6;//~1.-cos(0.1 deg)
aCyl=aGAS.Cylinder(); aCyl=aGAS.Cylinder();
if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) { if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) {
continue; continue;
} }
} }

View File

@ -881,12 +881,10 @@ if (!aNb && myNbPntsMin) {
aP2=aNodes(aN2).Transformed(aTrsf); aP2=aNodes(aN2).Transformed(aTrsf);
// //
if (aType==GeomAbs_Cylinder) { if (aType==GeomAbs_Cylinder) {
Standard_Real aTolSM;
gp_Cylinder aCyl; gp_Cylinder aCyl;
// //
aTolSM=1.523e-6;//~1.-cos(0.1 deg)
aCyl=aGAS.Cylinder(); aCyl=aGAS.Cylinder();
if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) { if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) {
continue; continue;
} }
} }

View File

@ -140,21 +140,34 @@ Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
const gp_Cylinder& aCyl, const gp_Cylinder& aCyl,
const Standard_Real aTol) const Standard_Real aTol)
{ {
Standard_Boolean bRet=Standard_False; const gp_XYZ &aLoc = aCyl.Location().XYZ();
Standard_Real aSM; const gp_Ax1 &aAxis = aCyl.Axis();
// const gp_XYZ &aDAxis = aAxis.Direction().XYZ();
gp_Vec aV12(aP1, aP2); gp_XYZ aDP1 = aP1.XYZ().Subtracted(aLoc);
gp_Dir aD12(aV12); gp_XYZ aDP2 = aP2.XYZ().Subtracted(aLoc);
// Standard_Real aDot1 = aDP1.Dot(aDAxis);
const gp_Ax1& aAxis=aCyl.Axis(); Standard_Real aDot2 = aDP1.Dot(aDAxis);
const gp_Dir& aDAxis=aAxis.Direction(); Standard_Real aTol2 = aTol*aTol;
//
aSM=fabs(aD12*aDAxis); // Project P1 and P2 onto a plane with location aLoc and Norm aDAxis.
if (fabs(1.-aSM) > aTol) { aDP1.Subtract(aDAxis.Multiplied(aDot1));
return bRet; aDP2.Subtract(aDAxis.Multiplied(aDot2));
Standard_Real aRadius1 = aDP1.Modulus();
Standard_Real aRadius2 = aDP2.Modulus();
Standard_Boolean isOn = Standard_False;
if (fabs(aRadius1 - aRadius2) <= aTol) {
// Check the deflection of the middle point.
gp_XYZ aMidP = 0.5*(aDP1 + aDP2);
Standard_Real aMidRadius1 = aMidP.Modulus();
if (fabs(aRadius1 - aRadius2) <= aTol) {
isOn = Standard_True;
}
} }
//
return !bRet; return isOn;
} }
//======================================================================= //=======================================================================
//function : IsAnalytic //function : IsAnalytic

View File

@ -673,8 +673,7 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap
AISShape->SetDisplayVectors( propMap.value( GEOM::propertyName( GEOM::EdgesDirection ) ).toBool() ); AISShape->SetDisplayVectors( propMap.value( GEOM::propertyName( GEOM::EdgesDirection ) ).toBool() );
// set transparency // set transparency
// VSR: ??? next line is commented: transparency property is set in the AfterDisplay() function AISShape->SetTransparency( propMap.value( GEOM::propertyName( GEOM::Transparency ) ).toDouble() );
//AISShape->SetTransparency( propMap.value( GEOM::propertyName( GEOM::Transparency ) ).toDouble() );
// set iso properties // set iso properties
int uIsos = propMap.value( GEOM::propertyName( GEOM::NbIsos ) ).toString().split( GEOM::subSectionSeparator() )[0].toInt(); int uIsos = propMap.value( GEOM::propertyName( GEOM::NbIsos ) ).toString().split( GEOM::subSectionSeparator() )[0].toInt();
@ -697,12 +696,36 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap
AISShape->SetOwnDeviationCoefficient( qMax( propMap.value( GEOM::propertyName( GEOM::Deflection ) ).toDouble(), GEOM::minDeflection() ) ); AISShape->SetOwnDeviationCoefficient( qMax( propMap.value( GEOM::propertyName( GEOM::Deflection ) ).toDouble(), GEOM::minDeflection() ) );
// set texture // set texture
bool textureAdded = false;
if ( HasTexture() ) { if ( HasTexture() ) {
// predefined display texture, manually set to displayer via GEOM_Displayer::SetTexture() function // predefined display texture, manually set to displayer via GEOM_Displayer::SetTexture() function
AISShape->SetTextureFileName( TCollection_AsciiString( GetTexture().c_str() ) ); AISShape->SetTextureFileName( TCollection_AsciiString( GetTexture().c_str() ) );
if ( ! entry.isEmpty() ) {
// check that study is active
SalomeApp_Study* study = getActiveStudy();
if ( study ) {
// Store the texture in object properties for next displays
study->setObjectProperty( aMgrId, entry, GEOM::propertyName( GEOM::Texture ), QString( GetTexture().c_str() ) );
study->setObjectProperty( aMgrId, entry, GEOM::propertyName( GEOM::DisplayMode ), 3 );
// Update porpeties map
propMap = getObjectProperties( study, entry, myViewFrame );
}
}
textureAdded = true;
}
else {
// Texture from properties
QString aTexture = propMap.value( GEOM::propertyName( GEOM::Texture ) ).toString();
if ( !aTexture.isEmpty() ) {
AISShape->SetTextureFileName( TCollection_AsciiString( aTexture.toStdString().c_str() ) );
textureAdded = true;
}
}
if ( textureAdded ){
AISShape->SetTextureMapOn(); AISShape->SetTextureMapOn();
AISShape->DisableTextureModulate(); AISShape->DisableTextureModulate();
AISShape->SetDisplayMode( 3 );
} }
// set line width // set line width
@ -1569,30 +1592,6 @@ void GEOM_Displayer::BeforeDisplay( SALOME_View* v, const SALOME_OCCPrs* )
void GEOM_Displayer::AfterDisplay( SALOME_View* v, const SALOME_OCCPrs* p ) void GEOM_Displayer::AfterDisplay( SALOME_View* v, const SALOME_OCCPrs* p )
{ {
SalomeApp_Study* aStudy = getStudy();
if (!aStudy) return;
SOCC_Viewer* vf = dynamic_cast<SOCC_Viewer*>( v );
if ( vf && !p->IsNull() ) {
int aMgrId = getViewManagerId( vf );
Handle(AIS_InteractiveContext) ic = vf->getAISContext();
const SOCC_Prs* prs = dynamic_cast<const SOCC_Prs*>( p );
if ( !ic.IsNull() && prs ) {
AIS_ListOfInteractive objects;
prs->GetObjects( objects );
AIS_ListIteratorOfListOfInteractive it( objects );
for ( ; it.More(); it.Next() ) {
Handle(GEOM_AISShape) sh = Handle(GEOM_AISShape)::DownCast( it.Value() );
if ( sh.IsNull() ) continue;
Handle(SALOME_InteractiveObject) IO = sh->getIO();
if ( IO.IsNull() ) continue;
PropMap aPropMap = aStudy->getObjectPropMap( aMgrId, IO->getEntry() );
if ( aPropMap.contains( GEOM::propertyName( GEOM::Transparency ) ) ) {
double transparency = aPropMap.value(GEOM::propertyName( GEOM::Transparency )).toDouble();
ic->SetTransparency( sh, transparency, true );
}
}
}
}
UpdateColorScale(false,false); UpdateColorScale(false,false);
} }

View File

@ -2316,6 +2316,10 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_WRN_WARNING</source> <source>GEOM_WRN_WARNING</source>
<translation>Warning</translation> <translation>Warning</translation>
</message> </message>
<message>
<source>GEOM_WRN_FACES_NOT_SHELL</source>
<translation>Unable to create a shell. Result is a compound of faces.</translation>
</message>
<message> <message>
<source>WRN_SHAPE_UNCLOSED</source> <source>WRN_SHAPE_UNCLOSED</source>
<translation>Unable to create solid from unclosed shape %1</translation> <translation>Unable to create solid from unclosed shape %1</translation>
@ -3004,6 +3008,10 @@ Please, select face, shell or solid and try again</translation>
<source>MEN_MATERIALS_LIBRARY</source> <source>MEN_MATERIALS_LIBRARY</source>
<translation>Materials library</translation> <translation>Materials library</translation>
</message> </message>
<message>
<source>MEN_TEXTURE</source>
<translation>Texture</translation>
</message>
<message> <message>
<source>MEN_TORUS</source> <source>MEN_TORUS</source>
<translation>Torus</translation> <translation>Torus</translation>
@ -3280,7 +3288,6 @@ Please, select face, shell or solid and try again</translation>
<source>PREF_SCALAR_BAR_NUMBER_OF_INTERVALS</source> <source>PREF_SCALAR_BAR_NUMBER_OF_INTERVALS</source>
<translation>Number of intervals</translation> <translation>Number of intervals</translation>
</message> </message>
<message> <message>
<source>PROCESS_SHAPE_NEW_OBJ_NAME</source> <source>PROCESS_SHAPE_NEW_OBJ_NAME</source>
<translation>ProcessShape</translation> <translation>ProcessShape</translation>
@ -4571,27 +4578,27 @@ Please, select face, shell or solid and try again</translation>
</message> </message>
<message> <message>
<source>GEOM_REMOVE_WEBS_TITLE</source> <source>GEOM_REMOVE_WEBS_TITLE</source>
<translation type="unfinished">Remove internal faces</translation> <translation>Remove internal faces</translation>
</message> </message>
<message> <message>
<source>GEOM_REMOVE_WEBS</source> <source>GEOM_REMOVE_WEBS</source>
<translation type="unfinished">Compound of solids</translation> <translation>Compound of solids</translation>
</message> </message>
<message> <message>
<source>REMOVE_WEBS_NEW_OBJ_NAME</source> <source>REMOVE_WEBS_NEW_OBJ_NAME</source>
<translation type="unfinished">NoInternalFaces</translation> <translation>NoInternalFaces</translation>
</message> </message>
<message> <message>
<source>TOP_REMOVE_WEBS</source> <source>TOP_REMOVE_WEBS</source>
<translation type="unfinished">Remove internal faces</translation> <translation>Remove internal faces</translation>
</message> </message>
<message> <message>
<source>MEN_REMOVE_WEBS</source> <source>MEN_REMOVE_WEBS</source>
<translation type="unfinished">Remove Internal Faces</translation> <translation>Remove Internal Faces</translation>
</message> </message>
<message> <message>
<source>STB_REMOVE_WEBS</source> <source>STB_REMOVE_WEBS</source>
<translation type="unfinished">Remove internal faces</translation> <translation>Remove internal faces</translation>
</message> </message>
<message> <message>
<source>GEOM_REMOVE_EXTRA_EDGES_TITLE</source> <source>GEOM_REMOVE_EXTRA_EDGES_TITLE</source>
@ -4976,7 +4983,7 @@ Ignoring units will cause model scaling (as dimensions are supposed to be specif
</message> </message>
<message> <message>
<source>TOP_SMOOTHINGSURFACE</source> <source>TOP_SMOOTHINGSURFACE</source>
<translation type="unfinished">Smoothing Surface</translation> <translation>Smoothing Surface</translation>
</message> </message>
<message> <message>
<source>GEOM_SELECT_IMAGE</source> <source>GEOM_SELECT_IMAGE</source>
@ -5031,12 +5038,12 @@ Ignoring units will cause model scaling (as dimensions are supposed to be specif
<translation>Import / Export</translation> <translation>Import / Export</translation>
</message> </message>
<message> <message>
<source>CC_PNT_ITEM_X_Y</source> <source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation> <translation>X=%1, Y=%2</translation>
</message> </message>
<message> <message>
<source>CC_PNT_ITEM_X_Y_Z</source> <source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation> <translation>X=%1, Y=%2, Z=%3</translation>
</message> </message>
</context> </context>
<context> <context>
@ -5656,7 +5663,7 @@ Number of sketch points too small</translation>
</message> </message>
<message> <message>
<source>LOWTHRESHOLD</source> <source>LOWTHRESHOLD</source>
<translation>Low theshold</translation> <translation>Low threshold</translation>
</message> </message>
<message> <message>
<source>RATIO</source> <source>RATIO</source>
@ -5878,7 +5885,7 @@ Number of sketch points too small</translation>
</message> </message>
<message> <message>
<source>WRN_NOT_SUBSHAPE</source> <source>WRN_NOT_SUBSHAPE</source>
<translation type="unfinished">The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection.</translation> <translation>The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -5914,10 +5921,6 @@ Number of sketch points too small</translation>
<source>DATA_TYPE</source> <source>DATA_TYPE</source>
<translation>Type</translation> <translation>Type</translation>
</message> </message>
<message>
<source></source>
<translation></translation>
</message>
<message> <message>
<source>BOOL</source> <source>BOOL</source>
<translation>Boolean</translation> <translation>Boolean</translation>
@ -6032,11 +6035,11 @@ Number of sketch points too small</translation>
</message> </message>
<message> <message>
<source>WRN_NOT_SUBSHAPE</source> <source>WRN_NOT_SUBSHAPE</source>
<translation type="unfinished">The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection.</translation> <translation>The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection.</translation>
</message> </message>
<message> <message>
<source>ERR_STEP_EXISTS</source> <source>ERR_STEP_EXISTS</source>
<translation type="unfinished">Step with such ID already exists.</translation> <translation>Step with such ID already exists.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -6509,23 +6512,23 @@ Do you want to create new material?</translation>
<translation>Step</translation> <translation>Step</translation>
</message> </message>
</context> </context>
<context> <context>
<name>EntityGUI_IsolineDlg</name> <name>EntityGUI_IsolineDlg</name>
<message> <message>
<source>GEOM_ISOLINE_TITLE</source> <source>GEOM_ISOLINE_TITLE</source>
<translation>Isoline Construction</translation> <translation>Isoline Construction</translation>
</message> </message>
<message> <message>
<source>GEOM_ISOLINE</source> <source>GEOM_ISOLINE</source>
<translation>Isoline</translation> <translation>Isoline</translation>
</message> </message>
<message> <message>
<source>GEOM_ISOLINE_U</source> <source>GEOM_ISOLINE_U</source>
<translation>U-Isoline</translation> <translation>U-Isoline</translation>
</message> </message>
<message> <message>
<source>GEOM_ISOLINE_V</source> <source>GEOM_ISOLINE_V</source>
<translation>V-Isoline</translation> <translation>V-Isoline</translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@ -4,12 +4,12 @@
<context> <context>
<name>@default</name> <name>@default</name>
<message> <message>
<source>MEN_POP_CONCEAL_CHILDREN</source> <source>MEN_TEXTURE</source>
<translation>Retirer les sous-éléments</translation> <translation type="unfinished">Texture</translation>
</message> </message>
<message> <message>
<source>MEN_POP_DISCLOSE_CHILDREN</source> <source>GEOM_WRN_FACES_NOT_SHELL</source>
<translation>Publier les sous-éléments</translation> <translation type="unfinished">Unable to create a shell. Result is a compound of faces.</translation>
</message> </message>
<message> <message>
<source>BRep_API: command not done</source> <source>BRep_API: command not done</source>
@ -37,8 +37,10 @@
</message> </message>
<message> <message>
<source>DEP_OBJECT</source> <source>DEP_OBJECT</source>
<translation>L&apos;objet choisi a é utilisé pour créer un autre objet. <translation>L&apos;objet choisi a é utilisé pour créer un autre objet ou est référencé par un autre module.
La suppression de cet objet peut entrainer un export python invalide. </translation> La suppression de cet objet peut entrainer un export python invalide.
Voulez-vous tout de même supprimer ces objets ?</translation>
</message> </message>
<message> <message>
<source>DEVIDE_EDGE_NEW_OBJECT_NAME</source> <source>DEVIDE_EDGE_NEW_OBJECT_NAME</source>
@ -1676,7 +1678,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
</message> </message>
<message> <message>
<source>GEOM_ALLOW_NON_MANIFOLD</source> <source>GEOM_ALLOW_NON_MANIFOLD</source>
<translation type="unfinished">Allow Non Manifold</translation> <translation>Non conformes autorisés</translation>
</message> </message>
<message> <message>
<source>GEOM_SHAPE</source> <source>GEOM_SHAPE</source>
@ -2356,7 +2358,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
</message> </message>
<message> <message>
<source>MEN_CURVE_CREATOR</source> <source>MEN_CURVE_CREATOR</source>
<translation type="unfinished">Curve creator</translation> <translation>Créateur de courbe</translation>
</message> </message>
<message> <message>
<source>MEN_ALL_SEL_ONLY</source> <source>MEN_ALL_SEL_ONLY</source>
@ -2799,12 +2801,12 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<translation>Editer champ</translation> <translation>Editer champ</translation>
</message> </message>
<message> <message>
<source>MEN_POP_SHOW_CHILDREN</source> <source>MEN_POP_DISCLOSE_CHILDREN</source>
<translation>Montrer les enfants</translation> <translation>Publier les sous-éléments</translation>
</message> </message>
<message> <message>
<source>MEN_POP_HIDE_CHILDREN</source> <source>MEN_POP_CONCEAL_CHILDREN</source>
<translation>Cacher les enfants</translation> <translation>Retirer les sous-éléments</translation>
</message> </message>
<message> <message>
<source>MEN_POP_UNPUBLISH_OBJ</source> <source>MEN_POP_UNPUBLISH_OBJ</source>
@ -2966,6 +2968,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>MEN_3DSKETCH</source> <source>MEN_3DSKETCH</source>
<translation>Esquisse 3D</translation> <translation>Esquisse 3D</translation>
</message> </message>
<message>
<source>MEN_ISOLINE</source>
<translation>Isoligne</translation>
</message>
<message> <message>
<source>MEN_SOLID</source> <source>MEN_SOLID</source>
<translation>Solide</translation> <translation>Solide</translation>
@ -3654,6 +3660,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>STB_POP_CREATE_GROUP</source> <source>STB_POP_CREATE_GROUP</source>
<translation>Créer un groupe</translation> <translation>Créer un groupe</translation>
</message> </message>
<message>
<source>STB_POP_EDIT_FIELD</source>
<translation>Editer un champ</translation>
</message>
<message> <message>
<source>STB_POP_UNPUBLISH_OBJ</source> <source>STB_POP_UNPUBLISH_OBJ</source>
<translation>Dépublier l&apos;objet</translation> <translation>Dépublier l&apos;objet</translation>
@ -3786,6 +3796,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>STB_3DSKETCH</source> <source>STB_3DSKETCH</source>
<translation>Créer une esquisse 3D</translation> <translation>Créer une esquisse 3D</translation>
</message> </message>
<message>
<source>STB_ISOLINE</source>
<translation>Créer une U ou V isoligne</translation>
</message>
<message> <message>
<source>STB_SOLID</source> <source>STB_SOLID</source>
<translation>Construire un solide</translation> <translation>Construire un solide</translation>
@ -4178,6 +4192,14 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>TOP_GROUP_CUT</source> <source>TOP_GROUP_CUT</source>
<translation>Découpe de groupes</translation> <translation>Découpe de groupes</translation>
</message> </message>
<message>
<source>TOP_FIELD_CREATE</source>
<translation>Créer un champ</translation>
</message>
<message>
<source>TOP_FIELD_EDIT</source>
<translation>Editer un champ</translation>
</message>
<message> <message>
<source>TOP_HEX_SOLID</source> <source>TOP_HEX_SOLID</source>
<translation>Solide hexaédrique</translation> <translation>Solide hexaédrique</translation>
@ -4290,6 +4312,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>TOP_POP_CREATE_GROUP</source> <source>TOP_POP_CREATE_GROUP</source>
<translation>Créer un groupe</translation> <translation>Créer un groupe</translation>
</message> </message>
<message>
<source>TOP_POP_EDIT_FIELD</source>
<translation>Editer un champ</translation>
</message>
<message> <message>
<source>TOP_POP_UNPUBLISH_OBJ</source> <source>TOP_POP_UNPUBLISH_OBJ</source>
<translation>Dépublier l&apos;objet</translation> <translation>Dépublier l&apos;objet</translation>
@ -4390,6 +4416,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
<source>TOP_3DSKETCH</source> <source>TOP_3DSKETCH</source>
<translation>Esquisse 3D</translation> <translation>Esquisse 3D</translation>
</message> </message>
<message>
<source>TOP_ISOLINE</source>
<translation>Isoligne</translation>
</message>
<message> <message>
<source>TOP_SOLID</source> <source>TOP_SOLID</source>
<translation>Créer un solide</translation> <translation>Créer un solide</translation>
@ -4955,14 +4985,6 @@ le paramètre &apos;%1&apos; aux préférences du module Géométrie.</translati
<source>TOP_SMOOTHINGSURFACE</source> <source>TOP_SMOOTHINGSURFACE</source>
<translation>Surface lissée</translation> <translation>Surface lissée</translation>
</message> </message>
<message>
<source>MEN_SMOOTHINGSURFACE</source>
<translation>Surface lissée</translation>
</message>
<message>
<source>STB_SMOOTHINGSURFACE</source>
<translation>Surface lissée</translation>
</message>
<message> <message>
<source>GEOM_SELECT_IMAGE</source> <source>GEOM_SELECT_IMAGE</source>
<translation>Sélectionner une image...</translation> <translation>Sélectionner une image...</translation>
@ -4971,6 +4993,10 @@ le paramètre &apos;%1&apos; aux préférences du module Géométrie.</translati
<source>MEN_IMPORTEXPORT</source> <source>MEN_IMPORTEXPORT</source>
<translation>Import / Export XAO</translation> <translation>Import / Export XAO</translation>
</message> </message>
<message>
<source>TOOL_IMPORTEXPORT</source>
<translation>Import / Export XAO</translation>
</message>
<message> <message>
<source>TOP_EXPORTXAO</source> <source>TOP_EXPORTXAO</source>
<translation>Export XAO</translation> <translation>Export XAO</translation>
@ -5012,12 +5038,12 @@ le paramètre &apos;%1&apos; aux préférences du module Géométrie.</translati
<translation>Import / Export XAO</translation> <translation>Import / Export XAO</translation>
</message> </message>
<message> <message>
<source>CC_PNT_ITEM_X_Y</source> <source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation> <translation>X=%1, Y=%2</translation>
</message> </message>
<message> <message>
<source>CC_PNT_ITEM_X_Y_Z</source> <source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation> <translation>X=%1, Y=%2, Z=%3</translation>
</message> </message>
</context> </context>
<context> <context>
@ -5453,19 +5479,19 @@ le paramètre &apos;%1&apos; aux préférences du module Géométrie.</translati
</message> </message>
<message> <message>
<source>SET_SECTIONS_POLYLINE</source> <source>SET_SECTIONS_POLYLINE</source>
<translation type="unfinished">Set polyline</translation> <translation>Définir la polyligne</translation>
</message> </message>
<message> <message>
<source>SET_SECTIONS_POLYLINE_TLT</source> <source>SET_SECTIONS_POLYLINE_TLT</source>
<translation type="unfinished">Set selected section type to polyline</translation> <translation>Affecter le type de section sélectionné à la polyligne</translation>
</message> </message>
<message> <message>
<source>SET_SECTIONS_SPLINE</source> <source>SET_SECTIONS_SPLINE</source>
<translation type="unfinished">Set spline</translation> <translation>Définir la spline</translation>
</message> </message>
<message> <message>
<source>SET_SECTIONS_SPLINE_TLT</source> <source>SET_SECTIONS_SPLINE_TLT</source>
<translation type="unfinished">Set selected section type to spline</translation> <translation>Affecter le type de section sélectionné à la spline</translation>
</message> </message>
<message> <message>
<source>REMOVE</source> <source>REMOVE</source>
@ -5593,7 +5619,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>USE_ROI</source> <source>USE_ROI</source>
<translation type="unfinished">Use region of interest</translation> <translation>Utiliser la région d&apos;intérêt</translation>
</message> </message>
<message> <message>
<source>KERNEL_SIZE</source> <source>KERNEL_SIZE</source>
@ -5609,75 +5635,75 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>TYPE_CRITERIA</source> <source>TYPE_CRITERIA</source>
<translation type="unfinished">Type criteria</translation> <translation>Critère de type</translation>
</message> </message>
<message> <message>
<source>CV_TERMCRIT_ITER</source> <source>CV_TERMCRIT_ITER</source>
<translation type="unfinished">Max number of iteration</translation> <translation>Nombre max d&apos;itérations</translation>
</message> </message>
<message> <message>
<source>CV_TERMCRIT_EPS</source> <source>CV_TERMCRIT_EPS</source>
<translation type="unfinished">Epsilon</translation> <translation>Epsilon</translation>
</message> </message>
<message> <message>
<source>CV_TERMCRIT_ITER | CV_TERMCRIT_EPS</source> <source>CV_TERMCRIT_ITER | CV_TERMCRIT_EPS</source>
<translation type="unfinished">Max number of iteration or epsilon</translation> <translation>Nombre max d&apos;itérations ou epsilon</translation>
</message> </message>
<message> <message>
<source>MAX_ITER</source> <source>MAX_ITER</source>
<translation type="unfinished">Max iteration</translation> <translation>Iteration max</translation>
</message> </message>
<message> <message>
<source>EPSILON</source> <source>EPSILON</source>
<translation type="unfinished">Epsilon</translation> <translation>Epsilon</translation>
</message> </message>
<message> <message>
<source>L2GRADIENT</source> <source>L2GRADIENT</source>
<translation type="unfinished">L2 gradient</translation> <translation>Gradient L2</translation>
</message> </message>
<message> <message>
<source>LOWTHRESHOLD</source> <source>LOWTHRESHOLD</source>
<translation type="unfinished">Low theshold</translation> <translation>Niveau bas</translation>
</message> </message>
<message> <message>
<source>RATIO</source> <source>RATIO</source>
<translation type="unfinished">Ratio</translation> <translation>Ratio</translation>
</message> </message>
<message> <message>
<source>SMOOTH_SIZE</source> <source>SMOOTH_SIZE</source>
<translation type="unfinished">Smooth size</translation> <translation>Adoucissement</translation>
</message> </message>
<message> <message>
<source>HBINS</source> <source>HBINS</source>
<translation type="unfinished">Hbins</translation> <translation>Hbins</translation>
</message> </message>
<message> <message>
<source>SBINS</source> <source>SBINS</source>
<translation type="unfinished">Sbins</translation> <translation>Sbins</translation>
</message> </message>
<message> <message>
<source>HIST_TYPE</source> <source>HIST_TYPE</source>
<translation type="unfinished">Histogram type</translation> <translation>Type d&apos;histogramme</translation>
</message> </message>
<message> <message>
<source>CV_HIST_ARRAY</source> <source>CV_HIST_ARRAY</source>
<translation type="unfinished">Multi-dimensional dense array</translation> <translation>Tableau dense multi-dimensionnel</translation>
</message> </message>
<message> <message>
<source>CV_HIST_SPARSE</source> <source>CV_HIST_SPARSE</source>
<translation type="unfinished">Multi-dimensional sparse array</translation> <translation>Tableau clairsemé multi-dimensionnel</translation>
</message> </message>
<message> <message>
<source>THRESHOLD_VALUE</source> <source>THRESHOLD_VALUE</source>
<translation type="unfinished">Threshold value</translation> <translation>Seuil</translation>
</message> </message>
<message> <message>
<source>MAX_THRESHOLD</source> <source>MAX_THRESHOLD</source>
<translation type="unfinished">Max threshold</translation> <translation>Seuil max</translation>
</message> </message>
<message> <message>
<source>FIND_CONTOURS_METHOD</source> <source>FIND_CONTOURS_METHOD</source>
<translation type="unfinished">Chain approximation method</translation> <translation>Méthode d&apos;approximation des chaînes</translation>
</message> </message>
<message> <message>
<source>CV_CHAIN_APPROX_NONE</source> <source>CV_CHAIN_APPROX_NONE</source>
@ -5689,11 +5715,11 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>CV_CHAIN_APPROX_TC89_KCOS</source> <source>CV_CHAIN_APPROX_TC89_KCOS</source>
<translation type="unfinished">TC89 KCOS</translation> <translation>TC89 KCOS</translation>
</message> </message>
<message> <message>
<source>CV_CHAIN_APPROX_TC89_L1</source> <source>CV_CHAIN_APPROX_TC89_L1</source>
<translation type="unfinished">TC89 L1</translation> <translation>TC89 L1</translation>
</message> </message>
</context> </context>
<context> <context>
@ -5859,7 +5885,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>WRN_NOT_SUBSHAPE</source> <source>WRN_NOT_SUBSHAPE</source>
<translation>La forme sélectionnée n'est pas un sous-élémént de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue.</translation> <translation>La forme sélectionnée n&apos;est pas un sous-élémént de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -5913,7 +5939,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>SHAPE_TYPE</source> <source>SHAPE_TYPE</source>
<translation>Type d'objet</translation> <translation>Type d&apos;objet</translation>
</message> </message>
<message> <message>
<source>VERTEX</source> <source>VERTEX</source>
@ -5973,7 +5999,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>GEOM_NO_STUDY</source> <source>GEOM_NO_STUDY</source>
<translation>Pas d'étude disponible</translation> <translation>Pas d&apos;étude disponible</translation>
</message> </message>
<message> <message>
<source>NO_SHAPE</source> <source>NO_SHAPE</source>
@ -6009,7 +6035,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message> </message>
<message> <message>
<source>WRN_NOT_SUBSHAPE</source> <source>WRN_NOT_SUBSHAPE</source>
<translation>La forme sélectionnée n'est pas un élément de la forme principale.</translation> <translation>La forme sélectionnée n&apos;est pas un élément de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue.</translation>
</message> </message>
<message> <message>
<source>ERR_STEP_EXISTS</source> <source>ERR_STEP_EXISTS</source>
@ -6400,24 +6426,24 @@ Voulez-vous en créer un nouveau ?</translation>
<context> <context>
<name>GEOMGUI_CreationInfoWdg</name> <name>GEOMGUI_CreationInfoWdg</name>
<message> <message>
<source>NO_INFO</source> <source>CREATION_INFO_TITLE</source>
<translation>(aucune information disponible)</translation> <translation>Information</translation>
</message>
<message>
<source>VALUE</source>
<translation>Valeur</translation>
</message>
<message>
<source>PARAMETER</source>
<translation>Paramètre</translation>
</message> </message>
<message> <message>
<source>OPERATION</source> <source>OPERATION</source>
<translation>Création</translation> <translation>Création</translation>
</message> </message>
<message> <message>
<source>CREATION_INFO_TITLE</source> <source>PARAMETER</source>
<translation>Information</translation> <translation>Paramètre</translation>
</message>
<message>
<source>VALUE</source>
<translation>Valeur</translation>
</message>
<message>
<source>NO_INFO</source>
<translation>(aucune information disponible)</translation>
</message> </message>
</context> </context>
<context> <context>
@ -6486,6 +6512,23 @@ Voulez-vous en créer un nouveau ?</translation>
<translation>Pas</translation> <translation>Pas</translation>
</message> </message>
</context> </context>
<context>
<name>EntityGUI_IsolineDlg</name>
<message>
<source>GEOM_ISOLINE_TITLE</source>
<translation>Construction d&apos;isoligne</translation>
</message>
<message>
<source>GEOM_ISOLINE</source>
<translation>Isoligne</translation>
</message>
<message>
<source>GEOM_ISOLINE_U</source>
<translation>U-Isoligne</translation>
</message>
<message>
<source>GEOM_ISOLINE_V</source>
<translation>V-Isoligne</translation>
</message>
</context>
</TS> </TS>

File diff suppressed because it is too large Load Diff

View File

@ -503,6 +503,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME
case GEOMOp::OpDMShading: // MENU VIEW - SHADING case GEOMOp::OpDMShading: // MENU VIEW - SHADING
case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE
case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY
case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN
@ -847,6 +848,11 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS
void GeometryGUI::createOriginAndBaseVectors() void GeometryGUI::createOriginAndBaseVectors()
{ {
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() ); SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
if ( aLocked ) {
SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
return;
}
if ( appStudy ) { if ( appStudy ) {
_PTR(Study) studyDS = appStudy->studyDS(); _PTR(Study) studyDS = appStudy->studyDS();
if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) { if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
@ -1019,6 +1025,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" ); createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" );
createGeomAction( GEOMOp::OpDMShading, "SHADING" ); createGeomAction( GEOMOp::OpDMShading, "SHADING" );
createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" ); createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" );
createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" ); createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" );
createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" ); createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" );
createGeomAction( GEOMOp::OpShow, "DISPLAY" ); createGeomAction( GEOMOp::OpShow, "DISPLAY" );
@ -1291,6 +1298,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 ); createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 );
createMenu( GEOMOp::OpDMShading, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShading, dispmodeId, -1 );
createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 );
createMenu( separator(), dispmodeId, -1 ); createMenu( separator(), dispmodeId, -1 );
createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 ); createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
@ -2663,6 +2671,11 @@ void GeometryGUI::storeVisualParameters (int savePoint)
param = occParam + GEOM::propertyName( GEOM::Color ); param = occParam + GEOM::propertyName( GEOM::Color );
ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString()); ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
} }
if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
param = occParam + GEOM::propertyName( GEOM::Texture );
ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
}
if (vType == SVTK_Viewer::Type()) { if (vType == SVTK_Viewer::Type()) {
if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) { if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
@ -2813,6 +2826,8 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble()); QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c); aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
} }
} else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
} else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) { } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1"); aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
} else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) { } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {

View File

@ -68,6 +68,7 @@ namespace GEOMOp {
OpDMWireframe = 2010, // MENU VIEW - DISPLAY MODE - WIREFRAME OpDMWireframe = 2010, // MENU VIEW - DISPLAY MODE - WIREFRAME
OpDMShading = 2011, // MENU VIEW - DISPLAY MODE - SHADING OpDMShading = 2011, // MENU VIEW - DISPLAY MODE - SHADING
OpDMShadingWithEdges = 2012, // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES OpDMShadingWithEdges = 2012, // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES
OpDMTexture = 2013, // MENU VIEW - DISPLAY MODE - TEXTURE
OpShow = 2100, // POPUP MENU - SHOW OpShow = 2100, // POPUP MENU - SHOW
OpShowOnly = 2101, // POPUP MENU - SHOW ONLY OpShowOnly = 2101, // POPUP MENU - SHOW ONLY
OpHide = 2102, // POPUP MENU - HIDE OpHide = 2102, // POPUP MENU - HIDE

View File

@ -18,6 +18,7 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// //
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx> #include <Standard_Stream.hxx>
@ -38,7 +39,6 @@
#include "utilities.h" #include "utilities.h"
#include <TDataStd_IntegerArray.hxx> #include <TDataStd_IntegerArray.hxx>
#include <TNaming_CopyShape.hxx>
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
@ -47,8 +47,6 @@
#include <TopTools_ListOfShape.hxx> #include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx> #include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TColStd_IndexedDataMapOfTransientTransient.hxx>
#include <ShapeFix_Shape.hxx> #include <ShapeFix_Shape.hxx>
#include <Standard_NullObject.hxx> #include <Standard_NullObject.hxx>
@ -423,8 +421,7 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape
const Standard_Real theTolerance, const Standard_Real theTolerance,
const TopAbs_ShapeEnum theShapeType, const TopAbs_ShapeEnum theShapeType,
const Standard_Boolean doKeepNonSolids, const Standard_Boolean doKeepNonSolids,
TCollection_AsciiString& theWarning, TCollection_AsciiString& theWarning) const
const TopTools_DataMapOfShapeShape& aCopyMap) const
{ {
TopoDS_Shape aRes; TopoDS_Shape aRes;
@ -554,18 +551,10 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape
TDF_Label anArgumentHistoryLabel = TDF_Label anArgumentHistoryLabel =
aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True); aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True);
TopTools_ListOfShape aModified;
for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) { for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) {
TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie); TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie);
if (aCopyMap.IsBound(anEntity)) { const TopTools_ListOfShape& aModified = aGA.Modified(anEntity);
anEntity = aCopyMap.Find(anEntity);
}
aModified = aGA.Modified(anEntity);
Standard_Integer nbModified = aModified.Extent(); Standard_Integer nbModified = aModified.Extent();
if (!nbModified && aResIndices.Contains(anEntity)) {
aModified.Append(anEntity);
nbModified = 1;
}
if (nbModified > 0) { if (nbModified > 0) {
TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(ie, Standard_True); TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(ie, Standard_True);
@ -754,35 +743,18 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const
Standard_Boolean aKeepNonSolids = aCI.GetKeepNonSolids(); Standard_Boolean aKeepNonSolids = aCI.GetKeepNonSolids();
// Copy initial shape to prevent its modification by gluing algorithm
TopoDS_Shape aShapeCopy;
TColStd_IndexedDataMapOfTransientTransient aMapTShapes;
TNaming_CopyShape::CopyTool(aShapeBase, aMapTShapes, aShapeCopy);
//
// map sub-shapes
TopTools_IndexedMapOfShape aShapeBase_inds, aShapeCopy_inds;
TopTools_DataMapOfShapeShape aCopyMap;
Standard_Integer aNbInd, i;
//
TopExp::MapShapes(aShapeBase, aShapeBase_inds);
TopExp::MapShapes(aShapeCopy, aShapeCopy_inds);
//
aNbInd = aShapeBase_inds.Extent();
for (i = 1; i <= aNbInd; ++i) {
aCopyMap.Bind(aShapeBase_inds(i), aShapeCopy_inds(i));
}
//
if (aType == GLUE_FACES) { if (aType == GLUE_FACES) {
aShape = GlueWithWarnings(aShapeCopy, tol3d, TopAbs_FACE, aKeepNonSolids, aWrn, aCopyMap); //aShape = GlueFacesWithWarnings(aShapeBase, tol3d, aKeepNonSolids, aWrn);
aShape = GlueWithWarnings(aShapeBase, tol3d, TopAbs_FACE, aKeepNonSolids, aWrn);
} }
else if (aType == GLUE_EDGES) { else if (aType == GLUE_EDGES) {
aShape = GlueWithWarnings(aShapeCopy, tol3d, TopAbs_EDGE, aKeepNonSolids, aWrn, aCopyMap); aShape = GlueWithWarnings(aShapeBase, tol3d, TopAbs_EDGE, aKeepNonSolids, aWrn);
} }
else if (aType == GLUE_FACES_BY_LIST || aType == GLUE_EDGES_BY_LIST) { else if (aType == GLUE_FACES_BY_LIST || aType == GLUE_EDGES_BY_LIST) {
Handle(TColStd_HSequenceOfTransient) SF = aCI.GetFaces(); Handle(TColStd_HSequenceOfTransient) SF = aCI.GetFaces();
TopTools_MapOfShape aFaces; TopTools_MapOfShape aFaces;
int i = 1;
for (i = 1; i <= SF->Length(); i++) { for (; i <= SF->Length(); i++) {
Handle(Standard_Transient) anItem = SF->Value(i); Handle(Standard_Transient) anItem = SF->Value(i);
if (anItem.IsNull()) if (anItem.IsNull())
continue; continue;
@ -792,14 +764,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const
TopoDS_Shape aFace = aRefSh->GetValue(); TopoDS_Shape aFace = aRefSh->GetValue();
if (aFace.IsNull()) if (aFace.IsNull())
continue; continue;
aFaces.Add(aFace);
// get copy of face to correspond to aShapeCopy
if (aShapeBase_inds.Contains(aFace)) {
int ind = aShapeBase_inds.FindIndex(aFace);
aFace = aShapeCopy_inds.FindKey(ind);
aFaces.Add(aFace);
}
} }
Standard_Boolean aGlueAllEdges = Standard_False; Standard_Boolean aGlueAllEdges = Standard_False;
@ -807,7 +772,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const
aGlueAllEdges = aCI.GetGlueAllEdges(); aGlueAllEdges = aCI.GetGlueAllEdges();
//aShape = GlueFacesByList(aShapeBase, tol3d, aKeepNonSolids, aFaces); //aShape = GlueFacesByList(aShapeBase, tol3d, aKeepNonSolids, aFaces);
aShape = GlueByList(aShapeCopy, tol3d, aKeepNonSolids, aFaces, aGlueAllEdges); aShape = GlueByList(aShapeBase, tol3d, aKeepNonSolids, aFaces, aGlueAllEdges);
} }
if (aShape.IsNull()) return 0; if (aShape.IsNull()) return 0;

View File

@ -48,7 +48,7 @@
#endif #endif
#include <TopTools_MapOfShape.hxx> #include <TopTools_MapOfShape.hxx>
#include <TopTools_DataMapOfShapeShape.hxx>
#ifndef _TFunction_Driver_HeaderFile #ifndef _TFunction_Driver_HeaderFile
#include <TFunction_Driver.hxx> #include <TFunction_Driver.hxx>
@ -104,8 +104,7 @@ Standard_EXPORT TopoDS_Shape GlueWithWarnings (const TopoDS_Shape& theShape,
const Standard_Real theTolerance, const Standard_Real theTolerance,
const TopAbs_ShapeEnum theShapeType, const TopAbs_ShapeEnum theShapeType,
const Standard_Boolean doKeepNonSolids, const Standard_Boolean doKeepNonSolids,
TCollection_AsciiString& theWarning, TCollection_AsciiString& theWarning) const;
const TopTools_DataMapOfShapeShape& aCopyMap) const;
Standard_EXPORT static TopoDS_Shape GlueByList (const TopoDS_Shape& theShape, Standard_EXPORT static TopoDS_Shape GlueByList (const TopoDS_Shape& theShape,
const Standard_Real theTolerance, const Standard_Real theTolerance,

View File

@ -60,6 +60,7 @@
#include <BRepCheck_Result.hxx> #include <BRepCheck_Result.hxx>
#include <BRepCheck_Shell.hxx> #include <BRepCheck_Shell.hxx>
#include <BRepClass3d_SolidClassifier.hxx> #include <BRepClass3d_SolidClassifier.hxx>
#include <BRepClass_FaceClassifier.hxx>
#include <BRepExtrema_DistShapeShape.hxx> #include <BRepExtrema_DistShapeShape.hxx>
#include <BRepGProp.hxx> #include <BRepGProp.hxx>
#include <BRepTools.hxx> #include <BRepTools.hxx>
@ -85,6 +86,7 @@
#include <GeomAPI_IntSS.hxx> #include <GeomAPI_IntSS.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx> #include <GeomAPI_ProjectPointOnCurve.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <GeomAbs_SurfaceType.hxx> #include <GeomAbs_SurfaceType.hxx>
@ -1551,40 +1553,116 @@ TCollection_AsciiString GEOMImpl_IMeasureOperations::WhatIs (Handle(GEOM_Object)
* AreCoordsInside * AreCoordsInside
*/ */
//============================================================================= //=============================================================================
std::vector<bool> GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, std::vector<bool>
const std::vector<double>& coords, GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape,
double tolerance) const std::vector<double>& coords,
double tolerance)
{ {
std::vector<bool> res; std::vector<bool> isInsideRes;
if (!theShape.IsNull()) { if (!theShape.IsNull()) {
Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
if (!aRefShape.IsNull()) { if (!aRefShape.IsNull()) {
TopoDS_Shape aShape = aRefShape->GetValue(); TopoDS_Shape aShape = aRefShape->GetValue();
if (!aShape.IsNull()) { if (!aShape.IsNull())
unsigned int nb_points = coords.size()/3; {
for (int i = 0; i < nb_points; i++) { TopTools_IndexedMapOfShape mapShape;
double x = coords[3*i]; {
double y = coords[3*i+1]; TopExp_Explorer anExp;
double z = coords[3*i+2]; for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More(); anExp.Next() )
gp_Pnt aPnt(x, y, z); mapShape.Add( anExp.Current() );
if ( aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID || for ( anExp.Init( aShape, TopAbs_FACE, TopAbs_SOLID ); anExp.More(); anExp.Next() )
aShape.ShapeType() == TopAbs_SOLID ) { mapShape.Add( anExp.Current() );
TopExp_Explorer anExp; for ( anExp.Init( aShape, TopAbs_EDGE, TopAbs_FACE ); anExp.More(); anExp.Next() )
bool isFound = false; mapShape.Add( anExp.Current() );
for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More() && !isFound; anExp.Next() ) { for ( anExp.Init( aShape, TopAbs_VERTEX, TopAbs_EDGE ); anExp.More(); anExp.Next() )
BRepClass3d_SolidClassifier SC( anExp.Current() ); mapShape.Add( anExp.Current() ); //// ?????????
}
size_t nb_points = coords.size()/3, nb_points_inside = 0;
isInsideRes.resize( nb_points, false );
for ( int iS = 1; iS <= mapShape.Extent(); ++iS )
{
if ( nb_points_inside == nb_points )
break;
aShape = mapShape( iS );
switch ( aShape.ShapeType() ) {
case TopAbs_SOLID:
{
BRepClass3d_SolidClassifier SC( TopoDS::Solid( aShape ));
for ( size_t i = 0; i < nb_points; i++)
{
if ( isInsideRes[ i ]) continue;
gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] );
SC.Perform( aPnt, tolerance ); SC.Perform( aPnt, tolerance );
isFound = ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ); isInsideRes[ i ] = (( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ));
nb_points_inside += isInsideRes[ i ];
} }
res.push_back( isFound ); break;
} }
else case TopAbs_FACE:
res.push_back( false ); {
Standard_Real u1,u2,v1,v2;
const TopoDS_Face& face = TopoDS::Face( aShape );
Handle(Geom_Surface) surf = BRep_Tool::Surface( face );
surf->Bounds( u1,u2,v1,v2 );
GeomAPI_ProjectPointOnSurf project;
project.Init(surf, u1,u2, v1,v2, tolerance );
for ( size_t i = 0; i < nb_points; i++)
{
if ( isInsideRes[ i ]) continue;
gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] );
project.Perform( aPnt );
if ( project.IsDone() &&
project.NbPoints() > 0 &&
project.LowerDistance() <= tolerance )
{
Quantity_Parameter u, v;
project.LowerDistanceParameters(u, v);
gp_Pnt2d uv( u, v );
BRepClass_FaceClassifier FC ( face, uv, tolerance );
isInsideRes[ i ] = (( FC.State() == TopAbs_IN ) || ( FC.State() == TopAbs_ON ));
nb_points_inside += isInsideRes[ i ];
}
}
break;
}
case TopAbs_EDGE:
{
Standard_Real f,l;
const TopoDS_Edge& edge = TopoDS::Edge( aShape );
Handle(Geom_Curve) curve = BRep_Tool::Curve( edge, f, l );
GeomAPI_ProjectPointOnCurve project;
project.Init( curve, f, l );
for ( size_t i = 0; i < nb_points; i++)
{
if ( isInsideRes[ i ]) continue;
gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] );
project.Perform( aPnt );
isInsideRes[ i ] = ( project.NbPoints() > 0 &&
project.LowerDistance() <= tolerance );
nb_points_inside += isInsideRes[ i ];
}
break;
}
case TopAbs_VERTEX:
{
gp_Pnt aVPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ));
for ( size_t i = 0; i < nb_points; i++)
{
if ( isInsideRes[ i ]) continue;
gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] );
isInsideRes[ i ] = ( aPnt.SquareDistance( aVPnt ) <= tolerance * tolerance );
nb_points_inside += isInsideRes[ i ];
}
break;
}
default:;
} // switch ( aShape.ShapeType() )
} }
} }
} }
} }
return res; return isInsideRes;
} }
//============================================================================= //=============================================================================
@ -1592,10 +1670,15 @@ std::vector<bool> GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Objec
* GetMinDistance * GetMinDistance
*/ */
//============================================================================= //=============================================================================
Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance Standard_Real
(Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, GEOMImpl_IMeasureOperations::GetMinDistance (Handle(GEOM_Object) theShape1,
Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1, Handle(GEOM_Object) theShape2,
Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2) Standard_Real& X1,
Standard_Real& Y1,
Standard_Real& Z1,
Standard_Real& X2,
Standard_Real& Y2,
Standard_Real& Z2)
{ {
SetErrorCode(KO); SetErrorCode(KO);
Standard_Real MinDist = 1.e9; Standard_Real MinDist = 1.e9;

View File

@ -27,6 +27,7 @@
#include <GEOMImpl_ITransformOperations.hxx> #include <GEOMImpl_ITransformOperations.hxx>
#include <GEOMImpl_Types.hxx> #include <GEOMImpl_Types.hxx>
#include <GEOM_Function.hxx> #include <GEOM_Function.hxx>
#include <GEOMUtils.hxx>
#include <ShapeFix_Shape.hxx> #include <ShapeFix_Shape.hxx>
#include <ShapeFix_ShapeTolerance.hxx> #include <ShapeFix_ShapeTolerance.hxx>
@ -175,10 +176,7 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
Handle(GEOM_Function) aVector = TI.GetVector(); Handle(GEOM_Function) aVector = TI.GetVector();
gp_Vec Vec = gp::DX(); gp_Vec Vec = gp::DX();
if (!aVector.IsNull()) { if (!aVector.IsNull()) {
TopoDS_Shape aV = aVector->GetValue(); Vec = GEOMUtils::GetVector( aVector->GetValue(), Standard_False );
if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
Vec = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec.Normalize(); Vec.Normalize();
} }
@ -211,18 +209,12 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
gp_Vec Vec2 = gp::DY(); gp_Vec Vec2 = gp::DY();
if (!aVector.IsNull()) { if (!aVector.IsNull()) {
TopoDS_Shape aV = aVector->GetValue(); Vec1 = GEOMUtils::GetVector( aVector->GetValue(), Standard_False );
if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
Vec1 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec1.Normalize(); Vec1.Normalize();
} }
if (!aVector2.IsNull()) { if (!aVector2.IsNull()) {
TopoDS_Shape aV = aVector2->GetValue(); Vec2 = GEOMUtils::GetVector( aVector2->GetValue(), Standard_False );
if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
Vec2 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec2.Normalize(); Vec2.Normalize();
} }

View File

@ -725,8 +725,8 @@ bool GEOMToolsGUI::Import()
app->putInfo( tr( "GEOM_PRP_LOADING" ).arg( SUIT_Tools::file( fileName, /*withExten=*/true ) ) ); app->putInfo( tr( "GEOM_PRP_LOADING" ).arg( SUIT_Tools::file( fileName, /*withExten=*/true ) ) );
anOp->start(); anOp->start();
CORBA::String_var fileN = fileName.toLatin1().constData(); CORBA::String_var fileN = fileName.toUtf8().constData();
CORBA::String_var fileT = aCurrentType.toLatin1().constData(); CORBA::String_var fileT = aCurrentType.toUtf8().constData();
// jfa 21.08.2012 for mantis issue 21511 (STEP file units) // jfa 21.08.2012 for mantis issue 21511 (STEP file units)
CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS"); CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS");
@ -945,7 +945,7 @@ bool GEOMToolsGUI::Export()
anOp->start(); anOp->start();
aInsOp->Export( anObj, file.toStdString().c_str(), fileType.toLatin1().constData() ); aInsOp->Export( anObj, file.toUtf8().constData(), fileType.toUtf8().constData() );
if (aInsOp->IsDone()) if (aInsOp->IsDone())
anOp->commit(); anOp->commit();

View File

@ -298,9 +298,9 @@ void GEOMToolsGUI::OnTexture()
QString aTexture = QFileDialog::getOpenFileName( dynamic_cast< SUIT_ViewWindow* >( window ),tr("GEOM_SELECT_IMAGE"),QString(), tr("OCC_TEXTURE_FILES")); QString aTexture = QFileDialog::getOpenFileName( dynamic_cast< SUIT_ViewWindow* >( window ),tr("GEOM_SELECT_IMAGE"),QString(), tr("OCC_TEXTURE_FILES"));
if( !aTexture.isEmpty() ) { if( !aTexture.isEmpty() ) {
displayer.SetTexture( aTexture.toStdString() );
for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
Handle( SALOME_InteractiveObject ) io = It.Value(); Handle( SALOME_InteractiveObject ) io = It.Value();
appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::Texture ), aTexture );
appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::DisplayMode ), 3 ); appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::DisplayMode ), 3 );
if ( window->isVisible( io ) ) displayer.Redisplay( io, false ); if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
} }

View File

@ -42,6 +42,7 @@
#include "GEOM_PythonDump.hxx" #include "GEOM_PythonDump.hxx"
#include "GEOMImpl_Types.hxx" #include "GEOMImpl_Types.hxx"
#include "GEOMImpl_CopyDriver.hxx" #include "GEOMImpl_CopyDriver.hxx"
#include "GEOMImpl_IInsertOperations.hxx"
#include "GEOM_wrap.hxx" #include "GEOM_wrap.hxx"
// Cascade headers // Cascade headers
@ -240,10 +241,9 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
CORBA::String_var aGeomObjIOR = _orb->object_to_string(theObject); CORBA::String_var aGeomObjIOR = _orb->object_to_string(theObject);
aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR); aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR);
TCollection_AsciiString anObjectName("Shape_"); TCollection_AsciiString anObjectName, aNamePrefix("Shape_");
// BEGIN: try to find existed name for current shape // BEGIN: try to find existed name for current shape
bool HasName = false;
if ( !aShape->_is_nil() ) if ( !aShape->_is_nil() )
{ {
// recieve current TopoDS shape // recieve current TopoDS shape
@ -263,7 +263,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
// check all named shapes using iterator // check all named shapes using iterator
TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True); TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True);
for (; anIt.More() && !HasName; anIt.Next()) { for (; anIt.More() && anObjectName.IsEmpty(); anIt.Next()) {
Handle(TNaming_NamedShape) anAttr = Handle(TNaming_NamedShape) anAttr =
Handle(TNaming_NamedShape)::DownCast(anIt.Value()); Handle(TNaming_NamedShape)::DownCast(anIt.Value());
if (anAttr.IsNull()) continue; if (anAttr.IsNull()) continue;
@ -271,10 +271,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
if (S.IsEqual(TopoSh)) { if (S.IsEqual(TopoSh)) {
TDF_Label L = anAttr->Label(); TDF_Label L = anAttr->Label();
Handle(TDataStd_Name) aName; Handle(TDataStd_Name) aName;
if (L.FindAttribute(TDataStd_Name::GetID(), aName)) { if (L.FindAttribute(TDataStd_Name::GetID(), aName))
anObjectName = aName->Get(); anObjectName = aName->Get();
HasName = true;
}
} }
} }
} }
@ -286,32 +284,32 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape )) { switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape )) {
case TopAbs_VERTEX: case TopAbs_VERTEX:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" ); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" );
anObjectName = "Group_Of_Vertices_"; aNamePrefix = "Group_Of_Vertices_";
break; break;
case TopAbs_EDGE: case TopAbs_EDGE:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE");
anObjectName = "Group_Of_Edges_"; aNamePrefix = "Group_Of_Edges_";
break; break;
case TopAbs_FACE: case TopAbs_FACE:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE");
anObjectName = "Group_Of_Faces_"; aNamePrefix = "Group_Of_Faces_";
break; break;
case TopAbs_SOLID: case TopAbs_SOLID:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID");
anObjectName = "Group_Of_Solids_"; aNamePrefix = "Group_Of_Solids_";
break; break;
} }
} else if ( mytype == GEOM_MARKER ) { } else if ( mytype == GEOM_MARKER ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS");
anObjectName = "LocalCS_"; aNamePrefix = "LocalCS_";
} else if ( mytype > ADVANCED_BASE ) { } else if ( mytype > ADVANCED_BASE ) {
char buf[20]; char buf[20];
sprintf( buf, "%d", aBaseObj->GetType() ); sprintf( buf, "%d", aBaseObj->GetType() );
std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf; std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf;
aResultSO->SetAttrString("AttributePixMap",advId.c_str()); aResultSO->SetAttrString("AttributePixMap",advId.c_str());
anObjectName = "Advanced_"; aNamePrefix = "Advanced_";
} else if ( mytype == GEOM_FIELD ) { } else if ( mytype == GEOM_FIELD ) {
anObjectName = "Field_"; aNamePrefix = "Field_";
GEOM::GEOM_Field_var aField = GEOM::GEOM_Field::_narrow(theObject); GEOM::GEOM_Field_var aField = GEOM::GEOM_Field::_narrow(theObject);
if ( !aField->_is_nil() ) if ( !aField->_is_nil() )
switch( aField->GetDimension() ) { switch( aField->GetDimension() ) {
@ -327,38 +325,38 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FIELD_SOLID"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FIELD_SOLID");
} }
} else if ( mytype == GEOM_FIELD_STEP ) { } else if ( mytype == GEOM_FIELD_STEP ) {
anObjectName = "Step_"; aNamePrefix = "Step_";
} else if ( !aShape->_is_nil() ) { } else if ( !aShape->_is_nil() ) {
GEOM::shape_type myshapetype=aShape->GetShapeType(); GEOM::shape_type myshapetype=aShape->GetShapeType();
if ( myshapetype == GEOM::COMPOUND ) { if ( myshapetype == GEOM::COMPOUND ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" ); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" );
anObjectName = "Compound_"; aNamePrefix = "Compound_";
} else if ( myshapetype == GEOM::COMPSOLID ) { } else if ( myshapetype == GEOM::COMPSOLID ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID");
anObjectName = "Compsolid_"; aNamePrefix = "Compsolid_";
} else if ( myshapetype == GEOM::SOLID ) { } else if ( myshapetype == GEOM::SOLID ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID");
anObjectName = "Solid_"; aNamePrefix = "Solid_";
} else if ( myshapetype == GEOM::SHELL ) { } else if ( myshapetype == GEOM::SHELL ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL");
anObjectName = "Shell_"; aNamePrefix = "Shell_";
} else if ( myshapetype == GEOM::FACE ) { } else if ( myshapetype == GEOM::FACE ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE");
anObjectName = "Face_"; aNamePrefix = "Face_";
} else if ( myshapetype == GEOM::WIRE ) { } else if ( myshapetype == GEOM::WIRE ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE");
anObjectName = "Wire_"; aNamePrefix = "Wire_";
} else if ( myshapetype == GEOM::EDGE ) { } else if ( myshapetype == GEOM::EDGE ) {
aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE"); aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE");
anObjectName = "Edge_"; aNamePrefix = "Edge_";
} else if ( myshapetype == GEOM::VERTEX ) { } else if ( myshapetype == GEOM::VERTEX ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_VERTEX" ); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_VERTEX" );
anObjectName = "Vertex_"; aNamePrefix = "Vertex_";
} }
} }
if (!HasName) if ( anObjectName.IsEmpty() )
{ {
//if (strlen(theName) == 0) anObjectName += TCollection_AsciiString(aResultSO->Tag()); //if (strlen(theName) == 0) aNamePrefix += TCollection_AsciiString(aResultSO->Tag());
//else anObjectName = TCollection_AsciiString(CORBA::string_dup(theName)); //else anObjectName = TCollection_AsciiString(CORBA::string_dup(theName));
// asv : 11.11.04 Introducing a more sofisticated method of name creation, just as // asv : 11.11.04 Introducing a more sofisticated method of name creation, just as
@ -368,16 +366,15 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
if ( strlen( theName ) == 0 ) { // MOST PROBABLY CALLED FROM BATCHMODE OR SUPERVISOR if ( strlen( theName ) == 0 ) { // MOST PROBABLY CALLED FROM BATCHMODE OR SUPERVISOR
int i = 0; // (WITH EMPTY NEW NAME) int i = 0; // (WITH EMPTY NEW NAME)
SALOMEDS::SObject_var obj; SALOMEDS::SObject_var obj;
TCollection_AsciiString aNewObjectName;
do { do {
aNewObjectName = anObjectName + TCollection_AsciiString(++i); anObjectName = aNamePrefix + TCollection_AsciiString(++i);
obj = theStudy->FindObject( aNewObjectName.ToCString() ); obj = theStudy->FindObject( anObjectName.ToCString() );
} }
while ( !obj->_is_nil() ); while ( !obj->_is_nil() );
anObjectName = aNewObjectName;
} }
else // MOST PROBABLY CALLED FROM GEOM GUI (ALREADY WITH VALID NAME) else { // MOST PROBABLY CALLED FROM GEOM GUI (ALREADY WITH VALID NAME)
anObjectName = theName; anObjectName = theName;
}
} }
//Set the study entry as a name of the published GEOM_Object //Set the study entry as a name of the published GEOM_Object
@ -750,6 +747,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
// Find the current Study and StudyBuilder // Find the current Study and StudyBuilder
SALOMEDS::Study_var aStudy = theObject->GetStudy(); SALOMEDS::Study_var aStudy = theObject->GetStudy();
SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
SALOMEDS::UseCaseBuilder_var anUseCaseBuilder = aStudy->GetUseCaseBuilder();
SALOMEDS::SObject_var aNewSO; SALOMEDS::SObject_var aNewSO;
// Retrieve a TopoDS_Shape from byte stream // Retrieve a TopoDS_Shape from byte stream
TopoDS_Shape aTopology; TopoDS_Shape aTopology;
@ -786,6 +784,10 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
anIOR->SetValue(objStr.in()); anIOR->SetValue(objStr.in());
anIOR->UnRegister(); anIOR->UnRegister();
// add object to the use case tree
// (to support tree representation customization and drag-n-drop)
anUseCaseBuilder->AppendTo( aNewSO->GetFather(), aNewSO );
// Return the created in the Study SObject // Return the created in the Study SObject
return aNewSO._retn(); return aNewSO._retn();
} }
@ -2905,11 +2907,11 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
if (aFileName.rfind("/") != std::string::npos) { // remove folders from the name if (aFileName.rfind("/") != std::string::npos) { // remove folders from the name
aFileName = aFileName.substr(aFileName.rfind("/") + 1); aFileName = aFileName.substr(aFileName.rfind("/") + 1);
} }
std::string anExtension(data->extension()); std::string anExtension(data->extension());
aFileName += "." + anExtension; aFileName += "." + anExtension;
// convert extension to upper case // convert extension to upper case
std::transform(anExtension.begin(), anExtension.end(), anExtension.begin(), ::toupper); std::transform(anExtension.begin(), anExtension.end(), anExtension.begin(), ::toupper);
std::string aFullPath = aTmpDir + aFileName; std::string aFullPath = aTmpDir + aFileName;
Engines::TMPFile* aFileStream = data->get(); Engines::TMPFile* aFileStream = data->get();
@ -2922,16 +2924,30 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
aFile.write(aBuffer, aFileStream->length()); aFile.write(aBuffer, aFileStream->length());
aFile.close(); aFile.close();
GEOM::GEOM_Object_var anObj = aInsOp->ImportFile(aFullPath.c_str(), anExtension.c_str()); GEOM::GEOM_Object_var aShapeObj;
if ( !anObj->_is_nil() && aInsOp->IsDone() ) { GEOM::ListOfGO_var aSubShape = new GEOM::ListOfGO;
SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), anObj, data->name()); GEOM::ListOfGO_var aGroups = new GEOM::ListOfGO;
aResult->length(1); GEOM::ListOfFields_var aFields = new GEOM::ListOfFields;
CORBA::Boolean isResultOK = aInsOp->ImportXAO(aFullPath.c_str(), aShapeObj.out(), aSubShape.out(), aGroups.out(), aFields.out());
if ( isResultOK && !aShapeObj->_is_nil() && aInsOp->IsDone() ) {
SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), aShapeObj, aShapeObj->GetName());
aResult->length(aGroups->length() + 1);
aResult[0] = aSO->GetID(); // unioque identifer of the object in GEOM is entry of SObject aResult[0] = aSO->GetID(); // unioque identifer of the object in GEOM is entry of SObject
} else { //Iteration for objects of the group.
if (anObj->_is_nil()) for (int i = 0; i < aGroups->length(); i++) {
SALOMEDS::SObject_var aSOChild = AddInStudy(aStudy, aGroups[i], aGroups[i]->GetName(), aShapeObj);
aResult[i+1] = aSOChild->GetID();
}
}
else {
if (aShapeObj->_is_nil())
MESSAGE("Result of the import operation is incorrect for file "<<aFullPath.c_str()); MESSAGE("Result of the import operation is incorrect for file "<<aFullPath.c_str());
if (!aInsOp->IsDone()) if (!aInsOp->IsDone())
MESSAGE("Import operation is not done for file "<<aFullPath.c_str()); MESSAGE("Import operation is not done for file "<<aFullPath.c_str());
if (!isResultOK)
MESSAGE("ImportXAO operation is failed for file "<<aFullPath.c_str());
return aResult._retn(); return aResult._retn();
} }
@ -2940,7 +2956,7 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
aTmpFiles.length(1); aTmpFiles.length(1);
aTmpFiles[0] = aFileName.c_str(); aTmpFiles[0] = aFileName.c_str();
SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aTmpFiles, true); SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aTmpFiles, true);
_impl->DocumentModified(studyId, false); _impl->DocumentModified(studyId, false);
return aResult._retn(); return aResult._retn();
} }
@ -2965,10 +2981,16 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId)
if (CORBA::is_nil(aComponent)) if (CORBA::is_nil(aComponent))
return aResult._retn(); return aResult._retn();
SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published shapes SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published shapes
TopoDS_Compound aResultComp;
BRep_Builder aBB; GEOM::GEOM_Object_var shapeObj;
aBB.MakeCompound(aResultComp); GEOM::ListOfGO_var groups = new GEOM::ListOfGO;
int aNumInComp = 0; // number of shapes in resulting compound GEOM::ListOfFields_var fields = new GEOM::ListOfFields;
std::string anAuthorName = "SIMAN Author";
GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(aStudy->StudyId());
GEOM::GEOM_IInsertOperations_var aInsOp = GetIInsertOperations(aStudy->StudyId());
int aSeqLength = 0; // the sequence length
for(; anIter->More(); anIter->Next()) { for(; anIter->More(); anIter->Next()) {
SALOMEDS::SObject_var aSO = anIter->Value(); SALOMEDS::SObject_var aSO = anIter->Value();
SALOMEDS::SObject_var aRefSO; SALOMEDS::SObject_var aRefSO;
@ -2979,30 +3001,42 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId)
GEOM::GEOM_Object_var aCORBAMainShape = GEOM::GEOM_Object::_narrow(anObj); GEOM::GEOM_Object_var aCORBAMainShape = GEOM::GEOM_Object::_narrow(anObj);
if(!aCORBAMainShape->_is_nil()) { if(!aCORBAMainShape->_is_nil()) {
CORBA::String_var entry = aCORBAMainShape->GetEntry(); CORBA::String_var entry = aCORBAMainShape->GetEntry();
Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast( _impl->GetObject(studyId, entry) ); Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast(_impl->GetObject(studyId, entry));
if (!aMainShape.IsNull()) {
TopoDS_Shape aMainSh = aMainShape->GetValue(); GEOM::shape_type aCORBAShapeType = aCORBAMainShape->GetShapeType();
if (!aMainSh.IsNull()) { if (!aMainShape.IsNull() && !(aCORBAShapeType == GEOM::VERTEX) && !(aCORBAShapeType == GEOM::EDGE)) {
aBB.Add(aResultComp, aMainSh); aSeqLength++;
aNumInComp++; shapeObj = aCORBAMainShape;
if (aShapesOp->_is_nil()) {
MESSAGE("No shapes operations!");
return aResult._retn();
} }
groups = aShapesOp->GetExistingSubObjects(aCORBAMainShape, true);
break;
} }
} }
} }
} }
} }
if (aNumInComp > 0) { // compund is correct, write it to the temporary file
std::string aFullPath = Kernel_Utils::GetTmpFileName() + ".brep"; if (aInsOp->_is_nil()) {
BRepTools::Write(aResultComp, aFullPath.c_str()); MESSAGE("No insert operations!");
MESSAGE("Write compound of "<<aNumInComp<<" shapes to "<<aFullPath.c_str()); return aResult._retn();
}
if (aSeqLength > 0) { // Shape is correct, write it to the temporary file
std::string aFullXaoPath = Kernel_Utils::GetTmpFileName() + ".xao";
CORBA::Boolean isResultOK = aInsOp->ExportXAO(shapeObj.in(), groups.in(), fields.in(), anAuthorName.c_str(), aFullXaoPath.c_str());
aResult->length(1); aResult->length(1);
Engines::DataContainer_var aData = (new Engines_DataContainer_i( Engines::DataContainer_var aData = (new Engines_DataContainer_i(
aFullPath.c_str(), "", "", true))->_this(); aFullXaoPath.c_str(), "", "", true))->_this();
aResult[0] = aData; aResult[0] = aData;
} else { } else {
MESSAGE("No shapes to export"); MESSAGE("No shapes to export");
} }
return aResult._retn(); return aResult._retn();
} }

View File

@ -674,10 +674,57 @@ void GroupGUI_GroupDlg::showOnlySelected()
Handle(SALOME_InteractiveObject) io = Handle(SALOME_InteractiveObject) io =
new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
if (view->isVisible(io)) myIsHiddenMain = true; if (view->isVisible(io)) myIsHiddenMain = true;
}
//keep the selected entry and IO in the map for checking
std::map<QString, Handle(SALOME_InteractiveObject)> aSelEntriesMap;
SALOME_ListIteratorOfListIO aSelIt(aSelList);
for ( ; aSelIt.More(); aSelIt.Next() ) {
Handle(SALOME_InteractiveObject) anSelIO = aSelIt.Value();
aSelEntriesMap[anSelIO->getEntry()] = anSelIO;
}
//get the displayed sub-shapes
SALOME_ListIO displayed;
view->GetVisible(displayed);
// Erase all, except the selected sub-shapes
std::map<QString, Handle(SALOME_InteractiveObject)>::iterator
aSelDispIter = aSelEntriesMap.end();
SALOME_ListIteratorOfListIO aDispIt( displayed );
for ( ; aDispIt.More(); aDispIt.Next() ) {
Handle(SALOME_InteractiveObject) anIO = aDispIt.Value();
aSelDispIter = aSelEntriesMap.find( anIO->getEntry() );
if ( aSelDispIter != aSelEntriesMap.end() ) {
//sub-shape is selected, so erase it's record from map to keep in it not displayed, but selected sub-shapes only
aSelEntriesMap.erase(aSelDispIter);
} else {
//sub-shape is not in the map of selected, then erase it from view
aDisplayer->Erase( anIO, /*forced = */false, /*updateViewer = */false );
}
}
aDisplayer->EraseAll(/*forced = false, updateViewer = true*/); if ( !aSelEntriesMap.empty() ) {
aDisplayer->Display(aSelList, true); // Build a presentation of the selected, but not displayed sub-shapes
TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
TopTools_IndexedMapOfShape aSubShapesMap;
TopExp::MapShapes(aMainShape, aSubShapesMap);
QString anEntryBase = aMainEntry.in();
TopExp_Explorer anExp (aMainShape, getShapeType());
for (; anExp.More(); anExp.Next()) {
TopoDS_Shape aSubShape = anExp.Current();
int index = aSubShapesMap.FindIndex(aSubShape);
QString anEntry = QString( "TEMP_" ) + anEntryBase + QString("_%1").arg(index);
if ( aSelEntriesMap.find( anEntry ) == aSelEntriesMap.end() ) {
//skip not selected sub-shapes
continue;
}
SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, view);
if (aPrs) {
displayPreview(aPrs, true, false); // append, do not update
}
}
}
aDisplayer->UpdateViewer();
}
// Mantis issue 0021421: do not hide main shape, if explode on VERTEX // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) { if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) {

View File

@ -347,7 +347,7 @@ SALOME_Prs* MeasureGUI_AngleDlg::buildPrs()
gce_MakePln gce_MP(aP11, aP12, aP3); gce_MakePln gce_MP(aP11, aP12, aP3);
Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value()); Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value());
Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2, aPlane->Pln() ); Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2 );
Handle(Prs3d_DimensionAspect) aDimensionStyle = new Prs3d_DimensionAspect; Handle(Prs3d_DimensionAspect) aDimensionStyle = new Prs3d_DimensionAspect;

View File

@ -95,6 +95,8 @@ namespace GEOM
"IsosColor", // - "IsosColor", // -
// outlines color // outlines color
"OutlineColor", // - "OutlineColor", // -
// texture
"Texture", // -
}; };
return ( type >= GEOM::Visibility && type <= GEOM::LastProperty ) ? names[type] : QString(); return ( type >= GEOM::Visibility && type <= GEOM::LastProperty ) ? names[type] : QString();
} }

View File

@ -54,7 +54,8 @@ namespace GEOM
PointColor, PointColor,
IsosColor, IsosColor,
OutlineColor, OutlineColor,
LastProperty = OutlineColor, Texture,
LastProperty = Texture,
}; };
GEOM_OBJECT_EXPORT double minDeflection(); GEOM_OBJECT_EXPORT double minDeflection();

View File

@ -59,14 +59,16 @@ void ShapeRec_FeatureDetector::SetPath( const std::string& thePath )
{ {
IplImage* src = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR); IplImage* src = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
imgHeight = src->height; imgHeight = src->height;
imgWidth = src->width; imgWidth = src->width;
cvReleaseImage(&src);
} }
} }
/*! /*!
Computes the corners of the image located at imagePath Computes the corners of the image located at imagePath
*/ */
void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters* parameters ){ void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters* parameters )
{
ShapeRec_CornersParameters* aCornersParameters = dynamic_cast<ShapeRec_CornersParameters*>( parameters ); ShapeRec_CornersParameters* aCornersParameters = dynamic_cast<ShapeRec_CornersParameters*>( parameters );
if ( !aCornersParameters ) aCornersParameters = new ShapeRec_CornersParameters(); if ( !aCornersParameters ) aCornersParameters = new ShapeRec_CornersParameters();
@ -105,8 +107,8 @@ void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters*
/*! /*!
Computes the contours of the image located at imagePath Computes the contours of the image located at imagePath
*/ */
bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters ){ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters )
{
// Initialising images // Initialising images
cv::Mat src, src_gray; cv::Mat src, src_gray;
cv::Mat detected_edges; cv::Mat detected_edges;
@ -135,40 +137,44 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
} }
else //COLORFILTER else //COLORFILTER
{ {
IplImage* find_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR); // Load the input image where we want to detect contours
IplImage* input_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
ShapeRec_ColorFilterParameters* aColorFilterParameters = dynamic_cast<ShapeRec_ColorFilterParameters*>( parameters ); ShapeRec_ColorFilterParameters* aColorFilterParameters = dynamic_cast<ShapeRec_ColorFilterParameters*>( parameters );
if ( !aColorFilterParameters ) aColorFilterParameters = new ShapeRec_ColorFilterParameters(); if ( !aColorFilterParameters ) aColorFilterParameters = new ShapeRec_ColorFilterParameters();
// Reduce noise // Reduce noise
cvSmooth( find_image, find_image, CV_GAUSSIAN, aColorFilterParameters->smoothSize, aColorFilterParameters->smoothSize ); cvSmooth( input_image, input_image, CV_GAUSSIAN, aColorFilterParameters->smoothSize, aColorFilterParameters->smoothSize );
// Crop the image to build an histogram from the selected part // Crop the image to the selected part only (sample_image)
cvSetImageROI(find_image, rect); cvSetImageROI(input_image, rect);
IplImage* test_image = cvCreateImage(cvGetSize(find_image), IplImage* sample_image = cvCreateImage(cvGetSize(input_image),
find_image->depth, input_image->depth,
find_image->nChannels); input_image->nChannels);
cvCopy(find_image, test_image, NULL); cvCopy(input_image, sample_image, NULL);
cvResetImageROI(find_image); cvResetImageROI(input_image);
IplImage* test_hsv = cvCreateImage(cvGetSize(test_image),8,3); IplImage* sample_hsv = cvCreateImage( cvGetSize(sample_image),8,3 );
IplImage* h_plane = cvCreateImage( cvGetSize(test_image), 8, 1 ); IplImage* sample_h_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize(test_image), 8, 1 ); IplImage* sample_s_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 );
CvHistogram* hist; CvHistogram* sample_hist;
cvCvtColor(test_image, test_hsv, CV_BGR2HSV); cvCvtColor(sample_image, sample_hsv, CV_BGR2HSV);
cvCvtPixToPlane(test_hsv, h_plane, s_plane, 0, 0); cvCvtPixToPlane(sample_hsv, sample_h_plane, sample_s_plane, 0, 0);
IplImage* planes[] = { h_plane, s_plane }; IplImage* sample_planes[] = { sample_h_plane, sample_s_plane };
//create hist // Create the hue / saturation histogram of the SAMPLE image.
// This histogramm will be representative of what is the zone
// we want to find the frontier of. Indeed, the sample image is meant to
// be representative of this zone
float hranges[] = { 0, 180 }; float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 }; float sranges[] = { 0, 256 };
float* ranges[] = { hranges, sranges }; float* ranges[] = { hranges, sranges };
hist = cvCreateHist( 2, aColorFilterParameters->histSize, aColorFilterParameters->histType, ranges ); sample_hist = cvCreateHist( 2, aColorFilterParameters->histSize, aColorFilterParameters->histType, ranges );
//calculate hue /saturation histogram //calculate hue /saturation histogram
cvCalcHist(planes, hist, 0 ,0); cvCalcHist(sample_planes, sample_hist, 0 ,0);
// // TEST print of the histogram for debugging // // TEST print of the histogram for debugging
// IplImage* hist_image = cvCreateImage(cvSize(320,300),8,3); // IplImage* hist_image = cvCreateImage(cvSize(320,300),8,3);
@ -194,18 +200,37 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
// cvNamedWindow("hist", 1); cvShowImage("hist",hist_image); // cvNamedWindow("hist", 1); cvShowImage("hist",hist_image);
//calculate back projection of hue and saturation planes of input image // Calculate the back projection of hue and saturation planes of the INPUT image
IplImage* backproject = cvCreateImage(cvGetSize(test_image), 8, 1); // by mean of the histogram of the SAMPLE image.
IplImage* binary_backproject = cvCreateImage(cvGetSize(test_image), 8, 1); //
cvCalcBackProject(planes, backproject, hist); // The pixels which (h,s) coordinates correspond to high values in the histogram
// will have high values in the grey image result. It means that a pixel of the INPUT image
// which is more probably in the zone represented by the SAMPLE image, will be whiter
// in the back projection.
IplImage* backproject = cvCreateImage(cvGetSize(input_image), 8, 1);
IplImage* binary_backproject = cvCreateImage(cvGetSize(input_image), 8, 1);
IplImage* input_hsv = cvCreateImage(cvGetSize(input_image),8,3);
IplImage* input_hplane = cvCreateImage(cvGetSize(input_image),8,1);
IplImage* input_splane = cvCreateImage(cvGetSize(input_image),8,1);
// Threshold in order to obtain binary image // Get hue and saturation planes of the INPUT image
cvCvtColor(input_image, input_hsv, CV_BGR2HSV);
cvCvtPixToPlane(input_hsv, input_hplane, input_splane, 0, 0);
IplImage* input_planes[] = { input_hplane, input_splane };
// Compute the back projection
cvCalcBackProject(input_planes, backproject, sample_hist);
// Threshold in order to obtain a binary image
cvThreshold(backproject, binary_backproject, aColorFilterParameters->threshold, aColorFilterParameters->maxThreshold, CV_THRESH_BINARY); cvThreshold(backproject, binary_backproject, aColorFilterParameters->threshold, aColorFilterParameters->maxThreshold, CV_THRESH_BINARY);
cvReleaseImage(&test_image); cvReleaseImage(&sample_image);
cvReleaseImage(&test_hsv); cvReleaseImage(&sample_hsv);
cvReleaseImage(&h_plane); cvReleaseImage(&sample_h_plane);
cvReleaseImage(&s_plane); cvReleaseImage(&sample_s_plane);
cvReleaseImage(&find_image); cvReleaseImage(&input_image);
cvReleaseImage(&input_hsv);
cvReleaseImage(&input_hplane);
cvReleaseImage(&input_splane);
cvReleaseImage(&backproject); cvReleaseImage(&backproject);
detected_edges = cv::Mat(binary_backproject); detected_edges = cv::Mat(binary_backproject);
@ -218,7 +243,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
// _detectAndRetrieveContours( detected_edges, parameters->findContoursMethod ); // _detectAndRetrieveContours( detected_edges, parameters->findContoursMethod );
detected_edges = detected_edges > 1; detected_edges = detected_edges > 1;
findContours( detected_edges, contours, hierarchy, CV_RETR_CCOMP, parameters->findContoursMethod, useROI ? cvPoint(rect.x,rect.y) : cvPoint(0,0) ); findContours( detected_edges, contours, hierarchy, CV_RETR_CCOMP, parameters->findContoursMethod);
return true; return true;
@ -269,6 +294,9 @@ std::string ShapeRec_FeatureDetector::CroppImage()
cvSaveImage ("/tmp/cropped_image.bmp", cropped_image); cvSaveImage ("/tmp/cropped_image.bmp", cropped_image);
cvReleaseImage(&src);
cvReleaseImage(&cropped_image);
return "/tmp/cropped_image.bmp"; return "/tmp/cropped_image.bmp";
} }

View File

@ -174,11 +174,11 @@ void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId)
{ {
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myBase.nullify(); //myBase.nullify();
myVector.nullify(); //myVector.nullify();
GroupArgs->LineEdit1->setText(""); //GroupArgs->LineEdit1->setText("");
GroupArgs->LineEdit2->setText(""); //GroupArgs->LineEdit2->setText("");
GroupArgs->SpinBox_DX1->setValue(myAng); GroupArgs->SpinBox_DX1->setValue(myAng);
GroupArgs->SpinBox_DY1->setValue(myNbTimes1); GroupArgs->SpinBox_DY1->setValue(myNbTimes1);
@ -275,7 +275,8 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
// angular step // angular step
double diag = sqrt((Xmax-Xmin)*(Xmax-Xmin) + (Ymax-Ymin)*(Ymax-Ymin)); double diag = sqrt((Xmax-Xmin)*(Xmax-Xmin) + (Ymax-Ymin)*(Ymax-Ymin));
double d = sqrt((0.5*(Xmax+Xmin))*(0.5*(Xmax+Xmin)) + (0.5*(Ymax+Ymin))*(0.5*(Ymax+Ymin))); double d = sqrt((0.5*(Xmax+Xmin))*(0.5*(Xmax+Xmin)) + (0.5*(Ymax+Ymin))*(0.5*(Ymax+Ymin)));
myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI); if ( fabs(d) > 1.e-16 )
myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI);
GroupArgs->SpinBox_DX1->setValue(myAng); GroupArgs->SpinBox_DX1->setValue(myAng);
// radial step // radial step
@ -293,10 +294,10 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
} }
// clear selection // clear selection
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myGeomGUI->getApp()->selectionMgr()->clearSelected(); // myGeomGUI->getApp()->selectionMgr()->clearSelected();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument())); // this, SLOT(SelectionIntoArgument()));
} }
else { else {
if ( myEditCurrentArgument == GroupArgs->LineEdit1 ) if ( myEditCurrentArgument == GroupArgs->LineEdit1 )

View File

@ -239,15 +239,21 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor
GroupDimensions->hide(); GroupDimensions->hide();
GroupPoints->show(); GroupPoints->show();
GroupPoints->LineEdit1->setText(""); //GroupPoints->LineEdit1->setText("");
GroupPoints->LineEdit2->setText(""); //GroupPoints->LineEdit2->setText("");
myBase.nullify(); //myBase.nullify();
myVectorU.nullify(); //myVectorU.nullify();
if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) );
if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) );
GroupPoints->SpinBox_DX->setValue(myStepU); GroupPoints->SpinBox_DX->setValue(myStepU);
GroupPoints->SpinBox_DY->setValue(myNbTimesU); GroupPoints->SpinBox_DY->setValue(myNbTimesU);
GroupPoints->PushButton1->click(); if ( !myBase )
GroupPoints->PushButton1->click();
else if ( !myVectorU )
GroupPoints->PushButton2->click();
break; break;
} }
case 1: // Translate double case 1: // Translate double
@ -255,19 +261,28 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor
GroupPoints->hide(); GroupPoints->hide();
GroupDimensions->show(); GroupDimensions->show();
GroupDimensions->LineEdit1->setText(""); //GroupDimensions->LineEdit1->setText("");
GroupDimensions->LineEdit2->setText(""); //GroupDimensions->LineEdit2->setText("");
GroupDimensions->LineEdit3->setText(""); //GroupDimensions->LineEdit3->setText("");
myBase.nullify(); //myBase.nullify();
myVectorU.nullify(); //myVectorU.nullify();
myVectorV.nullify(); //myVectorV.nullify();
if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) );
if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) );
if ( myVectorV ) GroupDimensions->LineEdit3->setText( GEOMBase::GetName( myVectorV.get() ) );
GroupDimensions->SpinBox_DX1->setValue(myStepU); GroupDimensions->SpinBox_DX1->setValue(myStepU);
GroupDimensions->SpinBox_DY1->setValue(myNbTimesU); GroupDimensions->SpinBox_DY1->setValue(myNbTimesU);
GroupDimensions->SpinBox_DX2->setValue(myStepV); GroupDimensions->SpinBox_DX2->setValue(myStepV);
GroupDimensions->SpinBox_DY2->setValue(myNbTimesV); GroupDimensions->SpinBox_DY2->setValue(myNbTimesV);
GroupDimensions->PushButton1->click(); if ( !myBase )
GroupDimensions->PushButton1->click();
else if ( !myVectorU )
GroupDimensions->PushButton2->click();
else if ( !myVectorV )
GroupDimensions->PushButton3->click();
break; break;
} }
} }
@ -329,7 +344,7 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
QString aName = GEOMBase::GetName( aSelectedObject.get() ); QString aName = GEOMBase::GetName( aSelectedObject.get() );
myEditCurrentArgument->setText( aName ); myEditCurrentArgument->setText( aName );
if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) { if ( myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
myBase = aSelectedObject; myBase = aSelectedObject;
// recompute myStepU (Mantis issue 0021718) // recompute myStepU (Mantis issue 0021718)
@ -338,36 +353,26 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
if (anOper->IsDone()) { if (anOper->IsDone()) {
myStepU = floor(1.5 * (Xmax - Xmin)); myStepU = floor(1.5 * (Xmax - Xmin));
myStepV = floor(1.5 * (Ymax - Ymin));
GroupPoints->SpinBox_DX->setValue(myStepU); GroupPoints->SpinBox_DX->setValue(myStepU);
GroupDimensions->SpinBox_DX1->setValue(myStepU);
GroupDimensions->SpinBox_DX2->setValue(myStepV);
} }
if (!myVectorU) if ( myEditCurrentArgument == GroupPoints->LineEdit1 && !myVectorU )
GroupPoints->PushButton2->click(); GroupPoints->PushButton2->click();
if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
if ( !myVectorU )
GroupDimensions->PushButton2->click();
else if ( !myVectorV )
GroupDimensions->PushButton3->click();
}
} }
else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
myVectorU = aSelectedObject; myVectorU = aSelectedObject;
if ( !myBase ) if ( !myBase )
GroupPoints->PushButton1->click(); GroupPoints->PushButton1->click();
} }
else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
myBase = aSelectedObject;
// recompute myStepU and myStepV (Mantis issue 0021718)
GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
if (anOper->IsDone()) {
myStepU = floor(1.5 * (Xmax - Xmin));
myStepV = floor(1.5 * (Ymax - Ymin));
GroupDimensions->SpinBox_DX1->setValue(myStepU);
GroupDimensions->SpinBox_DX2->setValue(myStepV);
}
if ( !myVectorU )
GroupDimensions->PushButton2->click();
else if ( !myVectorV )
GroupDimensions->PushButton3->click();
}
else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) { else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) {
myVectorU = aSelectedObject; myVectorU = aSelectedObject;
if ( !myVectorV ) if ( !myVectorV )
@ -384,10 +389,10 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
} }
// clear selection // clear selection
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myGeomGUI->getApp()->selectionMgr()->clearSelected(); // myGeomGUI->getApp()->selectionMgr()->clearSelected();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument())); // this, SLOT(SelectionIntoArgument()));
} }
else { else {
if ( myEditCurrentArgument == GroupPoints->LineEdit1 || if ( myEditCurrentArgument == GroupPoints->LineEdit1 ||
@ -668,8 +673,8 @@ bool TransformationGUI_MultiTranslationDlg::execute (ObjectList& objects)
createPathPreview(myVectorU.get()); createPathPreview(myVectorU.get());
createPathPreview(myVectorV.get()); createPathPreview(myVectorV.get());
anObj = anOper->MultiTranslate2D(myBase.get(), anObj = anOper->MultiTranslate2D(myBase.get(),
myVectorU.get(), myStepU, myNbTimesU, myVectorU.get(), myStepU, myNbTimesU,
myVectorV.get(), myStepV, myNbTimesV); myVectorV.get(), myStepV, myNbTimesV);
if (!IsPreview()) { if (!IsPreview()) {
aParameters << GroupDimensions->SpinBox_DX1->text(); aParameters << GroupDimensions->SpinBox_DX1->text();
aParameters << GroupDimensions->SpinBox_DY1->text(); aParameters << GroupDimensions->SpinBox_DY1->text();
@ -743,10 +748,11 @@ void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Objec
ShapeAnalysis_Edge aShapeAnal; ShapeAnalysis_Edge aShapeAnal;
TopoDS_Vertex aFirst = aShapeAnal.FirstVertex( anEdge ); TopoDS_Vertex aFirst = aShapeAnal.FirstVertex( anEdge );
TopoDS_Vertex aLast = aShapeAnal.LastVertex( anEdge ); TopoDS_Vertex aLast = aShapeAnal.LastVertex( anEdge );
if ( BRep_Tool::Pnt(aFirst).IsEqual( BRep_Tool::Pnt(aLast), Precision::Confusion() ) ) return;
TopoDS_Shape aVector = BRepBuilderAPI_MakeEdge(BRep_Tool::Pnt(aFirst), BRep_Tool::Pnt(aLast)).Shape(); TopoDS_Shape aVector = BRepBuilderAPI_MakeEdge(BRep_Tool::Pnt(aFirst), BRep_Tool::Pnt(aLast)).Shape();
const char* aName = "tmpVector"; const char* aName = "tmpVector";
Handle(GEOM_AISVector) anIO = new GEOM_AISVector( aVector, aName ); Handle(GEOM_AISVector) anIO = new GEOM_AISVector( aVector, aName );
// add Prs to preview // add Prs to preview
SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
SOCC_Prs* aPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); SOCC_Prs* aPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0));

View File

@ -55,7 +55,10 @@ SET(TestXAO_SOURCES
ADD_EXECUTABLE(TestXAO ${TestXAO_SOURCES}) ADD_EXECUTABLE(TestXAO ${TestXAO_SOURCES})
TARGET_LINK_LIBRARIES(TestXAO ${_link_LIBRARIES}) TARGET_LINK_LIBRARIES(TestXAO ${_link_LIBRARIES})
SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env)
ADD_TEST(TestXAO TestXAO) ADD_TEST(TestXAO TestXAO)
SET_TESTS_PROPERTIES(TestXAO PROPERTIES ENVIRONMENT "GEOM_SRC_DIR=${PROJECT_SOURCE_DIR}") SET_TESTS_PROPERTIES(TestXAO PROPERTIES ENVIRONMENT "GEOM_SRC_DIR=${PROJECT_SOURCE_DIR};${tests_env}")
INSTALL(TARGETS TestXAO DESTINATION ${SALOME_INSTALL_BINS}) INSTALL(TARGETS TestXAO DESTINATION ${SALOME_INSTALL_BINS})

View File

@ -25,8 +25,9 @@ namespace XAO
rstr.seekg(0, rstr.end); // go to the end rstr.seekg(0, rstr.end); // go to the end
length = rstr.tellg(); // report location (this is the length) length = rstr.tellg(); // report location (this is the length)
rstr.seekg(0, rstr.beg); // go back to the beginning rstr.seekg(0, rstr.beg); // go back to the beginning
char* txt = new char[length]; // allocate memory for a buffer of appropriate dimension char* txt = new char[length+1]; // allocate memory for a buffer of appropriate dimension
rstr.read(txt, length); // read the whole file into the buffer rstr.read(txt, length); // read the whole file into the buffer
txt[length] = '\0';
rstr.close(); rstr.close();
return txt; return txt;