mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-28 18:30:36 +05:00
0022761: [EDF] Improvement of Explode dialog box
This commit is contained in:
parent
72073a0f52
commit
110596005f
BIN
doc/salome/gui/GEOM/images/flat_contents.png
Normal file
BIN
doc/salome/gui/GEOM/images/flat_contents.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
@ -2,49 +2,75 @@
|
||||
|
||||
\page create_explode_page Explode
|
||||
|
||||
\n To \b Explode an object into sub-shapes, in the <b>Main Menu</b>
|
||||
select <b>New Entity > Explode</b>.
|
||||
To \b Explode an object into sub-shapes, in the <b>Main Menu</b>
|
||||
select <b>New Entity > Explode</b>. This operation opens the
|
||||
<b>Sub Shapes Selection</b> dialog box.
|
||||
|
||||
\n To create a list of sub-shapes (vertices, edges, wires etc.) of the
|
||||
\image html neo-obj1.png
|
||||
|
||||
To create a list of sub-shapes (vertices, edges, wires etc.) of the
|
||||
given shape using the \b Explode operation, you need to define the <b>Main
|
||||
Object</b>, which will be exploded and the <b>Type of Sub-shapes</b> you wish to
|
||||
obtain from it.
|
||||
\n The \b Result of the operation will be a List of \b GEOM_Objects
|
||||
|
||||
The \b Result of the operation will be a List of \b GEOM_Objects
|
||||
(vertexes, edges, wires, faces, shells or solids).
|
||||
|
||||
\n Using <b>TUI Commands</b> you can perform this operation in a
|
||||
Available choices in the <b>Sub Shapes Type</b> combo box depend on the type
|
||||
of selected <b>Main Object</b>:
|
||||
- \b Compound: to extract compounds;
|
||||
- \b Compsolid: to extract compsolids;
|
||||
- \b Solid: to extract solids;
|
||||
- \b Shell: to extract shells;
|
||||
- \b Face: to extract faces;
|
||||
- \b Wire: to extract wires;
|
||||
- \b Edge: to extract edges;
|
||||
- \b Vertex: to extract vertices;
|
||||
- \b Shape: to extract top-level contents of the compound shape;
|
||||
- \b Flat: to extract "flat" contents of the compound shape.
|
||||
|
||||
Note: "flat" contents means top-level simple-type sub-shapes extracted from
|
||||
the compound object recursively (i.e. there is no compounds in the result).
|
||||
For example, if a compound C1 contains a solid S1 and another compound C2 that
|
||||
contains solids S2 and S3 (see picture below):
|
||||
- Explode operation with \b Shape type given as parameter will return S1 and C2;
|
||||
- Explode operation with \b Flat type given as parameter will return S1, S2 and S3.
|
||||
|
||||
\image html flat_contents.png
|
||||
|
||||
Switching on <b>Select Sub-shapes</b> check box allows manual selection of sub-shapes
|
||||
to be extracted from the main object. In this mode the user can select sub-shapes
|
||||
directly in 3D viewer.
|
||||
|
||||
Using <b>TUI Commands</b> you can perform this operation in a
|
||||
variety of ways:
|
||||
<ul>
|
||||
<li><em>geompy.ExtractShapes(Shape, Type, isSorted)</em> explodes a
|
||||
Shape into sub-shapes of a given Type and returns a List of sub-shapes.
|
||||
This method does not return the Shape itself if it matches the
|
||||
Type.</li>
|
||||
<li><em>geompy.SubShapeAll(Shape, Type)</em> explodes a Shape on
|
||||
sub-shapes of a given Type and returns a List of sub-shapes.</li>
|
||||
<li><em>geompy.SubShapeAllIDs(Shape, Type)</em> explodes a Shape on
|
||||
sub-shapes of a given Type and returns a List of IDs of
|
||||
sub-shapes.</li>
|
||||
<li><em>geompy.SubShapeAllSortedCentres(Shape, Type)</em> explodes a
|
||||
shape on sub-shapes of a given type and sorts them taking into account
|
||||
their gravity centers, to provide stable order of sub-shapes.
|
||||
It returns a list of sub-shapes.</li>
|
||||
<li><em>geompy.SubShapeAllSortedCentresIDs(Shape, Type)</em> explodes
|
||||
a shape on sub-shapes of a given type and sorts them taking into
|
||||
account their gravity centers, to provide stable order of sub-shapes.
|
||||
It returns a List of IDs of sub-shapes.</li>
|
||||
<li><em>geompy.SubShape(Shape, Type, ListOfInd)</em> allows to obtain
|
||||
a compound of sub-shapes of the Shape, selected by they indices in a
|
||||
list of all sub-shapes of the given Type. Each index is in the range
|
||||
[1, Nb_Sub-Shapes_Of_Given_Type].</li>
|
||||
<li><em>geompy.SubShapeSortedCentres(Shape, Type, ListOfInd)</em>
|
||||
allows to obtain a compound of sub-shapes of the Shape, selected by
|
||||
they indices in sorted list of all sub-shapes of the given Type. Each
|
||||
index is in the range [1, Nb_Sub-Shapes_Of_Given_Type]</li>
|
||||
</ul>
|
||||
- <em>geompy.ExtractShapes(Shape, Type, isSorted)</em> explodes a
|
||||
Shape into sub-shapes of a given Type and returns a List of sub-shapes.
|
||||
This method does not return the Shape itself if it matches the
|
||||
Type.
|
||||
- <em>geompy.SubShapeAll(Shape, Type)</em> explodes a Shape on
|
||||
sub-shapes of a given Type and returns a List of sub-shapes.
|
||||
- <em>geompy.SubShapeAllIDs(Shape, Type)</em> explodes a Shape on
|
||||
sub-shapes of a given Type and returns a List of IDs of
|
||||
sub-shapes.
|
||||
- <em>geompy.SubShapeAllSortedCentres(Shape, Type)</em> explodes a
|
||||
shape on sub-shapes of a given type and sorts them taking into account
|
||||
their gravity centers, to provide stable order of sub-shapes.
|
||||
It returns a list of sub-shapes.
|
||||
- <em>geompy.SubShapeAllSortedCentresIDs(Shape, Type)</em> explodes
|
||||
a shape on sub-shapes of a given type and sorts them taking into
|
||||
account their gravity centers, to provide stable order of sub-shapes.
|
||||
It returns a List of IDs of sub-shapes.
|
||||
- <em>geompy.SubShape(Shape, Type, ListOfInd)</em> allows to obtain
|
||||
a compound of sub-shapes of the Shape, selected by they indices in a
|
||||
list of all sub-shapes of the given Type. Each index is in the range
|
||||
[1, Nb_Sub-Shapes_Of_Given_Type].
|
||||
- <em>geompy.SubShapeSortedCentres(Shape, Type, ListOfInd)</em>
|
||||
allows to obtain a compound of sub-shapes of the Shape, selected by
|
||||
they indices in sorted list of all sub-shapes of the given Type. Each
|
||||
index is in the range [1, Nb_Sub-Shapes_Of_Given_Type]
|
||||
|
||||
\n <b>Arguments: </b>1 SHAPE + 1 type of SubShape.
|
||||
|
||||
\image html neo-obj1.png
|
||||
<b>Arguments: </b>1 SHAPE + 1 type of SubShape.
|
||||
|
||||
<b>Example:</b>
|
||||
|
||||
|
@ -39,7 +39,7 @@ module GEOM
|
||||
*/
|
||||
enum shape_type
|
||||
{
|
||||
/*! */
|
||||
/*! A collection of arbitrary shapes */
|
||||
COMPOUND,
|
||||
/*! A collection of solids */
|
||||
COMPSOLID,
|
||||
@ -47,16 +47,19 @@ module GEOM
|
||||
SOLID,
|
||||
/*! A collection of faces connected by some edges of their wire boundaries */
|
||||
SHELL,
|
||||
/*! Part of a plane (in 2D geometry) or a surface (in 3D geometry) bounded by a close wire */
|
||||
/*! Part of a plane (in 2D geometry) or a surface (in 3D geometry) bounded by a closed wire */
|
||||
FACE,
|
||||
/*! A sequence of edges connected by their vertices */
|
||||
/*! A sequence of edges connected by their vertices */
|
||||
WIRE,
|
||||
/*! Edge, a shape corresponding to a curve, and bound by a vertex at each extremity */
|
||||
EDGE,
|
||||
/*! A zero-dimensional shape corresponding to a point in geometry */
|
||||
VERTEX,
|
||||
/*! */
|
||||
SHAPE };
|
||||
/*! Arbitrary shape in a Compound (used for processing of Compounds in some operations) */
|
||||
SHAPE,
|
||||
/*! Flat (top-level) contents of a Compound (used for processing of Compounds in some operations) */
|
||||
FLAT
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief Marker type
|
||||
|
@ -55,6 +55,62 @@
|
||||
|
||||
#include <GEOMImpl_Types.hxx>
|
||||
|
||||
namespace
|
||||
{
|
||||
const char* const ShapeTypes [] = {
|
||||
"Compound",
|
||||
"Compsolid",
|
||||
"Solid",
|
||||
"Shell",
|
||||
"Face",
|
||||
"Wire",
|
||||
"Edge",
|
||||
"Vertex",
|
||||
"Shape",
|
||||
"Flat"
|
||||
};
|
||||
|
||||
unsigned int NumberOfSubShapes(const TopoDS_Shape& S, const int shapeType, TopTools_MapOfShape& M)
|
||||
{
|
||||
unsigned int index = 0;
|
||||
|
||||
if (!S.IsNull()) {
|
||||
if (S.ShapeType() == TopAbs_COMPOUND &&
|
||||
(shapeType == TopAbs_SHAPE || shapeType == TopAbs_FLAT || shapeType == TopAbs_COMPOUND)) {
|
||||
TopoDS_Iterator It(S, Standard_True, Standard_True);
|
||||
for (; It.More(); It.Next()) {
|
||||
TopoDS_Shape SS = It.Value();
|
||||
if (M.Add(SS)) {
|
||||
if (shapeType == TopAbs_FLAT) {
|
||||
if (SS.ShapeType() != TopAbs_COMPOUND)
|
||||
index++;
|
||||
else
|
||||
index += NumberOfSubShapes(SS, shapeType, M);
|
||||
}
|
||||
else if (shapeType == TopAbs_SHAPE || shapeType == SS.ShapeType()) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType));
|
||||
for (; Exp.More(); Exp.Next()) {
|
||||
if (M.Add(Exp.Current())) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
unsigned int NumberOfSubShapes(const TopoDS_Shape& S, const int shapeType)
|
||||
{
|
||||
TopTools_MapOfShape M;
|
||||
return NumberOfSubShapes(S, shapeType, M);
|
||||
}
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// class : EntityGUI_SubShapeDlg
|
||||
// purpose : Constructs a EntityGUI_SubShapeDlg which is a child of 'parent', with the
|
||||
@ -66,7 +122,6 @@ EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(GeometryGUI* theGeometryGUI, QWidge
|
||||
bool modal, Qt::WindowFlags fl)
|
||||
: GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl),
|
||||
myDmMode( -1 ),
|
||||
myWithShape(true),
|
||||
myIsHiddenMain(false)
|
||||
{
|
||||
QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SUBSHAPE")));
|
||||
@ -133,18 +188,9 @@ void EntityGUI_SubShapeDlg::Init()
|
||||
myEditCurrentArgument = GroupPoints->LineEdit1;
|
||||
myObject = GEOM::GEOM_Object::_nil();
|
||||
|
||||
myWithShape = true;
|
||||
|
||||
/* type for sub-shape selection */
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
|
||||
for ( int i = 0; i <= (int)GEOM::FLAT; i++ )
|
||||
GroupPoints->ComboBox1->addItem(ShapeTypes[i], i);
|
||||
|
||||
if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType()
|
||||
!= OCCViewer_Viewer::Type())
|
||||
@ -172,6 +218,7 @@ void EntityGUI_SubShapeDlg::Init()
|
||||
updateButtonState();
|
||||
resize(100,100);
|
||||
SelectionIntoArgument();
|
||||
SubShapeToggled();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
@ -282,6 +329,8 @@ void EntityGUI_SubShapeDlg::SelectionIntoArgument()
|
||||
if (!isAllSubShapes())
|
||||
return;
|
||||
|
||||
int currentType = GroupPoints->ComboBox1->itemData( GroupPoints->ComboBox1->currentIndex() ).toInt();
|
||||
|
||||
ResetStateOfDialog();
|
||||
|
||||
QString aString = ""; /* name of selection */
|
||||
@ -291,87 +340,47 @@ void EntityGUI_SubShapeDlg::SelectionIntoArgument()
|
||||
aSelMgr->selectedObjects(aSelList);
|
||||
|
||||
int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true);
|
||||
if (nbSel != 1)
|
||||
return;
|
||||
|
||||
Handle(SALOME_InteractiveObject) IO = aSelList.First();
|
||||
if (!IO->hasEntry()) {
|
||||
SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
|
||||
updateButtonState();
|
||||
return;
|
||||
}
|
||||
|
||||
if (myIsHiddenMain) {
|
||||
GEOM_Displayer* aDisplayer = getDisplayer();
|
||||
aDisplayer->Display(myObject);
|
||||
myIsHiddenMain = false;
|
||||
}
|
||||
|
||||
TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList);
|
||||
if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) {
|
||||
myObject = GEOM::GEOM_Object::_nil();
|
||||
updateButtonState();
|
||||
return;
|
||||
}
|
||||
|
||||
myObject = GEOMBase::ConvertIOinGEOMObject(IO);
|
||||
if (myObject->_is_nil()) {
|
||||
updateButtonState();
|
||||
return;
|
||||
}
|
||||
|
||||
myShape = S;
|
||||
GroupPoints->LineEdit1->setText(aString);
|
||||
|
||||
int SelectedShapeType = GroupPoints->ComboBox1->currentIndex();
|
||||
int count = GroupPoints->ComboBox1->count();
|
||||
|
||||
if (myWithShape)
|
||||
count = count - 1;
|
||||
|
||||
int i = 0;
|
||||
// Solving PAL5590
|
||||
if (myShape.ShapeType() == TopAbs_COMPOUND) {
|
||||
unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND);
|
||||
if (nb > 0)
|
||||
i++;
|
||||
}
|
||||
while (i <= myShape.ShapeType()) {
|
||||
GroupPoints->ComboBox1->removeItem(0);
|
||||
i++;
|
||||
}
|
||||
|
||||
if (myShape.ShapeType() == TopAbs_COMPOUND) {
|
||||
if (myWithShape == false) {
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
|
||||
myWithShape = true;
|
||||
if (nbSel == 1) {
|
||||
Handle(SALOME_InteractiveObject) IO = aSelList.First();
|
||||
if (!IO->hasEntry()) {
|
||||
SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (myWithShape == true) {
|
||||
GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1);
|
||||
myWithShape = false;
|
||||
}
|
||||
}
|
||||
|
||||
int count1 = GroupPoints->ComboBox1->count();
|
||||
if (myWithShape)
|
||||
count1 = count1 - 1;
|
||||
|
||||
if (SelectedShapeType > myShape.ShapeType()) {
|
||||
if (SelectedShapeType == 8) {
|
||||
if (myShape.ShapeType() != TopAbs_COMPOUND) {
|
||||
GroupPoints->ComboBox1->setCurrentIndex(0);
|
||||
ComboTextChanged();
|
||||
else {
|
||||
TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList);
|
||||
if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) {
|
||||
myObject = GEOM::GEOM_Object::_nil();
|
||||
}
|
||||
}
|
||||
else
|
||||
GroupPoints->ComboBox1->setCurrentIndex(count1 - count + SelectedShapeType);
|
||||
}
|
||||
else {
|
||||
GroupPoints->ComboBox1->setCurrentIndex(0);
|
||||
ComboTextChanged();
|
||||
}
|
||||
else {
|
||||
myObject = GEOMBase::ConvertIOinGEOMObject(IO);
|
||||
if (!CORBA::is_nil(myObject)) {
|
||||
myShape = S;
|
||||
GroupPoints->LineEdit1->setText(aString);
|
||||
int i = 0;
|
||||
// Solving PAL5590
|
||||
if (myShape.ShapeType() == TopAbs_COMPOUND) {
|
||||
unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND);
|
||||
if (nb > 0)
|
||||
i++;
|
||||
}
|
||||
while (i <= myShape.ShapeType()) {
|
||||
GroupPoints->ComboBox1->removeItem(0);
|
||||
i++;
|
||||
}
|
||||
// remove Shape and Flat types for non-compound shapes
|
||||
if (myShape.ShapeType() != TopAbs_COMPOUND) {
|
||||
int idx = GroupPoints->ComboBox1->findData( (int)GEOM::SHAPE );
|
||||
if ( idx != -1 ) GroupPoints->ComboBox1->removeItem( idx );
|
||||
idx = GroupPoints->ComboBox1->findData( (int)GEOM::FLAT );
|
||||
if ( idx != -1 ) GroupPoints->ComboBox1->removeItem( idx );
|
||||
} // if (myShape.ShapeType() != TopAbs_COMPOUND)
|
||||
} // if (!CORBA::is_nil(myObject))
|
||||
} // if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX)
|
||||
} // if (!IO->hasEntry()) ... else
|
||||
} // if (nbSel == 1)
|
||||
|
||||
int idx = GroupPoints->ComboBox1->findData( currentType );
|
||||
if ( idx != -1 )
|
||||
GroupPoints->ComboBox1->setCurrentIndex( idx );
|
||||
|
||||
updateButtonState();
|
||||
}
|
||||
@ -420,29 +429,10 @@ void EntityGUI_SubShapeDlg::ResetStateOfDialog()
|
||||
myShape.Nullify();
|
||||
myEditCurrentArgument->setText("");
|
||||
|
||||
int SelectedShapeType = GroupPoints->ComboBox1->currentIndex();
|
||||
int count = GroupPoints->ComboBox1->count();
|
||||
if (myWithShape)
|
||||
count = count - 1;
|
||||
|
||||
/* type for sub-shape selection */
|
||||
GroupPoints->ComboBox1->clear();
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex");
|
||||
GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
|
||||
|
||||
myWithShape = true;
|
||||
|
||||
GroupPoints->ComboBox1->setCurrentIndex(8 - count + SelectedShapeType);
|
||||
|
||||
// to avoid recursion: SelectionIntoArgument->ResetStateOfDialog->ComboTextChanged->SubShapeToggled->activateSelection->(currentSelectionChanged)->SelectionIntoArgument
|
||||
//ComboTextChanged();
|
||||
for ( int i = 0; i <= (int)GEOM::FLAT; i++ )
|
||||
GroupPoints->ComboBox1->addItem(ShapeTypes[i], i);
|
||||
|
||||
updateButtonState();
|
||||
}
|
||||
@ -472,59 +462,23 @@ void EntityGUI_SubShapeDlg::ComboTextChanged()
|
||||
SubShapeToggled();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : NumberOfSubShapes()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S,
|
||||
const int shapeType) const
|
||||
{
|
||||
if (S.IsNull())
|
||||
return 0;
|
||||
|
||||
unsigned int index = 0;
|
||||
TopTools_MapOfShape M;
|
||||
|
||||
if (S.ShapeType() == TopAbs_COMPOUND &&
|
||||
(TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(shapeType) == TopAbs_COMPSOLID ||
|
||||
TopAbs_ShapeEnum(shapeType) == TopAbs_COMPOUND)) {
|
||||
TopoDS_Iterator It(S, Standard_True, Standard_True);
|
||||
for (; It.More(); It.Next()) {
|
||||
if (M.Add(It.Value())) {
|
||||
if (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(shapeType) == It.Value().ShapeType()) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType));
|
||||
for (; Exp.More(); Exp.Next()) {
|
||||
if (M.Add(Exp.Current())) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
M.Clear();
|
||||
return index;
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : updateButtonState
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void EntityGUI_SubShapeDlg::updateButtonState()
|
||||
{
|
||||
if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() != OCCViewer_Viewer::Type() ||
|
||||
myObject->_is_nil() || shapeType() == TopAbs_SHAPE || shapeType() == TopAbs_COMPOUND) {
|
||||
GroupPoints->CheckButton1->setChecked(false);
|
||||
GroupPoints->CheckButton1->setEnabled(false);
|
||||
bool viewOk = SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() == OCCViewer_Viewer::Type();
|
||||
bool shapeTypeOk = shapeType() != TopAbs_SHAPE && shapeType() != TopAbs_FLAT && shapeType() != TopAbs_COMPOUND;
|
||||
bool objectOK = !CORBA::is_nil( myObject );
|
||||
|
||||
if ( viewOk && objectOK && shapeTypeOk ) {
|
||||
GroupPoints->CheckButton1->setEnabled( true );
|
||||
}
|
||||
else {
|
||||
GroupPoints->CheckButton1->setChecked( false );
|
||||
GroupPoints->CheckButton1->setEnabled( false );
|
||||
}
|
||||
else
|
||||
GroupPoints->CheckButton1->setEnabled(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
@ -533,7 +487,7 @@ void EntityGUI_SubShapeDlg::updateButtonState()
|
||||
//=================================================================================
|
||||
bool EntityGUI_SubShapeDlg::isAllSubShapes() const
|
||||
{
|
||||
return !GroupPoints->CheckButton1->isChecked() || !GroupPoints->CheckButton1->isEnabled();
|
||||
return !GroupPoints->CheckButton1->isEnabled() || !GroupPoints->CheckButton1->isChecked();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
@ -542,19 +496,7 @@ bool EntityGUI_SubShapeDlg::isAllSubShapes() const
|
||||
//=================================================================================
|
||||
int EntityGUI_SubShapeDlg::shapeType() const
|
||||
{
|
||||
int type = GroupPoints->ComboBox1->currentIndex();
|
||||
|
||||
if (myObject->_is_nil())
|
||||
return type;
|
||||
|
||||
// Solving PAL5590
|
||||
type += myShape.ShapeType() + 1;
|
||||
if (myShape.ShapeType() == TopAbs_COMPOUND &&
|
||||
NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) {
|
||||
type--;
|
||||
}
|
||||
|
||||
return type;
|
||||
return GroupPoints->ComboBox1->itemData(GroupPoints->ComboBox1->currentIndex()).toInt();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
|
@ -73,9 +73,6 @@ private:
|
||||
|
||||
void ResetStateOfDialog();
|
||||
|
||||
unsigned int NumberOfSubShapes (const TopoDS_Shape&,
|
||||
const int) const;
|
||||
|
||||
void activateSelection();
|
||||
int getSelectedSubshapes (TColStd_IndexedMapOfInteger& theMapIndex);
|
||||
void updateButtonState();
|
||||
@ -87,8 +84,6 @@ private:
|
||||
GEOM::GEOM_Object_var myObject;
|
||||
int myDmMode;
|
||||
|
||||
bool myWithShape;
|
||||
|
||||
bool myIsHiddenMain;
|
||||
|
||||
DlgRef_1Sel1List1Check3Btn* GroupPoints;
|
||||
|
@ -135,6 +135,63 @@
|
||||
#include <Standard_Failure.hxx>
|
||||
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
|
||||
|
||||
namespace {
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Return normal to face at extrema point
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
gp_Vec GetNormal (const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
|
||||
{
|
||||
gp_Vec defaultNorm(1,0,0); // to have same normals on different faces
|
||||
try {
|
||||
// get UV at extrema point
|
||||
Standard_Real u,v, f,l;
|
||||
switch ( extrema.SupportTypeShape2(1) ) {
|
||||
case BRepExtrema_IsInFace: {
|
||||
extrema.ParOnFaceS2(1, u, v );
|
||||
break;
|
||||
}
|
||||
case BRepExtrema_IsOnEdge: {
|
||||
TopoDS_Edge edge = TopoDS::Edge( extrema.SupportOnShape2(1));
|
||||
Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f,l );
|
||||
extrema.ParOnEdgeS2( 1, u );
|
||||
gp_Pnt2d uv = pcurve->Value( u );
|
||||
u = uv.Coord(1);
|
||||
v = uv.Coord(2);
|
||||
break;
|
||||
}
|
||||
case BRepExtrema_IsVertex: return defaultNorm;
|
||||
}
|
||||
// get derivatives
|
||||
BRepAdaptor_Surface surface( face, false );
|
||||
gp_Vec du, dv; gp_Pnt p;
|
||||
surface.D1( u, v, p, du, dv );
|
||||
|
||||
return du ^ dv;
|
||||
|
||||
} catch (Standard_Failure ) {
|
||||
}
|
||||
return defaultNorm;
|
||||
}
|
||||
|
||||
void AddFlatSubShapes(const TopoDS_Shape& S, TopTools_ListOfShape& L, TopTools_MapOfShape& M)
|
||||
{
|
||||
if (S.ShapeType() != TopAbs_COMPOUND) {
|
||||
L.Append(S);
|
||||
}
|
||||
else {
|
||||
TopoDS_Iterator It(S, Standard_True, Standard_True);
|
||||
for (; It.More(); It.Next()) {
|
||||
TopoDS_Shape SS = It.Value();
|
||||
if (M.Add(SS))
|
||||
AddFlatSubShapes(SS, L, M);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
@ -1298,17 +1355,20 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
|
||||
TopTools_ListOfShape listShape;
|
||||
|
||||
if (aShape.ShapeType() == TopAbs_COMPOUND &&
|
||||
(TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
|
||||
TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND))
|
||||
(theShapeType == TopAbs_SHAPE || theShapeType == TopAbs_FLAT || theShapeType == TopAbs_COMPOUND))
|
||||
{
|
||||
TopoDS_Iterator It (aShape, Standard_True, Standard_True);
|
||||
for (; It.More(); It.Next()) {
|
||||
if (mapShape.Add(It.Value())) {
|
||||
if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
|
||||
listShape.Append(It.Value());
|
||||
TopoDS_Shape SS = It.Value();
|
||||
if (mapShape.Add(SS)) {
|
||||
if (theShapeType == TopAbs_FLAT) {
|
||||
AddFlatSubShapes(SS, listShape, mapShape);
|
||||
}
|
||||
else if (theShapeType == TopAbs_SHAPE || theShapeType == SS.ShapeType()) {
|
||||
listShape.Append(SS);
|
||||
}
|
||||
// VSR: for EXPLODE_NEW_INCLUDE_MAIN and EXPLODE_OLD_INCLUDE_MAIN:
|
||||
// it seems it is necessary to add top-level shape if theShapeType == TopAbs_COMPOUND
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1320,7 +1380,7 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
|
||||
listShape.Append(exp.Current());
|
||||
}
|
||||
|
||||
if (listShape.IsEmpty()) {
|
||||
if (listShape.IsEmpty()){
|
||||
//SetErrorCode("The given shape has no sub-shapes of the requested type");
|
||||
SetErrorCode(NOT_FOUND_ANY); // NPAL18017
|
||||
return aSeq;
|
||||
@ -1364,16 +1424,15 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
|
||||
// Put this subshape in the list of sub-shapes of theMainShape
|
||||
aMainShape->AddSubShapeReference(aFunction);
|
||||
}
|
||||
|
||||
if (!anObj.IsNull()) {
|
||||
aSeq->Append(anObj);
|
||||
aSeq->Append(anObj);
|
||||
|
||||
// for python command
|
||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
||||
anAsciiList += anEntry;
|
||||
anAsciiList += ",";
|
||||
}
|
||||
}
|
||||
// for python command
|
||||
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
|
||||
anAsciiList += anEntry;
|
||||
anAsciiList += ",";
|
||||
}
|
||||
}
|
||||
|
||||
//Make a Python command
|
||||
anAsciiList.Trunc(anAsciiList.Length() - 1);
|
||||
@ -1422,16 +1481,17 @@ Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::SubShapeAllIDs
|
||||
TopTools_ListOfShape listShape;
|
||||
|
||||
if (aShape.ShapeType() == TopAbs_COMPOUND &&
|
||||
(TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
|
||||
TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND))
|
||||
(theShapeType == TopAbs_SHAPE || theShapeType == TopAbs_FLAT || theShapeType == TopAbs_COMPOUND))
|
||||
{
|
||||
TopoDS_Iterator It (aShape, Standard_True, Standard_True);
|
||||
for (; It.More(); It.Next()) {
|
||||
if (mapShape.Add(It.Value())) {
|
||||
if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
|
||||
TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
|
||||
listShape.Append(It.Value());
|
||||
TopoDS_Shape SS = It.Value();
|
||||
if (mapShape.Add(SS)) {
|
||||
if (theShapeType == TopAbs_FLAT) {
|
||||
AddFlatSubShapes(SS, listShape, mapShape);
|
||||
}
|
||||
else if (theShapeType == TopAbs_SHAPE || theShapeType == SS.ShapeType()) {
|
||||
listShape.Append(SS);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1850,33 +1910,41 @@ Standard_Integer GEOMImpl_IShapesOperations::NumberOfSubShapes
|
||||
*/
|
||||
|
||||
try {
|
||||
OCC_CATCH_SIGNALS;
|
||||
int iType, nbTypes [TopAbs_SHAPE];
|
||||
for (iType = 0; iType < TopAbs_SHAPE; ++iType)
|
||||
nbTypes[iType] = 0;
|
||||
nbTypes[aShape.ShapeType()]++;
|
||||
|
||||
TopTools_MapOfShape aMapOfShape;
|
||||
aMapOfShape.Add(aShape);
|
||||
TopTools_ListOfShape aListOfShape;
|
||||
aListOfShape.Append(aShape);
|
||||
|
||||
TopTools_ListIteratorOfListOfShape itL (aListOfShape);
|
||||
for (; itL.More(); itL.Next()) {
|
||||
TopoDS_Iterator it (itL.Value());
|
||||
for (; it.More(); it.Next()) {
|
||||
TopoDS_Shape s = it.Value();
|
||||
if (aMapOfShape.Add(s)) {
|
||||
aListOfShape.Append(s);
|
||||
nbTypes[s.ShapeType()]++;
|
||||
if (theShapeType == TopAbs_FLAT) {
|
||||
TopTools_MapOfShape aMapOfShape;
|
||||
TopTools_ListOfShape aListOfShape;
|
||||
AddFlatSubShapes(aShape, aListOfShape, aMapOfShape);
|
||||
nbShapes = aListOfShape.Extent();
|
||||
}
|
||||
else {
|
||||
OCC_CATCH_SIGNALS;
|
||||
int iType, nbTypes [TopAbs_SHAPE];
|
||||
for (iType = 0; iType < TopAbs_SHAPE; ++iType)
|
||||
nbTypes[iType] = 0;
|
||||
nbTypes[aShape.ShapeType()]++;
|
||||
|
||||
TopTools_MapOfShape aMapOfShape;
|
||||
aMapOfShape.Add(aShape);
|
||||
TopTools_ListOfShape aListOfShape;
|
||||
aListOfShape.Append(aShape);
|
||||
|
||||
TopTools_ListIteratorOfListOfShape itL (aListOfShape);
|
||||
for (; itL.More(); itL.Next()) {
|
||||
TopoDS_Iterator it (itL.Value());
|
||||
for (; it.More(); it.Next()) {
|
||||
TopoDS_Shape s = it.Value();
|
||||
if (aMapOfShape.Add(s)) {
|
||||
aListOfShape.Append(s);
|
||||
nbTypes[s.ShapeType()]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE)
|
||||
nbShapes = aMapOfShape.Extent();
|
||||
else
|
||||
nbShapes = nbTypes[theShapeType];
|
||||
}
|
||||
|
||||
if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE)
|
||||
nbShapes = aMapOfShape.Extent();
|
||||
else
|
||||
nbShapes = nbTypes[theShapeType];
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||
@ -3850,49 +3918,6 @@ void GEOMImpl_IShapesOperations::GetShapeProperties( const TopoDS_Shape aShape,
|
||||
return;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Return normal to face at extrema point
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
gp_Vec GetNormal (const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
|
||||
{
|
||||
gp_Vec defaultNorm(1,0,0); // to have same normals on different faces
|
||||
try {
|
||||
// get UV at extrema point
|
||||
Standard_Real u,v, f,l;
|
||||
switch ( extrema.SupportTypeShape2(1) ) {
|
||||
case BRepExtrema_IsInFace: {
|
||||
extrema.ParOnFaceS2(1, u, v );
|
||||
break;
|
||||
}
|
||||
case BRepExtrema_IsOnEdge: {
|
||||
TopoDS_Edge edge = TopoDS::Edge( extrema.SupportOnShape2(1));
|
||||
Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f,l );
|
||||
extrema.ParOnEdgeS2( 1, u );
|
||||
gp_Pnt2d uv = pcurve->Value( u );
|
||||
u = uv.Coord(1);
|
||||
v = uv.Coord(2);
|
||||
break;
|
||||
}
|
||||
case BRepExtrema_IsVertex: return defaultNorm;
|
||||
}
|
||||
// get derivatives
|
||||
BRepAdaptor_Surface surface( face, false );
|
||||
gp_Vec du, dv; gp_Pnt p;
|
||||
surface.D1( u, v, p, du, dv );
|
||||
|
||||
return du ^ dv;
|
||||
|
||||
} catch (Standard_Failure ) {
|
||||
}
|
||||
return defaultNorm;
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* case GetInPlace:
|
||||
|
@ -20,6 +20,10 @@
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
|
||||
#ifndef GEOMImpl_Types_HXX
|
||||
#define GEOMImpl_Types_HXX
|
||||
|
||||
#include <TopAbs_ShapeEnum.hxx>
|
||||
|
||||
// GEOM_Object types
|
||||
|
||||
@ -371,5 +375,10 @@
|
||||
#define USER_TYPE_EX 1000 // Base type for GEOM plugins
|
||||
|
||||
|
||||
//Plugins specified constants
|
||||
// Plugins specified constants
|
||||
#define PLUGIN_NAME "Plugin Name"
|
||||
|
||||
// Flat type for TopAbs
|
||||
enum { TopAbs_FLAT = TopAbs_SHAPE+1 };
|
||||
|
||||
#endif // GEOMImpl_Types_HXX
|
||||
|
@ -559,7 +559,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
|
||||
## Enumeration ShapeType as a dictionary. \n
|
||||
## Topological types of shapes (like Open Cascade types). See GEOM::shape_type for details.
|
||||
# @ingroup l1_geomBuilder_auxiliary
|
||||
ShapeType = {"AUTO":-1, "COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8}
|
||||
ShapeType = {"AUTO":-1, "COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8, "FLAT":9}
|
||||
|
||||
## Kinds of shape in terms of <VAR>GEOM.GEOM_IKindOfShape.shape_kind</VAR> enumeration
|
||||
# and a list of parameters, describing the shape.
|
||||
|
Loading…
Reference in New Issue
Block a user