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)
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}_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
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.
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".
To produce it, select in the main menu <b>Operations - > Boolean - > Common</b>.
\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
intersections. Face/face intersections detection is switched off as it
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".
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>Example:</b>
@ -38,8 +47,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b>
For a detailed description of the Boolean operations please refer to
<a href="SALOME_BOA_PA.pdf">this document</a>.
Please, refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights
major limitations of these operations.

View File

@ -2,21 +2,30 @@
\page create_isoline_page Isoline
To create an \b Isoline in the <b>Main Menu</b> select <b>New Entity - >
Basic - > Isoline</b>
\b Isoline is a 3D curve built on a bounded face limited by <em> [Umin, Umax] </em> and <em> [Vmin, Vmax] </em>
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.
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.
To create an \b Isoline of a face in the <b>Main Menu</b> select <b>New Entity - > Basic - > Isoline</b>.
\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>
\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
\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>
Specify the parameters of the SmoothingSurface object creation in the opened dialog
box and press "Apply" or "Apply & Close" button.
Result of each operation will be a GEOM_Object.
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.
<b>TUI Command:</b> <em>geompy.MakeSmoothingSurface(lPoints)</em>
The result of the operation will be a GEOM_Object(Surface).
<b>Arguments:</b>
- \b Points - list of points
<b>TUI Command:</b> <em>geompy.MakeSmoothingSurface(Points)</em>
\image html smoothingsurface_dlg.png

View File

@ -2,29 +2,37 @@
\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.
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".
To produce it, select in the main menu <b>Operations - > Boolean - > Cut</b>
\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
intersections. Face/face intersections detection is switched off as it
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".
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>Example:</b>
@ -38,8 +46,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b>
For a detailed description of the Boolean operations please refer to
<a href="SALOME_BOA_PA.pdf">this document</a>.
Please refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights
major limitations of these operations.

View File

@ -2,30 +2,36 @@
\page fuse_operation_page Fuse
To produce a \b Fuse operation in the <b>Main Menu</b> select
<b>Operations - > Boolean - > Fuse</b>.
\b Fuse operation creates one shape from a list of shapes.
This operation creates one shape from a list of shapes.
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".
To produce it, select in the Main Menu <b>Operations - > Boolean - > Fuse</b>.
\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
intersections. Face/face intersections detection is switched off as it
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".
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>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".
<b> More details </b>
<ul>
<li>For a detailed description of the Boolean operations please refer to
<a href="SALOME_BOA_PA.pdf">this document</a>.
Please, refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights
major limitations of these operations.</li>
<li>Perhaps you also ask yourself : \ref partition_explanation "What is the difference between partition, compounds and fuse operation ?"</li>
</ul>
major limitations of these operations.
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>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>Automatic bring to front</b> - when option is ON: the objects selected by the user will be automatically
made "top-level".</li>
<li><b>Automatic bring to front</b> - when the option is on, the objects selected by the user automatically become "top-level".</li>
</ul>
</ul>
<ul>
<li><b>Number of isolines</b></li> - this submenu allows to specify the
number of isolines along the axes of coordinates:
<ul>
<li><b>Along U</b>
<li><b>Along V</b>
</ul>
<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:
\image html isos.png
This preference is not related with <b>Create Isoline</b> operation.
By default <b>Along U</b> and <b>Along V</b> are null and isolines are not drawn. </li>
</ul>
<ul>
<li><b>Input fields precision</b></li>
<ul>
<li><b>Length precision</b> - allows to ajust input precision of coordinates and dimensions.</li>
<li><b>Angular precision</b> - allows to ajust 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>Angular tolerance precision</b> - allows to ajust input precision of tolerance of angles.</li>
<li><b>Weight precision</b> - allows to ajust input precision of weight and mass.</li>
<li><b>Density precision</b> - allows to ajust input precision of density.</li>
<li><b>Parametric precision</b> - allows to ajust 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>Length precision</b> - allows to adjust input precision of coordinates and dimensions.</li>
<li><b>Angular precision</b> - allows to adjust input precision of angles.</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 adjust input precision of tolerance of angles.</li>
<li><b>Weight precision</b> - allows to adjust input precision of weight and mass.</li>
<li><b>Density precision</b> - allows to a just input precision of density.</li>
<li><b>Parametric precision</b> - allows to adjust input precision of parametric values.</li>
<li><b>Parametric tolerance precision</b> - allows to adjust input precision of tolerance in parametric space.</li>
</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
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>
\par

View File

@ -14,17 +14,14 @@
- \subpage transform_geom_obj_page "transformation of geometrical objects"
using various algorithms;
- \subpage repairing_operations_page "optimization of geometrical objects";
- viewing \subpage geometrical_obj_prop_page "geometrical object properties"
and other information about geometrical objects using
- viewing information about geometrical objects using
\subpage using_measurement_tools_page "measurement tools";
- \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".
The possibility to classify the created geometrical objects by moving it into early created container (folder) is detailed on
\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.
Also, there is a possibility to customize an
\subpage arranging_study_objects_page "arrangement of the geometrical objects in the SALOME study".
Geometry module preferences are described in the
\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>
<li>\ref material_general_description_anchor "General Description"</li>
@ -16,12 +16,11 @@
be changed in the future versions of SALOME Geometry module.
You can change the material properties of the selected shape(s) in
the dedicated dialog box. This dialog box can be invoked from the
context popup menu. The layout of context menu can be customized via
the context menu dialog. The layout of context menu can be customized via
"Show predefined materials in popup menu" preferences option.
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
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:
\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;
- 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
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
surfaces that absorb and reflect light. Each surface is assumed to be
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
portion of the incoming light in a preferential direction like a
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.
</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 Diffuse 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
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,
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.
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
"Color" button. "Ambient color" button will be disabled to signalize
that this attribute of the model is ignored. Also, it will be possible

View File

@ -2,15 +2,11 @@
\page partition_page Partition
<ul>
<li>For a detailed description of the Partition operation please refer to
<a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights
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>
For a detailed description of the Partition operation please refer to <a href="SALOME_BOA_PA.pdf">this document</a>.
It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights
major limitations of these operations.
Perhaps you also ask yourself : \ref partition_explanation "What's the difference between partition, compounds and fuse operation ?"
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
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
\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).
<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
behavior) each input compound will be automatically exploded into
sub-shapes and the intersection between these shapes will be also
computed. If this option is switched on, the intersection between
sub-shapes will not be performed. In this case the Partition algorithm
will work faster, but the result might differ from the default behavior.
only input shapes of the Compound type.
- If this option is switched off (default behavior) each input compound will be automatically
exploded into sub-shapes and the intersection between these shapes will be also computed.
- If this option is switched on, the intersection between sub-shapes will not be performed.
In this case the Partition algorithm will work faster, but the result might differ from the
default behavior.
<b>Detect Self-intersections</b> check box is used to check arguments
self-intersections. If this option is switched on (default behavior)
each input shape is checked for self-intersection. In case of its detection
the operation is aborted. If this option is switched off, the partition
algorithm is performed without self-intersection checks.
<b>Detect Self-intersections</b> check box is used to check self-intersection of arguments.
- If this option is switched on (by default), each input shape is checked for self-intersection.
If self-intersection is detected, the operation is aborted.
- If this option is switched off, the partition algorithm is performed without self-intersection
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
intersections. Face/face intersections detection is switched off as it
is a time-consuming operation that gives an impact on performance. To find
all self-intersections please use \ref check_self_intersections_page
"Detect Self-intersection tool".
<b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
- Activate \ref restore_presentation_parameters_page "Advanced options" if required.
\note Partition is a complex operation, so its result of it depends
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 KeepNonlimitShapes is a flag that allows to preserve standalone
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.
- Other parameters are obsolete and kept only for compatibility with
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>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
Activate \ref restore_presentation_parameters_page "Advanced options" if required.
<b>TUI Command:</b>
<em>geompy.MakeHalfPartition(Shape, Plane, checkSelfInte)</em>, where:
- \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 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.
<b>Examples:</b>

View File

