mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-01-26 22:00:34 +05:00
EDF 2281 : Second constructor and final documentation for the divided disk
This commit is contained in:
parent
91343094ce
commit
449a8ffa1a
Binary file not shown.
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 16 KiB |
BIN
doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png
Normal file
BIN
doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
BIN
doc/salome/gui/GEOM/images/divided_disk_dlg.png
Normal file
BIN
doc/salome/gui/GEOM/images/divided_disk_dlg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
@ -2,29 +2,46 @@
|
||||
|
||||
\page create_divideddisk_page DividedDisk
|
||||
|
||||
The <b>Divided disk</b> object is a disk divided into \b blocks. It means that it's a shape ready to be meshed with ruled hexaedra.
|
||||
Moreover this shape can be used as a basis in an \ref create_extrusion_alongpath_page "Extrusion along a path operation" in order to obtain any tube shape prepared for hexaedral mesh
|
||||
The <b>Divided disk</b> object is a disk divided into \b blocks. It means that it's a shape <b>prepared for hexaedral meshing</b>.
|
||||
|
||||
\n Moreover this shape can be used as a basis in an \ref create_extrusion_alongpath_page "Extrusion along a path" operation in order to obtain any <b>tube shape</b> prepared for hexaedral meshing
|
||||
(see example below).
|
||||
|
||||
Example:
|
||||
|
||||
\image html divided_disk.png
|
||||
|
||||
To create a \b DividedDisk in the <b>Main Menu</b> select <b>New Entity - >
|
||||
To create a <b> Divided Disk </b> in the <b>Main Menu</b> select <b>New Entity - >
|
||||
Advanced - > DividedDisk </b>
|
||||
|
||||
\n Then there are 2 ways to create a <b> Divided Disk</b> in 3D space.
|
||||
\n For both operations :
|
||||
Specify the parameters of the DividedDisk object creation in the opened dialog
|
||||
box and press "Apply" or "Apply & Close" button.
|
||||
Result of each operation will be a GEOM_Object.
|
||||
|
||||
<b>TUI Command:</b> <em>geompy.MakeDividedDisk(R, Orientation)</em>
|
||||
\n First way : by radius and orientation (plane "OXY", "OYZ" or "OZX"). The resulting disk is located at the origin of coordinates
|
||||
|
||||
<b>TUI Command:</b> <em>geompy.MakeDividedDisk(Radius, Orientation)</em>
|
||||
|
||||
<b>Arguments:</b>
|
||||
- \b R - Radius of the disk
|
||||
- \b Radius - Radius of the disk
|
||||
- \b Orientation - Plane on wich the disk will be built
|
||||
|
||||
\image html divided_disk_dlg.png
|
||||
|
||||
\n Second way : by giving its center, normal and radius.
|
||||
|
||||
<b>TUI Command:</b> <em>geompy.MakeDividedDiskPntVecR(Center, Vector,
|
||||
Radius)</em>
|
||||
|
||||
<b>Arguments:</b>
|
||||
- \b Center - Center of the disk
|
||||
- \b Vector - Normal to the plane of the disk
|
||||
- \b Radius - Radius of the disk
|
||||
|
||||
\image html divided_disk_PntVecR_dlg.png
|
||||
|
||||
Our <b>TUI Scripts</b> provide you with useful examples of creation of
|
||||
\ref tui_creation_divideddisk "Advanced objects".
|
||||
|
||||
|
@ -3763,10 +3763,24 @@ module GEOM
|
||||
* can be use to create divided pipes for later meshing in hexaedra.
|
||||
* \param theR Radius of the disk
|
||||
* \param theRatio Relative size of the central square diagonal against the disk diameter
|
||||
* \param theOrientation Plane on which the disk will be built
|
||||
* \return New GEOM_Object, containing the created shape.
|
||||
*/
|
||||
GEOM_Object MakeDividedDisk (in double theR, in double theRatio, in short theOrientation);
|
||||
|
||||
/*!
|
||||
* \brief Create a Disk prepared for hexa meshing with given center, normal vector and radius.
|
||||
* \param thePnt disk center.
|
||||
* \param theVec Vector, normal to the plane of the disk.
|
||||
* \param theR Disk radius.
|
||||
* \param theRatio Relative size of the central square diagonal against the disk diameter
|
||||
* \return New GEOM_Object, containing the created disk.
|
||||
*/
|
||||
GEOM_Object MakeDividedDiskPntVecR ( in GEOM_Object thePnt,
|
||||
in GEOM_Object theVec,
|
||||
in double theR,
|
||||
in double theRatio);
|
||||
|
||||
/*!
|
||||
* Builds a cylinder prepared for hexa meshes
|
||||
* \param theR Radius of the cylinder
|
||||
|
@ -45,16 +45,19 @@
|
||||
AdvancedGUI_DividedDiskDlg::AdvancedGUI_DividedDiskDlg (GeometryGUI* theGeometryGUI, QWidget* parent)
|
||||
: GEOMBase_Skeleton(theGeometryGUI, parent, false)
|
||||
{
|
||||
QPixmap imageOp (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_DIVIDEDDISK_R_RATIO")));
|
||||
// QPixmap imageOp (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_DIVIDEDDISK_R_RATIO")));
|
||||
QPixmap imageOp1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_DISK_R")));
|
||||
QPixmap imageOp2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_DISK_PNT_VEC_R")));
|
||||
QPixmap imageSel (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
|
||||
|
||||
setWindowTitle(tr("GEOM_DIVIDEDDISK_TITLE"));
|
||||
|
||||
/***************************************************************/
|
||||
mainFrame()->GroupConstructors->setTitle(tr("GEOM_DIVIDEDDISK"));
|
||||
mainFrame()->RadioButton1->setIcon(imageOp);
|
||||
mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
|
||||
mainFrame()->RadioButton2->close();
|
||||
mainFrame()->RadioButton1->setIcon(imageOp1);
|
||||
mainFrame()->RadioButton2->setIcon(imageOp2);
|
||||
// mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
|
||||
// mainFrame()->RadioButton2->close();
|
||||
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
|
||||
mainFrame()->RadioButton3->close();
|
||||
|
||||
@ -67,12 +70,23 @@ AdvancedGUI_DividedDiskDlg::AdvancedGUI_DividedDiskDlg (GeometryGUI* theGeometry
|
||||
GroupOrientation->RadioButton1->setText(tr("GEOM_WPLANE_OXY"));
|
||||
GroupOrientation->RadioButton2->setText(tr("GEOM_WPLANE_OYZ"));
|
||||
GroupOrientation->RadioButton3->setText(tr("GEOM_WPLANE_OZX"));
|
||||
|
||||
GroupPntVecR = new DlgRef_2Sel1Spin(centralWidget());
|
||||
GroupPntVecR->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
|
||||
GroupPntVecR->TextLabel1->setText(tr("GEOM_CENTER_POINT"));
|
||||
GroupPntVecR->TextLabel2->setText(tr("GEOM_VECTOR"));
|
||||
GroupPntVecR->TextLabel3->setText(tr("GEOM_RADIUS"));
|
||||
GroupPntVecR->PushButton1->setIcon(imageSel);
|
||||
GroupPntVecR->PushButton2->setIcon(imageSel);
|
||||
GroupPntVecR->LineEdit1->setReadOnly(true);
|
||||
GroupPntVecR->LineEdit2->setReadOnly(true);
|
||||
//@@ setup dialog box layout here @@//
|
||||
|
||||
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
|
||||
layout->setMargin(0); layout->setSpacing(6);
|
||||
layout->addWidget(GroupParams);
|
||||
layout->addWidget(GroupOrientation);
|
||||
layout->addWidget(GroupPntVecR);
|
||||
/***************************************************************/
|
||||
|
||||
setHelpFileName("create_divideddisk_page.html");
|
||||
@ -100,7 +114,8 @@ void AdvancedGUI_DividedDiskDlg::Init()
|
||||
|
||||
// min, max, step and decimals for spin boxes & initial values
|
||||
initSpinBox(GroupParams->SpinBox_DX, 0.00001, COORD_MAX, step, "length_precision" );
|
||||
GroupParams->SpinBox_DX->setValue(100);
|
||||
GroupParams ->SpinBox_DX->setValue(100);
|
||||
GroupPntVecR->SpinBox_DX->setValue(100);
|
||||
|
||||
GroupOrientation->RadioButton1->setChecked(true);
|
||||
myOrientation = 1;
|
||||
@ -110,17 +125,22 @@ void AdvancedGUI_DividedDiskDlg::Init()
|
||||
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
||||
connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)),
|
||||
this, SLOT(SetDoubleSpinBoxStep(double)));
|
||||
|
||||
connect(GroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
|
||||
|
||||
connect(GroupOrientation->RadioButton1, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
connect(GroupOrientation->RadioButton2, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
connect(GroupOrientation->RadioButton3, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
|
||||
|
||||
connect(GroupPntVecR->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||
connect(GroupPntVecR->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||
|
||||
connect(GroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
|
||||
connect(GroupPntVecR->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
|
||||
|
||||
connect(GroupOrientation->RadioButton1, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
connect(GroupOrientation->RadioButton2, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
connect(GroupOrientation->RadioButton3, SIGNAL(clicked()), this, SLOT(RadioButtonClicked()));
|
||||
|
||||
initName(tr("GEOM_DIVIDEDDISK"));
|
||||
|
||||
resize(minimumSizeHint());
|
||||
displayPreview(true);
|
||||
ConstructorsClicked(0);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
@ -132,6 +152,60 @@ void AdvancedGUI_DividedDiskDlg::SetDoubleSpinBoxStep (double step)
|
||||
//@@ set double spin box step for all spin boxes here @@//
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ConstructorsClicked()
|
||||
// purpose : Radio button management
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::ConstructorsClicked (int constructorId)
|
||||
{
|
||||
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
||||
|
||||
switch (constructorId) {
|
||||
case 0:
|
||||
{
|
||||
GroupPntVecR->hide();
|
||||
GroupParams->show();
|
||||
GroupOrientation->show();
|
||||
|
||||
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
||||
globalSelection(); // close local contexts, if any
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
GroupParams->hide();
|
||||
GroupOrientation->hide();
|
||||
GroupPntVecR->show();
|
||||
|
||||
GroupPntVecR->PushButton1->click();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
qApp->processEvents();
|
||||
updateGeometry();
|
||||
resize(minimumSizeHint());
|
||||
SelectionIntoArgument();
|
||||
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : RadioButtonClicked()
|
||||
// purpose : Radio button management
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::RadioButtonClicked()
|
||||
{
|
||||
if (GroupOrientation->RadioButton1->isChecked())
|
||||
myOrientation = 1;
|
||||
else if (GroupOrientation->RadioButton2->isChecked())
|
||||
myOrientation = 2;
|
||||
else if (GroupOrientation->RadioButton3->isChecked())
|
||||
myOrientation = 3;
|
||||
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ClickOnOk()
|
||||
// purpose :
|
||||
@ -156,6 +230,99 @@ bool AdvancedGUI_DividedDiskDlg::ClickOnApply()
|
||||
return true;
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : SelectionIntoArgument()
|
||||
// purpose : Called when selection is changed or on dialog initialization or activation
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::SelectionIntoArgument()
|
||||
{
|
||||
if (getConstructorId() == 0)
|
||||
return;
|
||||
|
||||
erasePreview();
|
||||
myEditCurrentArgument->setText("");
|
||||
|
||||
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
|
||||
SALOME_ListIO aSelList;
|
||||
aSelMgr->selectedObjects(aSelList);
|
||||
|
||||
if (aSelList.Extent() != 1) {
|
||||
if (myEditCurrentArgument == GroupPntVecR->LineEdit1) myPoint.nullify();
|
||||
else if (myEditCurrentArgument == GroupPntVecR->LineEdit2) myDir.nullify();
|
||||
return;
|
||||
}
|
||||
|
||||
TopAbs_ShapeEnum aNeedType = myEditCurrentArgument == GroupPntVecR->LineEdit2 ? TopAbs_EDGE : TopAbs_VERTEX;
|
||||
GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType );
|
||||
TopoDS_Shape aShape;
|
||||
if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ){
|
||||
QString aName = GEOMBase::GetName( aSelectedObject.get() );
|
||||
|
||||
myEditCurrentArgument->setText(aName);
|
||||
|
||||
// clear selection
|
||||
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
||||
myGeomGUI->getApp()->selectionMgr()->clearSelected();
|
||||
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
|
||||
this, SLOT(SelectionIntoArgument()));
|
||||
|
||||
if (myEditCurrentArgument == GroupPntVecR->LineEdit1) {
|
||||
myPoint = aSelectedObject;
|
||||
if (myPoint && !myDir)
|
||||
GroupPntVecR->PushButton2->click();
|
||||
}
|
||||
else if (myEditCurrentArgument == GroupPntVecR->LineEdit2) {
|
||||
myDir = aSelectedObject;
|
||||
if (myDir && !myPoint)
|
||||
GroupPntVecR->PushButton1->click();
|
||||
}
|
||||
}
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : SetEditCurrentArgument()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::SetEditCurrentArgument()
|
||||
{
|
||||
QPushButton* send = (QPushButton*)sender();
|
||||
|
||||
if (send == GroupPntVecR->PushButton1) {
|
||||
myEditCurrentArgument = GroupPntVecR->LineEdit1;
|
||||
|
||||
GroupPntVecR->PushButton2->setDown(false);
|
||||
GroupPntVecR->LineEdit2->setEnabled(false);
|
||||
}
|
||||
else if (send == GroupPntVecR->PushButton2) {
|
||||
myEditCurrentArgument = GroupPntVecR->LineEdit2;
|
||||
|
||||
GroupPntVecR->PushButton1->setDown(false);
|
||||
GroupPntVecR->LineEdit1->setEnabled(false);
|
||||
}
|
||||
|
||||
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
|
||||
if (myEditCurrentArgument == GroupPntVecR->LineEdit2) {
|
||||
globalSelection(); // close local contexts, if any
|
||||
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
|
||||
}
|
||||
else {
|
||||
globalSelection(); // close local contexts, if any
|
||||
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX);
|
||||
}
|
||||
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
|
||||
this, SLOT(SelectionIntoArgument()));
|
||||
|
||||
// enable line edit
|
||||
myEditCurrentArgument->setEnabled(true);
|
||||
myEditCurrentArgument->setFocus();
|
||||
// after setFocus(), because it will be setDown(false) when loses focus
|
||||
send->setDown(true);
|
||||
|
||||
// seems we need it only to avoid preview disappearing, caused by selection mode change
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ActivateThisDialog()
|
||||
// purpose :
|
||||
@ -163,7 +330,10 @@ bool AdvancedGUI_DividedDiskDlg::ClickOnApply()
|
||||
void AdvancedGUI_DividedDiskDlg::ActivateThisDialog()
|
||||
{
|
||||
GEOMBase_Skeleton::ActivateThisDialog();
|
||||
displayPreview(true);
|
||||
connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
|
||||
this, SLOT( SelectionIntoArgument() ) );
|
||||
|
||||
ConstructorsClicked( getConstructorId() );
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
@ -176,41 +346,12 @@ void AdvancedGUI_DividedDiskDlg::enterEvent (QEvent*)
|
||||
ActivateThisDialog();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : RadioBittonClicked()
|
||||
// purpose : Radio button management
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::RadioButtonClicked()
|
||||
{
|
||||
if (GroupOrientation->RadioButton1->isChecked())
|
||||
myOrientation = 1;
|
||||
else if (GroupOrientation->RadioButton2->isChecked())
|
||||
myOrientation = 2;
|
||||
else if (GroupOrientation->RadioButton3->isChecked())
|
||||
myOrientation = 3;
|
||||
|
||||
// gp_Pnt theOrigin = gp::Origin();
|
||||
// gp_Dir DirZ = gp::DZ();
|
||||
// gp_Dir DirX = gp::DX();
|
||||
// gp_Dir DirY = gp::DY();
|
||||
//
|
||||
// if (GroupOrientation->RadioButton1->isChecked())
|
||||
// myWPlane = gp_Ax3(theOrigin, DirZ, DirX);
|
||||
// else if (GroupOrientation->RadioButton2->isChecked())
|
||||
// myWPlane = gp_Ax3(theOrigin, DirX, DirY);
|
||||
// else if (GroupOrientation->RadioButton3->isChecked())
|
||||
// myWPlane = gp_Ax3(theOrigin, DirY, DirZ);
|
||||
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ValueChangedInSpinBox()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void AdvancedGUI_DividedDiskDlg::ValueChangedInSpinBox()
|
||||
{
|
||||
//@@ connect custom spin boxes or other widget to this slot in the Init() method for automatic preview update @@//
|
||||
displayPreview(true);
|
||||
}
|
||||
|
||||
@ -247,20 +388,38 @@ bool AdvancedGUI_DividedDiskDlg::execute (ObjectList& objects)
|
||||
GEOM::GEOM_Object_var anObj;
|
||||
|
||||
GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation());
|
||||
CORBA::Double theRatio = 50;
|
||||
CORBA::Double theR = 0;
|
||||
|
||||
switch (getConstructorId()) {
|
||||
case 0:
|
||||
theR = GroupParams->SpinBox_DX->value(); // init parameter value from dialog box ;
|
||||
|
||||
//@@ retrieve input values from the widgets here @@//
|
||||
CORBA::Double theR = GroupParams->SpinBox_DX->value(); //@@ init parameter value from dialog box @@;
|
||||
CORBA::Double theRatio = 50; //@@ init parameter value from dialog box @@;
|
||||
|
||||
// call engine function
|
||||
anObj = anOper->MakeDividedDisk(theR, theRatio, myOrientation);
|
||||
res = !anObj->_is_nil();
|
||||
if (res && !IsPreview())
|
||||
{
|
||||
QStringList aParameters;
|
||||
aParameters << GroupParams->SpinBox_DX->text();
|
||||
if ( aParameters.count() > 0 ) anObj->SetParameters(aParameters.join(":").toLatin1().constData());
|
||||
// call engine function
|
||||
anObj = anOper->MakeDividedDisk(theR, theRatio, myOrientation);
|
||||
res = !anObj->_is_nil();
|
||||
if (res && !IsPreview())
|
||||
{
|
||||
QStringList aParameters;
|
||||
aParameters << GroupParams->SpinBox_DX->text();
|
||||
if ( aParameters.count() > 0 ) anObj->SetParameters(aParameters.join(":").toLatin1().constData());
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
theR = GroupPntVecR->SpinBox_DX->value();
|
||||
|
||||
// call engine function
|
||||
anObj = anOper->MakeDividedDiskPntVecR(myPoint.get(), myDir.get(), theR, theRatio);
|
||||
res = !anObj->_is_nil();
|
||||
if (res && !IsPreview())
|
||||
{
|
||||
QStringList aParameters;
|
||||
aParameters << GroupPntVecR->SpinBox_DX->text();
|
||||
if ( aParameters.count() > 0 ) anObj->SetParameters(aParameters.join(":").toLatin1().constData());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (res)
|
||||
objects.push_back(anObj._retn());
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
class DlgRef_1Spin;
|
||||
class DlgRef_3Radio;
|
||||
class DlgRef_2Sel1Spin;
|
||||
|
||||
//=================================================================================
|
||||
// class : AdvancedGUI_DividedDiskDlg
|
||||
@ -50,13 +51,18 @@ private:
|
||||
void enterEvent( QEvent* );
|
||||
|
||||
private:
|
||||
GEOM::GeomObjPtr myPoint, myDir;
|
||||
DlgRef_1Spin* GroupParams;
|
||||
DlgRef_3Radio* GroupOrientation;
|
||||
DlgRef_2Sel1Spin* GroupPntVecR;
|
||||
int myOrientation;
|
||||
|
||||
private slots:
|
||||
void ConstructorsClicked ( int );
|
||||
void ClickOnOk();
|
||||
bool ClickOnApply();
|
||||
void SetEditCurrentArgument();
|
||||
void SelectionIntoArgument();
|
||||
void ActivateThisDialog();
|
||||
void ValueChangedInSpinBox();
|
||||
void RadioButtonClicked();
|
||||
|
@ -50,8 +50,9 @@
|
||||
#include <TFunction_Logbook.hxx>
|
||||
#include <StdFail_NotDone.hxx>
|
||||
|
||||
#include <utilities.h>
|
||||
#include <TopExp.hxx>
|
||||
|
||||
#include <utilities.h>
|
||||
//@@ include required header files here @@//
|
||||
|
||||
//=======================================================================
|
||||
@ -91,17 +92,34 @@ Standard_Integer GEOMImpl_DividedDiskDriver::Execute(TFunction_Logbook& log) con
|
||||
double Ratio = aData.GetRatio();
|
||||
|
||||
// Build reference disk (in the global coordinate system)
|
||||
TopoDS_Shell S = MakeDisk( R, Ratio );
|
||||
TopoDS_Shell aDisk = MakeDisk( R, Ratio );
|
||||
|
||||
if (aType == DIVIDEDDISK_R_RATIO) {
|
||||
if (aType == DIVIDEDDISK_R_RATIO)
|
||||
{
|
||||
int theOrientation = aData.GetOrientation();
|
||||
aShape = TransformShape(S, theOrientation);
|
||||
aShape = TransformShape(aDisk, theOrientation);
|
||||
}
|
||||
else if (aType == DIVIDEDDISK_R_VECTOR_PNT){
|
||||
// other construction modes here
|
||||
gp_Pnt P = gp::Origin();
|
||||
gp_Dir V = gp::DZ();
|
||||
aShape = TransformShape(S, P, V);
|
||||
else if (aType == DIVIDEDDISK_R_VECTOR_PNT)
|
||||
{
|
||||
Handle(GEOM_Function) aRefPoint = aData.GetCenter();
|
||||
Handle(GEOM_Function) aRefVector = aData.GetVector();
|
||||
TopoDS_Shape aShapePnt = aRefPoint->GetValue();
|
||||
TopoDS_Shape aShapeVec = aRefVector->GetValue();
|
||||
|
||||
if (aShapePnt.ShapeType() == TopAbs_VERTEX &&
|
||||
aShapeVec.ShapeType() == TopAbs_EDGE)
|
||||
{
|
||||
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt));
|
||||
TopoDS_Edge anE = TopoDS::Edge(aShapeVec);
|
||||
TopoDS_Vertex V1, V2;
|
||||
TopExp::Vertices(anE, V1, V2, Standard_True);
|
||||
if (!V1.IsNull() && !V2.IsNull())
|
||||
{
|
||||
gp_Vec aVec (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2));
|
||||
gp_Dir aDir(aVec);
|
||||
aShape = TransformShape(aDisk, aPnt, aDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (aShape.IsNull()) return 0;
|
||||
|
@ -2290,6 +2290,69 @@ Handle(GEOM_Object) GEOMImpl_IAdvancedOperations::MakeDividedDisk (double theR,
|
||||
return aShape;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* This function allows to create a disk already divided into blocks. It can be
|
||||
* used to create divided pipes for later meshing in hexaedra.
|
||||
* \param theR Radius of the disk
|
||||
* \param theRatio Relative size of the central square diagonal against the disk diameter
|
||||
* \return New GEOM_Object, containing the created shape.
|
||||
*/
|
||||
//=============================================================================
|
||||
Handle(GEOM_Object) GEOMImpl_IAdvancedOperations::MakeDividedDiskPntVecR (Handle(GEOM_Object) thePnt,
|
||||
Handle(GEOM_Object) theVec,
|
||||
double theR,
|
||||
double theRatio)
|
||||
{
|
||||
SetErrorCode(KO);
|
||||
|
||||
//Add a new object
|
||||
Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), GEOM_DIVIDEDDISK);
|
||||
|
||||
//Add a new shape function with parameters
|
||||
Handle(GEOM_Function) aFunction = aShape->AddFunction(GEOMImpl_DividedDiskDriver::GetID(), DIVIDEDDISK_R_VECTOR_PNT);
|
||||
if (aFunction.IsNull()) return NULL;
|
||||
|
||||
//Check if the function is set correctly
|
||||
if (aFunction->GetDriverGUID() != GEOMImpl_DividedDiskDriver::GetID()) return NULL;
|
||||
|
||||
GEOMImpl_IDividedDisk aData (aFunction);
|
||||
|
||||
Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
|
||||
Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
|
||||
|
||||
if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL;
|
||||
|
||||
aData.SetCenter(aRefPnt);
|
||||
aData.SetVector(aRefVec);
|
||||
|
||||
aData.SetR(theR);
|
||||
aData.SetRatio(theRatio);
|
||||
|
||||
//Compute the resulting value
|
||||
try {
|
||||
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
|
||||
OCC_CATCH_SIGNALS;
|
||||
#endif
|
||||
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||
SetErrorCode("DividedDisk 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) << aShape << " = geompy.MakeDividedDiskPntVecR(" << thePnt << ", " << theVec << ", " << theR << ")";
|
||||
|
||||
SetErrorCode(OK);
|
||||
|
||||
return aShape;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* Builds a cylinder prepared for hexa meshes
|
||||
|
@ -109,7 +109,13 @@ public:
|
||||
Handle(GEOM_Object) P1 = 0,
|
||||
Handle(GEOM_Object) P2 = 0,
|
||||
Handle(GEOM_Object) P3 = 0);
|
||||
|
||||
Standard_EXPORT Handle(GEOM_Object) MakeDividedDisk (double theR, double theRatio, int theOrientation);
|
||||
Standard_EXPORT Handle(GEOM_Object) MakeDividedDiskPntVecR (Handle(GEOM_Object) thePnt,
|
||||
Handle(GEOM_Object) theVec,
|
||||
double theR,
|
||||
double theRatio);
|
||||
|
||||
Standard_EXPORT Handle(GEOM_Object) MakeDividedCylinder (double theR, double theH);
|
||||
/*@@ insert new functions before this line @@ do not remove this line @@*/
|
||||
};
|
||||
|
@ -28,6 +28,9 @@
|
||||
#define DIVIDEDDISK_ARG_RATIO 2
|
||||
#define DIVIDEDDISK_ARG_ORIENT 3
|
||||
|
||||
#define DIVIDEDDISK_ARG_CENTER 4
|
||||
#define DIVIDEDDISK_ARG_VECTOR 5
|
||||
|
||||
class GEOMImpl_IDividedDisk
|
||||
{
|
||||
public:
|
||||
@ -41,6 +44,12 @@ public:
|
||||
|
||||
void SetOrientation(int theOrientation) { _func->SetInteger(DIVIDEDDISK_ARG_ORIENT, theOrientation); }
|
||||
double GetOrientation() { return _func->GetInteger(DIVIDEDDISK_ARG_ORIENT); }
|
||||
|
||||
void SetCenter(Handle(GEOM_Function) theP) { _func->SetReference(DIVIDEDDISK_ARG_CENTER, theP); }
|
||||
void SetVector(Handle(GEOM_Function) theV) { _func->SetReference(DIVIDEDDISK_ARG_VECTOR, theV); }
|
||||
|
||||
Handle(GEOM_Function) GetCenter() { return _func->GetReference(DIVIDEDDISK_ARG_CENTER); }
|
||||
Handle(GEOM_Function) GetVector() { return _func->GetReference(DIVIDEDDISK_ARG_VECTOR); }
|
||||
|
||||
private:
|
||||
Handle(GEOM_Function) _func;
|
||||
|
@ -345,6 +345,36 @@ GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* MakeDividedDiskPntVecR
|
||||
*/
|
||||
//=============================================================================
|
||||
GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr thePnt,
|
||||
GEOM::GEOM_Object_ptr theVec,
|
||||
CORBA::Double theR,
|
||||
CORBA::Double theRatio)
|
||||
{
|
||||
GEOM::GEOM_Object_var aGEOMObject;
|
||||
|
||||
//Set a not done flag
|
||||
GetOperations()->SetNotDone();
|
||||
|
||||
//Get the reference points
|
||||
Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
|
||||
Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
|
||||
|
||||
if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
|
||||
|
||||
// Make DividedDisk
|
||||
Handle(GEOM_Object) anObject =
|
||||
GetOperations()->MakeDividedDiskPntVecR(aPnt, aVec, theR, theRatio);
|
||||
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||
return aGEOMObject._retn();
|
||||
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* Builds a cylinder prepared for hexa meshes
|
||||
|
@ -63,7 +63,16 @@ class GEOM_I_EXPORT GEOM_IAdvancedOperations_i :
|
||||
CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2,
|
||||
CORBA::Double theRF, CORBA::Boolean theHexMesh,
|
||||
GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3);
|
||||
GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR, CORBA::Double theRatio, CORBA::Short theOrientation);
|
||||
|
||||
GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR,
|
||||
CORBA::Double theRatio,
|
||||
CORBA::Short theOrientation);
|
||||
|
||||
GEOM::GEOM_Object_ptr MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr theCenter,
|
||||
GEOM::GEOM_Object_ptr theVector,
|
||||
CORBA::Double theR,
|
||||
CORBA::Double theRatio);
|
||||
|
||||
GEOM::GEOM_Object_ptr MakeDividedCylinder (CORBA::Double theR, CORBA::Double theH);
|
||||
/*@@ insert new functions before this line @@ do not remove this line @@*/
|
||||
|
||||
|
@ -8562,6 +8562,21 @@ class geompyDC(GEOM._objref_GEOM_Gen):
|
||||
RaiseIfFailed("MakeDividedDisk", self.AdvOp)
|
||||
if Parameters: anObj.SetParameters(Parameters)
|
||||
return anObj
|
||||
|
||||
## This function allows creating a disk already divided into blocks. It
|
||||
# can be used to create divided pipes for later meshing in hexaedra.
|
||||
# @param theCenter Center of the disk
|
||||
# @param theVector Normal vector to the plane of the created disk
|
||||
# @param theRadius Radius of the disk
|
||||
# @return New GEOM_Object, containing the created shape.
|
||||
#
|
||||
# @ref tui_creation_divideddisk "Example"
|
||||
def MakeDividedDiskPntVecR(self, theCenter, theVector, theRadius):
|
||||
theRadius, Parameters = ParseParameters(theRadius)
|
||||
anObj = self.AdvOp.MakeDividedDiskPntVecR(theCenter, theVector, theRadius, 50.0)
|
||||
RaiseIfFailed("MakeDividedDiskPntVecR", self.AdvOp)
|
||||
if Parameters: anObj.SetParameters(Parameters)
|
||||
return anObj
|
||||
|
||||
## Builds a cylinder prepared for hexa meshes
|
||||
# @param theR Radius of the cylinder
|
||||
|
Loading…
Reference in New Issue
Block a user