]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
EDF 2281 : Second constructor and final documentation for the divided disk
authorrnc <rnc@opencascade.com>
Fri, 20 Jul 2012 09:47:00 +0000 (09:47 +0000)
committerrnc <rnc@opencascade.com>
Fri, 20 Jul 2012 09:47:00 +0000 (09:47 +0000)
14 files changed:
doc/salome/gui/GEOM/images/divided_disk.png
doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png [new file with mode: 0644]
doc/salome/gui/GEOM/images/divided_disk_dlg.png [new file with mode: 0644]
doc/salome/gui/GEOM/input/creating_divideddisk.doc
idl/GEOM_Gen.idl
src/AdvancedGUI/AdvancedGUI_DividedDiskDlg.cxx
src/AdvancedGUI/AdvancedGUI_DividedDiskDlg.h
src/GEOMImpl/GEOMImpl_DividedDiskDriver.cxx
src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx
src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx
src/GEOMImpl/GEOMImpl_IDividedDisk.hxx
src/GEOM_I/GEOM_IAdvancedOperations_i.cc
src/GEOM_I/GEOM_IAdvancedOperations_i.hh
src/GEOM_SWIG/geompyDC.py

index 8f0bb3ee46cfc591e262e70d40b499d93b564ce7..fe0868d9e63a535c0ab96f6aa22943efb3fe989b 100644 (file)
Binary files a/doc/salome/gui/GEOM/images/divided_disk.png and b/doc/salome/gui/GEOM/images/divided_disk.png differ
diff --git a/doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png b/doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png
new file mode 100644 (file)
index 0000000..c57f8f6
Binary files /dev/null and b/doc/salome/gui/GEOM/images/divided_disk_PntVecR_dlg.png differ
diff --git a/doc/salome/gui/GEOM/images/divided_disk_dlg.png b/doc/salome/gui/GEOM/images/divided_disk_dlg.png
new file mode 100644 (file)
index 0000000..3a8b8ba
Binary files /dev/null and b/doc/salome/gui/GEOM/images/divided_disk_dlg.png differ
index 0854039ed0839af44985510bf18c3e2f86540071..b42460f40ac06346afc2b656cc65626e0260bea4 100644 (file)
@@ -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".
 
index 370e035a87a39a3bbf1aeea88bba98728f96615c..b5bfd563002dc779d99adea227601c85bc7e8ce5 100644 (file)
@@ -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
index 8b4fed3b780797e0ddbb631fc1775c9633769893..5ac411273ad402852e7ce55fef946e4e72b667ff 100644 (file)
 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(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(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()));
+  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());
-
-  //@@ 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());
+  CORBA::Double theRatio = 50;  
+  CORBA::Double theR = 0;
+  
+  switch (getConstructorId()) {
+  case 0:
+    theR = GroupParams->SpinBox_DX->value(); // 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());
+    }
+    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());
index 5d3ff0a02adf3dc75dadf3bf6c26dac868d17151..b84b63a036a375178844c5e93a7801218a3a813d 100644 (file)
@@ -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();
index d14c6f6b71ea1af277b734fb2935c4e3978ecc41..e0cecd9695254ec90c074b96140b73a660f18727 100644 (file)
@@ -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;
index fc39655cfe58df1a3534b0a36147d145c94172d7..703112c7c9a93983e052e732c5e4351508955bfb 100644 (file)
@@ -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
index a687f35b7a8ec938a31652a47761837dd425bbbe..c05575fb20b1fafeb8bde3674d2c198472d9ae64 100644 (file)
@@ -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 @@*/
 };
index 0f6b0205ae3ff94623620581f65875b04106f2b4..2c0a8f9b08e50c984a25b474113a27856f3f28d6 100644 (file)
@@ -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;
index e007eefc4f4da8f19645db2344e6f7ecc0d21695..900fcf54452f1440001f863e6e020947f020ccf8 100644 (file)
@@ -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
index ec09a18f5f8d1ab671236a7c139f18537218ebe4..c692bc3cc7a9a8b7cee525d1dcc8e6bd5625ebf1 100644 (file)
@@ -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 @@*/
 
index 4b23d4eab5c97f1ba6df91013f1daad779ca135e..d178b45a7d1da8ff7cd6d4bf19dd14375fc85fba 100644 (file)
@@ -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