@ -6,7 +6,7 @@
<b>Repair - > Remove internal faces</b>.
\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
@ -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".
\note Only shared faces will be removed. Coincident but not shared
faces will stay as is, use GlueFaces or MakePartition before
RemoveInternalFaces if you need to remove them.
faces will stay as is, use Glue Faces or Partition before
Remove Internal Faces if you need to remove them.
\n <b>TUI Command:</b> <em>geompy.RemoveInternalFaces(theCompound)</em>,
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" -
reverses the normals of the selected faces.</li>
<li>\subpage remove_webs_operation_page "Remove internal faces" -
rebuilds the topology of a compound of solids by removing of the faces
that are shared by several solids.</li>
rebuilds the topology of a compound of solids by removing the faces
are shared by several solids.</li>
<li>\subpage remove_extra_edges_operation_page "Remove extra edges" -
removes seam and degenerated edges from the given shape.</li>
<li>\subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" -
removes selected vertices from a given wire in case if adjacent edges
are C1 continuous.</li>
<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>
*/

View File

@ -2,26 +2,31 @@
\page section_opeartion_page Section
To produce a \b Section operation in the <b>Main Menu</b> select
<b>Operations - > Boolean - > Section</b>
\b Section operation creates an edge or a wire representing the intersection of surfaces of two shapes.
This operation creates the section between 2 shapes.
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".
To produce it, select in the main menu <b>Operations - > Boolean - > Section</b>
\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
intersections. Face/face intersections detection is switched off as it
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".
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>
@ -34,8 +39,7 @@ Our <b>TUI Scripts</b> provide you with useful examples of the use of
<b> More details </b>
For a detailed description of the Boolean operations please refer to
<a href="SALOME_BOA_PA.pdf">this document</a>.
Please refer to <a href="SALOME_BOA_PA.pdf">this document</a> for a detailed description of Boolean operations.
It provides a general review of the Partition and Boolean
operations algorithms, describes the usage methodology and highlights
major limitations of these operations.

View File

@ -2,26 +2,28 @@
\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.
\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.
The \b Result will be a \b GEOM_Object.
\image html repair6.png
\n <b>Arguments:</b> Name + 1 or more shapes + 1 value (sew
precision).
\n \b Detect button allows to display the number of free boundaries in
your shape:
In this dialog:
- 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.
- Activate <b>Allow Non Manifold </b> check-box to produce non-manifold sewing, if required.
- 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"

View File

@ -2,20 +2,21 @@
\page union_faces_operation_page Union Faces
\n To <b>Union Faces</b> in the <b>Main Menu</b> select
<b>Repair - > Union Faces</b>.
\n This operation unites all faces sharing one surface on a given
shape.
This operation unites on a given shape all faces sharing the same surface.
\n <b>TUI Command:</b> <em>geompy.UnionFaces(theShape)</em>,
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".
To <b>Union Faces</b> in the <b>Main Menu</b> select <b>Repair - > Union Faces</b>.
\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
<center><em>Shape with not united faces</em></center>

View File

