mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-11-13 17:18:36 +05:00
0022081: EDF 2386 GEOM: Union of a list of objects
This commit is contained in:
parent
930012ab96
commit
af323ccd1d
@ -20,22 +20,32 @@ cylinder = geompy.MakeCylinder(p1, v, radius1, height)
|
|||||||
# create a sphere
|
# create a sphere
|
||||||
sphere = geompy.MakeSphereR(40)
|
sphere = geompy.MakeSphereR(40)
|
||||||
|
|
||||||
|
# create a box
|
||||||
|
box = geompy.MakeBoxDXDYDZ(80, 80, 80)
|
||||||
|
|
||||||
# fuse
|
# fuse
|
||||||
fuse1 = geompy.MakeFuse(cylinder, sphere)
|
fuse1 = geompy.MakeFuse(cylinder, sphere)
|
||||||
fuse2 = geompy.MakeBoolean(cylinder, sphere, 3)
|
fuse2 = geompy.MakeBoolean(cylinder, sphere, 3)
|
||||||
|
fuse3 = geompy.MakeFuseList([cylinder, sphere, box])
|
||||||
|
|
||||||
# add objects in the study
|
# add objects in the study
|
||||||
id_cylinder = geompy.addToStudy(cylinder, "Cylinder")
|
id_cylinder = geompy.addToStudy(cylinder, "Cylinder")
|
||||||
id_sphere = geompy.addToStudy(sphere, "Sphere")
|
id_sphere = geompy.addToStudy(sphere, "Sphere")
|
||||||
|
id_box = geompy.addToStudy(box, "Box")
|
||||||
id_fuse1 = geompy.addToStudy(fuse1, "Fuse_1")
|
id_fuse1 = geompy.addToStudy(fuse1, "Fuse_1")
|
||||||
id_fuse2 = geompy.addToStudy(fuse2, "Fuse_2")
|
id_fuse2 = geompy.addToStudy(fuse2, "Fuse_2")
|
||||||
|
id_fuse3 = geompy.addToStudy(fuse3, "Fuse_3")
|
||||||
|
|
||||||
# display results
|
# display results
|
||||||
gg.createAndDisplayGO(id_cylinder)
|
gg.createAndDisplayGO(id_cylinder)
|
||||||
gg.setDisplayMode(id_cylinder,1)
|
gg.setDisplayMode(id_cylinder,1)
|
||||||
gg.createAndDisplayGO(id_sphere)
|
gg.createAndDisplayGO(id_sphere)
|
||||||
gg.setDisplayMode(id_sphere,1)
|
gg.setDisplayMode(id_sphere,1)
|
||||||
|
gg.createAndDisplayGO(id_box)
|
||||||
|
gg.setDisplayMode(id_box,1)
|
||||||
gg.createAndDisplayGO(id_fuse1)
|
gg.createAndDisplayGO(id_fuse1)
|
||||||
gg.setDisplayMode(id_fuse1,1)
|
gg.setDisplayMode(id_fuse1,1)
|
||||||
gg.createAndDisplayGO(id_fuse2)
|
gg.createAndDisplayGO(id_fuse2)
|
||||||
gg.setDisplayMode(id_fuse2,1)
|
gg.setDisplayMode(id_fuse2,1)
|
||||||
|
gg.createAndDisplayGO(id_fuse3)
|
||||||
|
gg.setDisplayMode(id_fuse3,1)
|
||||||
|
@ -20,12 +20,28 @@ cylinder = geompy.MakeCylinder(p1, v, radius1, height)
|
|||||||
# create a sphere
|
# create a sphere
|
||||||
sphere = geompy.MakeSphereR(40)
|
sphere = geompy.MakeSphereR(40)
|
||||||
|
|
||||||
|
# create a box
|
||||||
|
box = geompy.MakeBoxDXDYDZ(80, 80, 80)
|
||||||
|
|
||||||
# make common
|
# make common
|
||||||
common = geompy.MakeCommon(cylinder, sphere)
|
common1 = geompy.MakeCommon(cylinder, sphere)
|
||||||
|
common2 = geompy.MakeCommonList([cylinder, sphere, box])
|
||||||
|
|
||||||
# add objects in the study
|
# add objects in the study
|
||||||
id_common = geompy.addToStudy(common, "Common")
|
id_cylinder = geompy.addToStudy(cylinder, "Cylinder")
|
||||||
|
id_sphere = geompy.addToStudy(sphere, "Sphere")
|
||||||
|
id_box = geompy.addToStudy(box, "Box")
|
||||||
|
id_common1 = geompy.addToStudy(common1, "Common_1")
|
||||||
|
id_common2 = geompy.addToStudy(common2, "Common_2")
|
||||||
|
|
||||||
# display the results
|
# display the results
|
||||||
gg.createAndDisplayGO(id_common)
|
gg.createAndDisplayGO(id_cylinder)
|
||||||
gg.setDisplayMode(id_common,1)
|
gg.setDisplayMode(id_cylinder,1)
|
||||||
|
gg.createAndDisplayGO(id_sphere)
|
||||||
|
gg.setDisplayMode(id_sphere,1)
|
||||||
|
gg.createAndDisplayGO(id_box)
|
||||||
|
gg.setDisplayMode(id_box,1)
|
||||||
|
gg.createAndDisplayGO(id_common1)
|
||||||
|
gg.setDisplayMode(id_common1,1)
|
||||||
|
gg.createAndDisplayGO(id_common2)
|
||||||
|
gg.setDisplayMode(id_common2,1)
|
||||||
|
@ -20,12 +20,28 @@ cylinder = geompy.MakeCylinder(p1, v, radius1, height)
|
|||||||
# create a sphere
|
# create a sphere
|
||||||
sphere = geompy.MakeSphereR(40)
|
sphere = geompy.MakeSphereR(40)
|
||||||
|
|
||||||
|
# create a box
|
||||||
|
box = geompy.MakeBoxDXDYDZ(80, 80, 80)
|
||||||
|
|
||||||
#cut
|
#cut
|
||||||
cut = geompy.MakeCut(cylinder, sphere)
|
cut1 = geompy.MakeCut(cylinder, sphere)
|
||||||
|
cut2 = geompy.MakeCutList(cylinder, [sphere, box])
|
||||||
|
|
||||||
# add objects in the study
|
# add objects in the study
|
||||||
id_cut = geompy.addToStudy(cut, "Cut")
|
id_cylinder = geompy.addToStudy(cylinder, "Cylinder")
|
||||||
|
id_sphere = geompy.addToStudy(sphere, "Sphere")
|
||||||
|
id_box = geompy.addToStudy(box, "Box")
|
||||||
|
id_cut1 = geompy.addToStudy(cut1, "Cut_1")
|
||||||
|
id_cut2 = geompy.addToStudy(cut2, "Cut_2")
|
||||||
|
|
||||||
# display the results
|
# display the results
|
||||||
gg.createAndDisplayGO(id_cut)
|
gg.createAndDisplayGO(id_cylinder)
|
||||||
gg.setDisplayMode(id_cut,1)
|
gg.setDisplayMode(id_cylinder,1)
|
||||||
|
gg.createAndDisplayGO(id_sphere)
|
||||||
|
gg.setDisplayMode(id_sphere,1)
|
||||||
|
gg.createAndDisplayGO(id_box)
|
||||||
|
gg.setDisplayMode(id_box,1)
|
||||||
|
gg.createAndDisplayGO(id_cut1)
|
||||||
|
gg.setDisplayMode(id_cut1,1)
|
||||||
|
gg.createAndDisplayGO(id_cut2)
|
||||||
|
gg.setDisplayMode(id_cut2,1)
|
||||||
|
@ -2,23 +2,23 @@
|
|||||||
|
|
||||||
\page common_operation_page Common
|
\page common_operation_page Common
|
||||||
|
|
||||||
For detail description of the Boolean operations please refer to
|
|
||||||
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
|
||||||
It provides a general review of the Partition and Boolean
|
|
||||||
operations algorithms, describes the usage methodology and highlighs
|
|
||||||
major limitations of these operations.
|
|
||||||
|
|
||||||
To produce a \b Common operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Common</b>
|
To produce a \b Common operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Common</b>
|
||||||
|
|
||||||
This operation cuts the common part of two 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 any \b GEOM_Object.
|
The \b Result will be a \b GEOM_Object.
|
||||||
<b>TUI Command:</b> <em>geompy.MakeCommon(s1, s2)</em>
|
|
||||||
<b>Arguments:</b> Name + 2 shapes.
|
<b>TUI Command:</b> <em>geompy.MakeCommonList(theShapesList)</em>\n
|
||||||
|
<b>Arguments:</b> Name + a list of shapes.\n
|
||||||
<b>Advanced option:</b>
|
<b>Advanced option:</b>
|
||||||
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
||||||
|
|
||||||
\image html bool2.png
|
\image html bool2.png "Common dialog"
|
||||||
|
|
||||||
|
For a particular case with two shapes for the Common operation there is the following TUI command:
|
||||||
|
|
||||||
|
<b>TUI Command:</b> <em>geompy.MakeCommon(s1, s2)</em>\n
|
||||||
|
<b>Arguments:</b> Name + 2 shapes.
|
||||||
|
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@ -29,4 +29,12 @@ The \b Result will be any \b GEOM_Object.
|
|||||||
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
||||||
\ref tui_common "Boolean Operations".
|
\ref tui_common "Boolean Operations".
|
||||||
|
|
||||||
|
<b> More details </b>
|
||||||
|
|
||||||
|
For a detailed description of the Boolean operations please refer to
|
||||||
|
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
||||||
|
It provides a general review of the Partition and Boolean
|
||||||
|
operations algorithms, describes the usage methodology and highlights
|
||||||
|
major limitations of these operations.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -2,23 +2,23 @@
|
|||||||
|
|
||||||
\page cut_operation_page Cut
|
\page cut_operation_page Cut
|
||||||
|
|
||||||
For detail description of the Boolean operations please refer to
|
|
||||||
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
|
||||||
It provides a general review of the Partition and Boolean
|
|
||||||
operations algorithms, describes the usage methodology and highlighs
|
|
||||||
major limitations of these operations.
|
|
||||||
|
|
||||||
To produce a \b Cut operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Cut</b>
|
To produce a \b Cut operation in the <b>Main Menu</b> select <b>Operations - > Boolean - > Cut</b>
|
||||||
|
|
||||||
This operation cuts a shape with another one.
|
This operation cuts a shape with a list of other shapes.
|
||||||
The \b Result will be any \b GEOM_Object.
|
|
||||||
<b>Arguments:</b> Name + 2 shapes.
|
The \b Result will be a \b GEOM_Object.
|
||||||
|
|
||||||
|
<b>TUI Command:</b> <em>geompy.MakeCutList(theMainShape, theShapesList)</em>\n
|
||||||
|
<b>Arguments:</b> Name + a main shape + a list of other shapes.\n
|
||||||
<b>Advanced option:</b>
|
<b>Advanced option:</b>
|
||||||
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
||||||
|
|
||||||
<b>Dialog Box:</b>
|
\image html bool3.png "Cut dialog"
|
||||||
|
|
||||||
\image html bool3.png
|
For a particular case with two shapes (object and tool) for the Cut operation there is the following TUI command:
|
||||||
|
|
||||||
|
<b>TUI Command:</b> <em>geompy.MakeCut(s1, s2)</em>\n
|
||||||
|
<b>Arguments:</b> Name + the object + the tool.
|
||||||
|
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@ -29,4 +29,12 @@ The \b Result will be any \b GEOM_Object.
|
|||||||
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
||||||
\ref tui_cut "Boolean Operations".
|
\ref tui_cut "Boolean Operations".
|
||||||
|
|
||||||
|
<b> More details </b>
|
||||||
|
|
||||||
|
For a detailed description of the Boolean operations please refer to
|
||||||
|
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
||||||
|
It provides a general review of the Partition and Boolean
|
||||||
|
operations algorithms, describes the usage methodology and highlights
|
||||||
|
major limitations of these operations.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -5,8 +5,21 @@
|
|||||||
To produce a \b Fuse operation in the <b>Main Menu</b> select
|
To produce a \b Fuse operation in the <b>Main Menu</b> select
|
||||||
<b>Operations - > Boolean - > Fuse</b>.
|
<b>Operations - > Boolean - > Fuse</b>.
|
||||||
|
|
||||||
This operation creates one shape from two shapes.
|
This operation creates one shape from a list of shapes.
|
||||||
The \b Result will be any \b GEOM_Object.
|
|
||||||
|
The \b Result will be a \b GEOM_Object.
|
||||||
|
|
||||||
|
<b>TUI Command:</b> <em>geompy.MakeFuseList(theShapesList)</em>\n
|
||||||
|
<b>Arguments:</b> Name + a list of shapes.\n
|
||||||
|
<b>Advanced option:</b>
|
||||||
|
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
||||||
|
|
||||||
|
\image html bool1.png "Fuse dialog"
|
||||||
|
|
||||||
|
For a particular case with two shapes to be fused there is the following TUI command:
|
||||||
|
|
||||||
|
<b>TUI Command:</b> <em>geompy.MakeFuse(s1, s2)</em>\n
|
||||||
|
<b>Arguments:</b> Name + 2 shapes.
|
||||||
|
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@ -14,13 +27,6 @@ The \b Result will be any \b GEOM_Object.
|
|||||||
|
|
||||||
\image html fusesn2.png "The resulting fuse"
|
\image html fusesn2.png "The resulting fuse"
|
||||||
|
|
||||||
<b>TUI Command:</b> <em>geompy.MakeFuse(s1, s2)</em>\n
|
|
||||||
<b>Arguments:</b> Name + 2 shapes.\n
|
|
||||||
<b>Advanced option:</b>
|
|
||||||
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
|
||||||
|
|
||||||
\image html bool1.png
|
|
||||||
|
|
||||||
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
||||||
\ref tui_fuse "Boolean Operations".
|
\ref tui_fuse "Boolean Operations".
|
||||||
|
|
||||||
|
@ -2,24 +2,19 @@
|
|||||||
|
|
||||||
\page section_opeartion_page Section
|
\page section_opeartion_page Section
|
||||||
|
|
||||||
For detail description of the Boolean operations please refer to
|
|
||||||
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
|
||||||
It provides a general review of the Partition and Boolean
|
|
||||||
operations algorithms, describes the usage methodology and highlighs
|
|
||||||
major limitations of these operations.
|
|
||||||
|
|
||||||
To produce a \b Section operation in the <b>Main Menu</b> select
|
To produce a \b Section operation in the <b>Main Menu</b> select
|
||||||
<b>Operations - > Boolean - > Section</b>
|
<b>Operations - > Boolean - > Section</b>
|
||||||
|
|
||||||
This operation creates the section between 2 shapes.
|
This operation creates the section between 2 shapes.
|
||||||
|
|
||||||
The \b Result will be any \b GEOM_Object (EDGE or WIRE).
|
The \b Result will be any \b GEOM_Object (EDGE or WIRE).
|
||||||
<b>TUI Command:</b> <em>geompy.MakeSection(s1, s2)</em>
|
|
||||||
<b>Arguments:</b> Name + 2 shapes.
|
<b>TUI Command:</b> <em>geompy.MakeSection(s1, s2)</em>\n
|
||||||
|
<b>Arguments:</b> Name + 2 shapes.\n
|
||||||
<b>Advanced option:</b>
|
<b>Advanced option:</b>
|
||||||
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
|
||||||
|
|
||||||
\image html neo-section.png
|
\image html neo-section.png "Section dialog"
|
||||||
|
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@ -30,4 +25,12 @@ The \b Result will be any \b GEOM_Object (EDGE or WIRE).
|
|||||||
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
||||||
\ref tui_section "Boolean Operations".
|
\ref tui_section "Boolean Operations".
|
||||||
|
|
||||||
|
<b> More details </b>
|
||||||
|
|
||||||
|
For a detailed description of the Boolean operations please refer to
|
||||||
|
<a href="SALOME_BOA_PA.pdf">this document</a>.
|
||||||
|
It provides a general review of the Partition and Boolean
|
||||||
|
operations algorithms, describes the usage methodology and highlights
|
||||||
|
major limitations of these operations.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -12,16 +12,35 @@ You can use the following boolean operations for construction of more
|
|||||||
complex geometrical objects (2D & 3D elements):
|
complex geometrical objects (2D & 3D elements):
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>\subpage fuse_operation_page "Fuse" - creates a shape from two shapes.</li>
|
<li>\subpage fuse_operation_page "Fuse" - creates a shape from a list of shapes.</li>
|
||||||
<li>\subpage common_operation_page "Common" - transforms the common part
|
<li>\subpage common_operation_page "Common" - transforms the common part
|
||||||
of two objects into an independent object.</li>
|
of a list of objects into an independent object.</li>
|
||||||
<li>\subpage cut_operation_page "Cut" - cuts one shape with
|
<li>\subpage cut_operation_page "Cut" - cuts one shape with
|
||||||
another. </li>
|
a list of others. </li>
|
||||||
<li>\subpage section_opeartion_page "Section" - creates a section between two shapes.</li>
|
<li>\subpage section_opeartion_page "Section" - creates a section between two shapes.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
There is a general TUI command covering all these operations, which
|
You can use advanced TUI commands performing these operations
|
||||||
can be used alongside with separate commands for each operation.
|
independently from each other:
|
||||||
|
\par
|
||||||
|
<em>geompy.MakeFuseList(theShapesList)</em>, where \em theShapesList is
|
||||||
|
the list of shapes for Fuse operation;
|
||||||
|
\par
|
||||||
|
<em>geompy.MakeCommonList(theShapesList)</em>, where \em theShapesList is
|
||||||
|
the list of shapes for Common operation;
|
||||||
|
\par
|
||||||
|
<em>geompy.MakeCutList(theMainShape, theShapesList)</em>, where \em
|
||||||
|
theMainShape is the object of the operation and \em theShapesList is
|
||||||
|
the list of tools for Cut operation;
|
||||||
|
\par
|
||||||
|
<em>geompy.MakeSection(Shape1, Shape2)</em>, where \em Shape1 is the first
|
||||||
|
argument and \em Shape2 is the second argument of Section operation;
|
||||||
|
|
||||||
|
|
||||||
|
There are several TUI commands that can be used to perform boolean operations
|
||||||
|
with only two arguments. There is a general TUI command covering these
|
||||||
|
operations, which can be used alongside with separate commands for each
|
||||||
|
operation.
|
||||||
\par
|
\par
|
||||||
<em>geompy.MakeBoolean(Shape1, Shape2, Operation),</em> where \em
|
<em>geompy.MakeBoolean(Shape1, Shape2, Operation),</em> where \em
|
||||||
Shape1 is the first argument and \em Shape2 is the second argument of
|
Shape1 is the first argument and \em Shape2 is the second argument of
|
||||||
@ -32,17 +51,14 @@ Boolean operation, \em Operation is a type of the Boolean operation (1
|
|||||||
Besides, you can use advanced TUI commands performing these operations
|
Besides, you can use advanced TUI commands performing these operations
|
||||||
independently from each other:
|
independently from each other:
|
||||||
\par
|
\par
|
||||||
<em>geompy.MakeFuse(Shape1, Shape2)</em>, where \em Shape1 and \em
|
<em>geompy.MakeFuse(Shape1, Shape2)</em>, where \em Shape1 is the first
|
||||||
Shape2 is the second argument of Fuse operation;
|
argument and \em Shape2 is the second argument of Fuse operation;
|
||||||
\par
|
\par
|
||||||
<em>geompy.MakeCommon(Shape1, Shape2)</em>, where \em Shape1 and \em
|
<em>geompy.MakeCommon(Shape1, Shape2)</em>, where \em Shape1 is the first
|
||||||
Shape2 is the second argument of Common operation;
|
argument and \em Shape2 is the second argument of Common operation;
|
||||||
\par
|
\par
|
||||||
<em>geompy.MakeCut(Shape1, Shape2)</em>, where \em Shape1 and \em
|
<em>geompy.MakeCut(Shape1, Shape2)</em>, where \em Shape1 is the first
|
||||||
Shape2 is the second argument of Cut operation;
|
argument and \em Shape2 is the second argument of Cut operation;
|
||||||
\par
|
|
||||||
<em>geompy.MakeSection(Shape1, Shape2)</em>, where \em Shape1 and \em
|
|
||||||
Shape2 is the second argument of Section operation;
|
|
||||||
|
|
||||||
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
Our <b>TUI Scripts</b> provide you with useful examples of the use of
|
||||||
\ref tui_boolean_operations_page "Boolean Operations".
|
\ref tui_boolean_operations_page "Boolean Operations".
|
||||||
|
@ -2675,6 +2675,29 @@ module GEOM
|
|||||||
in GEOM_Object theShape2,
|
in GEOM_Object theShape2,
|
||||||
in long theOperation);
|
in long theOperation);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Perform fusion boolean operation on list of objects.
|
||||||
|
* \param theShapes Shapes to be fused.
|
||||||
|
* \return New GEOM_Object, containing the result shape.
|
||||||
|
*/
|
||||||
|
GEOM_Object MakeFuseList (in ListOfGO theShapes);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Perform common boolean operation on list of objects.
|
||||||
|
* \param theShapes Shapes for common operation.
|
||||||
|
* \return New GEOM_Object, containing the result shape.
|
||||||
|
*/
|
||||||
|
GEOM_Object MakeCommonList (in ListOfGO theShapes);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Perform cutting of list of objects from theMainShape.
|
||||||
|
* \param theMainShape the object for cut operation.
|
||||||
|
* \param theShapes Shapes to be cut from theMainShape (tools).
|
||||||
|
* \return New GEOM_Object, containing the result shape.
|
||||||
|
*/
|
||||||
|
GEOM_Object MakeCutList (in GEOM_Object theMainShape,
|
||||||
|
in ListOfGO theShapes);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Perform partition operation.
|
* \brief Perform partition operation.
|
||||||
*
|
*
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <SUIT_ResourceMgr.h>
|
#include <SUIT_ResourceMgr.h>
|
||||||
#include <SalomeApp_Application.h>
|
#include <SalomeApp_Application.h>
|
||||||
#include <LightApp_SelectionMgr.h>
|
#include <LightApp_SelectionMgr.h>
|
||||||
|
#include <SALOME_ListIteratorOfListIO.hxx>
|
||||||
|
|
||||||
// VSR 22/08/2012: issue 0021787: remove "Preview" button from BOP and Partition operations
|
// VSR 22/08/2012: issue 0021787: remove "Preview" button from BOP and Partition operations
|
||||||
// Comment next line to enable preview in BOP dialog box
|
// Comment next line to enable preview in BOP dialog box
|
||||||
@ -95,19 +96,27 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe
|
|||||||
myGroup = new DlgRef_2Sel(centralWidget());
|
myGroup = new DlgRef_2Sel(centralWidget());
|
||||||
|
|
||||||
myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
|
myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
|
||||||
if (myOperation != BooleanGUI::CUT) {
|
if (myOperation == BooleanGUI::CUT) {
|
||||||
|
myGroup->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
|
||||||
|
myGroup->TextLabel2->setText(tr("GEOM_TOOL_OBJECTS"));
|
||||||
|
}
|
||||||
|
else if (myOperation == BooleanGUI::SECTION) {
|
||||||
myGroup->TextLabel1->setText(tr("GEOM_OBJECT_I").arg(1));
|
myGroup->TextLabel1->setText(tr("GEOM_OBJECT_I").arg(1));
|
||||||
myGroup->TextLabel2->setText(tr("GEOM_OBJECT_I").arg(2));
|
myGroup->TextLabel2->setText(tr("GEOM_OBJECT_I").arg(2));
|
||||||
}
|
} else { // Fuse or Common
|
||||||
else {
|
myGroup->TextLabel1->setText(tr( "GEOM_SELECTED_OBJECTS" ));
|
||||||
myGroup->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
|
myGroup->TextLabel2->hide();
|
||||||
myGroup->TextLabel2->setText(tr("GEOM_TOOL_OBJECT"));
|
myGroup->PushButton2->hide();
|
||||||
|
myGroup->LineEdit2->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
myGroup->PushButton1->setIcon(image1);
|
myGroup->PushButton1->setIcon(image1);
|
||||||
myGroup->PushButton2->setIcon(image1);
|
|
||||||
myGroup->LineEdit1->setReadOnly(true);
|
myGroup->LineEdit1->setReadOnly(true);
|
||||||
myGroup->LineEdit2->setReadOnly(true);
|
|
||||||
|
if (myOperation != BooleanGUI::FUSE && myOperation != BooleanGUI::COMMON) {
|
||||||
|
myGroup->PushButton2->setIcon(image1);
|
||||||
|
myGroup->LineEdit2->setReadOnly(true);
|
||||||
|
}
|
||||||
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
|
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
|
||||||
layout->setMargin(0); layout->setSpacing(6);
|
layout->setMargin(0); layout->setSpacing(6);
|
||||||
@ -144,14 +153,17 @@ void BooleanGUI_Dialog::Init()
|
|||||||
myGroup->LineEdit1->setText("");
|
myGroup->LineEdit1->setText("");
|
||||||
myGroup->LineEdit2->setText("");
|
myGroup->LineEdit2->setText("");
|
||||||
myObject1.nullify();
|
myObject1.nullify();
|
||||||
myObject2.nullify();
|
reset();
|
||||||
|
|
||||||
// signals and slots connections
|
// signals and slots connections
|
||||||
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
||||||
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
||||||
|
|
||||||
connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||||
connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
|
||||||
|
if (!myGroup->PushButton2->isHidden()) {
|
||||||
|
connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||||
|
}
|
||||||
|
|
||||||
connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(),
|
connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(),
|
||||||
SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
|
SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
|
||||||
@ -198,10 +210,20 @@ bool BooleanGUI_Dialog::ClickOnApply()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// function : SelectionIntoArgument()
|
// function : reset()
|
||||||
// purpose : Called when selection is changed or on dialog initialization or activation
|
// purpose :
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
void BooleanGUI_Dialog::SelectionIntoArgument()
|
void BooleanGUI_Dialog::reset()
|
||||||
|
{
|
||||||
|
myObjects = new GEOM::ListOfGO;
|
||||||
|
myObjects->length( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : singleSelection
|
||||||
|
// purpose : Performs single selection. Called from SelectionIntoArgument()
|
||||||
|
//=================================================================================
|
||||||
|
void BooleanGUI_Dialog::singleSelection()
|
||||||
{
|
{
|
||||||
myEditCurrentArgument->setText("");
|
myEditCurrentArgument->setText("");
|
||||||
|
|
||||||
@ -219,19 +241,67 @@ void BooleanGUI_Dialog::SelectionIntoArgument()
|
|||||||
|
|
||||||
if (myEditCurrentArgument == myGroup->LineEdit1) {
|
if (myEditCurrentArgument == myGroup->LineEdit1) {
|
||||||
myObject1 = aSelectedObject;
|
myObject1 = aSelectedObject;
|
||||||
if (!myObject2)
|
if (!myGroup->PushButton2->isHidden() && !myObjects->length())
|
||||||
myGroup->PushButton2->click();
|
myGroup->PushButton2->click();
|
||||||
}
|
}
|
||||||
else if (myEditCurrentArgument == myGroup->LineEdit2) {
|
else if (myEditCurrentArgument == myGroup->LineEdit2) {
|
||||||
myObject2 = aSelectedObject;
|
myObjects->length(1);
|
||||||
|
myObjects[0] = aSelectedObject.get();
|
||||||
if (!myObject1)
|
if (!myObject1)
|
||||||
myGroup->PushButton1->click();
|
myGroup->PushButton1->click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (myEditCurrentArgument == myGroup->LineEdit1) myObject1.nullify();
|
if (myEditCurrentArgument == myGroup->LineEdit1) myObject1.nullify();
|
||||||
else if (myEditCurrentArgument == myGroup->LineEdit2) myObject2.nullify();
|
else if (myEditCurrentArgument == myGroup->LineEdit2) reset();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : multipleSelection
|
||||||
|
// purpose : Performs multiple selection. Called from SelectionIntoArgument()
|
||||||
|
//=================================================================================
|
||||||
|
void BooleanGUI_Dialog::multipleSelection()
|
||||||
|
{
|
||||||
|
myEditCurrentArgument->setText( "" );
|
||||||
|
reset();
|
||||||
|
|
||||||
|
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
|
||||||
|
SALOME_ListIO aSelList;
|
||||||
|
aSelMgr->selectedObjects(aSelList);
|
||||||
|
myObjects->length(aSelList.Extent());
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (SALOME_ListIteratorOfListIO anIt (aSelList); anIt.More(); anIt.Next()) {
|
||||||
|
GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIt.Value() );
|
||||||
|
|
||||||
|
if ( !CORBA::is_nil( aSelectedObject ) ) {
|
||||||
|
myObjects[i++] = aSelectedObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
myObjects->length( i );
|
||||||
|
if ( i == 1 ) {
|
||||||
|
myEditCurrentArgument->setText( GEOMBase::GetName( myObjects[0] ) );
|
||||||
|
} else if ( i > 0 ) {
|
||||||
|
myEditCurrentArgument->setText( QString::number( i ) + "_" + tr( "GEOM_OBJECTS" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : SelectionIntoArgument()
|
||||||
|
// purpose : Called when selection is changed or on dialog initialization or activation
|
||||||
|
//=================================================================================
|
||||||
|
void BooleanGUI_Dialog::SelectionIntoArgument()
|
||||||
|
{
|
||||||
|
if ( myOperation == BooleanGUI::SECTION ||
|
||||||
|
(myOperation == BooleanGUI::CUT &&
|
||||||
|
myEditCurrentArgument == myGroup->LineEdit1)) {
|
||||||
|
singleSelection();
|
||||||
|
} else {
|
||||||
|
multipleSelection();
|
||||||
|
}
|
||||||
|
|
||||||
processPreview();
|
processPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,8 +316,10 @@ void BooleanGUI_Dialog::SetEditCurrentArgument()
|
|||||||
if (send == myGroup->PushButton1) {
|
if (send == myGroup->PushButton1) {
|
||||||
myEditCurrentArgument = myGroup->LineEdit1;
|
myEditCurrentArgument = myGroup->LineEdit1;
|
||||||
|
|
||||||
myGroup->PushButton2->setDown(false);
|
if (!myGroup->PushButton2->isHidden()) {
|
||||||
myGroup->LineEdit2->setEnabled(false);
|
myGroup->PushButton2->setDown(false);
|
||||||
|
myGroup->LineEdit2->setEnabled(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (send == myGroup->PushButton2) {
|
else if (send == myGroup->PushButton2) {
|
||||||
myEditCurrentArgument = myGroup->LineEdit2;
|
myEditCurrentArgument = myGroup->LineEdit2;
|
||||||
@ -301,7 +373,24 @@ GEOM::GEOM_IOperations_ptr BooleanGUI_Dialog::createOperation()
|
|||||||
//=================================================================================
|
//=================================================================================
|
||||||
bool BooleanGUI_Dialog::isValid (QString&)
|
bool BooleanGUI_Dialog::isValid (QString&)
|
||||||
{
|
{
|
||||||
return myObject1 && myObject2;
|
bool isOK = false;
|
||||||
|
|
||||||
|
switch (myOperation) {
|
||||||
|
case BooleanGUI::FUSE:
|
||||||
|
case BooleanGUI::COMMON:
|
||||||
|
isOK = myObjects->length() > 1;
|
||||||
|
break;
|
||||||
|
case BooleanGUI::CUT:
|
||||||
|
isOK = myObject1 && myObjects->length();
|
||||||
|
break;
|
||||||
|
case BooleanGUI::SECTION:
|
||||||
|
isOK = myObject1 && (myObjects->length() == 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
@ -313,7 +402,24 @@ bool BooleanGUI_Dialog::execute (ObjectList& objects)
|
|||||||
GEOM::GEOM_Object_var anObj;
|
GEOM::GEOM_Object_var anObj;
|
||||||
|
|
||||||
GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation());
|
GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation());
|
||||||
anObj = anOper->MakeBoolean(myObject1.get(), myObject2.get(), myOperation);
|
|
||||||
|
switch (myOperation) {
|
||||||
|
case BooleanGUI::FUSE:
|
||||||
|
anObj = anOper->MakeFuseList(myObjects);
|
||||||
|
break;
|
||||||
|
case BooleanGUI::COMMON:
|
||||||
|
anObj = anOper->MakeCommonList(myObjects);
|
||||||
|
break;
|
||||||
|
case BooleanGUI::CUT:
|
||||||
|
anObj = anOper->MakeCutList(myObject1.get(), myObjects);
|
||||||
|
break;
|
||||||
|
case BooleanGUI::SECTION:
|
||||||
|
anObj = anOper->MakeBoolean(myObject1.get(), myObjects[0], myOperation);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!anObj->_is_nil())
|
if (!anObj->_is_nil())
|
||||||
objects.push_back(anObj._retn());
|
objects.push_back(anObj._retn());
|
||||||
|
|
||||||
|
@ -55,12 +55,15 @@ protected:
|
|||||||
private:
|
private:
|
||||||
void Init();
|
void Init();
|
||||||
void enterEvent( QEvent* );
|
void enterEvent( QEvent* );
|
||||||
|
void reset();
|
||||||
|
void singleSelection();
|
||||||
|
void multipleSelection();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int myOperation;
|
int myOperation;
|
||||||
|
|
||||||
GEOM::GeomObjPtr myObject1;
|
GEOM::GeomObjPtr myObject1;
|
||||||
GEOM::GeomObjPtr myObject2;
|
GEOM::ListOfGO_var myObjects;
|
||||||
|
|
||||||
DlgRef_2Sel* myGroup;
|
DlgRef_2Sel* myGroup;
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ Please, select face, shell or solid and try again</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_COMMON_TITLE</source>
|
<source>GEOM_COMMON_TITLE</source>
|
||||||
<translation>Common Of Two Objects</translation>
|
<translation>Common Of Objects</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_COMPOUND</source>
|
<source>GEOM_COMPOUND</source>
|
||||||
@ -507,7 +507,7 @@ Please, select face, shell or solid and try again</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_CUT_TITLE</source>
|
<source>GEOM_CUT_TITLE</source>
|
||||||
<translation>Cut Of Two Objects</translation>
|
<translation>Cut Of Objects</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_CYLINDER</source>
|
<source>GEOM_CYLINDER</source>
|
||||||
@ -836,7 +836,7 @@ Please, select face, shell or solid and try again</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_FUSE_TITLE</source>
|
<source>GEOM_FUSE_TITLE</source>
|
||||||
<translation>Fuse Two Objects</translation>
|
<translation>Fuse Objects</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_FixFaceSize</source>
|
<source>GEOM_FixFaceSize</source>
|
||||||
@ -2142,10 +2142,6 @@ Please, select face, shell or solid and try again</translation>
|
|||||||
<source>GEOM_TOLERANCE_VERTEX</source>
|
<source>GEOM_TOLERANCE_VERTEX</source>
|
||||||
<translation>Vertex :</translation>
|
<translation>Vertex :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>GEOM_TOOL_OBJECT</source>
|
|
||||||
<translation>Tool Object</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_TOOL_OBJECTS</source>
|
<source>GEOM_TOOL_OBJECTS</source>
|
||||||
<translation>Tool Objects</translation>
|
<translation>Tool Objects</translation>
|
||||||
|
@ -439,7 +439,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_COMMON_TITLE</source>
|
<source>GEOM_COMMON_TITLE</source>
|
||||||
<translation>Intersection de deux objets</translation>
|
<translation>Intersection des objets</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_COMPOUND</source>
|
<source>GEOM_COMPOUND</source>
|
||||||
@ -507,7 +507,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_CUT_TITLE</source>
|
<source>GEOM_CUT_TITLE</source>
|
||||||
<translation>Découpe de deux objets</translation>
|
<translation>Découpe des objets</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_CYLINDER</source>
|
<source>GEOM_CYLINDER</source>
|
||||||
@ -836,7 +836,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_FUSE_TITLE</source>
|
<source>GEOM_FUSE_TITLE</source>
|
||||||
<translation>Réunir deux objets</translation>
|
<translation>Réunir des objets</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_FixFaceSize</source>
|
<source>GEOM_FixFaceSize</source>
|
||||||
@ -2142,10 +2142,6 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
|
|||||||
<source>GEOM_TOLERANCE_VERTEX</source>
|
<source>GEOM_TOLERANCE_VERTEX</source>
|
||||||
<translation>Point:</translation>
|
<translation>Point:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>GEOM_TOOL_OBJECT</source>
|
|
||||||
<translation>Objet outil </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>GEOM_TOOL_OBJECTS</source>
|
<source>GEOM_TOOL_OBJECTS</source>
|
||||||
<translation>Objets outils </translation>
|
<translation>Objets outils </translation>
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
#include <BRepCheck_Analyzer.hxx>
|
#include <BRepCheck_Analyzer.hxx>
|
||||||
|
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
#include <TopoDS_Shape.hxx>
|
|
||||||
#include <TopoDS_Compound.hxx>
|
#include <TopoDS_Compound.hxx>
|
||||||
#include <TopoDS_Iterator.hxx>
|
#include <TopoDS_Iterator.hxx>
|
||||||
#include <TopTools_MapOfShape.hxx>
|
#include <TopTools_MapOfShape.hxx>
|
||||||
@ -87,124 +86,166 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const
|
|||||||
|
|
||||||
TopoDS_Shape aShape;
|
TopoDS_Shape aShape;
|
||||||
|
|
||||||
Handle(GEOM_Function) aRefShape1 = aCI.GetShape1();
|
switch (aType) {
|
||||||
Handle(GEOM_Function) aRefShape2 = aCI.GetShape2();
|
case BOOLEAN_COMMON:
|
||||||
TopoDS_Shape aShape1 = aRefShape1->GetValue();
|
case BOOLEAN_CUT:
|
||||||
TopoDS_Shape aShape2 = aRefShape2->GetValue();
|
case BOOLEAN_FUSE:
|
||||||
|
case BOOLEAN_SECTION:
|
||||||
|
{
|
||||||
|
Handle(GEOM_Function) aRefShape1 = aCI.GetShape1();
|
||||||
|
Handle(GEOM_Function) aRefShape2 = aCI.GetShape2();
|
||||||
|
TopoDS_Shape aShape1 = aRefShape1->GetValue();
|
||||||
|
TopoDS_Shape aShape2 = aRefShape2->GetValue();
|
||||||
|
|
||||||
if (!aShape1.IsNull() && !aShape2.IsNull()) {
|
if (!aShape1.IsNull() && !aShape2.IsNull()) {
|
||||||
// check arguments for Mantis issue 0021019
|
// check arguments for Mantis issue 0021019
|
||||||
BRepCheck_Analyzer ana (aShape1, Standard_True);
|
BRepCheck_Analyzer ana (aShape1, Standard_True);
|
||||||
if (!ana.IsValid())
|
if (!ana.IsValid())
|
||||||
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
ana.Init(aShape2);
|
ana.Init(aShape2);
|
||||||
if (!ana.IsValid())
|
if (!ana.IsValid())
|
||||||
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
|
|
||||||
// perform COMMON operation
|
aShape = performOperation (aShape1, aShape2, aType);
|
||||||
if (aType == BOOLEAN_COMMON) {
|
|
||||||
BRep_Builder B;
|
|
||||||
TopoDS_Compound C;
|
|
||||||
B.MakeCompound(C);
|
|
||||||
|
|
||||||
TopTools_ListOfShape listShape1, listShape2;
|
if (aShape.IsNull())
|
||||||
GEOMUtils::AddSimpleShapes(aShape1, listShape1);
|
return 0;
|
||||||
GEOMUtils::AddSimpleShapes(aShape2, listShape2);
|
|
||||||
|
|
||||||
Standard_Boolean isCompound =
|
|
||||||
(listShape1.Extent() > 1 || listShape2.Extent() > 1);
|
|
||||||
|
|
||||||
TopTools_ListIteratorOfListOfShape itSub1 (listShape1);
|
|
||||||
for (; itSub1.More(); itSub1.Next()) {
|
|
||||||
TopoDS_Shape aValue1 = itSub1.Value();
|
|
||||||
TopTools_ListIteratorOfListOfShape itSub2 (listShape2);
|
|
||||||
for (; itSub2.More(); itSub2.Next()) {
|
|
||||||
TopoDS_Shape aValue2 = itSub2.Value();
|
|
||||||
BRepAlgoAPI_Common BO (aValue1, aValue2);
|
|
||||||
if (!BO.IsDone()) {
|
|
||||||
StdFail_NotDone::Raise("Common operation can not be performed on the given shapes");
|
|
||||||
}
|
|
||||||
if (isCompound) {
|
|
||||||
TopoDS_Shape aStepResult = BO.Shape();
|
|
||||||
|
|
||||||
// check result of this step: if it is a compound (boolean operations
|
|
||||||
// allways return a compound), we add all sub-shapes of it.
|
|
||||||
// This allows to avoid adding empty compounds,
|
|
||||||
// resulting from COMMON on two non-intersecting shapes.
|
|
||||||
if (aStepResult.ShapeType() == TopAbs_COMPOUND) {
|
|
||||||
TopoDS_Iterator aCompIter (aStepResult);
|
|
||||||
for (; aCompIter.More(); aCompIter.Next()) {
|
|
||||||
// add shape in a result
|
|
||||||
B.Add(C, aCompIter.Value());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// add shape in a result
|
|
||||||
B.Add(C, aStepResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
aShape = BO.Shape();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCompound) {
|
|
||||||
/*
|
|
||||||
TopTools_ListOfShape listShapeC;
|
|
||||||
GEOMUtils::AddSimpleShapes(C, listShapeC);
|
|
||||||
TopTools_ListIteratorOfListOfShape itSubC (listShapeC);
|
|
||||||
bool isOnlySolids = true;
|
|
||||||
for (; itSubC.More(); itSubC.Next()) {
|
|
||||||
TopoDS_Shape aValueC = itSubC.Value();
|
|
||||||
if (aValueC.ShapeType() != TopAbs_SOLID) isOnlySolids = false;
|
|
||||||
}
|
|
||||||
if (isOnlySolids)
|
|
||||||
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion());
|
|
||||||
else
|
|
||||||
aShape = C;
|
|
||||||
*/
|
|
||||||
|
|
||||||
// As GlueFaces has been improved to keep all kind of shapes
|
|
||||||
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
|
||||||
if (anExp.More())
|
|
||||||
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
|
||||||
else
|
|
||||||
aShape = C;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case BOOLEAN_COMMON_LIST:
|
||||||
|
case BOOLEAN_FUSE_LIST:
|
||||||
|
{
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
|
||||||
|
const Standard_Integer nbShapes = aShapes->Length();
|
||||||
|
Standard_Integer i;
|
||||||
|
Handle(GEOM_Function) aRefShape;
|
||||||
|
TopoDS_Shape aShape2;
|
||||||
|
Standard_Integer aSimpleType =
|
||||||
|
(aType == BOOLEAN_FUSE_LIST ? BOOLEAN_FUSE : BOOLEAN_COMMON);
|
||||||
|
|
||||||
// perform CUT operation
|
if (nbShapes > 0) {
|
||||||
else if (aType == BOOLEAN_CUT) {
|
aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(1));
|
||||||
BRep_Builder B;
|
aShape = aRefShape->GetValue();
|
||||||
TopoDS_Compound C;
|
|
||||||
B.MakeCompound(C);
|
|
||||||
|
|
||||||
TopTools_ListOfShape listShapes, listTools;
|
if (!aShape.IsNull()) {
|
||||||
GEOMUtils::AddSimpleShapes(aShape1, listShapes);
|
BRepCheck_Analyzer anAna (aShape, Standard_True);
|
||||||
GEOMUtils::AddSimpleShapes(aShape2, listTools);
|
|
||||||
|
|
||||||
Standard_Boolean isCompound = (listShapes.Extent() > 1);
|
if (!anAna.IsValid()) {
|
||||||
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
TopTools_ListIteratorOfListOfShape itSub1 (listShapes);
|
|
||||||
for (; itSub1.More(); itSub1.Next()) {
|
|
||||||
TopoDS_Shape aCut = itSub1.Value();
|
|
||||||
// tools
|
|
||||||
TopTools_ListIteratorOfListOfShape itSub2 (listTools);
|
|
||||||
for (; itSub2.More(); itSub2.Next()) {
|
|
||||||
TopoDS_Shape aTool = itSub2.Value();
|
|
||||||
BRepAlgoAPI_Cut BO (aCut, aTool);
|
|
||||||
if (!BO.IsDone()) {
|
|
||||||
StdFail_NotDone::Raise("Cut operation can not be performed on the given shapes");
|
|
||||||
}
|
}
|
||||||
aCut = BO.Shape();
|
|
||||||
|
for (i = 2; i <= nbShapes; i++) {
|
||||||
|
aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(i));
|
||||||
|
aShape2 = aRefShape->GetValue();
|
||||||
|
anAna.Init(aShape2);
|
||||||
|
|
||||||
|
if (!anAna.IsValid()) {
|
||||||
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
aShape = performOperation (aShape, aShape2, aSimpleType);
|
||||||
|
|
||||||
|
if (aShape.IsNull()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BOOLEAN_CUT_LIST:
|
||||||
|
{
|
||||||
|
Handle(GEOM_Function) aRefObject = aCI.GetShape1();
|
||||||
|
|
||||||
|
aShape = aRefObject->GetValue();
|
||||||
|
|
||||||
|
if (!aShape.IsNull()) {
|
||||||
|
// check arguments for Mantis issue 0021019
|
||||||
|
BRepCheck_Analyzer anAna (aShape, Standard_True);
|
||||||
|
|
||||||
|
if (!anAna.IsValid()) {
|
||||||
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aTools = aCI.GetShapes();
|
||||||
|
const Standard_Integer nbShapes = aTools->Length();
|
||||||
|
Standard_Integer i;
|
||||||
|
Handle(GEOM_Function) aRefTool;
|
||||||
|
TopoDS_Shape aTool;
|
||||||
|
|
||||||
|
for (i = 1; i <= nbShapes; i++) {
|
||||||
|
aRefTool = Handle(GEOM_Function)::DownCast(aTools->Value(i));
|
||||||
|
aTool = aRefTool->GetValue();
|
||||||
|
anAna.Init(aTool);
|
||||||
|
|
||||||
|
if (!anAna.IsValid()) {
|
||||||
|
StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is not valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
aShape = performOperation (aShape, aTool, BOOLEAN_CUT);
|
||||||
|
|
||||||
|
if (aShape.IsNull()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aFunction->SetValue(aShape);
|
||||||
|
|
||||||
|
log.SetTouched(Label());
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : performOperation
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
TopoDS_Shape GEOMImpl_BooleanDriver::performOperation
|
||||||
|
(const TopoDS_Shape theShape1,
|
||||||
|
const TopoDS_Shape theShape2,
|
||||||
|
const Standard_Integer theType)const
|
||||||
|
{
|
||||||
|
TopoDS_Shape aShape;
|
||||||
|
|
||||||
|
// perform COMMON operation
|
||||||
|
if (theType == BOOLEAN_COMMON) {
|
||||||
|
BRep_Builder B;
|
||||||
|
TopoDS_Compound C;
|
||||||
|
B.MakeCompound(C);
|
||||||
|
|
||||||
|
TopTools_ListOfShape listShape1, listShape2;
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape1, listShape1);
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape2, listShape2);
|
||||||
|
|
||||||
|
Standard_Boolean isCompound =
|
||||||
|
(listShape1.Extent() > 1 || listShape2.Extent() > 1);
|
||||||
|
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub1 (listShape1);
|
||||||
|
for (; itSub1.More(); itSub1.Next()) {
|
||||||
|
TopoDS_Shape aValue1 = itSub1.Value();
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub2 (listShape2);
|
||||||
|
for (; itSub2.More(); itSub2.Next()) {
|
||||||
|
TopoDS_Shape aValue2 = itSub2.Value();
|
||||||
|
BRepAlgoAPI_Common BO (aValue1, aValue2);
|
||||||
|
if (!BO.IsDone()) {
|
||||||
|
StdFail_NotDone::Raise("Common operation can not be performed on the given shapes");
|
||||||
}
|
}
|
||||||
if (isCompound) {
|
if (isCompound) {
|
||||||
|
TopoDS_Shape aStepResult = BO.Shape();
|
||||||
|
|
||||||
// check result of this step: if it is a compound (boolean operations
|
// check result of this step: if it is a compound (boolean operations
|
||||||
// allways return a compound), we add all sub-shapes of it.
|
// allways return a compound), we add all sub-shapes of it.
|
||||||
// This allows to avoid adding empty compounds,
|
// This allows to avoid adding empty compounds,
|
||||||
// resulting from CUT of parts
|
// resulting from COMMON on two non-intersecting shapes.
|
||||||
if (aCut.ShapeType() == TopAbs_COMPOUND) {
|
if (aStepResult.ShapeType() == TopAbs_COMPOUND) {
|
||||||
TopoDS_Iterator aCompIter (aCut);
|
TopoDS_Iterator aCompIter (aStepResult);
|
||||||
for (; aCompIter.More(); aCompIter.Next()) {
|
for (; aCompIter.More(); aCompIter.Next()) {
|
||||||
// add shape in a result
|
// add shape in a result
|
||||||
B.Add(C, aCompIter.Value());
|
B.Add(C, aCompIter.Value());
|
||||||
@ -212,200 +253,163 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// add shape in a result
|
// add shape in a result
|
||||||
B.Add(C, aCut);
|
B.Add(C, aStepResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
aShape = aCut;
|
aShape = BO.Shape();
|
||||||
}
|
|
||||||
|
|
||||||
if (isCompound) {
|
|
||||||
/*
|
|
||||||
TopTools_ListOfShape listShapeC;
|
|
||||||
GEOMUtils::AddSimpleShapes(C, listShapeC);
|
|
||||||
TopTools_ListIteratorOfListOfShape itSubC (listShapeC);
|
|
||||||
bool isOnlySolids = true;
|
|
||||||
for (; itSubC.More(); itSubC.Next()) {
|
|
||||||
TopoDS_Shape aValueC = itSubC.Value();
|
|
||||||
if (aValueC.ShapeType() != TopAbs_SOLID) isOnlySolids = false;
|
|
||||||
}
|
|
||||||
if (isOnlySolids)
|
|
||||||
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion());
|
|
||||||
else
|
|
||||||
aShape = C;
|
|
||||||
*/
|
|
||||||
|
|
||||||
// As GlueFaces has been improved to keep all kind of shapes
|
|
||||||
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
|
||||||
if (anExp.More())
|
|
||||||
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
|
||||||
else
|
|
||||||
aShape = C;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform FUSE operation
|
if (isCompound) {
|
||||||
else if (aType == BOOLEAN_FUSE) {
|
// As GlueFaces has been improved to keep all kind of shapes
|
||||||
/* Fix for NPAL15379: refused
|
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
||||||
// Check arguments
|
if (anExp.More())
|
||||||
TopTools_ListOfShape listShape1, listShape2;
|
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
||||||
GEOMUtils::AddSimpleShapes(aShape1, listShape1);
|
else
|
||||||
GEOMUtils::AddSimpleShapes(aShape2, listShape2);
|
aShape = C;
|
||||||
|
|
||||||
Standard_Boolean isIntersect = Standard_False;
|
|
||||||
|
|
||||||
if (listShape1.Extent() > 1 && !isIntersect) {
|
|
||||||
// check intersections inside the first compound
|
|
||||||
TopTools_ListIteratorOfListOfShape it1 (listShape1);
|
|
||||||
for (; it1.More() && !isIntersect; it1.Next()) {
|
|
||||||
TopoDS_Shape aValue1 = it1.Value();
|
|
||||||
TopTools_ListIteratorOfListOfShape it2 (listShape1);
|
|
||||||
for (; it2.More() && !isIntersect; it2.Next()) {
|
|
||||||
TopoDS_Shape aValue2 = it2.Value();
|
|
||||||
if (aValue2 != aValue1) {
|
|
||||||
BRepAlgoAPI_Section BO (aValue1, aValue2);
|
|
||||||
if (BO.IsDone()) {
|
|
||||||
TopoDS_Shape aSect = BO.Shape();
|
|
||||||
TopExp_Explorer anExp (aSect, TopAbs_EDGE);
|
|
||||||
if (anExp.More()) {
|
|
||||||
isIntersect = Standard_True;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listShape2.Extent() > 1 && !isIntersect) {
|
|
||||||
// check intersections inside the second compound
|
|
||||||
TopTools_ListIteratorOfListOfShape it1 (listShape2);
|
|
||||||
for (; it1.More() && !isIntersect; it1.Next()) {
|
|
||||||
TopoDS_Shape aValue1 = it1.Value();
|
|
||||||
TopTools_ListIteratorOfListOfShape it2 (listShape2);
|
|
||||||
for (; it2.More() && !isIntersect; it2.Next()) {
|
|
||||||
TopoDS_Shape aValue2 = it2.Value();
|
|
||||||
if (aValue2 != aValue1) {
|
|
||||||
BRepAlgoAPI_Section BO (aValue1, aValue2);
|
|
||||||
if (BO.IsDone()) {
|
|
||||||
TopoDS_Shape aSect = BO.Shape();
|
|
||||||
TopExp_Explorer anExp (aSect, TopAbs_EDGE);
|
|
||||||
if (anExp.More()) {
|
|
||||||
isIntersect = Standard_True;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isIntersect) {
|
|
||||||
// have intersections inside compounds
|
|
||||||
// check intersections between compounds
|
|
||||||
TopTools_ListIteratorOfListOfShape it1 (listShape1);
|
|
||||||
for (; it1.More(); it1.Next()) {
|
|
||||||
TopoDS_Shape aValue1 = it1.Value();
|
|
||||||
TopTools_ListIteratorOfListOfShape it2 (listShape2);
|
|
||||||
for (; it2.More(); it2.Next()) {
|
|
||||||
TopoDS_Shape aValue2 = it2.Value();
|
|
||||||
if (aValue2 != aValue1) {
|
|
||||||
BRepAlgoAPI_Section BO (aValue1, aValue2);
|
|
||||||
if (BO.IsDone()) {
|
|
||||||
TopoDS_Shape aSect = BO.Shape();
|
|
||||||
TopExp_Explorer anExp (aSect, TopAbs_EDGE);
|
|
||||||
if (anExp.More()) {
|
|
||||||
StdFail_NotDone::Raise("Bad argument for Fuse: compound with intersecting sub-shapes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Perform
|
|
||||||
BRepAlgoAPI_Fuse BO (aShape1, aShape2);
|
|
||||||
if (!BO.IsDone()) {
|
|
||||||
StdFail_NotDone::Raise("Fuse operation can not be performed on the given shapes");
|
|
||||||
}
|
|
||||||
aShape = BO.Shape();
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform SECTION operation
|
|
||||||
else if (aType == BOOLEAN_SECTION) {
|
|
||||||
BRep_Builder B;
|
|
||||||
TopoDS_Compound C;
|
|
||||||
B.MakeCompound(C);
|
|
||||||
|
|
||||||
TopTools_ListOfShape listShape1, listShape2;
|
|
||||||
GEOMUtils::AddSimpleShapes(aShape1, listShape1);
|
|
||||||
GEOMUtils::AddSimpleShapes(aShape2, listShape2);
|
|
||||||
|
|
||||||
Standard_Boolean isCompound =
|
|
||||||
(listShape1.Extent() > 1 || listShape2.Extent() > 1);
|
|
||||||
|
|
||||||
TopTools_ListIteratorOfListOfShape itSub1 (listShape1);
|
|
||||||
for (; itSub1.More(); itSub1.Next()) {
|
|
||||||
TopoDS_Shape aValue1 = itSub1.Value();
|
|
||||||
TopTools_ListIteratorOfListOfShape itSub2 (listShape2);
|
|
||||||
for (; itSub2.More(); itSub2.Next()) {
|
|
||||||
TopoDS_Shape aValue2 = itSub2.Value();
|
|
||||||
BRepAlgoAPI_Section BO (aValue1, aValue2, Standard_False);
|
|
||||||
// Set approximation to have an attached 3D BSpline geometry to each edge,
|
|
||||||
// where analytic curve is not possible. Without this flag in some cases
|
|
||||||
// we obtain BSpline curve of degree 1 (C0), which is slowly
|
|
||||||
// processed by some algorithms (Partition for example).
|
|
||||||
BO.Approximation(Standard_True);
|
|
||||||
//modified by NIZNHY-PKV Tue Oct 18 14:34:16 2011f
|
|
||||||
BO.ComputePCurveOn1(Standard_True);
|
|
||||||
BO.ComputePCurveOn2(Standard_True);
|
|
||||||
//modified by NIZNHY-PKV Tue Oct 18 14:34:18 2011t
|
|
||||||
|
|
||||||
BO.Build();
|
|
||||||
if (!BO.IsDone()) {
|
|
||||||
StdFail_NotDone::Raise("Section operation can not be performed on the given shapes");
|
|
||||||
}
|
|
||||||
if (isCompound) {
|
|
||||||
TopoDS_Shape aStepResult = BO.Shape();
|
|
||||||
|
|
||||||
// check result of this step: if it is a compound (boolean operations
|
|
||||||
// allways return a compound), we add all sub-shapes of it.
|
|
||||||
// This allows to avoid adding empty compounds,
|
|
||||||
// resulting from SECTION on two non-intersecting shapes.
|
|
||||||
if (aStepResult.ShapeType() == TopAbs_COMPOUND) {
|
|
||||||
TopoDS_Iterator aCompIter (aStepResult);
|
|
||||||
for (; aCompIter.More(); aCompIter.Next()) {
|
|
||||||
// add shape in a result
|
|
||||||
B.Add(C, aCompIter.Value());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// add shape in a result
|
|
||||||
B.Add(C, aStepResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
aShape = BO.Shape();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCompound) {
|
|
||||||
//aShape = C;
|
|
||||||
|
|
||||||
// As GlueFaces has been improved to keep all kind of shapes
|
|
||||||
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
|
||||||
if (anExp.More())
|
|
||||||
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
|
||||||
else
|
|
||||||
aShape = C;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UNKNOWN operation
|
|
||||||
else {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aShape.IsNull()) return 0;
|
// perform CUT operation
|
||||||
|
else if (theType == BOOLEAN_CUT) {
|
||||||
|
BRep_Builder B;
|
||||||
|
TopoDS_Compound C;
|
||||||
|
B.MakeCompound(C);
|
||||||
|
|
||||||
|
TopTools_ListOfShape listShapes, listTools;
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape1, listShapes);
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape2, listTools);
|
||||||
|
|
||||||
|
Standard_Boolean isCompound = (listShapes.Extent() > 1);
|
||||||
|
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub1 (listShapes);
|
||||||
|
for (; itSub1.More(); itSub1.Next()) {
|
||||||
|
TopoDS_Shape aCut = itSub1.Value();
|
||||||
|
// tools
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub2 (listTools);
|
||||||
|
for (; itSub2.More(); itSub2.Next()) {
|
||||||
|
TopoDS_Shape aTool = itSub2.Value();
|
||||||
|
BRepAlgoAPI_Cut BO (aCut, aTool);
|
||||||
|
if (!BO.IsDone()) {
|
||||||
|
StdFail_NotDone::Raise("Cut operation can not be performed on the given shapes");
|
||||||
|
}
|
||||||
|
aCut = BO.Shape();
|
||||||
|
}
|
||||||
|
if (isCompound) {
|
||||||
|
// check result of this step: if it is a compound (boolean operations
|
||||||
|
// allways return a compound), we add all sub-shapes of it.
|
||||||
|
// This allows to avoid adding empty compounds,
|
||||||
|
// resulting from CUT of parts
|
||||||
|
if (aCut.ShapeType() == TopAbs_COMPOUND) {
|
||||||
|
TopoDS_Iterator aCompIter (aCut);
|
||||||
|
for (; aCompIter.More(); aCompIter.Next()) {
|
||||||
|
// add shape in a result
|
||||||
|
B.Add(C, aCompIter.Value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// add shape in a result
|
||||||
|
B.Add(C, aCut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aShape = aCut;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCompound) {
|
||||||
|
// As GlueFaces has been improved to keep all kind of shapes
|
||||||
|
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
||||||
|
if (anExp.More())
|
||||||
|
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
||||||
|
else
|
||||||
|
aShape = C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// perform FUSE operation
|
||||||
|
else if (theType == BOOLEAN_FUSE) {
|
||||||
|
// Perform
|
||||||
|
BRepAlgoAPI_Fuse BO (theShape1, theShape2);
|
||||||
|
if (!BO.IsDone()) {
|
||||||
|
StdFail_NotDone::Raise("Fuse operation can not be performed on the given shapes");
|
||||||
|
}
|
||||||
|
aShape = BO.Shape();
|
||||||
|
}
|
||||||
|
|
||||||
|
// perform SECTION operation
|
||||||
|
else if (theType == BOOLEAN_SECTION) {
|
||||||
|
BRep_Builder B;
|
||||||
|
TopoDS_Compound C;
|
||||||
|
B.MakeCompound(C);
|
||||||
|
|
||||||
|
TopTools_ListOfShape listShape1, listShape2;
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape1, listShape1);
|
||||||
|
GEOMUtils::AddSimpleShapes(theShape2, listShape2);
|
||||||
|
|
||||||
|
Standard_Boolean isCompound =
|
||||||
|
(listShape1.Extent() > 1 || listShape2.Extent() > 1);
|
||||||
|
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub1 (listShape1);
|
||||||
|
for (; itSub1.More(); itSub1.Next()) {
|
||||||
|
TopoDS_Shape aValue1 = itSub1.Value();
|
||||||
|
TopTools_ListIteratorOfListOfShape itSub2 (listShape2);
|
||||||
|
for (; itSub2.More(); itSub2.Next()) {
|
||||||
|
TopoDS_Shape aValue2 = itSub2.Value();
|
||||||
|
BRepAlgoAPI_Section BO (aValue1, aValue2, Standard_False);
|
||||||
|
// Set approximation to have an attached 3D BSpline geometry to each edge,
|
||||||
|
// where analytic curve is not possible. Without this flag in some cases
|
||||||
|
// we obtain BSpline curve of degree 1 (C0), which is slowly
|
||||||
|
// processed by some algorithms (Partition for example).
|
||||||
|
BO.Approximation(Standard_True);
|
||||||
|
//modified by NIZNHY-PKV Tue Oct 18 14:34:16 2011f
|
||||||
|
BO.ComputePCurveOn1(Standard_True);
|
||||||
|
BO.ComputePCurveOn2(Standard_True);
|
||||||
|
//modified by NIZNHY-PKV Tue Oct 18 14:34:18 2011t
|
||||||
|
|
||||||
|
BO.Build();
|
||||||
|
if (!BO.IsDone()) {
|
||||||
|
StdFail_NotDone::Raise("Section operation can not be performed on the given shapes");
|
||||||
|
}
|
||||||
|
if (isCompound) {
|
||||||
|
TopoDS_Shape aStepResult = BO.Shape();
|
||||||
|
|
||||||
|
// check result of this step: if it is a compound (boolean operations
|
||||||
|
// allways return a compound), we add all sub-shapes of it.
|
||||||
|
// This allows to avoid adding empty compounds,
|
||||||
|
// resulting from SECTION on two non-intersecting shapes.
|
||||||
|
if (aStepResult.ShapeType() == TopAbs_COMPOUND) {
|
||||||
|
TopoDS_Iterator aCompIter (aStepResult);
|
||||||
|
for (; aCompIter.More(); aCompIter.Next()) {
|
||||||
|
// add shape in a result
|
||||||
|
B.Add(C, aCompIter.Value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// add shape in a result
|
||||||
|
B.Add(C, aStepResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aShape = BO.Shape();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCompound) {
|
||||||
|
// As GlueFaces has been improved to keep all kind of shapes
|
||||||
|
TopExp_Explorer anExp (C, TopAbs_VERTEX);
|
||||||
|
if (anExp.More())
|
||||||
|
aShape = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True);
|
||||||
|
else
|
||||||
|
aShape = C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UNKNOWN operation
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aShape.IsNull()) return aShape;
|
||||||
|
|
||||||
// as boolean operations always produce compound, lets simplify it
|
// as boolean operations always produce compound, lets simplify it
|
||||||
// for the case, if it contains only one sub-shape
|
// for the case, if it contains only one sub-shape
|
||||||
@ -413,7 +417,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const
|
|||||||
GEOMUtils::AddSimpleShapes(aShape, listShapeRes);
|
GEOMUtils::AddSimpleShapes(aShape, listShapeRes);
|
||||||
if (listShapeRes.Extent() == 1) {
|
if (listShapeRes.Extent() == 1) {
|
||||||
aShape = listShapeRes.First();
|
aShape = listShapeRes.First();
|
||||||
if (aShape.IsNull()) return 0;
|
if (aShape.IsNull()) return aShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 08.07.2008 skl for bug 19761 from Mantis
|
// 08.07.2008 skl for bug 19761 from Mantis
|
||||||
@ -430,9 +434,6 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const
|
|||||||
if (!ana.IsValid())
|
if (!ana.IsValid())
|
||||||
Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result");
|
Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result");
|
||||||
}
|
}
|
||||||
//if (!BRepAlgo::IsValid(aShape)) {
|
|
||||||
// Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result");
|
|
||||||
//}
|
|
||||||
|
|
||||||
// BEGIN: Mantis issue 0021060: always limit tolerance of BOP result
|
// BEGIN: Mantis issue 0021060: always limit tolerance of BOP result
|
||||||
// 1. Get shape parameters for comparison
|
// 1. Get shape parameters for comparison
|
||||||
@ -506,24 +507,9 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const
|
|||||||
}
|
}
|
||||||
// END: Mantis issue 0021060
|
// END: Mantis issue 0021060
|
||||||
|
|
||||||
//Alternative case to check shape result Mantis 0020604: EDF 1172
|
return aShape;
|
||||||
/* TopoDS_Iterator It (aShape, Standard_True, Standard_True);
|
|
||||||
int nbSubshapes=0;
|
|
||||||
for (; It.More(); It.Next())
|
|
||||||
nbSubshapes++;
|
|
||||||
if (!nbSubshapes)
|
|
||||||
Standard_ConstructionError::Raise("Boolean operation aborted : result object is empty compound");*/
|
|
||||||
//end of 0020604: EDF 1172
|
|
||||||
//! the changes temporary commented because of customer needs (see the same mantis bug)
|
|
||||||
|
|
||||||
aFunction->SetValue(aShape);
|
|
||||||
|
|
||||||
log.SetTouched(Label());
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : GEOMImpl_BooleanDriver_Type_
|
//function : GEOMImpl_BooleanDriver_Type_
|
||||||
//purpose :
|
//purpose :
|
||||||
|
@ -51,6 +51,11 @@
|
|||||||
#include <Handle_TFunction_Driver.hxx>
|
#include <Handle_TFunction_Driver.hxx>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _TopoDS_Shape_HeaderFile
|
||||||
|
#include <TopoDS_Shape.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class Standard_Transient;
|
class Standard_Transient;
|
||||||
class Handle_Standard_Type;
|
class Handle_Standard_Type;
|
||||||
class Handle(TFunction_Driver);
|
class Handle(TFunction_Driver);
|
||||||
@ -156,6 +161,12 @@ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STAND
|
|||||||
Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_BooleanDriver) == AType || TFunction_Driver::IsKind(AType)); }
|
Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_BooleanDriver) == AType || TFunction_Driver::IsKind(AType)); }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TopoDS_Shape performOperation(const TopoDS_Shape theShape1,
|
||||||
|
const TopoDS_Shape theShape2,
|
||||||
|
const Standard_Integer theType) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,9 +23,11 @@
|
|||||||
//NOTE: This is an intreface to a function for the Common, Cut and Fuse creation.
|
//NOTE: This is an intreface to a function for the Common, Cut and Fuse creation.
|
||||||
//
|
//
|
||||||
#include "GEOM_Function.hxx"
|
#include "GEOM_Function.hxx"
|
||||||
|
#include "TColStd_HSequenceOfTransient.hxx"
|
||||||
|
|
||||||
#define BOOL_ARG_SHAPE1 1
|
#define BOOL_ARG_SHAPE1 1
|
||||||
#define BOOL_ARG_SHAPE2 2
|
#define BOOL_ARG_SHAPE2 2
|
||||||
|
#define BOOL_ARG_SHAPES 3
|
||||||
|
|
||||||
class GEOMImpl_IBoolean
|
class GEOMImpl_IBoolean
|
||||||
{
|
{
|
||||||
@ -35,9 +37,13 @@ class GEOMImpl_IBoolean
|
|||||||
|
|
||||||
void SetShape1(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE1, theRef); }
|
void SetShape1(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE1, theRef); }
|
||||||
void SetShape2(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE2, theRef); }
|
void SetShape2(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE2, theRef); }
|
||||||
|
void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes)
|
||||||
|
{ _func->SetReferenceList(BOOL_ARG_SHAPES, theShapes); }
|
||||||
|
|
||||||
Handle(GEOM_Function) GetShape1() { return _func->GetReference(BOOL_ARG_SHAPE1); }
|
Handle(GEOM_Function) GetShape1() { return _func->GetReference(BOOL_ARG_SHAPE1); }
|
||||||
Handle(GEOM_Function) GetShape2() { return _func->GetReference(BOOL_ARG_SHAPE2); }
|
Handle(GEOM_Function) GetShape2() { return _func->GetReference(BOOL_ARG_SHAPE2); }
|
||||||
|
Handle(TColStd_HSequenceOfTransient) GetShapes()
|
||||||
|
{ return _func->GetReferenceList(BOOL_ARG_SHAPES); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -139,6 +139,185 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object
|
|||||||
return aBool;
|
return aBool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeFuseList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theShapes)
|
||||||
|
{
|
||||||
|
SetErrorCode(KO);
|
||||||
|
|
||||||
|
if (theShapes.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Add a new Boolean object
|
||||||
|
Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN);
|
||||||
|
|
||||||
|
//Add a new Boolean function
|
||||||
|
Handle(GEOM_Function) aFunction =
|
||||||
|
aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_FUSE_LIST);
|
||||||
|
|
||||||
|
if (aFunction.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Check if the function is set correctly
|
||||||
|
if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL;
|
||||||
|
|
||||||
|
GEOMImpl_IBoolean aCI (aFunction);
|
||||||
|
|
||||||
|
TCollection_AsciiString aDescription;
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapesSeq =
|
||||||
|
getShapeFunctions(theShapes, aDescription);
|
||||||
|
|
||||||
|
if (aShapesSeq.IsNull()) return NULL;
|
||||||
|
|
||||||
|
aCI.SetShapes(aShapesSeq);
|
||||||
|
|
||||||
|
//Compute the Boolean value
|
||||||
|
try {
|
||||||
|
#if OCC_VERSION_LARGE > 0x06010000
|
||||||
|
OCC_CATCH_SIGNALS;
|
||||||
|
#endif
|
||||||
|
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||||
|
SetErrorCode("Boolean driver failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Standard_Failure) {
|
||||||
|
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||||
|
SetErrorCode(aFail->GetMessageString());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Make a Python command
|
||||||
|
GEOM::TPythonDump(aFunction) << aBool <<
|
||||||
|
" = geompy.MakeFuseList([" << aDescription.ToCString() << "])";
|
||||||
|
|
||||||
|
SetErrorCode(OK);
|
||||||
|
return aBool;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeCommonList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theShapes)
|
||||||
|
{
|
||||||
|
SetErrorCode(KO);
|
||||||
|
|
||||||
|
if (theShapes.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Add a new Boolean object
|
||||||
|
Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN);
|
||||||
|
|
||||||
|
//Add a new Boolean function
|
||||||
|
Handle(GEOM_Function) aFunction =
|
||||||
|
aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_COMMON_LIST);
|
||||||
|
|
||||||
|
if (aFunction.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Check if the function is set correctly
|
||||||
|
if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL;
|
||||||
|
|
||||||
|
GEOMImpl_IBoolean aCI (aFunction);
|
||||||
|
|
||||||
|
TCollection_AsciiString aDescription;
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapesSeq =
|
||||||
|
getShapeFunctions(theShapes, aDescription);
|
||||||
|
|
||||||
|
if (aShapesSeq.IsNull()) return NULL;
|
||||||
|
|
||||||
|
aCI.SetShapes(aShapesSeq);
|
||||||
|
|
||||||
|
//Compute the Boolean value
|
||||||
|
try {
|
||||||
|
#if OCC_VERSION_LARGE > 0x06010000
|
||||||
|
OCC_CATCH_SIGNALS;
|
||||||
|
#endif
|
||||||
|
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||||
|
SetErrorCode("Boolean driver failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Standard_Failure) {
|
||||||
|
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||||
|
SetErrorCode(aFail->GetMessageString());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Make a Python command
|
||||||
|
GEOM::TPythonDump(aFunction) << aBool <<
|
||||||
|
" = geompy.MakeCommonList([" << aDescription.ToCString() << "])";
|
||||||
|
|
||||||
|
SetErrorCode(OK);
|
||||||
|
return aBool;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeCutList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList
|
||||||
|
(Handle(GEOM_Object) theMainShape,
|
||||||
|
const Handle(TColStd_HSequenceOfTransient)& theShapes)
|
||||||
|
{
|
||||||
|
SetErrorCode(KO);
|
||||||
|
|
||||||
|
if (theShapes.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Add a new Boolean object
|
||||||
|
Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN);
|
||||||
|
|
||||||
|
//Add a new Boolean function
|
||||||
|
Handle(GEOM_Function) aFunction =
|
||||||
|
aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_CUT_LIST);
|
||||||
|
|
||||||
|
if (aFunction.IsNull()) return NULL;
|
||||||
|
|
||||||
|
//Check if the function is set correctly
|
||||||
|
if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL;
|
||||||
|
|
||||||
|
GEOMImpl_IBoolean aCI (aFunction);
|
||||||
|
Handle(GEOM_Function) aMainRef = theMainShape->GetLastFunction();
|
||||||
|
|
||||||
|
if (aMainRef.IsNull()) return NULL;
|
||||||
|
|
||||||
|
TCollection_AsciiString aDescription;
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapesSeq =
|
||||||
|
getShapeFunctions(theShapes, aDescription);
|
||||||
|
|
||||||
|
if (aShapesSeq.IsNull()) return NULL;
|
||||||
|
|
||||||
|
aCI.SetShape1(aMainRef);
|
||||||
|
aCI.SetShapes(aShapesSeq);
|
||||||
|
|
||||||
|
//Compute the Boolean value
|
||||||
|
try {
|
||||||
|
#if OCC_VERSION_LARGE > 0x06010000
|
||||||
|
OCC_CATCH_SIGNALS;
|
||||||
|
#endif
|
||||||
|
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||||
|
SetErrorCode("Boolean driver failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Standard_Failure) {
|
||||||
|
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||||
|
SetErrorCode(aFail->GetMessageString());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Make a Python command
|
||||||
|
GEOM::TPythonDump(aFunction) << aBool << " = geompy.MakeCutList("
|
||||||
|
<< theMainShape << ", [" << aDescription.ToCString() << "])";
|
||||||
|
|
||||||
|
SetErrorCode(OK);
|
||||||
|
return aBool;
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
/*!
|
/*!
|
||||||
* MakePartition
|
* MakePartition
|
||||||
@ -173,85 +352,47 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition
|
|||||||
|
|
||||||
GEOMImpl_IPartition aCI (aFunction);
|
GEOMImpl_IPartition aCI (aFunction);
|
||||||
|
|
||||||
Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aShapesSeq;
|
||||||
Handle(TColStd_HSequenceOfTransient) aToolsSeq = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aToolsSeq;
|
||||||
Handle(TColStd_HSequenceOfTransient) aKeepInsSeq = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aKeepInsSeq;
|
||||||
Handle(TColStd_HSequenceOfTransient) aRemInsSeq = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aRemInsSeq;
|
||||||
|
|
||||||
Standard_Integer ind, aLen;
|
|
||||||
TCollection_AsciiString anEntry;
|
|
||||||
TCollection_AsciiString aShapesDescr, aToolsDescr, aKeepInsDescr, aRemoveInsDescr;
|
TCollection_AsciiString aShapesDescr, aToolsDescr, aKeepInsDescr, aRemoveInsDescr;
|
||||||
|
|
||||||
// Shapes
|
// Shapes
|
||||||
aLen = theShapes->Length();
|
aShapesSeq = getShapeFunctions(theShapes, aShapesDescr);
|
||||||
for (ind = 1; ind <= aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theShapes->Value(ind));
|
|
||||||
Handle(GEOM_Function) aRefSh = anObj->GetLastFunction();
|
|
||||||
if (aRefSh.IsNull()) {
|
|
||||||
SetErrorCode("NULL shape for Partition");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
aShapesSeq->Append(aRefSh);
|
|
||||||
|
|
||||||
// For Python command
|
if (aShapesSeq.IsNull()) {
|
||||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
SetErrorCode("NULL shape for Partition");
|
||||||
if (ind > 1) aShapesDescr += ", ";
|
return NULL;
|
||||||
aShapesDescr += anEntry;
|
|
||||||
}
|
}
|
||||||
aCI.SetShapes(aShapesSeq);
|
|
||||||
|
|
||||||
// Tools
|
// Tools
|
||||||
aLen = theTools->Length();
|
aToolsSeq = getShapeFunctions(theTools, aToolsDescr);
|
||||||
for (ind = 1; ind <= aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theTools->Value(ind));
|
|
||||||
Handle(GEOM_Function) aRefSh = anObj->GetLastFunction();
|
|
||||||
if (aRefSh.IsNull()) {
|
|
||||||
SetErrorCode("NULL tool shape for Partition");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
aToolsSeq->Append(aRefSh);
|
|
||||||
|
|
||||||
// For Python command
|
if (aToolsSeq.IsNull()) {
|
||||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
SetErrorCode("NULL tool shape for Partition");
|
||||||
if (ind > 1) aToolsDescr += ", ";
|
return NULL;
|
||||||
aToolsDescr += anEntry;
|
|
||||||
}
|
}
|
||||||
aCI.SetTools(aToolsSeq);
|
|
||||||
|
|
||||||
// Keep Inside
|
// Keep Inside
|
||||||
aLen = theKeepIns->Length();
|
aKeepInsSeq = getShapeFunctions(theKeepIns, aKeepInsDescr);
|
||||||
for (ind = 1; ind <= aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theKeepIns->Value(ind));
|
|
||||||
Handle(GEOM_Function) aRefSh = anObj->GetLastFunction();
|
|
||||||
if (aRefSh.IsNull()) {
|
|
||||||
SetErrorCode("NULL <keep inside> shape for Partition");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
aKeepInsSeq->Append(aRefSh);
|
|
||||||
|
|
||||||
// For Python command
|
if (aKeepInsSeq.IsNull()) {
|
||||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
SetErrorCode("NULL <keep inside> shape for Partition");
|
||||||
if (ind > 1) aKeepInsDescr += ", ";
|
return NULL;
|
||||||
aKeepInsDescr += anEntry;
|
|
||||||
}
|
}
|
||||||
aCI.SetKeepIns(aKeepInsSeq);
|
|
||||||
|
|
||||||
// Remove Inside
|
// Remove Inside
|
||||||
aLen = theRemoveIns->Length();
|
aRemInsSeq = getShapeFunctions(theRemoveIns, aRemoveInsDescr);
|
||||||
for (ind = 1; ind <= aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theRemoveIns->Value(ind));
|
|
||||||
Handle(GEOM_Function) aRefSh = anObj->GetLastFunction();
|
|
||||||
if (aRefSh.IsNull()) {
|
|
||||||
SetErrorCode("NULL <remove inside> shape for Partition");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
aRemInsSeq->Append(aRefSh);
|
|
||||||
|
|
||||||
// For Python command
|
if (aRemInsSeq.IsNull()) {
|
||||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
SetErrorCode("NULL <remove inside> shape for Partition");
|
||||||
if (ind > 1) aRemoveInsDescr += ", ";
|
return NULL;
|
||||||
aRemoveInsDescr += anEntry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
aCI.SetShapes(aShapesSeq);
|
||||||
|
aCI.SetTools(aToolsSeq);
|
||||||
|
aCI.SetKeepIns(aKeepInsSeq);
|
||||||
aCI.SetRemoveIns(aRemInsSeq);
|
aCI.SetRemoveIns(aRemInsSeq);
|
||||||
|
|
||||||
// Limit
|
// Limit
|
||||||
@ -370,3 +511,46 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition
|
|||||||
SetErrorCode(OK);
|
SetErrorCode(OK);
|
||||||
return aPart;
|
return aPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* getShapeFunctions
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
Handle(TColStd_HSequenceOfTransient)
|
||||||
|
GEOMImpl_IBooleanOperations::getShapeFunctions
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theObjects,
|
||||||
|
TCollection_AsciiString &theDescription)
|
||||||
|
{
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aResult =
|
||||||
|
new TColStd_HSequenceOfTransient;
|
||||||
|
Standard_Integer aNbObjects = theObjects->Length();
|
||||||
|
Standard_Integer i;
|
||||||
|
TCollection_AsciiString anEntry;
|
||||||
|
Handle(GEOM_Object) anObj;
|
||||||
|
Handle(GEOM_Function) aRefObj;
|
||||||
|
|
||||||
|
// Shapes
|
||||||
|
for (i = 1; i <= aNbObjects; i++) {
|
||||||
|
anObj = Handle(GEOM_Object)::DownCast(theObjects->Value(i));
|
||||||
|
aRefObj = anObj->GetLastFunction();
|
||||||
|
|
||||||
|
if (aRefObj.IsNull()) {
|
||||||
|
aResult.Nullify();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aResult->Append(aRefObj);
|
||||||
|
|
||||||
|
// For Python command
|
||||||
|
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
||||||
|
|
||||||
|
if (i > 1) {
|
||||||
|
theDescription += ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
theDescription += anEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
@ -40,6 +40,16 @@ class GEOMImpl_IBooleanOperations : public GEOM_IOperations {
|
|||||||
Handle(GEOM_Object) theShape2,
|
Handle(GEOM_Object) theShape2,
|
||||||
Standard_Integer theOp);
|
Standard_Integer theOp);
|
||||||
|
|
||||||
|
Standard_EXPORT Handle(GEOM_Object) MakeFuseList
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theShapes);
|
||||||
|
|
||||||
|
Standard_EXPORT Handle(GEOM_Object) MakeCommonList
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theShapes);
|
||||||
|
|
||||||
|
Standard_EXPORT Handle(GEOM_Object) MakeCutList
|
||||||
|
(Handle(GEOM_Object) theMainShape,
|
||||||
|
const Handle(TColStd_HSequenceOfTransient)& theShapes);
|
||||||
|
|
||||||
Standard_EXPORT Handle(GEOM_Object) MakePartition
|
Standard_EXPORT Handle(GEOM_Object) MakePartition
|
||||||
(const Handle(TColStd_HSequenceOfTransient)& theShapes,
|
(const Handle(TColStd_HSequenceOfTransient)& theShapes,
|
||||||
const Handle(TColStd_HSequenceOfTransient)& theTools,
|
const Handle(TColStd_HSequenceOfTransient)& theTools,
|
||||||
@ -53,6 +63,13 @@ class GEOMImpl_IBooleanOperations : public GEOM_IOperations {
|
|||||||
|
|
||||||
Standard_EXPORT Handle(GEOM_Object) MakeHalfPartition (Handle(GEOM_Object) theShape,
|
Standard_EXPORT Handle(GEOM_Object) MakeHalfPartition (Handle(GEOM_Object) theShape,
|
||||||
Handle(GEOM_Object) thePlane);
|
Handle(GEOM_Object) thePlane);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Handle(TColStd_HSequenceOfTransient) getShapeFunctions
|
||||||
|
(const Handle(TColStd_HSequenceOfTransient)& theObjects,
|
||||||
|
TCollection_AsciiString &theDescription);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -229,10 +229,13 @@
|
|||||||
#define THRUSECTIONS_RULED 1
|
#define THRUSECTIONS_RULED 1
|
||||||
#define THRUSECTIONS_SMOOTHED 2
|
#define THRUSECTIONS_SMOOTHED 2
|
||||||
|
|
||||||
#define BOOLEAN_COMMON 1
|
#define BOOLEAN_COMMON 1
|
||||||
#define BOOLEAN_CUT 2
|
#define BOOLEAN_CUT 2
|
||||||
#define BOOLEAN_FUSE 3
|
#define BOOLEAN_FUSE 3
|
||||||
#define BOOLEAN_SECTION 4
|
#define BOOLEAN_SECTION 4
|
||||||
|
#define BOOLEAN_COMMON_LIST 5
|
||||||
|
#define BOOLEAN_CUT_LIST 6
|
||||||
|
#define BOOLEAN_FUSE_LIST 7
|
||||||
|
|
||||||
#define PARTITION_PARTITION 1
|
#define PARTITION_PARTITION 1
|
||||||
#define PARTITION_HALF 2
|
#define PARTITION_HALF 2
|
||||||
|
@ -85,6 +85,100 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBoolean
|
|||||||
return GetObject(anObject);
|
return GetObject(anObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeFuseList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseList
|
||||||
|
(const GEOM::ListOfGO& theShapes)
|
||||||
|
{
|
||||||
|
GEOM::GEOM_Object_var aGEOMObject;
|
||||||
|
|
||||||
|
//Set a not done flag
|
||||||
|
GetOperations()->SetNotDone();
|
||||||
|
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapes =
|
||||||
|
GetListOfObjectsImpl(theShapes);
|
||||||
|
|
||||||
|
if (aShapes.IsNull()) {
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make fusion
|
||||||
|
Handle(GEOM_Object) anObject = GetOperations()->MakeFuseList(aShapes);
|
||||||
|
|
||||||
|
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
|
||||||
|
return GetObject(anObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeCommonList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonList
|
||||||
|
(const GEOM::ListOfGO& theShapes)
|
||||||
|
{
|
||||||
|
GEOM::GEOM_Object_var aGEOMObject;
|
||||||
|
|
||||||
|
//Set a not done flag
|
||||||
|
GetOperations()->SetNotDone();
|
||||||
|
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapes =
|
||||||
|
GetListOfObjectsImpl(theShapes);
|
||||||
|
|
||||||
|
if (aShapes.IsNull()) {
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make fusion
|
||||||
|
Handle(GEOM_Object) anObject = GetOperations()->MakeCommonList(aShapes);
|
||||||
|
|
||||||
|
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
|
||||||
|
return GetObject(anObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* MakeCutList
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutList
|
||||||
|
(GEOM::GEOM_Object_ptr theMainShape,
|
||||||
|
const GEOM::ListOfGO& theShapes)
|
||||||
|
{
|
||||||
|
GEOM::GEOM_Object_var aGEOMObject;
|
||||||
|
|
||||||
|
//Set a not done flag
|
||||||
|
GetOperations()->SetNotDone();
|
||||||
|
|
||||||
|
Handle(GEOM_Object) aMainShape = GetObjectImpl(theMainShape);
|
||||||
|
|
||||||
|
if (aMainShape.IsNull()) {
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aShapes =
|
||||||
|
GetListOfObjectsImpl(theShapes);
|
||||||
|
|
||||||
|
if (aShapes.IsNull()) {
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make fusion
|
||||||
|
Handle(GEOM_Object) anObject = GetOperations()->MakeCutList(aMainShape, aShapes);
|
||||||
|
|
||||||
|
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||||
|
return aGEOMObject._retn();
|
||||||
|
|
||||||
|
return GetObject(anObject);
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
/*!
|
/*!
|
||||||
* MakePartition
|
* MakePartition
|
||||||
@ -105,47 +199,20 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition
|
|||||||
//Set a not done flag
|
//Set a not done flag
|
||||||
GetOperations()->SetNotDone();
|
GetOperations()->SetNotDone();
|
||||||
|
|
||||||
int ind, aLen;
|
Handle(TColStd_HSequenceOfTransient) aShapes = GetListOfObjectsImpl(theShapes);
|
||||||
Handle(TColStd_HSequenceOfTransient) aShapes = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aTools = GetListOfObjectsImpl(theTools);
|
||||||
Handle(TColStd_HSequenceOfTransient) aTools = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aKeepIns = GetListOfObjectsImpl(theKeepIns);
|
||||||
Handle(TColStd_HSequenceOfTransient) aKeepIns = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aRemIns = GetListOfObjectsImpl(theRemoveIns);
|
||||||
Handle(TColStd_HSequenceOfTransient) aRemIns = new TColStd_HSequenceOfTransient;
|
|
||||||
Handle(TColStd_HArray1OfInteger) aMaterials;
|
Handle(TColStd_HArray1OfInteger) aMaterials;
|
||||||
|
|
||||||
//Get the shapes
|
if (aShapes.IsNull() || aTools.IsNull() ||
|
||||||
aLen = theShapes.length();
|
aKeepIns.IsNull() || aRemIns.IsNull()) {
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
return aGEOMObject._retn();
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theShapes[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aShapes->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the tools
|
|
||||||
aLen = theTools.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theTools[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aTools->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the keep inside shapes
|
|
||||||
aLen = theKeepIns.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theKeepIns[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aKeepIns->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the remove inside shapes
|
|
||||||
aLen = theRemoveIns.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theRemoveIns[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aRemIns->Append(aSh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the materials
|
//Get the materials
|
||||||
aLen = theMaterials.length();
|
int ind;
|
||||||
|
int aLen = theMaterials.length();
|
||||||
if ( aLen ) {
|
if ( aLen ) {
|
||||||
aMaterials = new TColStd_HArray1OfInteger (1, aLen);
|
aMaterials = new TColStd_HArray1OfInteger (1, aLen);
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
for (ind = 0; ind < aLen; ind++) {
|
||||||
@ -185,47 +252,20 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersected
|
|||||||
//Set a not done flag
|
//Set a not done flag
|
||||||
GetOperations()->SetNotDone();
|
GetOperations()->SetNotDone();
|
||||||
|
|
||||||
int ind, aLen;
|
Handle(TColStd_HSequenceOfTransient) aShapes = GetListOfObjectsImpl(theShapes);
|
||||||
Handle(TColStd_HSequenceOfTransient) aShapes = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aTools = GetListOfObjectsImpl(theTools);
|
||||||
Handle(TColStd_HSequenceOfTransient) aTools = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aKeepIns = GetListOfObjectsImpl(theKeepIns);
|
||||||
Handle(TColStd_HSequenceOfTransient) aKeepIns = new TColStd_HSequenceOfTransient;
|
Handle(TColStd_HSequenceOfTransient) aRemIns = GetListOfObjectsImpl(theRemoveIns);
|
||||||
Handle(TColStd_HSequenceOfTransient) aRemIns = new TColStd_HSequenceOfTransient;
|
|
||||||
Handle(TColStd_HArray1OfInteger) aMaterials;
|
Handle(TColStd_HArray1OfInteger) aMaterials;
|
||||||
|
|
||||||
//Get the shapes
|
if (aShapes.IsNull() || aTools.IsNull() ||
|
||||||
aLen = theShapes.length();
|
aKeepIns.IsNull() || aRemIns.IsNull()) {
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
return aGEOMObject._retn();
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theShapes[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aShapes->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the tools
|
|
||||||
aLen = theTools.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theTools[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aTools->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the keep inside shapes
|
|
||||||
aLen = theKeepIns.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theKeepIns[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aKeepIns->Append(aSh);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the remove inside shapes
|
|
||||||
aLen = theRemoveIns.length();
|
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
|
||||||
Handle(GEOM_Object) aSh = GetObjectImpl(theRemoveIns[ind]);
|
|
||||||
if (aSh.IsNull()) return aGEOMObject._retn();
|
|
||||||
aRemIns->Append(aSh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the materials
|
//Get the materials
|
||||||
aLen = theMaterials.length();
|
int ind;
|
||||||
|
int aLen = theMaterials.length();
|
||||||
if ( aLen ) {
|
if ( aLen ) {
|
||||||
aMaterials = new TColStd_HArray1OfInteger (1, aLen);
|
aMaterials = new TColStd_HArray1OfInteger (1, aLen);
|
||||||
for (ind = 0; ind < aLen; ind++) {
|
for (ind = 0; ind < aLen; ind++) {
|
||||||
|
@ -46,6 +46,13 @@ class GEOM_I_EXPORT GEOM_IBooleanOperations_i :
|
|||||||
GEOM::GEOM_Object_ptr theShape2,
|
GEOM::GEOM_Object_ptr theShape2,
|
||||||
CORBA::Long theOp);
|
CORBA::Long theOp);
|
||||||
|
|
||||||
|
GEOM::GEOM_Object_ptr MakeFuseList (const GEOM::ListOfGO& theShapes);
|
||||||
|
|
||||||
|
GEOM::GEOM_Object_ptr MakeCommonList (const GEOM::ListOfGO& theShapes);
|
||||||
|
|
||||||
|
GEOM::GEOM_Object_ptr MakeCutList (GEOM::GEOM_Object_ptr theMainShape,
|
||||||
|
const GEOM::ListOfGO& theShapes);
|
||||||
|
|
||||||
GEOM::GEOM_Object_ptr MakePartition (const GEOM::ListOfGO& theShapes,
|
GEOM::GEOM_Object_ptr MakePartition (const GEOM::ListOfGO& theShapes,
|
||||||
const GEOM::ListOfGO& theTools,
|
const GEOM::ListOfGO& theTools,
|
||||||
const GEOM::ListOfGO& theKeepInside,
|
const GEOM::ListOfGO& theKeepInside,
|
||||||
|
@ -160,6 +160,34 @@ Handle(GEOM_Object) GEOM_IOperations_i::GetObjectImpl(GEOM::GEOM_Object_ptr theO
|
|||||||
return anImpl;
|
return anImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* GetListOfObjectsImpl
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
Handle(TColStd_HSequenceOfTransient) GEOM_IOperations_i::GetListOfObjectsImpl
|
||||||
|
(const GEOM::ListOfGO& theObjects)
|
||||||
|
{
|
||||||
|
Handle(TColStd_HSequenceOfTransient) aResult =
|
||||||
|
new TColStd_HSequenceOfTransient;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int aNbObj = theObjects.length();
|
||||||
|
|
||||||
|
for (i = 0; i < aNbObj; i++) {
|
||||||
|
Handle(GEOM_Object) anObj = GetObjectImpl(theObjects[i]);
|
||||||
|
|
||||||
|
if (anObj.IsNull()) {
|
||||||
|
aResult.Nullify();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aResult->Append(anObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
/*!
|
/*!
|
||||||
* UpdateGUIForObject
|
* UpdateGUIForObject
|
||||||
|
@ -50,6 +50,9 @@ class GEOM_I_EXPORT GEOM_IOperations_i : public virtual POA_GEOM::GEOM_IOperatio
|
|||||||
virtual GEOM::GEOM_Object_ptr GetObject(Handle(GEOM_Object) theObject);
|
virtual GEOM::GEOM_Object_ptr GetObject(Handle(GEOM_Object) theObject);
|
||||||
virtual Handle(GEOM_Object) GetObjectImpl(GEOM::GEOM_Object_ptr theObject);
|
virtual Handle(GEOM_Object) GetObjectImpl(GEOM::GEOM_Object_ptr theObject);
|
||||||
|
|
||||||
|
virtual Handle(TColStd_HSequenceOfTransient)
|
||||||
|
GetListOfObjectsImpl(const GEOM::ListOfGO& theObjects);
|
||||||
|
|
||||||
virtual void StartOperation();
|
virtual void StartOperation();
|
||||||
|
|
||||||
virtual void FinishOperation();
|
virtual void FinishOperation();
|
||||||
|
@ -163,17 +163,29 @@ def TestOtherOperations (geompy, math):
|
|||||||
id_Orientation = geompy.addToStudy(Orientation, "OrientationChange")
|
id_Orientation = geompy.addToStudy(Orientation, "OrientationChange")
|
||||||
|
|
||||||
# MakeCommon, MakeCut, MakeFuse, MakeSection
|
# MakeCommon, MakeCut, MakeFuse, MakeSection
|
||||||
|
p1 = geompy.MakeVertex(60, 120, 0)
|
||||||
|
p2 = geompy.MakeVertex( 0, 0, 0)
|
||||||
|
v = geompy.MakeVector(p1, p2)
|
||||||
|
height = 90
|
||||||
|
radius1 = 50
|
||||||
|
cylinder = geompy.MakeCylinder(p1, v, radius1, height)
|
||||||
Sphere = geompy.MakeSphereR(100)
|
Sphere = geompy.MakeSphereR(100)
|
||||||
|
|
||||||
Common = geompy.MakeCommon (Box, Sphere)
|
Common1 = geompy.MakeCommon (Box, Sphere)
|
||||||
Cut = geompy.MakeCut (Box, Sphere)
|
Cut1 = geompy.MakeCut (Box, Sphere)
|
||||||
Fuse = geompy.MakeFuse (Box, Sphere)
|
Fuse1 = geompy.MakeFuse (Box, Sphere)
|
||||||
Section = geompy.MakeSection(Box, Sphere)
|
Section = geompy.MakeSection (Box, Sphere)
|
||||||
|
Common2 = geompy.MakeCommonList([Box, Sphere, cylinder])
|
||||||
|
Cut2 = geompy.MakeCutList (Box, [Sphere, cylinder])
|
||||||
|
Fuse2 = geompy.MakeFuseList ([Box, Sphere, cylinder])
|
||||||
|
|
||||||
id_Common = geompy.addToStudy(Common, "Common")
|
id_Common1 = geompy.addToStudy(Common1, "Common_1")
|
||||||
id_Cut = geompy.addToStudy(Cut, "Cut")
|
id_Cut1 = geompy.addToStudy(Cut1, "Cut_1")
|
||||||
id_Fuse = geompy.addToStudy(Fuse, "Fuse")
|
id_Fuse1 = geompy.addToStudy(Fuse1, "Fuse_1")
|
||||||
id_Section = geompy.addToStudy(Section, "Section")
|
id_Section = geompy.addToStudy(Section, "Section")
|
||||||
|
id_Common2 = geompy.addToStudy(Common2, "Common_2")
|
||||||
|
id_Cut2 = geompy.addToStudy(Cut2, "Cut_2")
|
||||||
|
id_Fuse2 = geompy.addToStudy(Fuse2, "Fuse_2")
|
||||||
|
|
||||||
# Partition
|
# Partition
|
||||||
p100 = geompy.MakeVertex(100, 100, 100)
|
p100 = geompy.MakeVertex(100, 100, 100)
|
||||||
@ -713,10 +725,9 @@ def TestOtherOperations (geompy, math):
|
|||||||
sph2 = geompy.MakeSphere(50, 50, -50, 40)
|
sph2 = geompy.MakeSphere(50, 50, -50, 40)
|
||||||
pcyl = geompy.MakeVertex(50, 50, -50)
|
pcyl = geompy.MakeVertex(50, 50, -50)
|
||||||
cyli = geompy.MakeCylinder(pcyl, vz, 40, 100)
|
cyli = geompy.MakeCylinder(pcyl, vz, 40, 100)
|
||||||
fuse = geompy.MakeFuse(sph1, cyli)
|
sh_1 = geompy.MakeFuseList([sph1, cyli, sph2])
|
||||||
sh_1 = geompy.MakeFuse(fuse, sph2)
|
|
||||||
# As after Fuse we have a compound, we need to obtain a solid from it
|
# As after Fuse we have a compound, we need to obtain a solid from it
|
||||||
#shsh = geompy.SubShapeAll(fuse, geompy.ShapeType["SOLID"])
|
#shsh = geompy.SubShapeAll(sh_1, geompy.ShapeType["SOLID"])
|
||||||
#sh_1 = shsh[0]
|
#sh_1 = shsh[0]
|
||||||
geompy.addToStudy(sh_1, "sh_1")
|
geompy.addToStudy(sh_1, "sh_1")
|
||||||
|
|
||||||
|
@ -6637,6 +6637,98 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
|
|||||||
# note: auto-publishing is done in self.MakeBoolean()
|
# note: auto-publishing is done in self.MakeBoolean()
|
||||||
return self.MakeBoolean(theShape1, theShape2, 4, theName)
|
return self.MakeBoolean(theShape1, theShape2, 4, theName)
|
||||||
|
|
||||||
|
## Perform Fuse boolean operation on the list of shapes.
|
||||||
|
# @param theShapesList Shapes to be fused.
|
||||||
|
# @param theName Object name; when specified, this parameter is used
|
||||||
|
# for result publication in the study. Otherwise, if automatic
|
||||||
|
# publication is switched on, default value is used for result name.
|
||||||
|
#
|
||||||
|
# @return New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
#
|
||||||
|
# @ref tui_fuse "Example 1"
|
||||||
|
# \n @ref swig_MakeCommon "Example 2"
|
||||||
|
def MakeFuseList(self, theShapesList, theName=None):
|
||||||
|
"""
|
||||||
|
Perform Fuse boolean operation on the list of shapes.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
theShapesList Shapes to be fused.
|
||||||
|
theName Object name; when specified, this parameter is used
|
||||||
|
for result publication in the study. Otherwise, if automatic
|
||||||
|
publication is switched on, default value is used for result name.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Example: see GEOM_TestOthers.py
|
||||||
|
anObj = self.BoolOp.MakeFuseList(theShapesList)
|
||||||
|
RaiseIfFailed("MakeFuseList", self.BoolOp)
|
||||||
|
self._autoPublish(anObj, theName, "fuse")
|
||||||
|
return anObj
|
||||||
|
|
||||||
|
## Perform Common boolean operation on the list of shapes.
|
||||||
|
# @param theShapesList Shapes for Common operation.
|
||||||
|
# @param theName Object name; when specified, this parameter is used
|
||||||
|
# for result publication in the study. Otherwise, if automatic
|
||||||
|
# publication is switched on, default value is used for result name.
|
||||||
|
#
|
||||||
|
# @return New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
#
|
||||||
|
# @ref tui_common "Example 1"
|
||||||
|
# \n @ref swig_MakeCommon "Example 2"
|
||||||
|
def MakeCommonList(self, theShapesList, theName=None):
|
||||||
|
"""
|
||||||
|
Perform Common boolean operation on the list of shapes.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
theShapesList Shapes for Common operation.
|
||||||
|
theName Object name; when specified, this parameter is used
|
||||||
|
for result publication in the study. Otherwise, if automatic
|
||||||
|
publication is switched on, default value is used for result name.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Example: see GEOM_TestOthers.py
|
||||||
|
anObj = self.BoolOp.MakeCommonList(theShapesList)
|
||||||
|
RaiseIfFailed("MakeCommonList", self.BoolOp)
|
||||||
|
self._autoPublish(anObj, theName, "common")
|
||||||
|
return anObj
|
||||||
|
|
||||||
|
## Perform Cut boolean operation on one object and the list of tools.
|
||||||
|
# @param theMainShape The object of the operation.
|
||||||
|
# @param theShapesList The list of tools of the operation.
|
||||||
|
# @param theName Object name; when specified, this parameter is used
|
||||||
|
# for result publication in the study. Otherwise, if automatic
|
||||||
|
# publication is switched on, default value is used for result name.
|
||||||
|
#
|
||||||
|
# @return New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
#
|
||||||
|
# @ref tui_cut "Example 1"
|
||||||
|
# \n @ref swig_MakeCommon "Example 2"
|
||||||
|
def MakeCutList(self, theMainShape, theShapesList, theName=None):
|
||||||
|
"""
|
||||||
|
Perform Cut boolean operation on one object and the list of tools.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
theMainShape The object of the operation.
|
||||||
|
theShapesList The list of tools of the operation.
|
||||||
|
theName Object name; when specified, this parameter is used
|
||||||
|
for result publication in the study. Otherwise, if automatic
|
||||||
|
publication is switched on, default value is used for result name.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
New GEOM.GEOM_Object, containing the result shape.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Example: see GEOM_TestOthers.py
|
||||||
|
anObj = self.BoolOp.MakeCutList(theMainShape, theShapesList)
|
||||||
|
RaiseIfFailed("MakeCutList", self.BoolOp)
|
||||||
|
self._autoPublish(anObj, theName, "cut")
|
||||||
|
return anObj
|
||||||
|
|
||||||
# end of l3_boolean
|
# end of l3_boolean
|
||||||
## @}
|
## @}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user