diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_dialog.png b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog.png
index 3cd442a8d..62dc9f415 100644
Binary files a/doc/salome/gui/SMESH/images/hypo_quad_params_dialog.png and b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog.png differ
diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_enf.png b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_enf.png
new file mode 100644
index 000000000..a3e7cfa39
Binary files /dev/null and b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_enf.png differ
diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_vert.png b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_vert.png
new file mode 100644
index 000000000..5c7585336
Binary files /dev/null and b/doc/salome/gui/SMESH/images/hypo_quad_params_dialog_vert.png differ
diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_enfnodes_algo.png b/doc/salome/gui/SMESH/images/hypo_quad_params_enfnodes_algo.png
new file mode 100755
index 000000000..adddf842c
Binary files /dev/null and b/doc/salome/gui/SMESH/images/hypo_quad_params_enfnodes_algo.png differ
diff --git a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc
index 38efc810c..e019c8b87 100644
--- a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc
+++ b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc
@@ -38,32 +38,12 @@ of a given face.
\image html hypo_quad_params_dialog.png "Quadrangle parameters creation/edition dialog"
-Quadrangle parameters is a hypothesis for Quadrangle (Mapping).
+Quadrangle parameters is a hypothesis for Quadrangle (Mapping) algorithm.
-Base vertex parameter allows using Quadrangle (Mapping)
-algorithm for meshing of trilateral faces. In this case it is
-necessary to select the vertex, which will be used as the fourth edge
-(degenerated).
-
-\image html hypo_quad_params_1.png "A face built from 3 edges"
-
-\image html hypo_quad_params_res.png "The resulting mesh"
-
-This parameter can be also used to mesh a segment of a circular face.
-Please, consider that there is a limitation on the selection of the
-vertex for the faces built with the angle > 180 degrees (see the picture).
-
-\image html hypo_quad_params_2.png "3/4 of a circular face"
-
-In this case, selection of a wrong vertex for the Base vertex
-parameter will generate a wrong mesh. The picture below
-shows the good (left) and the bad (right) results of meshing.
-
-\image html hypo_quad_params_res_2.png "The resulting meshes"
-
-Type parameter is used on faces with a different number of
-segments on opposite sides to define the algorithm of transition
-between them. The following types are available:
+Transition tab is used to define the algorithm of transition
+between opposite sides of faces with a different number of
+segments on opposite sides. The following types of transition
+algorithms are available:
- Standard is the default case, when both triangles and quadrangles
are possible in the transition area along the finer meshed sides.
@@ -92,7 +72,65 @@ between them. The following types are available:
to Nmin segments is log3 ( Nmax / Nmin ). The number of
face rows is equal to the number of segments on each of equally
discretized sides.
- \image html reduce_three_to_one.png "The fastest transition pattern: 3 to 1"
+
+\image html reduce_three_to_one.png "The fastest transition pattern: 3 to 1"
+
+Base vertex tab allows using Quadrangle (Mapping)
+algorithm for meshing of trilateral faces. In this case it is
+necessary to select the vertex, which will be used as the fourth edge
+(degenerated).
+
+\image html hypo_quad_params_dialog_vert.png "Base Vertex tab of Quadrangle parameters creation/edition dialog"
+
+\image html hypo_quad_params_1.png "A face built from 3 edges"
+
+\image html hypo_quad_params_res.png "The resulting mesh"
+
+This parameter can be also used to mesh a segment of a circular face.
+Please, consider that there is a limitation on the selection of the
+vertex for the faces built with the angle > 180 degrees (see the picture).
+
+\image html hypo_quad_params_2.png "3/4 of a circular face"
+
+In this case, selection of a wrong vertex for the Base vertex
+parameter will generate a wrong mesh. The picture below
+shows the good (left) and the bad (right) results of meshing.
+
+\image html hypo_quad_params_res_2.png "The resulting meshes"
+
+\image html hypo_quad_params_dialog_enf.png "Enforced nodes tab of Quadrangle parameters creation/edition dialog"
+
+Enforced nodes tab allows for defining points where the
+algorithm should create nodes. There are two ways to define positions
+of the enforced nodes.
+
+ \b Vertices group allows to set up shapes whose vertices will
+ define positions of the enforced nodes. Only vertices successfully
+ projected to the meshed face and located close enough to the
+ meshed face will be used to create the enforced nodes.
+ \b Points group allows to explicitly define coordinates of
+ points used to create the enforced nodes. Only points successfully
+ projected to the meshed face and located close enough to the
+ meshed face will be used to create the enforced nodes.
+
+Algorithm of creation of the enforced nodes is following.
+
+\image html hypo_quad_params_enfnodes_algo.png "Steps of the algorithm of creation of the enforced nodes"
+
+ Left image: Positions of nodes are computed without taking into
+ account the enforced vertex (yellow point).
+ Middle image: A node closest to the enforced vertex is
+ detected. Extreme nodes of the row and column of the detected node
+ are used to create virtual edges (yellow lines) ending at the
+ enforced vertex.
+ Right image: The meshed face is thus divided by the virtual
+ edges into four quadrilateral sub-domains each of which is meshed
+ as usually: the nodes of the row and column of detected node are
+ moved to the virtual edges and the quadrilateral elements are
+ constructed.
+
+If there are several enforced vertices, the algorithm is applied
+recursively to the formed sub-domains.
See Also a sample TUI Script of a
\ref tui_quadrangle_parameters "Quadrangle Parameters" hypothesis.
diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts
index 8bb38cd7c..4f87f5cf5 100644
--- a/src/SMESHGUI/SMESH_msg_en.ts
+++ b/src/SMESHGUI/SMESH_msg_en.ts
@@ -6002,10 +6002,15 @@ Please specify them and try again
No sense in creating a submesh ignored by global algorithm "%1"
- GEOMETRY_OBJECT_IS_NOT_DEFINED
+ GEOMETRY_OBJECT_IS_NOT_DEFINED_MESH
Geometry object is not defined.
Do you want to create an empty mesh
without algorithms and hypotheses?
+
+
+ GEOMETRY_OBJECT_IS_NOT_DEFINED_SUBMESH
+ Geometry object is not defined.
+Please specify it and try again
GEOMETRY_OBJECT_IS_NULL
@@ -6071,6 +6076,14 @@ Please enter valid name and try again
There is no object for editing. Please
select mesh or sub-mesh and try again
+
+ CONCURRENT_SUBMESH_APPEARS
+
+The assigned algorithm has the same priority as one assigned to an
+adjacent sub-mesh, hence it's undefined which algorithm to use for
+meshing boundary shared by two sub-meshes. Would you like to set
+the order of sub-mesh computation?
+
SMESHGUI_MeshPatternDlg
@@ -6233,6 +6246,14 @@ It is impossible to read point coordinates from file
NONE
<None>
+
+ DEFAULT
+ <Default>
+
+
+ SELECT
+ <Select>
+
SMESHGUI_MultiEditDlg
diff --git a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx
index fd0cdb6ca..2c4ce511f 100644
--- a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx
+++ b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx
@@ -42,8 +42,10 @@
#include "StdMeshers_QuadrangleParams.hxx"
#include "StdMeshers_ViscousLayers2D.hxx"
+#include
#include
#include
+#include
#include
#include
#include
@@ -3736,6 +3738,8 @@ void StdMeshers_Quadrangle_2D::smooth (FaceQuadStruct::Ptr quad)
// Get nodes to smooth
+ // TODO: do not smooth fixed nodes
+
typedef map< const SMDS_MeshNode*, TSmoothNode, TIDCompare > TNo2SmooNoMap;
TNo2SmooNoMap smooNoMap;
@@ -4205,6 +4209,9 @@ bool StdMeshers_Quadrangle_2D::getEnforcedUV()
surf->Bounds( u1,u2,v1,v2 );
GeomAPI_ProjectPointOnSurf project;
project.Init(surf, u1,u2, v1,v2, tol );
+ Bnd_Box bbox;
+ BRepBndLib::Add( face, bbox );
+ double farTol = 0.01 * sqrt( bbox.SquareExtent() );
for ( size_t iP = 0; iP < points.size(); ++iP )
{
@@ -4217,7 +4224,7 @@ bool StdMeshers_Quadrangle_2D::getEnforcedUV()
<< points[ iP ].X() << ", "<< points[ iP ].Y() << ", "<< points[ iP ].Z() << " )");
continue;
}
- if ( project.LowerDistance() > tol*1000 )
+ if ( project.LowerDistance() > farTol )
{
if ( isStrictCheck && iP < nbPoints )
return error
diff --git a/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.cxx
index bbde9200c..4d98ef2b9 100644
--- a/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.cxx
+++ b/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.cxx
@@ -23,29 +23,401 @@
#include "StdMeshersGUI_QuadrangleParamWdg.h"
#include "SMESHGUI.h"
+#include "SMESHGUI_SpinBox.h"
+#include "StdMeshersGUI_SubShapeSelectorWdg.h"
-#include "SUIT_ResourceMgr.h"
+#include
+#include
+#include
+#include
+#include
// Qt includes
#include
-#include
-#include
+#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
// IDL includes
#include
#include CORBA_CLIENT_HEADER(SMESH_BasicHypothesis)
+#include CORBA_CLIENT_HEADER(GEOM_Gen)
+
#define SPACING 6
-#define MARGIN 0
+#define MARGIN 11
+
+enum { TAB_TRANSITION, TAB_VERTEX, TAB_ENF_POINTS };
//================================================================================
// function : Constructor
// purpose :
//================================================================================
+
+StdMeshersGUI_QuadrangleParamCreator::StdMeshersGUI_QuadrangleParamCreator(const QString& aHypType)
+ : StdMeshersGUI_StdHypothesisCreator( aHypType )
+{
+}
+
+//=======================================================================
+//function : helpPage
+//purpose :
+//=======================================================================
+
+QString StdMeshersGUI_QuadrangleParamCreator::helpPage() const
+{
+ return "a2d_meshing_hypo_page.html#hypo_quad_params_anchor";
+}
+
+//=======================================================================
+//function : buildFrame
+//purpose :
+//=======================================================================
+
+QFrame* StdMeshersGUI_QuadrangleParamCreator::buildFrame()
+{
+ QFrame* fr = new QFrame();
+
+ QGridLayout* lay = new QGridLayout( fr );
+ lay->setMargin( MARGIN );
+ lay->setSpacing( SPACING );
+ int row = 0;
+
+ myName = 0;
+ if ( isCreation() )
+ {
+ myName = new QLineEdit( fr );
+ QLabel* nameLab = new QLabel( tr("SMESH_NAME"));
+ lay->addWidget( nameLab, row, 0 );
+ lay->addWidget( myName, row, 1 );
+ ++row;
+ }
+
+ // Transition type
+
+ myTypeWdg = new StdMeshersGUI_QuadrangleParamWdg( fr );
+
+ // Vertexes
+
+ myVertexSelWdg = new StdMeshersGUI_SubShapeSelectorWdg( fr, TopAbs_VERTEX );
+ myVertexSelWdg->layout()->setMargin( MARGIN );
+
+ // Enforced Points
+
+ QWidget* pointsFrame = new QWidget( fr );
+ QVBoxLayout* pointsLay = new QVBoxLayout( pointsFrame );
+ pointsLay->setMargin(MARGIN);
+ pointsLay->setSpacing(SPACING);
+
+ // shapes
+ QGroupBox* shapesGroup = new QGroupBox( tr("SHAPES"), pointsFrame );
+ myShapesList = new QListWidget( shapesGroup );
+ myAddShapeBut = new QPushButton( tr("SMESH_BUT_ADD"), shapesGroup );
+ QPushButton* remShapeBut = new QPushButton( tr("SMESH_BUT_REMOVE"), shapesGroup );
+ //
+ QGridLayout* shapesLay = new QGridLayout( shapesGroup );
+ shapesLay->setMargin(MARGIN);
+ shapesLay->setSpacing(SPACING);
+ shapesLay->addWidget( myShapesList, 0, 0, 3, 2 );
+ shapesLay->addWidget( myAddShapeBut, 0, 2 );
+ shapesLay->addWidget( remShapeBut, 1, 2 );
+ shapesLay->setColumnStretch( 0, 1 );
+ shapesLay->setRowStretch ( 2, 1 );
+
+ // coords
+ QGroupBox* coordsGroup = new QGroupBox( tr("POINTS"), pointsFrame );
+ myCoordsTreeWdg = new QTreeWidget( coordsGroup );
+ myCoordsTreeWdg->setColumnCount ( 3 );
+ myCoordsTreeWdg->setHeaderLabels( QStringList() << "X" << "Y" << "Z" );
+ myCoordsTreeWdg->setItemDelegate( new ItemDelegate( myCoordsTreeWdg ));
+ QPushButton* addCoordBut = new QPushButton( tr("SMESH_BUT_ADD"), coordsGroup );
+ QPushButton* remCoordBut = new QPushButton( tr("SMESH_BUT_REMOVE"), coordsGroup );
+ //
+ QGridLayout* coordsLay = new QGridLayout( coordsGroup );
+ coordsLay->setMargin(MARGIN);
+ coordsLay->setSpacing(SPACING);
+ coordsLay->addWidget( myCoordsTreeWdg, 0, 0, 3, 2 );
+ coordsLay->addWidget( addCoordBut, 0, 2 );
+ coordsLay->addWidget( remCoordBut, 1, 2 );
+ coordsLay->setColumnStretch( 0, 1 );
+ coordsLay->setRowStretch ( 2, 1 );
+
+ pointsLay->addWidget( shapesGroup );
+ pointsLay->addWidget( coordsGroup );
+
+ // Tabs
+ myTabs = new QTabWidget( fr );
+ myTabs->addTab( myTypeWdg, tr("TRANSITION"));
+ myTabs->addTab( myVertexSelWdg, tr("SMESH_BASE_VERTEX"));
+ myTabs->addTab( pointsFrame, tr("ENF_NODES"));
+
+ lay->addWidget( myTabs, row, 0, 2, 3 );
+
+ // signals
+ connect( myTypeWdg, SIGNAL( typeChanged(int)), SLOT( onTypeChanged(int)));
+ connect( myAddShapeBut, SIGNAL( clicked()), SLOT( onAddShape() ));
+ connect( remShapeBut, SIGNAL( clicked()), SLOT( onRemoveShape() ));
+ connect( addCoordBut, SIGNAL( clicked()), SLOT( onAddPoint() ));
+ connect( remCoordBut, SIGNAL( clicked()), SLOT( onRemovePoint() ));
+ connect( myTabs, SIGNAL( currentChanged(int)),SLOT( onTabChanged(int)));
+
+ LightApp_SelectionMgr* selMgr = SMESHGUI::GetSMESHGUI()->selectionMgr();
+ connect( selMgr, SIGNAL(currentSelectionChanged()), SLOT( onSelectionChanged()));
+
+ return fr;
+}
+
+//=======================================================================
+//function : retrieveParams
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::retrieveParams() const
+{
+ StdMeshers::StdMeshers_QuadrangleParams_var h =
+ StdMeshers::StdMeshers_QuadrangleParams::_narrow( initParamsHypothesis() );
+
+ // name
+ if( myName )
+ myName->setText( hypName() );
+
+ // main shape
+ myVertexSelWdg->SetMaxSize(1);
+ QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry();
+ QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry();
+ if ( anEntry.isEmpty() )
+ anEntry = h->GetObjectEntry();
+ myVertexSelWdg->SetGeomShapeEntry(anEntry);
+ myVertexSelWdg->SetMainShapeEntry(aMainEntry);
+
+ if ( !isCreation())
+ {
+ // type
+ myTypeWdg->SetType(int(h->GetQuadType()));
+
+ // vertex
+ int vertID = h->GetTriaVertex();
+ if (vertID > 0) {
+ SMESH::long_array_var aVec = new SMESH::long_array;
+ aVec->length(1);
+ aVec[0] = vertID;
+ myVertexSelWdg->SetListOfIDs(aVec);
+ }
+
+ // enforced nodes
+ GEOM::ListOfGO_var shapes;
+ SMESH::nodes_array_var points;
+ h->GetEnforcedNodes( shapes, points );
+ for ( int i = 0; i < shapes->length(); ++i )
+ {
+ CORBA::String_var name = shapes[i]->GetName();
+ CORBA::String_var entry = shapes[i]->GetStudyEntry();
+ QListWidgetItem* item = new QListWidgetItem( name.in() );
+ item->setData( Qt::UserRole, entry.in() );
+ myShapesList->addItem( item );
+ }
+ for ( int i = 0; i < points->length(); ++i )
+ {
+ QTreeWidgetItem* item = new QTreeWidgetItem
+ ( QStringList()
+ << QString::number( points[i].x )
+ << QString::number( points[i].y )
+ << QString::number( points[i].z ));
+ item->setFlags( item->flags() | Qt::ItemIsEditable );
+ myCoordsTreeWdg->addTopLevelItem( item );
+ }
+ }
+ ((StdMeshersGUI_QuadrangleParamCreator*) this)->onSelectionChanged();
+}
+
+//=======================================================================
+//function : storeParams
+//purpose :
+//=======================================================================
+
+QString StdMeshersGUI_QuadrangleParamCreator::storeParams() const
+{
+ StdMeshers::StdMeshers_QuadrangleParams_var h =
+ StdMeshers::StdMeshers_QuadrangleParams::_narrow( hypothesis() );
+
+ // name
+ if( myName )
+ SMESH::SetName( SMESH::FindSObject( h ), myName->text().toLatin1().constData() );
+
+ // transition
+ h->SetQuadType( StdMeshers::QuadType( myTypeWdg->GetType()) );
+
+ // vertex
+ if ( myVertexSelWdg->GetListSize() > 0 )
+ {
+ h->SetTriaVertex( myVertexSelWdg->GetListOfIDs()[0] ); // getlist must be called once
+ h->SetObjectEntry( myVertexSelWdg->GetMainShapeEntry() );
+ }
+ else
+ {
+ h->SetTriaVertex( -1 );
+ }
+
+ // enfored nodes
+
+ GEOM::ListOfGO_var goList = new GEOM::ListOfGO;
+ int nbShapes = 0;
+ goList->length( myShapesList->count() );
+ for ( int i = 0; i < myShapesList->count(); ++i )
+ {
+ QListWidgetItem* item = myShapesList->item(i);
+ QString entry = item->data( Qt::UserRole ).toString();
+ Handle(SALOME_InteractiveObject) io =
+ new SALOME_InteractiveObject( entry.toStdString().c_str(), "GEOM" );
+ GEOM::GEOM_Object_var go = GEOMBase::ConvertIOinGEOMObject( io );
+ if ( !go->_is_nil() )
+ goList[ nbShapes++ ] = go;
+ }
+ goList->length( nbShapes );
+
+ SMESH::nodes_array_var points = new SMESH::nodes_array;
+ points->length( myCoordsTreeWdg->topLevelItemCount() );
+ for ( int i = 0; i < myCoordsTreeWdg->topLevelItemCount(); ++i )
+ {
+ QTreeWidgetItem* item = myCoordsTreeWdg->topLevelItem( i );
+ points[i].x = item->text(0).toInt();
+ points[i].y = item->text(1).toInt();
+ points[i].z = item->text(2).toInt();
+ }
+ h->SetEnforcedNodes( goList, points );
+
+ return "";
+}
+
+//=======================================================================
+//function : onTypeChanged
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onTypeChanged(int type)
+{
+ myTabs->setTabEnabled( TAB_ENF_POINTS, ( type != StdMeshers::QUAD_REDUCED ));
+}
+
+//=======================================================================
+//function : onAddShape
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onAddShape()
+{
+ if ( !mySelectedShapeIO.IsNull() )
+ {
+ QListWidgetItem* item = new QListWidgetItem( mySelectedShapeIO->getName() );
+ item->setData( Qt::UserRole, mySelectedShapeIO->getEntry() );
+ myShapesList->addItem( item );
+ mySelectedShapeIO.Nullify();
+ myAddShapeBut->setEnabled( false );
+ }
+}
+
+//=======================================================================
+//function : onRemoveShape
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onRemoveShape()
+{
+ if ( QListWidgetItem * item = myShapesList->currentItem() )
+ delete item;
+ onSelectionChanged();
+}
+
+//=======================================================================
+//function : onAddPoint
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onAddPoint()
+{
+ QTreeWidgetItem* item = new QTreeWidgetItem( QStringList() << "0" << "0" << "0" );
+ item->setFlags( item->flags() | Qt::ItemIsEditable );
+ myCoordsTreeWdg->addTopLevelItem( item );
+}
+
+//=======================================================================
+//function : onRemovePoint
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onRemovePoint()
+{
+ if ( myCoordsTreeWdg->topLevelItemCount() )
+ delete myCoordsTreeWdg->currentItem();
+}
+
+//=======================================================================
+//function : onSelectionChanged
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onSelectionChanged()
+{
+ mySelectedShapeIO.Nullify();
+
+ // find a sole selected geometry
+ LightApp_SelectionMgr* selMgr = SMESHGUI::GetSMESHGUI()->selectionMgr();
+ SALOME_ListIO selList;
+ selMgr->selectedObjects( selList );
+ SALOME_ListIteratorOfListIO selIt( selList );
+ for ( ; selIt.More(); selIt.Next() )
+ {
+ GEOM::GEOM_Object_var go = GEOMBase::ConvertIOinGEOMObject( selIt.Value() );
+ if ( !go->_is_nil() )
+ {
+ if ( !mySelectedShapeIO.IsNull() )
+ {
+ mySelectedShapeIO.Nullify();
+ break;
+ }
+ mySelectedShapeIO = selIt.Value();
+ if ( !mySelectedShapeIO->getName() || !mySelectedShapeIO->getName()[0] )
+ mySelectedShapeIO.Nullify();
+ }
+ }
+ // check if a selected geometry is not already in myShapesList
+ if ( !mySelectedShapeIO.IsNull() )
+ {
+ for ( int i = 0; i < myShapesList->count(); ++i )
+ if ( myShapesList->item(i)->data( Qt::UserRole ) == mySelectedShapeIO->getEntry() )
+ {
+ mySelectedShapeIO.Nullify();
+ break;
+ }
+ }
+ myAddShapeBut->setEnabled( !mySelectedShapeIO.IsNull() );
+}
+
+//=======================================================================
+//function : onTabChanged
+//purpose :
+//=======================================================================
+
+void StdMeshersGUI_QuadrangleParamCreator::onTabChanged(int i)
+{
+ myVertexSelWdg->showPreview( i == TAB_VERTEX );
+}
+
+//================================================================================
+// function : Constructor
+// purpose :
+//================================================================================
+
StdMeshersGUI_QuadrangleParamWdg::StdMeshersGUI_QuadrangleParamWdg (QWidget * parent)
- : QWidget(parent),
- myType(0)
+ : QWidget(parent), myType(0)
{
myType = new QButtonGroup (this);
@@ -71,6 +443,8 @@ StdMeshersGUI_QuadrangleParamWdg::StdMeshersGUI_QuadrangleParamWdg (QWidget * pa
setLayout(typeLay);
setMinimumWidth(300);
+
+ connect( myType, SIGNAL( buttonClicked(int)), this, SIGNAL( typeChanged(int)));
}
//================================================================================
@@ -98,3 +472,25 @@ int StdMeshersGUI_QuadrangleParamWdg::GetType()
{
return myType->checkedId();
}
+
+//================================================================================
+/*!
+ \brief Constructor
+*/
+StdMeshersGUI_QuadrangleParamCreator::
+ItemDelegate::ItemDelegate( QObject* parent ) : QItemDelegate( parent )
+{
+}
+//================================================================================
+/*!
+ \brief Create item editor widget
+*/
+QWidget* StdMeshersGUI_QuadrangleParamCreator::
+ItemDelegate::createEditor( QWidget* parent,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index ) const
+{
+ SMESHGUI_SpinBox* sb = new SMESHGUI_SpinBox( parent );
+ sb->RangeStepAndValidator( COORD_MIN, COORD_MAX, 10 );
+ return sb;
+}
diff --git a/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.h b/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.h
index 7ce5b314d..539c83167 100644
--- a/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.h
+++ b/src/StdMeshersGUI/StdMeshersGUI_QuadrangleParamWdg.h
@@ -24,26 +24,104 @@
// SMESH includes
#include "SMESH_StdMeshersGUI.hxx"
+#include "StdMeshersGUI_StdHypothesisCreator.h"
+
+#include
// Qt includes
#include
+#include
+
class QButtonGroup;
+class QLineEdit;
+class QListWidget;
+class QPushButton;
+class QTabWidget;
+class QTreeWidget;
+class StdMeshersGUI_QuadrangleParamWdg;
+class StdMeshersGUI_SubShapeSelectorWdg;
+//================================================================================
+/*!
+ * \brief Quadrangle Parameters Creator
+ */
+class STDMESHERSGUI_EXPORT StdMeshersGUI_QuadrangleParamCreator : public StdMeshersGUI_StdHypothesisCreator
+{
+ Q_OBJECT
+
+ class ItemDelegate;
+
+ public:
+ StdMeshersGUI_QuadrangleParamCreator( const QString& aHypType );
+
+ //virtual bool checkParams( QString& ) const;
+ virtual QString helpPage() const;
+
+ protected:
+ virtual QFrame* buildFrame();
+ virtual void retrieveParams() const;
+ virtual QString storeParams() const;
+
+ private slots:
+
+ void onTypeChanged(int type);
+ void onAddShape();
+ void onRemoveShape();
+ void onAddPoint();
+ void onRemovePoint();
+ void onSelectionChanged();
+ void onTabChanged(int);
+
+ private:
+
+ QLineEdit* myName;
+ StdMeshersGUI_QuadrangleParamWdg* myTypeWdg;
+ StdMeshersGUI_SubShapeSelectorWdg* myVertexSelWdg;
+ QListWidget* myShapesList;
+ QPushButton* myAddShapeBut;
+ QTreeWidget* myCoordsTreeWdg;
+ QTabWidget* myTabs;
+ Handle(SALOME_InteractiveObject) mySelectedShapeIO;
+};
+
+//================================================================================
+/*!
+ * \brief Transition type widget
+ */
class STDMESHERSGUI_EXPORT StdMeshersGUI_QuadrangleParamWdg : public QWidget
{
Q_OBJECT
-public:
+ public:
StdMeshersGUI_QuadrangleParamWdg (QWidget* parent = 0);
~StdMeshersGUI_QuadrangleParamWdg();
void SetType (int theType);
int GetType ();
-private:
- // Quadranle preference, Triangle preference, Reduced
- QButtonGroup* myType;
+ GEOM::ListOfGO* GetShapes();
+ SMESH::nodes_array* GetPoints();
+ void Set( GEOM::ListOfGO_var shapes, SMESH::nodes_array_var points );
+
+ signals:
+
+ void typeChanged(int);
+
+ private:
+ QButtonGroup* myType; // Quadranle preference, Triangle preference, Reduced
+};
+
+//================================================================================
+/*!
+ * \brief Item delegate for a tree widget
+ */
+class StdMeshersGUI_QuadrangleParamCreator::ItemDelegate : public QItemDelegate
+{
+ Q_OBJECT
+public:
+ ItemDelegate( QObject* );
+ QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, const QModelIndex& ) const;
};
#endif // STDMESHERSGUI_QUADRANGLEPARAMWDG_H
diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts
index 8b94762e7..08dcd5671 100644
--- a/src/StdMeshersGUI/StdMeshers_msg_en.ts
+++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts
@@ -492,6 +492,29 @@
Reduced
+
+ StdMeshersGUI_QuadrangleParamCreator
+
+ POINTS
+ Points
+
+
+ SHAPES
+ Vertices
+
+
+ TRANSITION
+ Transition
+
+
+ ENF_NODES
+ Enforced nodes
+
+
+
+
+
+
StdMeshersGUI_LayerDistributionParamWdg