@ -2,10 +2,10 @@
\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>.
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.
You can use the following boolean operations for construction of more
@ -44,7 +44,7 @@ operation.
\par
<em>geompy.MakeBoolean(Shape1, Shape2, Operation, checkSelfInte),</em> where \em
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).
@ -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
argument and \em Shape2 is the second argument of Cut operation;
The flag \em checkSelfInte tells whether arguments should be checked for
self-intersection prior to an operation. Its default value is \em False which
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
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.
\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
intersections. Face/face intersections detection is switched off as it
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".
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
concerning created or imported geometrical objects :
\n The key property of an object is its \subpage geometrical_obj_prop_page "Geometrical Type"
\n There are also various <b> Measurement tools </b> for getting data about created or imported geometrical objects :
<ul>
<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
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
unpublished objects are by default sorted by the name in ascending order. It is possible
to change order of sorting (ascending / descending) by clicking the corresponding title
bar of the objects list.
"Eye" icons in this dialog box allow previewing unpublished objects in the viewer. By default all
unpublished objects are sorted by name in ascending order. It is possible
to change the order (ascending / descending) by clicking the corresponding title bar of the objects list.
</li>
</ul>
@ -115,8 +114,7 @@ window providing some information on a selected geometric object:
- <b>Creation operation</b> shows a name of the operation
used to create the selected object.
- In a table under <b>Creation operation</b>, \b Parameter and \b
Value are a name and a value of a parameter used to create the
selected object.
- The table below lists \b Parameters used to create the
selected object and their \b Values.
*/

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.
- \subpage export_xao_page "Export"
- \subpage import_xao_page "Import"
To import a shape in the \b XAO format, in the <b>Main Menu</b> select <b>New Entity ->
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->SpinBox3->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()) {
ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok;
ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok;
ok = RReductionGroupParams->SpinBox3->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()) {
ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok;
ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok;
ok = IReductionGroupParams->SpinBox3->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;

View File

@ -246,6 +246,30 @@
<source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>Position</translation>
</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>
<name>AdvancedGUI_SmoothingSurfaceDlg</name>

View File

@ -246,6 +246,30 @@
<source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>Position</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>
<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>
<name>AdvancedGUI_SmoothingSurfaceDlg</name>

View File

@ -5,269 +5,293 @@
<name>@default</name>
<message>
<source>GEOM_ADVANCED</source>
<translation>GEOM_ADVANCED</translation>
<translation>高度な形状: タイプ %1</translation>
</message>
<message>
<source>GEOM_ADVANCED_201</source>
<translation>GEOM_ADVANCED_201</translation>
<translation>T型パイプ</translation>
</message>
<message>
<source>GEOM_ADVANCED_202</source>
<translation>GEOM_ADVANCED_202</translation>
<translation></translation>
</message>
<message>
<source>GEOM_ADVANCED_203</source>
<translation>GEOM_ADVANCED_203</translation>
<translation> </translation>
</message>
<message>
<source>GEOM_DIVIDEDDISK</source>
<translation>GEOM_DIVIDEDDISK</translation>
<translation>Divided_Disk</translation>
</message>
<message>
<source>GEOM_DIVIDEDDISK_TITLE</source>
<translation>GEOM_DIVIDEDDISK_TITLE</translation>
<translation></translation>
</message>
<message>
<source>GEOM_DIVIDEDCYLINDER</source>
<translation>GEOM_DIVIDEDCYLINDER</translation>
<translation>Divided_Cylinder</translation>
</message>
<message>
<source>GEOM_DIVIDEDCYLINDER_TITLE</source>
<translation>GEOM_DIVIDEDCYLINDER_TITLE</translation>
<translation></translation>
</message>
<message>
<source>MEN_DIVIDEDCYLINDER</source>
<translation>MEN_DIVIDEDCYLINDER</translation>
<translation></translation>
</message>
<message>
<source>TOP_DIVIDEDCYLINDER</source>
<translation>TOP_DIVIDEDCYLINDER</translation>
<translation></translation>
</message>
<message>
<source>STB_DIVIDEDCYLINDER</source>
<translation>STB_DIVIDEDCYLINDER</translation>
<translation></translation>
</message>
<message>
<source>MEN_DIVIDEDDISK</source>
<translation>MEN_DIVIDEDDISK</translation>
<translation></translation>
</message>
<message>
<source>TOP_DIVIDEDDISK</source>
<translation>TOP_DIVIDEDDISK</translation>
<translation></translation>
</message>
<message>
<source>STB_DIVIDEDDISK</source>
<translation>STB_DIVIDEDDISK</translation>
<translation></translation>
</message>
<message>
<source>TOP_PIPETSHAPE</source>
<translation>TOP_PIPETSHAPE</translation>
<translation>T型パイプを作成</translation>
</message>
<message>
<source>MEN_PIPETSHAPE</source>
<translation>MEN_PIPETSHAPE</translation>
<translation>T型パイプを作成</translation>
</message>
<message>
<source>STB_PIPETSHAPE</source>
<translation>STB_PIPETSHAPE</translation>
<translation>T型パイプを作成</translation>
</message>
<message>
<source>TOP_SMOOTHINGSURFACE</source>
<translation>TOP_SMOOTHINGSURFACE</translation>
<translation></translation>
</message>
<message>
<source>MEN_SMOOTHINGSURFACE</source>
<translation>MEN_SMOOTHINGSURFACE</translation>
<translation></translation>
</message>
<message>
<source>STB_SMOOTHINGSURFACE</source>
<translation>STB_SMOOTHINGSURFACE</translation>
<translation></translation>
</message>
<message>
<source>HALF_LENGTH_MAIN_PIPE</source>
<translation>HALF_LENGTH_MAIN_PIPE</translation>
<translation></translation>
</message>
<message>
<source>HALF_LENGTH_INCIDENT_PIPE</source>
<translation>HALF_LENGTH_INCIDENT_PIPE</translation>
<translation></translation>
</message>
<message>
<source>CIRCULAR_QUARTER_PIPE</source>
<translation>CIRCULAR_QUARTER_PIPE</translation>
<translation>/4</translation>
</message>
<message>
<source>THICKNESS</source>
<translation>THICKNESS</translation>
<translation></translation>
</message>
<message>
<source>FLANGE</source>
<translation>FLANGE</translation>
<translation></translation>
</message>
<message>
<source>CHAMFER_OR_FILLET</source>
<translation>CHAMFER_OR_FILLET</translation>
<translation> </translation>
</message>
<message>
<source>CHAMFER</source>
<translation>CHAMFER</translation>
<translation></translation>
</message>
<message>
<source>FILLET</source>
<translation>FILLET</translation>
<translation></translation>
</message>
<message>
<source>JUNCTION_FACE_1</source>
<translation>JUNCTION_FACE_1</translation>
<translation>Junction 1</translation>
</message>
<message>
<source>JUNCTION_FACE_2</source>
<translation>JUNCTION_FACE_2</translation>
<translation>Junction 2</translation>
</message>
<message>
<source>JUNCTION_FACE_3</source>
<translation>JUNCTION_FACE_3</translation>
<translation>Junction 3</translation>
</message>
<message>
<source>INTERNAL_FACES</source>
<translation>INTERNAL_FACES</translation>
<translation></translation>
</message>
</context>
<context>
<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>
<source>GEOM_PIPE_TSHAPE_TITLE</source>
<translation>GEOM_PIPE_TSHAPE_TITLE</translation>
<translation>T型パイプの作成</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE</source>
<translation>GEOM_PIPE_TSHAPE</translation>
<translation>PipeTShape</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_MPIPE</source>
<translation>GEOM_PIPE_TSHAPE_MPIPE</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_R</source>
<translation>GEOM_PIPE_TSHAPE_R</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_W</source>
<translation>GEOM_PIPE_TSHAPE_W</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_L</source>
<translation>GEOM_PIPE_TSHAPE_L</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_IPIPE</source>
<translation>GEOM_PIPE_TSHAPE_IPIPE</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_CHAMFER</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_CHAMFER_H</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER_H</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_CHAMFER_W</source>
<translation>GEOM_PIPE_TSHAPE_CHAMFER_W</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_FILLET</source>
<translation>GEOM_PIPE_TSHAPE_FILLET</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_HEX</source>
<translation>GEOM_PIPE_TSHAPE_HEX</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION</source>
<translation>GEOM_PIPE_TSHAPE_POSITION</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION_P1</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P1</translation>
<translation> P1</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION_P2</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P2</translation>
<translation> P2</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION_P3</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_P3</translation>
<translation> P3</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION_LBL_L1</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_LBL_L1</translation>
<translation>New L1</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_POSITION_LBL_L2</source>
<translation>GEOM_PIPE_TSHAPE_POSITION_LBL_L2</translation>
<translation>New L2</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_LEFT_TR</source>
<translation>GEOM_PIPE_TSHAPE_LEFT_TR</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_RIGHT_TR</source>
<translation>GEOM_PIPE_TSHAPE_RIGHT_TR</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_INCI_TR</source>
<translation>GEOM_PIPE_TSHAPE_INCI_TR</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_TR_R</source>
<translation>GEOM_PIPE_TSHAPE_TR_R</translation>
<translation> (r%1)</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_TR_W</source>
<translation>GEOM_PIPE_TSHAPE_TR_W</translation>
<translation> (w%1)</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_TR_L_TRANS</source>
<translation>GEOM_PIPE_TSHAPE_TR_L_TRANS</translation>
<translation> (ltrans %1)</translation>
</message>
<message>
<source>GEOM_PIPE_TSHAPE_TR_L_THIN</source>
<translation>GEOM_PIPE_TSHAPE_TR_L_THIN</translation>
<translation> (lthin %1)</translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_GROUPMAIN</source>
<translation>GEOM_PIPETSHAPE_GROUPMAIN</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_GROUPREDUCT</source>
<translation>GEOM_PIPETSHAPE_GROUPREDUCT</translation>
<translation></translation>
</message>
<message>
<source>GEOM_PIPETSHAPE_GROUPPOS</source>
<translation>GEOM_PIPETSHAPE_GROUPPOS</translation>
<translation></translation>
</message>
</context>
<context>
<name>AdvancedGUI_SmoothingSurfaceDlg</name>
<message>
<source>GEOM_SMOOTHINGSURFACE_TITLE</source>
<translation>GEOM_SMOOTHINGSURFACE_TITLE</translation>
<translation></translation>
</message>
<message>
<source>GEOM_SMOOTHINGSURFACE</source>
<translation>GEOM_SMOOTHINGSURFACE</translation>
<translation> lissee</translation>
</message>
<message>
<source>GEOM_SMOOTHINGSURFACE_RESULT</source>
<translation>GEOM_SMOOTHINGSURFACE_RESULT</translation>
<translation></translation>
</message>
<message>
<source>GEOM_SMOOTHINGSURFACE_ARG</source>
<translation>GEOM_SMOOTHINGSURFACE_ARG</translation>
<translation></translation>
</message>
<message>
<source>GEOM_SMOOTHINGSURFACE_ARG_POINTS</source>
<translation>GEOM_SMOOTHINGSURFACE_ARG_POINTS</translation>
<translation></translation>
</message>
</context>
</TS>

View File

@ -233,6 +233,41 @@ static Standard_Boolean IsFacesOfSameSolids
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
//purpose :
@ -302,7 +337,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
Standard_Integer i;
for (i = 1; i <= edges.Length(); 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;
const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge);
@ -315,7 +350,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
if (aProcessed.Contains(anCheckedFace))
continue;
if (BRep_Tool::IsClosed(edge, anCheckedFace)) {
if (!IsEdgeValidToMerge(edge, anCheckedFace)) {
// Skip seam edge.
continue;
}

View File

@ -32,6 +32,7 @@
#include <GEOMImpl_Types.hxx>
#include <SUIT_MessageBox.h>
#include <SUIT_ResourceMgr.h>
#include <SUIT_Session.h>
#include <SalomeApp_Application.h>
@ -260,8 +261,17 @@ bool BuildGUI_ShellDlg::execute( ObjectList& objects )
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() );
}
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
SetDisplayMode( 2 );
break;
case GEOMOp::OpDMTexture: // MENU VIEW - DISPLAY MODE - TEXTURE
SetDisplayMode( 3 );
break;
case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
getGeometryGUI()->EmitSignalDeactivateDialog();
DisplayAll();

View File

@ -1701,8 +1701,8 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub
std::string Angle_str = doubleToString(theAngle);
// Construction of the plane
gce_MakePln gce_MP2(P0, P1, P2);
Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value());
//gce_MakePln gce_MP2(P0, P1, P2);
//Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value());
TopoDS_Vertex V0 = BRepBuilderAPI_MakeVertex(P0);
TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1);
@ -1725,7 +1725,7 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub
// 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 );

View File

@ -282,7 +282,16 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
myWidgets.insert( HIST_TYPE, histType );
QDoubleSpinBox* thresholdValue = new QDoubleSpinBox();
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 );
QDoubleSpinBox* maxThreshold = new QDoubleSpinBox();
maxThreshold->setRange( 1, 255 );
@ -327,7 +336,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
// mainFrame()->GroupBoxName->hide();
// Build an instance of detection used to perform image processing operations
aDetector = new ShapeRec_FeatureDetector();
myDetector = new ShapeRec_FeatureDetector();
setHelpFileName( "shape_recognition_page.html" );
@ -341,7 +350,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
//=================================================================================
EntityGUI_FeatureDetectorDlg::~EntityGUI_FeatureDetectorDlg()
{
delete myDetector;
}
//=================================================================================
@ -447,9 +456,9 @@ void EntityGUI_FeatureDetectorDlg::SelectionIntoArgument()
return ;
// Setting the image caracteristics
aDetector->SetPath( theImgFileName );
height = aDetector->GetImgHeight();
width = aDetector->GetImgWidth();
myDetector->SetPath( theImgFileName );
height = myDetector->GetImgHeight();
width = myDetector->GetImgWidth();
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
@ -674,7 +683,7 @@ void EntityGUI_FeatureDetectorDlg::setEndPnt(const gp_Pnt& theEndPnt)
{
myEndPnt = theEndPnt;
MESSAGE("myEndPnt = ("<<theEndPnt.X()<<", "<<theEndPnt.Y()<<")")
if (setSelectionRect() && aDetector->GetImgHeight() > 0)
if (setSelectionRect() && myDetector->GetImgHeight() > 0)
showImageSample();
}
@ -705,8 +714,8 @@ bool EntityGUI_FeatureDetectorDlg::setSelectionRect()
void EntityGUI_FeatureDetectorDlg::showImageSample()
{
// Cropp the image to the selection rectangle given by the user
aDetector->SetROI( myRect );
std::string samplePicturePath = aDetector->CroppImage();
myDetector->SetROI( myRect );
std::string samplePicturePath = myDetector->CroppImage();
// Display the result
QPixmap pixmap(QString(samplePicturePath.c_str()));
@ -753,9 +762,9 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
subPictureLeft = pictureLeft;
subPictureTop = pictureTop;
}
aDetector->ComputeCorners( useROI, parameters );
CvPoint2D32f* corners = aDetector->GetCorners();
int cornerCount = aDetector->GetCornerCount();
myDetector->ComputeCorners( useROI, parameters );
CvPoint2D32f* corners = myDetector->GetCorners();
int cornerCount = myDetector->GetCornerCount();
int i;
// 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() );
aDetector->ComputeContours( useROI, parameters );
std::vector< std::vector<cv::Point> > contours = aDetector->GetContours();
std::vector<cv::Vec4i> hierarchy = aDetector->GetContoursHierarchy();
myDetector->ComputeContours( useROI, parameters );
std::vector< std::vector<cv::Point> > contours = myDetector->GetContours();
std::vector<cv::Vec4i> hierarchy = myDetector->GetContoursHierarchy();
std::vector< cv::Point > contour;
int idx = 0;
@ -914,8 +923,8 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
// else if(myConstructorId ==LINES)
// {
// aDetector->ComputeLines();
// std::vector<cv::Vec4i> lines = aDetector->GetLines();
// myDetector->ComputeLines();
// std::vector<cv::Vec4i> lines = myDetector->GetLines();
// GEOM::GEOM_Object_var Pnt1;
// GEOM::GEOM_Object_var Pnt2;
// GEOM::GEOM_Object_var aLine;

View File

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

View File

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

View File

@ -589,10 +589,58 @@ void EntityGUI_SubShapeDlg::showOnlySelected()
Handle(SALOME_InteractiveObject) io =
new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
if (view->isVisible(io)) myIsHiddenMain = true;
}
aDisplayer->EraseAll(/*forced = false, updateViewer = true*/);
aDisplayer->Display(aSelList, 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() ) {
//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
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);
//
if (aType==GeomAbs_Cylinder) {
Standard_Real aTolSM;
gp_Cylinder aCyl;
//
aTolSM=1.523e-6;//~1.-cos(0.1 deg)
aCyl=aGAS.Cylinder();
if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) {
if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) {
continue;
}
}

View File

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

View File

@ -140,21 +140,34 @@ Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
const gp_Cylinder& aCyl,
const Standard_Real aTol)
{
Standard_Boolean bRet=Standard_False;
Standard_Real aSM;
//
gp_Vec aV12(aP1, aP2);
gp_Dir aD12(aV12);
//
const gp_Ax1& aAxis=aCyl.Axis();
const gp_Dir& aDAxis=aAxis.Direction();
//
aSM=fabs(aD12*aDAxis);
if (fabs(1.-aSM) > aTol) {
return bRet;
const gp_XYZ &aLoc = aCyl.Location().XYZ();
const gp_Ax1 &aAxis = aCyl.Axis();
const gp_XYZ &aDAxis = aAxis.Direction().XYZ();
gp_XYZ aDP1 = aP1.XYZ().Subtracted(aLoc);
gp_XYZ aDP2 = aP2.XYZ().Subtracted(aLoc);
Standard_Real aDot1 = aDP1.Dot(aDAxis);
Standard_Real aDot2 = aDP1.Dot(aDAxis);
Standard_Real aTol2 = aTol*aTol;
// Project P1 and P2 onto a plane with location aLoc and Norm aDAxis.
aDP1.Subtract(aDAxis.Multiplied(aDot1));
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

View File

@ -673,8 +673,7 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap
AISShape->SetDisplayVectors( propMap.value( GEOM::propertyName( GEOM::EdgesDirection ) ).toBool() );
// 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
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() ) );
// set texture
bool textureAdded = false;
if ( HasTexture() ) {
// predefined display texture, manually set to displayer via GEOM_Displayer::SetTexture() function
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->DisableTextureModulate();
AISShape->SetDisplayMode( 3 );
}
// 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 )
{
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);
}

View File

@ -2316,6 +2316,10 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_WRN_WARNING</source>
<translation>Warning</translation>
</message>
<message>
<source>GEOM_WRN_FACES_NOT_SHELL</source>
<translation>Unable to create a shell. Result is a compound of faces.</translation>
</message>
<message>
<source>WRN_SHAPE_UNCLOSED</source>
<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>
<translation>Materials library</translation>
</message>
<message>
<source>MEN_TEXTURE</source>
<translation>Texture</translation>
</message>
<message>
<source>MEN_TORUS</source>
<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>
<translation>Number of intervals</translation>
</message>
<message>
<source>PROCESS_SHAPE_NEW_OBJ_NAME</source>
<translation>ProcessShape</translation>
@ -4571,27 +4578,27 @@ Please, select face, shell or solid and try again</translation>
</message>
<message>
<source>GEOM_REMOVE_WEBS_TITLE</source>
<translation type="unfinished">Remove internal faces</translation>
<translation>Remove internal faces</translation>
</message>
<message>
<source>GEOM_REMOVE_WEBS</source>
<translation type="unfinished">Compound of solids</translation>
<translation>Compound of solids</translation>
</message>
<message>
<source>REMOVE_WEBS_NEW_OBJ_NAME</source>
<translation type="unfinished">NoInternalFaces</translation>
<translation>NoInternalFaces</translation>
</message>
<message>
<source>TOP_REMOVE_WEBS</source>
<translation type="unfinished">Remove internal faces</translation>
<translation>Remove internal faces</translation>
</message>
<message>
<source>MEN_REMOVE_WEBS</source>
<translation type="unfinished">Remove Internal Faces</translation>
<translation>Remove Internal Faces</translation>
</message>
<message>
<source>STB_REMOVE_WEBS</source>
<translation type="unfinished">Remove internal faces</translation>
<translation>Remove internal faces</translation>
</message>
<message>
<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>
<source>TOP_SMOOTHINGSURFACE</source>
<translation type="unfinished">Smoothing Surface</translation>
<translation>Smoothing Surface</translation>
</message>
<message>
<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>
</message>
<message>
<source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation>
<source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation>
</message>
<message>
<source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation>
<source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation>
</message>
</context>
<context>
@ -5656,7 +5663,7 @@ Number of sketch points too small</translation>
</message>
<message>
<source>LOWTHRESHOLD</source>
<translation>Low theshold</translation>
<translation>Low threshold</translation>
</message>
<message>
<source>RATIO</source>
@ -5878,7 +5885,7 @@ Number of sketch points too small</translation>
</message>
<message>
<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>
</context>
<context>
@ -5914,10 +5921,6 @@ Number of sketch points too small</translation>
<source>DATA_TYPE</source>
<translation>Type</translation>
</message>
<message>
<source></source>
<translation></translation>
</message>
<message>
<source>BOOL</source>
<translation>Boolean</translation>
@ -6032,11 +6035,11 @@ Number of sketch points too small</translation>
</message>
<message>
<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>
<source>ERR_STEP_EXISTS</source>
<translation type="unfinished">Step with such ID already exists.</translation>
<translation>Step with such ID already exists.</translation>
</message>
</context>
<context>
@ -6509,23 +6512,23 @@ Do you want to create new material?</translation>
<translation>Step</translation>
</message>
</context>
<context>
<context>
<name>EntityGUI_IsolineDlg</name>
<message>
<source>GEOM_ISOLINE_TITLE</source>
<translation>Isoline Construction</translation>
<source>GEOM_ISOLINE_TITLE</source>
<translation>Isoline Construction</translation>
</message>
<message>
<source>GEOM_ISOLINE</source>
<translation>Isoline</translation>
<source>GEOM_ISOLINE</source>
<translation>Isoline</translation>
</message>
<message>
<source>GEOM_ISOLINE_U</source>
<translation>U-Isoline</translation>
<source>GEOM_ISOLINE_U</source>
<translation>U-Isoline</translation>
</message>
<message>
<source>GEOM_ISOLINE_V</source>
<translation>V-Isoline</translation>
<source>GEOM_ISOLINE_V</source>
<translation>V-Isoline</translation>
</message>
</context>
</context>
</TS>

View File

@ -4,12 +4,12 @@
<context>
<name>@default</name>
<message>
<source>MEN_POP_CONCEAL_CHILDREN</source>
<translation>Retirer les sous-éléments</translation>
<source>MEN_TEXTURE</source>
<translation type="unfinished">Texture</translation>
</message>
<message>
<source>MEN_POP_DISCLOSE_CHILDREN</source>
<translation>Publier les sous-éléments</translation>
<source>GEOM_WRN_FACES_NOT_SHELL</source>
<translation type="unfinished">Unable to create a shell. Result is a compound of faces.</translation>
</message>
<message>
<source>BRep_API: command not done</source>
@ -37,8 +37,10 @@
</message>
<message>
<source>DEP_OBJECT</source>
<translation>L&apos;objet choisi a é utilisé pour créer un autre objet.
La suppression de cet objet peut entrainer un export python invalide. </translation>
<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.
Voulez-vous tout de même supprimer ces objets ?</translation>
</message>
<message>
<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>
<source>GEOM_ALLOW_NON_MANIFOLD</source>
<translation type="unfinished">Allow Non Manifold</translation>
<translation>Non conformes autorisés</translation>
</message>
<message>
<source>GEOM_SHAPE</source>
@ -2356,7 +2358,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
</message>
<message>
<source>MEN_CURVE_CREATOR</source>
<translation type="unfinished">Curve creator</translation>
<translation>Créateur de courbe</translation>
</message>
<message>
<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>
</message>
<message>
<source>MEN_POP_SHOW_CHILDREN</source>
<translation>Montrer les enfants</translation>
<source>MEN_POP_DISCLOSE_CHILDREN</source>
<translation>Publier les sous-éléments</translation>
</message>
<message>
<source>MEN_POP_HIDE_CHILDREN</source>
<translation>Cacher les enfants</translation>
<source>MEN_POP_CONCEAL_CHILDREN</source>
<translation>Retirer les sous-éléments</translation>
</message>
<message>
<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>
<translation>Esquisse 3D</translation>
</message>
<message>
<source>MEN_ISOLINE</source>
<translation>Isoligne</translation>
</message>
<message>
<source>MEN_SOLID</source>
<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>
<translation>Créer un groupe</translation>
</message>
<message>
<source>STB_POP_EDIT_FIELD</source>
<translation>Editer un champ</translation>
</message>
<message>
<source>STB_POP_UNPUBLISH_OBJ</source>
<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>
<translation>Créer une esquisse 3D</translation>
</message>
<message>
<source>STB_ISOLINE</source>
<translation>Créer une U ou V isoligne</translation>
</message>
<message>
<source>STB_SOLID</source>
<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>
<translation>Découpe de groupes</translation>
</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>
<source>TOP_HEX_SOLID</source>
<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>
<translation>Créer un groupe</translation>
</message>
<message>
<source>TOP_POP_EDIT_FIELD</source>
<translation>Editer un champ</translation>
</message>
<message>
<source>TOP_POP_UNPUBLISH_OBJ</source>
<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>
<translation>Esquisse 3D</translation>
</message>
<message>
<source>TOP_ISOLINE</source>
<translation>Isoligne</translation>
</message>
<message>
<source>TOP_SOLID</source>
<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>
<translation>Surface lissée</translation>
</message>
<message>
<source>MEN_SMOOTHINGSURFACE</source>
<translation>Surface lissée</translation>
</message>
<message>
<source>STB_SMOOTHINGSURFACE</source>
<translation>Surface lissée</translation>
</message>
<message>
<source>GEOM_SELECT_IMAGE</source>
<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>
<translation>Import / Export XAO</translation>
</message>
<message>
<source>TOOL_IMPORTEXPORT</source>
<translation>Import / Export XAO</translation>
</message>
<message>
<source>TOP_EXPORTXAO</source>
<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>
</message>
<message>
<source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation>
<source>CC_PNT_ITEM_X_Y</source>
<translation>X=%1, Y=%2</translation>
</message>
<message>
<source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation>
<source>CC_PNT_ITEM_X_Y_Z</source>
<translation>X=%1, Y=%2, Z=%3</translation>
</message>
</context>
<context>
@ -5453,19 +5479,19 @@ le paramètre &apos;%1&apos; aux préférences du module Géométrie.</translati
</message>
<message>
<source>SET_SECTIONS_POLYLINE</source>
<translation type="unfinished">Set polyline</translation>
<translation>Définir la polyligne</translation>
</message>
<message>
<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>
<source>SET_SECTIONS_SPLINE</source>
<translation type="unfinished">Set spline</translation>
<translation>Définir la spline</translation>
</message>
<message>
<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>
<source>REMOVE</source>
@ -5593,7 +5619,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<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>
<source>KERNEL_SIZE</source>
@ -5609,75 +5635,75 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<source>TYPE_CRITERIA</source>
<translation type="unfinished">Type criteria</translation>
<translation>Critère de type</translation>
</message>
<message>
<source>CV_TERMCRIT_ITER</source>
<translation type="unfinished">Max number of iteration</translation>
<translation>Nombre max d&apos;itérations</translation>
</message>
<message>
<source>CV_TERMCRIT_EPS</source>
<translation type="unfinished">Epsilon</translation>
<translation>Epsilon</translation>
</message>
<message>
<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>
<source>MAX_ITER</source>
<translation type="unfinished">Max iteration</translation>
<translation>Iteration max</translation>
</message>
<message>
<source>EPSILON</source>
<translation type="unfinished">Epsilon</translation>
<translation>Epsilon</translation>
</message>
<message>
<source>L2GRADIENT</source>
<translation type="unfinished">L2 gradient</translation>
<translation>Gradient L2</translation>
</message>
<message>
<source>LOWTHRESHOLD</source>
<translation type="unfinished">Low theshold</translation>
<translation>Niveau bas</translation>
</message>
<message>
<source>RATIO</source>
<translation type="unfinished">Ratio</translation>
<translation>Ratio</translation>
</message>
<message>
<source>SMOOTH_SIZE</source>
<translation type="unfinished">Smooth size</translation>
<translation>Adoucissement</translation>
</message>
<message>
<source>HBINS</source>
<translation type="unfinished">Hbins</translation>
<translation>Hbins</translation>
</message>
<message>
<source>SBINS</source>
<translation type="unfinished">Sbins</translation>
<translation>Sbins</translation>
</message>
<message>
<source>HIST_TYPE</source>
<translation type="unfinished">Histogram type</translation>
<translation>Type d&apos;histogramme</translation>
</message>
<message>
<source>CV_HIST_ARRAY</source>
<translation type="unfinished">Multi-dimensional dense array</translation>
<translation>Tableau dense multi-dimensionnel</translation>
</message>
<message>
<source>CV_HIST_SPARSE</source>
<translation type="unfinished">Multi-dimensional sparse array</translation>
<translation>Tableau clairsemé multi-dimensionnel</translation>
</message>
<message>
<source>THRESHOLD_VALUE</source>
<translation type="unfinished">Threshold value</translation>
<translation>Seuil</translation>
</message>
<message>
<source>MAX_THRESHOLD</source>
<translation type="unfinished">Max threshold</translation>
<translation>Seuil max</translation>
</message>
<message>
<source>FIND_CONTOURS_METHOD</source>
<translation type="unfinished">Chain approximation method</translation>
<translation>Méthode d&apos;approximation des chaînes</translation>
</message>
<message>
<source>CV_CHAIN_APPROX_NONE</source>
@ -5689,11 +5715,11 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<source>CV_CHAIN_APPROX_TC89_KCOS</source>
<translation type="unfinished">TC89 KCOS</translation>
<translation>TC89 KCOS</translation>
</message>
<message>
<source>CV_CHAIN_APPROX_TC89_L1</source>
<translation type="unfinished">TC89 L1</translation>
<translation>TC89 L1</translation>
</message>
</context>
<context>
@ -5859,7 +5885,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<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>
</context>
<context>
@ -5913,7 +5939,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<source>SHAPE_TYPE</source>
<translation>Type d'objet</translation>
<translation>Type d&apos;objet</translation>
</message>
<message>
<source>VERTEX</source>
@ -5973,7 +5999,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<source>GEOM_NO_STUDY</source>
<translation>Pas d'étude disponible</translation>
<translation>Pas d&apos;étude disponible</translation>
</message>
<message>
<source>NO_SHAPE</source>
@ -6009,7 +6035,7 @@ Le nombre de points n&apos;est pas suffisant</translation>
</message>
<message>
<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>
<source>ERR_STEP_EXISTS</source>
@ -6400,24 +6426,24 @@ Voulez-vous en créer un nouveau ?</translation>
<context>
<name>GEOMGUI_CreationInfoWdg</name>
<message>
<source>NO_INFO</source>
<translation>(aucune information disponible)</translation>
</message>
<message>
<source>VALUE</source>
<translation>Valeur</translation>
</message>
<message>
<source>PARAMETER</source>
<translation>Paramètre</translation>
<source>CREATION_INFO_TITLE</source>
<translation>Information</translation>
</message>
<message>
<source>OPERATION</source>
<translation>Création</translation>
</message>
<message>
<source>CREATION_INFO_TITLE</source>
<translation>Information</translation>
<source>PARAMETER</source>
<translation>Paramètre</translation>
</message>
<message>
<source>VALUE</source>
<translation>Valeur</translation>
</message>
<message>
<source>NO_INFO</source>
<translation>(aucune information disponible)</translation>
</message>
</context>
<context>
@ -6486,6 +6512,23 @@ Voulez-vous en créer un nouveau ?</translation>
<translation>Pas</translation>
</message>
</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>

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::OpDMShading: // MENU VIEW - SHADING
case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE
case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY
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()
{
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 ) {
_PTR(Study) studyDS = appStudy->studyDS();
if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
@ -1019,6 +1025,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" );
createGeomAction( GEOMOp::OpDMShading, "SHADING" );
createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" );
createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" );
createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" );
createGeomAction( GEOMOp::OpShow, "DISPLAY" );
@ -1291,6 +1298,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 );
createMenu( GEOMOp::OpDMShading, dispmodeId, -1 );
createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 );
createMenu( separator(), dispmodeId, -1 );
createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
@ -2663,6 +2671,11 @@ void GeometryGUI::storeVisualParameters (int savePoint)
param = occParam + GEOM::propertyName( GEOM::Color );
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 (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());
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 )) {
aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
} else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {

View File

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

View File

@ -18,6 +18,7 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx>
@ -38,7 +39,6 @@
#include "utilities.h"
#include <TDataStd_IntegerArray.hxx>
#include <TNaming_CopyShape.hxx>
#include <TopExp.hxx>
#include <TopoDS_Shape.hxx>
@ -47,8 +47,6 @@
#include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TColStd_IndexedDataMapOfTransientTransient.hxx>
#include <ShapeFix_Shape.hxx>
#include <Standard_NullObject.hxx>
@ -423,8 +421,7 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape
const Standard_Real theTolerance,
const TopAbs_ShapeEnum theShapeType,
const Standard_Boolean doKeepNonSolids,
TCollection_AsciiString& theWarning,
const TopTools_DataMapOfShapeShape& aCopyMap) const
TCollection_AsciiString& theWarning) const
{
TopoDS_Shape aRes;
@ -554,18 +551,10 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape
TDF_Label anArgumentHistoryLabel =
aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True);
TopTools_ListOfShape aModified;
for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) {
TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie);
if (aCopyMap.IsBound(anEntity)) {
anEntity = aCopyMap.Find(anEntity);
}
aModified = aGA.Modified(anEntity);
const TopTools_ListOfShape& aModified = aGA.Modified(anEntity);
Standard_Integer nbModified = aModified.Extent();
if (!nbModified && aResIndices.Contains(anEntity)) {
aModified.Append(anEntity);
nbModified = 1;
}
if (nbModified > 0) {
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();
// 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) {
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) {
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) {
Handle(TColStd_HSequenceOfTransient) SF = aCI.GetFaces();
TopTools_MapOfShape aFaces;
for (i = 1; i <= SF->Length(); i++) {
int i = 1;
for (; i <= SF->Length(); i++) {
Handle(Standard_Transient) anItem = SF->Value(i);
if (anItem.IsNull())
continue;
@ -792,14 +764,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const
TopoDS_Shape aFace = aRefSh->GetValue();
if (aFace.IsNull())
continue;
// 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);
}
aFaces.Add(aFace);
}
Standard_Boolean aGlueAllEdges = Standard_False;
@ -807,7 +772,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const
aGlueAllEdges = aCI.GetGlueAllEdges();
//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;

View File

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

View File

@ -60,6 +60,7 @@
#include <BRepCheck_Result.hxx>
#include <BRepCheck_Shell.hxx>
#include <BRepClass3d_SolidClassifier.hxx>
#include <BRepClass_FaceClassifier.hxx>
#include <BRepExtrema_DistShapeShape.hxx>
#include <BRepGProp.hxx>
#include <BRepTools.hxx>
@ -85,6 +86,7 @@
#include <GeomAPI_IntSS.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <GeomAbs_SurfaceType.hxx>
@ -1551,40 +1553,116 @@ TCollection_AsciiString GEOMImpl_IMeasureOperations::WhatIs (Handle(GEOM_Object)
* AreCoordsInside
*/
//=============================================================================
std::vector<bool> GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape,
const std::vector<double>& coords,
double tolerance)
std::vector<bool>
GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape,
const std::vector<double>& coords,
double tolerance)
{
std::vector<bool> res;
std::vector<bool> isInsideRes;
if (!theShape.IsNull()) {
Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
if (!aRefShape.IsNull()) {
TopoDS_Shape aShape = aRefShape->GetValue();
if (!aShape.IsNull()) {
unsigned int nb_points = coords.size()/3;
for (int i = 0; i < nb_points; i++) {
double x = coords[3*i];
double y = coords[3*i+1];
double z = coords[3*i+2];
gp_Pnt aPnt(x, y, z);
if ( aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID ||
aShape.ShapeType() == TopAbs_SOLID ) {
TopExp_Explorer anExp;
bool isFound = false;
for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More() && !isFound; anExp.Next() ) {
BRepClass3d_SolidClassifier SC( anExp.Current() );
if (!aShape.IsNull())
{
TopTools_IndexedMapOfShape mapShape;
{
TopExp_Explorer anExp;
for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More(); anExp.Next() )
mapShape.Add( anExp.Current() );
for ( anExp.Init( aShape, TopAbs_FACE, TopAbs_SOLID ); anExp.More(); anExp.Next() )
mapShape.Add( anExp.Current() );
for ( anExp.Init( aShape, TopAbs_EDGE, TopAbs_FACE ); anExp.More(); anExp.Next() )
mapShape.Add( anExp.Current() );
for ( anExp.Init( aShape, TopAbs_VERTEX, TopAbs_EDGE ); anExp.More(); anExp.Next() )
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 );
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
res.push_back( false );
case TopAbs_FACE:
{
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
*/
//=============================================================================
Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance
(Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2,
Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1,
Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2)
Standard_Real
GEOMImpl_IMeasureOperations::GetMinDistance (Handle(GEOM_Object) theShape1,
Handle(GEOM_Object) theShape2,
Standard_Real& X1,
Standard_Real& Y1,
Standard_Real& Z1,
Standard_Real& X2,
Standard_Real& Y2,
Standard_Real& Z2)
{
SetErrorCode(KO);
Standard_Real MinDist = 1.e9;

View File

@ -27,6 +27,7 @@
#include <GEOMImpl_ITransformOperations.hxx>
#include <GEOMImpl_Types.hxx>
#include <GEOM_Function.hxx>
#include <GEOMUtils.hxx>
#include <ShapeFix_Shape.hxx>
#include <ShapeFix_ShapeTolerance.hxx>
@ -175,10 +176,7 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
Handle(GEOM_Function) aVector = TI.GetVector();
gp_Vec Vec = gp::DX();
if (!aVector.IsNull()) {
TopoDS_Shape aV = aVector->GetValue();
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 = GEOMUtils::GetVector( aVector->GetValue(), Standard_False );
Vec.Normalize();
}
@ -211,18 +209,12 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
gp_Vec Vec2 = gp::DY();
if (!aVector.IsNull()) {
TopoDS_Shape aV = aVector->GetValue();
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 = GEOMUtils::GetVector( aVector->GetValue(), Standard_False );
Vec1.Normalize();
}
if (!aVector2.IsNull()) {
TopoDS_Shape aV = aVector2->GetValue();
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 = GEOMUtils::GetVector( aVector2->GetValue(), Standard_False );
Vec2.Normalize();
}

View File

@ -725,8 +725,8 @@ bool GEOMToolsGUI::Import()
app->putInfo( tr( "GEOM_PRP_LOADING" ).arg( SUIT_Tools::file( fileName, /*withExten=*/true ) ) );
anOp->start();
CORBA::String_var fileN = fileName.toLatin1().constData();
CORBA::String_var fileT = aCurrentType.toLatin1().constData();
CORBA::String_var fileN = fileName.toUtf8().constData();
CORBA::String_var fileT = aCurrentType.toUtf8().constData();
// jfa 21.08.2012 for mantis issue 21511 (STEP file units)
CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS");
@ -945,7 +945,7 @@ bool GEOMToolsGUI::Export()
anOp->start();
aInsOp->Export( anObj, file.toStdString().c_str(), fileType.toLatin1().constData() );
aInsOp->Export( anObj, file.toUtf8().constData(), fileType.toUtf8().constData() );
if (aInsOp->IsDone())
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"));
if( !aTexture.isEmpty() ) {
displayer.SetTexture( aTexture.toStdString() );
for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
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 );
if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
}

View File

@ -42,6 +42,7 @@
#include "GEOM_PythonDump.hxx"
#include "GEOMImpl_Types.hxx"
#include "GEOMImpl_CopyDriver.hxx"
#include "GEOMImpl_IInsertOperations.hxx"
#include "GEOM_wrap.hxx"
// 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);
aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR);
TCollection_AsciiString anObjectName("Shape_");
TCollection_AsciiString anObjectName, aNamePrefix("Shape_");
// BEGIN: try to find existed name for current shape
bool HasName = false;
if ( !aShape->_is_nil() )
{
// 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
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)::DownCast(anIt.Value());
if (anAttr.IsNull()) continue;
@ -271,10 +271,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
if (S.IsEqual(TopoSh)) {
TDF_Label L = anAttr->Label();
Handle(TDataStd_Name) aName;
if (L.FindAttribute(TDataStd_Name::GetID(), aName)) {
if (L.FindAttribute(TDataStd_Name::GetID(), aName))
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 )) {
case TopAbs_VERTEX:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" );
anObjectName = "Group_Of_Vertices_";
aNamePrefix = "Group_Of_Vertices_";
break;
case TopAbs_EDGE:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE");
anObjectName = "Group_Of_Edges_";
aNamePrefix = "Group_Of_Edges_";
break;
case TopAbs_FACE:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE");
anObjectName = "Group_Of_Faces_";
aNamePrefix = "Group_Of_Faces_";
break;
case TopAbs_SOLID:
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID");
anObjectName = "Group_Of_Solids_";
aNamePrefix = "Group_Of_Solids_";
break;
}
} else if ( mytype == GEOM_MARKER ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS");
anObjectName = "LocalCS_";
aNamePrefix = "LocalCS_";
} else if ( mytype > ADVANCED_BASE ) {
char buf[20];
sprintf( buf, "%d", aBaseObj->GetType() );
std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf;
aResultSO->SetAttrString("AttributePixMap",advId.c_str());
anObjectName = "Advanced_";
aNamePrefix = "Advanced_";
} else if ( mytype == GEOM_FIELD ) {
anObjectName = "Field_";
aNamePrefix = "Field_";
GEOM::GEOM_Field_var aField = GEOM::GEOM_Field::_narrow(theObject);
if ( !aField->_is_nil() )
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");
}
} else if ( mytype == GEOM_FIELD_STEP ) {
anObjectName = "Step_";
aNamePrefix = "Step_";
} else if ( !aShape->_is_nil() ) {
GEOM::shape_type myshapetype=aShape->GetShapeType();
if ( myshapetype == GEOM::COMPOUND ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" );
anObjectName = "Compound_";
aNamePrefix = "Compound_";
} else if ( myshapetype == GEOM::COMPSOLID ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID");
anObjectName = "Compsolid_";
aNamePrefix = "Compsolid_";
} else if ( myshapetype == GEOM::SOLID ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID");
anObjectName = "Solid_";
aNamePrefix = "Solid_";
} else if ( myshapetype == GEOM::SHELL ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL");
anObjectName = "Shell_";
aNamePrefix = "Shell_";
} else if ( myshapetype == GEOM::FACE ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE");
anObjectName = "Face_";
aNamePrefix = "Face_";
} else if ( myshapetype == GEOM::WIRE ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE");
anObjectName = "Wire_";
aNamePrefix = "Wire_";
} else if ( myshapetype == GEOM::EDGE ) {
aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE");
anObjectName = "Edge_";
aNamePrefix = "Edge_";
} else if ( myshapetype == GEOM::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));
// 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
int i = 0; // (WITH EMPTY NEW NAME)
SALOMEDS::SObject_var obj;
TCollection_AsciiString aNewObjectName;
do {
aNewObjectName = anObjectName + TCollection_AsciiString(++i);
obj = theStudy->FindObject( aNewObjectName.ToCString() );
anObjectName = aNamePrefix + TCollection_AsciiString(++i);
obj = theStudy->FindObject( anObjectName.ToCString() );
}
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;
}
}
//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
SALOMEDS::Study_var aStudy = theObject->GetStudy();
SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
SALOMEDS::UseCaseBuilder_var anUseCaseBuilder = aStudy->GetUseCaseBuilder();
SALOMEDS::SObject_var aNewSO;
// Retrieve a TopoDS_Shape from byte stream
TopoDS_Shape aTopology;
@ -786,6 +784,10 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
anIOR->SetValue(objStr.in());
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 aNewSO._retn();
}
@ -2905,11 +2907,11 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
if (aFileName.rfind("/") != std::string::npos) { // remove folders from the name
aFileName = aFileName.substr(aFileName.rfind("/") + 1);
}
std::string anExtension(data->extension());
aFileName += "." + anExtension;
// convert extension to upper case
std::transform(anExtension.begin(), anExtension.end(), anExtension.begin(), ::toupper);
std::string aFullPath = aTmpDir + aFileName;
Engines::TMPFile* aFileStream = data->get();
@ -2922,16 +2924,30 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
aFile.write(aBuffer, aFileStream->length());
aFile.close();
GEOM::GEOM_Object_var anObj = aInsOp->ImportFile(aFullPath.c_str(), anExtension.c_str());
if ( !anObj->_is_nil() && aInsOp->IsDone() ) {
SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), anObj, data->name());
aResult->length(1);
GEOM::GEOM_Object_var aShapeObj;
GEOM::ListOfGO_var aSubShape = new GEOM::ListOfGO;
GEOM::ListOfGO_var aGroups = new GEOM::ListOfGO;
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
} else {
if (anObj->_is_nil())
//Iteration for objects of the group.
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());
if (!aInsOp->IsDone())
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();
}
@ -2940,7 +2956,7 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData(
aTmpFiles.length(1);
aTmpFiles[0] = aFileName.c_str();
SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aTmpFiles, true);
_impl->DocumentModified(studyId, false);
return aResult._retn();
}
@ -2965,10 +2981,16 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId)
if (CORBA::is_nil(aComponent))
return aResult._retn();
SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published shapes
TopoDS_Compound aResultComp;
BRep_Builder aBB;
aBB.MakeCompound(aResultComp);
int aNumInComp = 0; // number of shapes in resulting compound
GEOM::GEOM_Object_var shapeObj;
GEOM::ListOfGO_var groups = new GEOM::ListOfGO;
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()) {
SALOMEDS::SObject_var aSO = anIter->Value();
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);
if(!aCORBAMainShape->_is_nil()) {
CORBA::String_var entry = aCORBAMainShape->GetEntry();
Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast( _impl->GetObject(studyId, entry) );
if (!aMainShape.IsNull()) {
TopoDS_Shape aMainSh = aMainShape->GetValue();
if (!aMainSh.IsNull()) {
aBB.Add(aResultComp, aMainSh);
aNumInComp++;
Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast(_impl->GetObject(studyId, entry));
GEOM::shape_type aCORBAShapeType = aCORBAMainShape->GetShapeType();
if (!aMainShape.IsNull() && !(aCORBAShapeType == GEOM::VERTEX) && !(aCORBAShapeType == GEOM::EDGE)) {
aSeqLength++;
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";
BRepTools::Write(aResultComp, aFullPath.c_str());
MESSAGE("Write compound of "<<aNumInComp<<" shapes to "<<aFullPath.c_str());
if (aInsOp->_is_nil()) {
MESSAGE("No insert operations!");
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);
Engines::DataContainer_var aData = (new Engines_DataContainer_i(
aFullPath.c_str(), "", "", true))->_this();
aFullXaoPath.c_str(), "", "", true))->_this();
aResult[0] = aData;
} else {
MESSAGE("No shapes to export");
}
return aResult._retn();
}

View File

@ -674,10 +674,57 @@ void GroupGUI_GroupDlg::showOnlySelected()
Handle(SALOME_InteractiveObject) io =
new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
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*/);
aDisplayer->Display(aSelList, true);
if ( !aSelEntriesMap.empty() ) {
// 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
if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) {

View File

@ -347,7 +347,7 @@ SALOME_Prs* MeasureGUI_AngleDlg::buildPrs()
gce_MakePln gce_MP(aP11, aP12, aP3);
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;

View File

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

View File

@ -54,7 +54,8 @@ namespace GEOM
PointColor,
IsosColor,
OutlineColor,
LastProperty = OutlineColor,
Texture,
LastProperty = Texture,
};
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);
imgHeight = src->height;
imgWidth = src->width;
imgWidth = src->width;
cvReleaseImage(&src);
}
}
/*!
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 );
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
*/
bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters ){
bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters )
{
// Initialising images
cv::Mat src, src_gray;
cv::Mat detected_edges;
@ -135,40 +137,44 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
}
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 );
if ( !aColorFilterParameters ) aColorFilterParameters = new ShapeRec_ColorFilterParameters();
// 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
cvSetImageROI(find_image, rect);
IplImage* test_image = cvCreateImage(cvGetSize(find_image),
find_image->depth,
find_image->nChannels);
cvCopy(find_image, test_image, NULL);
cvResetImageROI(find_image);
// Crop the image to the selected part only (sample_image)
cvSetImageROI(input_image, rect);
IplImage* sample_image = cvCreateImage(cvGetSize(input_image),
input_image->depth,
input_image->nChannels);
cvCopy(input_image, sample_image, NULL);
cvResetImageROI(input_image);
IplImage* test_hsv = cvCreateImage(cvGetSize(test_image),8,3);
IplImage* h_plane = cvCreateImage( cvGetSize(test_image), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize(test_image), 8, 1 );
CvHistogram* hist;
IplImage* sample_hsv = cvCreateImage( cvGetSize(sample_image),8,3 );
IplImage* sample_h_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 );
IplImage* sample_s_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 );
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);
IplImage* planes[] = { h_plane, s_plane };
cvCvtPixToPlane(sample_hsv, sample_h_plane, sample_s_plane, 0, 0);
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 sranges[] = { 0, 256 };
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
cvCalcHist(planes, hist, 0 ,0);
cvCalcHist(sample_planes, sample_hist, 0 ,0);
// // TEST print of the histogram for debugging
// 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);
//calculate back projection of hue and saturation planes of input image
IplImage* backproject = cvCreateImage(cvGetSize(test_image), 8, 1);
IplImage* binary_backproject = cvCreateImage(cvGetSize(test_image), 8, 1);
cvCalcBackProject(planes, backproject, hist);
// Calculate the back projection of hue and saturation planes of the INPUT image
// by mean of the histogram of the SAMPLE image.
//
// 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);
cvReleaseImage(&test_image);
cvReleaseImage(&test_hsv);
cvReleaseImage(&h_plane);
cvReleaseImage(&s_plane);
cvReleaseImage(&find_image);
cvReleaseImage(&sample_image);
cvReleaseImage(&sample_hsv);
cvReleaseImage(&sample_h_plane);
cvReleaseImage(&sample_s_plane);
cvReleaseImage(&input_image);
cvReleaseImage(&input_hsv);
cvReleaseImage(&input_hplane);
cvReleaseImage(&input_splane);
cvReleaseImage(&backproject);
detected_edges = cv::Mat(binary_backproject);
@ -218,7 +243,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
// _detectAndRetrieveContours( detected_edges, parameters->findContoursMethod );
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;
@ -269,6 +294,9 @@ std::string ShapeRec_FeatureDetector::CroppImage()
cvSaveImage ("/tmp/cropped_image.bmp", cropped_image);
cvReleaseImage(&src);
cvReleaseImage(&cropped_image);
return "/tmp/cropped_image.bmp";
}

View File

@ -174,11 +174,11 @@ void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId)
{
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myBase.nullify();
myVector.nullify();
//myBase.nullify();
//myVector.nullify();
GroupArgs->LineEdit1->setText("");
GroupArgs->LineEdit2->setText("");
//GroupArgs->LineEdit1->setText("");
//GroupArgs->LineEdit2->setText("");
GroupArgs->SpinBox_DX1->setValue(myAng);
GroupArgs->SpinBox_DY1->setValue(myNbTimes1);
@ -275,7 +275,8 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
// angular step
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)));
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);
// radial step
@ -293,10 +294,10 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
}
// clear selection
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myGeomGUI->getApp()->selectionMgr()->clearSelected();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
// disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
// myGeomGUI->getApp()->selectionMgr()->clearSelected();
// connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
// this, SLOT(SelectionIntoArgument()));
}
else {
if ( myEditCurrentArgument == GroupArgs->LineEdit1 )

View File

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

View File

@ -55,7 +55,10 @@ SET(TestXAO_SOURCES
ADD_EXECUTABLE(TestXAO ${TestXAO_SOURCES})
TARGET_LINK_LIBRARIES(TestXAO ${_link_LIBRARIES})
SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env)
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})

View File

@ -25,8 +25,9 @@ namespace XAO
rstr.seekg(0, rstr.end); // go to the end
length = rstr.tellg(); // report location (this is the length)
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
txt[length] = '\0';
rstr.close();
return txt;