]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
IMP 0016656: EDF531: Default constructor in creation dialog of geometric objects.
authorjfa <jfa@opencascade.com>
Wed, 13 Aug 2008 13:20:56 +0000 (13:20 +0000)
committerjfa <jfa@opencascade.com>
Wed, 13 Aug 2008 13:20:56 +0000 (13:20 +0000)
18 files changed:
doc/salome/gui/GEOM/images/circle1.png
doc/salome/gui/GEOM/images/ellipse.png
doc/salome/gui/GEOM/input/creating_circle.doc
doc/salome/gui/GEOM/input/creating_ellipse.doc
src/BasicGUI/BasicGUI_CircleDlg.cxx
src/BasicGUI/BasicGUI_EllipseDlg.cxx
src/BasicGUI/BasicGUI_VectorDlg.cxx
src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx
src/GEOMImpl/GEOMImpl_CircleDriver.cxx
src/GEOMImpl/GEOMImpl_EllipseDriver.cxx
src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx
src/GEOM_I/GEOM_ICurvesOperations_i.cc
src/GEOM_SWIG/geompyDC.py
src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx
src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx
src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx
src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx
src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx

index 8eae9abbe29d345d4141677df09c23dd02ebb695..c9708f1d7aca590d52ee8131bb7e23eade3a4d07 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/circle1.png and b/doc/salome/gui/GEOM/images/circle1.png differ
index 6bce2c24723e0534b0141ddda998378812e25a9f..649303ef2d63496be4337c340ace3fe6c81089d3 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/ellipse.png and b/doc/salome/gui/GEOM/images/ellipse.png differ
index 153c610059d709eb17a62eb8336dcd3b6426713e..7b0442a3ae21b7a146e1e7817e7c98a58d19f86e 100644 (file)
@@ -15,6 +15,10 @@ Radius)</em>
 \n <b>Arguments:</b> Name + 1 vertex (for the center) + 1 edge (for
 the direction) + Radius.
 
+\note Passing None as <b>Center Point</b> means Origin of global
+coordinate system, passing None as \b Vector means OZ axis of global
+coordinate system.
+
 \image html circle1.png
 
 \n Secondly, you can define a \b Circle by three \b Points that lie on it. 
index 78972181b06d32207d258976a21f0e95f7119710..8d9fdc6f2d57ec70af912ec9b1e60b96d4ad0e26 100644 (file)
@@ -12,6 +12,10 @@ Vector giving its normal, and its <b>Major & Minor Radiuses</b>.
 \n <b>Arguments:</b> Name + 1 vertex (for the center) + 1 edge (for
 the direction) + 1 X Radius + 1 Y Radius.
 
+\note Passing None as <b>Center Point</b> means Origin of global
+coordinate system, passing None as \b Vector means OZ axis of global
+coordinate system.
+
 \image html ellipse.png
 
 <b>Example:</b>
@@ -21,4 +25,4 @@ the direction) + 1 X Radius + 1 Y Radius.
 Our <b>TUI Scripts</b> provide you with useful examples of creation of
 \ref tui_creation_ellipse "Basic Geometric Objects".
 
-*/
\ No newline at end of file
+*/
index 1a067c6fa9330521eb04312b70c915f5538fb16a..23fc15a4dfa71df96f7d865490e503f334b556ce 100644 (file)
@@ -69,8 +69,8 @@ BasicGUI_CircleDlg::BasicGUI_CircleDlg( GeometryGUI* theGeometryGUI, QWidget* pa
   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->TextLabel1->setText( tr( "GEOM_CENTER_POINT" ) + " (Origin by default)" );
+  GroupPntVecR->TextLabel2->setText( tr( "GEOM_VECTOR" ) + " (Z axis by default)" );
   GroupPntVecR->TextLabel3->setText( tr( "GEOM_RADIUS" ) );
   GroupPntVecR->PushButton1->setIcon( image1 );
   GroupPntVecR->PushButton2->setIcon( image1 );
@@ -248,6 +248,8 @@ void BasicGUI_CircleDlg::ConstructorsClicked( int constructorId )
 
   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged() ),
           this, SLOT( SelectionIntoArgument() ) );
+
+  displayPreview();
 }
 
 //=================================================================================
@@ -494,12 +496,15 @@ bool BasicGUI_CircleDlg::isValid( QString& msg )
 {
   const int id = getConstructorId();
   if ( id == 0 )
-    return !myPoint->_is_nil() && !myDir->_is_nil() && getRadius() > 0;
+    //return !myPoint->_is_nil() && !myDir->_is_nil() && getRadius() > 0;
+    //nil point means origin of global CS
+    //nil vector means Z axis
+    return getRadius() > 0;
   else if ( id == 1 )
     return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() &&
       !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 );
   else if ( id == 2 )
-      return !myPoint4->_is_nil() && !myPoint5->_is_nil() && !myPoint6->_is_nil() &&
+    return !myPoint4->_is_nil() && !myPoint5->_is_nil() && !myPoint6->_is_nil() &&
       !isEqual( myPoint4, myPoint5 ) && !isEqual( myPoint5, myPoint6 ) && !isEqual( myPoint4, myPoint6 );
   return false;
 }
@@ -548,8 +553,10 @@ void BasicGUI_CircleDlg::addSubshapesToStudy()
 
   switch ( getConstructorId() ) {
   case 0:
-    objMap[GroupPntVecR->LineEdit1->text()] = myPoint;
-    objMap[GroupPntVecR->LineEdit2->text()] = myDir;
+    if (!CORBA::is_nil(myPoint))
+      objMap[GroupPntVecR->LineEdit1->text()] = myPoint;
+    if (!CORBA::is_nil(myDir))
+      objMap[GroupPntVecR->LineEdit2->text()] = myDir;
     break;
   case 1:
     objMap[Group3Pnts->LineEdit1->text()] = myPoint1;
index b0b451569c83396905fdad312a7a127c33074243..519e088a36a0a3a00f96e3bb383131883ce191d4 100644 (file)
@@ -69,8 +69,8 @@ BasicGUI_EllipseDlg::BasicGUI_EllipseDlg( GeometryGUI* theGeometryGUI, QWidget*
 
   GroupPoints = new DlgRef_2Sel2Spin( centralWidget() );
   GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) );
-  GroupPoints->TextLabel1->setText( tr( "GEOM_CENTER" ) );
-  GroupPoints->TextLabel2->setText( tr( "GEOM_VECTOR" ) );
+  GroupPoints->TextLabel1->setText( tr( "GEOM_CENTER" ) + " (Origin by default)" );
+  GroupPoints->TextLabel2->setText( tr( "GEOM_VECTOR" ) + " (Z axis by default)" );
   GroupPoints->TextLabel3->setText( tr( "GEOM_RADIUS_MAJOR" ) );
   GroupPoints->TextLabel4->setText( tr( "GEOM_RADIUS_MINOR" ) );
   GroupPoints->PushButton1->setIcon( image1 );
@@ -146,6 +146,8 @@ void BasicGUI_EllipseDlg::Init()
          SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
   initName( tr( "GEOM_ELLIPSE" ) );
+
+  displayPreview();
 }
 
 //=================================================================================
@@ -189,6 +191,7 @@ bool BasicGUI_EllipseDlg::ClickOnApply()
   //globalSelection(GEOM_POINT);
   globalSelection(); // close local contexts, if any
   localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
+  displayPreview();
   
   return true;
 }
@@ -368,7 +371,10 @@ bool BasicGUI_EllipseDlg::isValid( QString& msg )
     msg = tr( "GEOM_ELLIPSE_ERROR_1" );
     return false;
   }
-  return !myPoint->_is_nil() && !myDir->_is_nil();
+  //return !myPoint->_is_nil() && !myDir->_is_nil();
+  //nil point means origin of global CS
+  //nil vector means Z axis
+  return true;
 }
 
 //=================================================================================
@@ -395,8 +401,10 @@ void BasicGUI_EllipseDlg::addSubshapesToStudy()
 {
   QMap<QString, GEOM::GEOM_Object_var> objMap;
 
-  objMap[GroupPoints->LineEdit1->text()] = myPoint;
-  objMap[GroupPoints->LineEdit2->text()] = myDir;
+  if (!CORBA::is_nil(myPoint))
+    objMap[GroupPoints->LineEdit1->text()] = myPoint;
+  if (!CORBA::is_nil(myDir))
+    objMap[GroupPoints->LineEdit2->text()] = myDir;
 
   addSubshapesToFather( objMap );
 }
index dd6102815548a04e08bc7598e16fd56138514773..9408a0a3971f0e8bca95b1e0ebcd7e68f2b93dea 100644 (file)
@@ -44,7 +44,7 @@
 
 //=================================================================================
 // class    : BasicGUI_VectorDlg()
-// purpose  : Constructs a BasicGUI_VectorDlg which is a child of 'parent', with the 
+// purpose  : Constructs a BasicGUI_VectorDlg which is a child of 'parent', with the
 //            name 'name' and widget flags set to 'f'.
 //            The dialog will by default be modeless, unless you set 'modal' to
 //            TRUE to construct a modal dialog.
@@ -91,7 +91,7 @@ BasicGUI_VectorDlg::BasicGUI_VectorDlg( GeometryGUI* theGeometryGUI, QWidget* pa
   /***************************************************************/
 
   setHelpFileName( "create_vector_page.html" );
-  
+
   /* Initialisations */
   Init();
 }
@@ -102,7 +102,7 @@ BasicGUI_VectorDlg::BasicGUI_VectorDlg( GeometryGUI* theGeometryGUI, QWidget* pa
 // purpose  : Destroys the object and frees any allocated resources
 //=================================================================================
 BasicGUI_VectorDlg::~BasicGUI_VectorDlg()
-{  
+{
 }
 
 
@@ -121,7 +121,7 @@ void BasicGUI_VectorDlg::Init()
   /* Get setting of step value from file configuration */
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100 );
+
   /* min, max, step and decimals for spin boxes */
   initSpinBox( GroupDimensions->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR:TODO : DBL_DIGITS_DISPLAY
   initSpinBox( GroupDimensions->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR:TODO : DBL_DIGITS_DISPLAY
@@ -137,7 +137,7 @@ void BasicGUI_VectorDlg::Init()
   /* signals and slots connections */
   connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) );
   connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ),        this, SLOT( ClickOnCancel() ) );
-  
+
   connect( buttonOk(),     SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
   connect( buttonApply(),  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
 
@@ -157,12 +157,13 @@ void BasicGUI_VectorDlg::Init()
 
   connect( GroupDimensions->CheckButton1, SIGNAL( stateChanged( int ) ), this, SLOT( ReverseVector( int ) ) );
 
-  connect( myGeomGUI->getApp()->selectionMgr(), 
+  connect( myGeomGUI->getApp()->selectionMgr(),
           SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
   initName( tr("GEOM_VECTOR") );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 //=================================================================================
@@ -192,14 +193,14 @@ void BasicGUI_VectorDlg::ConstructorsClicked( int constructorId )
     {
       GroupDimensions->hide();
       GroupPoints->show();
-      
+
       myEditCurrentArgument = GroupPoints->LineEdit1;
       GroupPoints->LineEdit1->setText( "" );
       GroupPoints->LineEdit2->setText( "" );
-      
+
       globalSelection(); // close local contexts, if any
       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
-      connect( myGeomGUI->getApp()->selectionMgr(), 
+      connect( myGeomGUI->getApp()->selectionMgr(),
               SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
       break;
     }
@@ -208,12 +209,12 @@ void BasicGUI_VectorDlg::ConstructorsClicked( int constructorId )
       GroupPoints->hide();
       GroupDimensions->show();
       globalSelection(); // close local contexts, if any
-      
-      double dx( 0. ), dy( 0. ), dz( 0. ); 
+
+      double dx( 0. ), dy( 0. ), dz( 0. );
       GroupDimensions->SpinBox_DX->setValue( dx );
       GroupDimensions->SpinBox_DY->setValue( dy );
       GroupDimensions->SpinBox_DZ->setValue( dz );
-      
+
       GroupDimensions->CheckButton1->setChecked( false );
       break;
     }
@@ -271,7 +272,7 @@ void BasicGUI_VectorDlg::SelectionIntoArgument()
     return;
   }
 
-  // nbSel == 1 
+  // nbSel == 1
   Standard_Boolean aRes = Standard_False;
   GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes );
   if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
@@ -334,7 +335,7 @@ void BasicGUI_VectorDlg::SetEditCurrentArgument()
 // purpose  :
 //=================================================================================
 void BasicGUI_VectorDlg::LineEditReturnPressed()
-{ 
+{
   QLineEdit* send = (QLineEdit*)sender();
   if      ( send == GroupPoints->LineEdit1 ) myEditCurrentArgument = GroupPoints->LineEdit1;
   else if ( send == GroupPoints->LineEdit2 ) myEditCurrentArgument = GroupPoints->LineEdit2;
@@ -397,7 +398,7 @@ void BasicGUI_VectorDlg::ReverseVector( int state )
   GroupDimensions->SpinBox_DX->setValue( dx );
   GroupDimensions->SpinBox_DY->setValue( dy );
   GroupDimensions->SpinBox_DZ->setValue( dz );
-  
+
   displayPreview();
 }
 
@@ -426,7 +427,7 @@ bool BasicGUI_VectorDlg::isValid( QString& msg )
 bool BasicGUI_VectorDlg::execute( ObjectList& objects )
 {
   bool res = false;
-  
+
   GEOM::GEOM_Object_var anObj;
 
   switch ( getConstructorId() ) {
index f5a646c87fce22b7b4fe3ee719e2c6adb5b10db8..55bba2858e9d04ca402521ce79e24fea082a592b 100644 (file)
@@ -102,20 +102,20 @@ BasicGUI_WorkingPlaneDlg::BasicGUI_WorkingPlaneDlg( GeometryGUI* theGeometryGUI,
   /***************************************************************/
   QGroupBox* aReverseGroupBox = new QGroupBox( centralWidget() );
   QHBoxLayout* aReverseGroupBoxLayout = new QHBoxLayout( aReverseGroupBox );
-  aReverseGroupBoxLayout->setMargin( 9 ); 
+  aReverseGroupBoxLayout->setMargin( 9 );
   aReverseGroupBoxLayout->setSpacing( 6 );
-    
+
   myReverseCB = new QCheckBox( aReverseGroupBox );
   myReverseCB->setText( tr( "GEOM_REVERSE_PLANE" ) );
   aReverseGroupBoxLayout->addWidget( myReverseCB );
-    
+
   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
   layout->setMargin( 0 ); layout->setSpacing( 6 );
   layout->addWidget( Group1 );
   layout->addWidget( Group2 );
   layout->addWidget( Group3 );
   layout->addWidget( aReverseGroupBox );
-  
+
   setHelpFileName( "create_wplane_page.html" );
 
   Init();
@@ -175,7 +175,8 @@ void BasicGUI_WorkingPlaneDlg::Init()
 
   initName( tr( "GEOM_WPLANE" ) );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 2 ); // simplest constructor
+  ConstructorsClicked( 2 );
 }
 
 //=================================================================================
@@ -196,15 +197,15 @@ void BasicGUI_WorkingPlaneDlg::ConstructorsClicked( int constructorId )
       aMap.Add( GEOM_PLANE );
       aMap.Add( GEOM_MARKER );
       globalSelection( aMap );
-      
+
       Group2->hide();
       Group3->hide();
       Group1->show();
-      
+
       myEditCurrentArgument = Group1->LineEdit1;
       Group1->LineEdit1->setText( "" );
       myFace = GEOM::GEOM_Object::_nil();
-      
+
       connect( aSelMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
       break;
     }
@@ -213,17 +214,17 @@ void BasicGUI_WorkingPlaneDlg::ConstructorsClicked( int constructorId )
       //globalSelection( GEOM_LINE );
       GEOM::GEOM_Object_var anObj;
       localSelection( anObj, TopAbs_EDGE );
-      
+
       Group1->hide();
       Group3->hide();
       Group2->show();
-      
+
       myEditCurrentArgument = Group2->LineEdit1;
       Group2->LineEdit1->setText( "" );
       Group2->LineEdit2->setText( "" );
       myVectX = GEOM::GEOM_Object::_nil();
       myVectZ = GEOM::GEOM_Object::_nil();
-      
+
       connect( aSelMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
       break;
     }
@@ -232,13 +233,13 @@ void BasicGUI_WorkingPlaneDlg::ConstructorsClicked( int constructorId )
       Group1->hide();
       Group2->hide();
       Group3->show();
-      
+
       Group3->RadioButton1->setChecked( true );
       aOriginType = 1;
       break;
     }
   }
-  
+
   qApp->processEvents();
   updateGeometry();
   resize( minimumSize() );
@@ -274,12 +275,12 @@ bool BasicGUI_WorkingPlaneDlg::ClickOnApply()
 {
   buttonApply()->setFocus();
   myGeomGUI->application()->putInfo( "" );
+
   if ( updateWPlane( false ) ) {
     myGeomGUI->SetWorkingPlane( myWPlane );
     myGeomGUI->ActiveWorkingPlane();
   }
-  
+
   return true;
 }
 
@@ -316,7 +317,7 @@ void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument()
 
   if ( myEditCurrentArgument == Group1->LineEdit1 )
     myFace = aSelectedObject;
-  else if ( myEditCurrentArgument == Group2->LineEdit1 || 
+  else if ( myEditCurrentArgument == Group2->LineEdit1 ||
            myEditCurrentArgument == Group2->LineEdit2 ) {
     if ( aRes && !aSelectedObject->_is_nil() ) {
       TopoDS_Shape aShape;
@@ -347,7 +348,7 @@ void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument()
   }
 
   myEditCurrentArgument->setText( aName );
-  
+
   updateWPlane();
 }
 
@@ -445,7 +446,7 @@ void BasicGUI_WorkingPlaneDlg::enterEvent( QEvent* )
 bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview )
 {
   erasePreview();
-  
+
   const int id = getConstructorId();
 
   if ( id == 0 ) { // by planar face selection
@@ -470,20 +471,20 @@ bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview )
       gp_Dir aDirN ( Zx, Zy, Zz );
       gp_Dir aDirX ( Xx, Xy, Xz );
       myWPlane = gp_Ax3( aPnt, aDirN, aDirX );
-    } 
+    }
     else {
       if ( !showPreview )
        showError( "Wrong shape selected (has to be a planar face)" );
       return false;
     }
-  } 
+  }
   else if ( id == 1 ) { // by two vectors (Ox & Oz)
     if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) {
       if ( !showPreview )
        showError( "Two vectors have to be selected" );
       return false;
     }
-    
+
     TopoDS_Edge aVectX, aVectZ;
     TopoDS_Vertex VX1, VX2, VZ1, VZ2;
     gp_Vec aVX, aVZ;
@@ -534,7 +535,7 @@ bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview )
 
     myWPlane = gp_Ax3( BRep_Tool::Pnt( VX1 ), aDirZ, aDirX );
 
-  } 
+  }
   else if ( id == 2 ) { // by selection from standard (OXY or OYZ, or OZX)
     gp_Ax2 anAx2;
 
@@ -544,23 +545,24 @@ bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview )
 
     myWPlane = gp_Ax3( anAx2 );
 
-  } 
+  }
   else {
     return false;
   }
-  
+
   if ( myReverseCB->isChecked() ) {
     myWPlane.YReverse();
     myWPlane.ZReverse();
   }
-  
+
   if ( showPreview ) {
     GEOM::GEOM_IBasicOperations_var aBasicOp = getGeomEngine()->GetIBasicOperations( getStudyId() );
-    GEOM::GEOM_Object_var anObj = aBasicOp->MakeMarker( myWPlane.Location().X(),   myWPlane.Location().Y(),   myWPlane.Location().Z(),
-                                                       myWPlane.XDirection().X(), myWPlane.XDirection().Y(), myWPlane.XDirection().Z(),
-                                                       myWPlane.YDirection().X(), myWPlane.YDirection().Y(), myWPlane.YDirection().Z() );
+    GEOM::GEOM_Object_var anObj = aBasicOp->MakeMarker
+      ( myWPlane.Location().X(),   myWPlane.Location().Y(),   myWPlane.Location().Z(),
+        myWPlane.XDirection().X(), myWPlane.XDirection().Y(), myWPlane.XDirection().Z(),
+        myWPlane.YDirection().X(), myWPlane.YDirection().Y(), myWPlane.YDirection().Z() );
     displayPreview( anObj );
   }
-  
+
   return true;
 }
index 79184422b9616e9a88c21370cca98049aafcdf17..3d32b36e90f7d43d0930a5c32cdd2e9415938ae8 100644 (file)
@@ -77,65 +77,87 @@ Standard_Integer GEOMImpl_CircleDriver::Execute(TFunction_Logbook& log) const
   TopoDS_Shape aShape;
 
   if (aType == CIRCLE_PNT_VEC_R) {
-    Handle(GEOM_Function) aRefPoint  = aCI.GetCenter();
+    // Center
+    gp_Pnt aP = gp::Origin();
+    Handle(GEOM_Function) aRefPoint = aCI.GetCenter();
+    if (!aRefPoint.IsNull()) {
+      TopoDS_Shape aShapePnt = aRefPoint->GetValue();
+      if (aShapePnt.ShapeType() != TopAbs_VERTEX) {
+        Standard_ConstructionError::Raise
+          ("Circle creation aborted: invalid center argument, must be a point");
+      }
+      aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt));
+    }
+    // Normal
+    gp_Vec aV = gp::DZ();
     Handle(GEOM_Function) aRefVector = aCI.GetVector();
-    TopoDS_Shape aShapePnt = aRefPoint->GetValue();
-    TopoDS_Shape aShapeVec = aRefVector->GetValue();
-    if (aShapePnt.ShapeType() == TopAbs_VERTEX &&
-        aShapeVec.ShapeType() == TopAbs_EDGE) {
-      gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt));
+    if (!aRefVector.IsNull()) {
+      TopoDS_Shape aShapeVec = aRefVector->GetValue();
+      if (aShapeVec.ShapeType() != TopAbs_EDGE) {
+        Standard_ConstructionError::Raise
+          ("Circle creation aborted: invalid vector argument, must be a vector or an edge");
+      }
       TopoDS_Edge anE = TopoDS::Edge(aShapeVec);
       TopoDS_Vertex V1, V2;
       TopExp::Vertices(anE, V1, V2, Standard_True);
       if (!V1.IsNull() && !V2.IsNull()) {
-        gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2));
-        gp_Ax2 anAxes (aP, aV);
-        gp_Circ aCirc (anAxes, aCI.GetRadius());
-        aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge();
+        aV = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2));
+        if (aV.Magnitude() < gp::Resolution()) {
+          Standard_ConstructionError::Raise
+            ("Circle creation aborted: vector of zero length is given");
+        }
       }
     }
+    // Axes
+    gp_Ax2 anAxes (aP, aV);
+    // Circle
+    gp_Circ aCirc (anAxes, aCI.GetRadius());
+    aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge();
   }
- else if (aType == CIRCLE_CENTER_TWO_PNT) {
-       Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1();
-       Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2();
-       Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3();
-       TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue();
-       TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue();
-       TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue();
-       if (aShapePnt1.ShapeType() == TopAbs_VERTEX && aShapePnt2.ShapeType() == TopAbs_VERTEX &&
-          aShapePnt3.ShapeType() == TopAbs_VERTEX)
-       {
-        gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1));
-        gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2));
-        gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3));
-
-        if (aP1.Distance(aP2) < gp::Resolution() ||
-            aP1.Distance(aP3) < gp::Resolution() ||
-            aP2.Distance(aP3) < gp::Resolution())
-          Standard_ConstructionError::Raise("Circle creation aborted: coincident points given");
-        if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular()))
-          Standard_ConstructionError::Raise("Circle creation aborted: points lay on one line");
-         double x, y, z, x1, y1, z1, x2, y2, z2, dx, dy, dz, dx2, dy2, dz2, dx3, dy3, dz3, aRadius;
-        //Calculations for Radius
-        x = aP1.X(); y = aP1.Y(); z = aP1.Z();
-        x1 = aP2.X(); y1 = aP2.Y(); z1 = aP2.Z();
-        dx = x1 - x;
-         dy = y1 - y;
-        dz = z1 - z;
-        aRadius = sqrt(dx*dx + dy*dy + dz*dz);
-        //Calculations for Plane Vector
-        x2 = aP3.X(); y2 = aP3.Y(); z2 = aP3.Z();
-        dx2 = x2 - x; dy2 = y2 - y; dz2 = z2 - z;
-        dx3 = ((dy*dz2) - (dy2*dz))/100;
-        dy3 = ((dx2*dz) - (dx*dz2))/100;
-        dz3 = ((dx*dy2) - (dx2*dy))/100;
-        //Make Plane Vector
-        gp_Dir aDir ( dx3, dy3, dz3 );
-        //Make Circle
-        gp_Ax2 anAxes (aP1, aDir);
-        gp_Circ aCirc (anAxes, aRadius);
-        aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge();  
-       }
+  else if (aType == CIRCLE_CENTER_TWO_PNT) {
+    Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1();
+    Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2();
+    Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3();
+    TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue();
+    TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue();
+    TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue();
+    if (aShapePnt1.ShapeType() == TopAbs_VERTEX &&
+        aShapePnt2.ShapeType() == TopAbs_VERTEX &&
+        aShapePnt3.ShapeType() == TopAbs_VERTEX)
+    {
+      gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1));
+      gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2));
+      gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3));
+
+      if (aP1.Distance(aP2) < gp::Resolution() ||
+          aP1.Distance(aP3) < gp::Resolution() ||
+          aP2.Distance(aP3) < gp::Resolution())
+        Standard_ConstructionError::Raise("Circle creation aborted: coincident points given");
+
+      if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular()))
+        Standard_ConstructionError::Raise("Circle creation aborted: points lay on one line");
+
+      double x, y, z, x1, y1, z1, x2, y2, z2, dx, dy, dz, dx2, dy2, dz2, dx3, dy3, dz3, aRadius;
+      //Calculations for Radius
+      x = aP1.X(); y = aP1.Y(); z = aP1.Z();
+      x1 = aP2.X(); y1 = aP2.Y(); z1 = aP2.Z();
+      dx = x1 - x;
+      dy = y1 - y;
+      dz = z1 - z;
+      aRadius = sqrt(dx*dx + dy*dy + dz*dz);
+      //Calculations for Plane Vector
+      x2 = aP3.X(); y2 = aP3.Y(); z2 = aP3.Z();
+      dx2 = x2 - x; dy2 = y2 - y; dz2 = z2 - z;
+      dx3 = ((dy*dz2) - (dy2*dz))/100;
+      dy3 = ((dx2*dz) - (dx*dz2))/100;
+      dz3 = ((dx*dy2) - (dx2*dy))/100;
+      //Make Plane Vector
+      gp_Dir aDir ( dx3, dy3, dz3 );
+      //Make Circle
+      gp_Ax2 anAxes (aP1, aDir);
+      gp_Circ aCirc (anAxes, aRadius);
+      aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge();  
+    }
   }
   else if (aType == CIRCLE_THREE_PNT) {
     Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1();
@@ -160,7 +182,7 @@ Standard_Integer GEOMImpl_CircleDriver::Execute(TFunction_Logbook& log) const
       aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge();
     }  
   }
-   else {
+  else {
   }
 
   if (aShape.IsNull()) return 0;
index 03685a46bedb25a36a380c782ad31abcf68ccd89..a36e92c3a25b3075443c44bd2ee40231e9686c39 100644 (file)
@@ -71,24 +71,44 @@ Standard_Integer GEOMImpl_EllipseDriver::Execute(TFunction_Logbook& log) const
   TopoDS_Shape aShape;
 
   if (aType == ELLIPSE_PNT_VEC_RR) {
-    Handle(GEOM_Function) aRefPoint  = aCI.GetCenter();
+    // Center
+    gp_Pnt aP = gp::Origin();
+    Handle(GEOM_Function) aRefPoint = aCI.GetCenter();
+    if (!aRefPoint.IsNull()) {
+      TopoDS_Shape aShapePnt = aRefPoint->GetValue();
+      if (aShapePnt.ShapeType() != TopAbs_VERTEX) {
+        Standard_ConstructionError::Raise
+          ("Circle creation aborted: invalid center argument, must be a point");
+      }
+      aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt));
+    }
+    // Normal
+    gp_Vec aV = gp::DZ();
     Handle(GEOM_Function) aRefVector = aCI.GetVector();
-    TopoDS_Shape aShapePnt = aRefPoint->GetValue();
-    TopoDS_Shape aShapeVec = aRefVector->GetValue();
-    if (aShapePnt.ShapeType() == TopAbs_VERTEX &&
-        aShapeVec.ShapeType() == TopAbs_EDGE) {
-      gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt));
+    if (!aRefVector.IsNull()) {
+      TopoDS_Shape aShapeVec = aRefVector->GetValue();
+      if (aShapeVec.ShapeType() != TopAbs_EDGE) {
+        Standard_ConstructionError::Raise
+          ("Circle creation aborted: invalid vector argument, must be a vector or an edge");
+      }
       TopoDS_Edge anE = TopoDS::Edge(aShapeVec);
       TopoDS_Vertex V1, V2;
       TopExp::Vertices(anE, V1, V2, Standard_True);
       if (!V1.IsNull() && !V2.IsNull()) {
-        gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2));
-        gp_Ax2 anAxes (aP, aV);
-        gp_Elips anEll (anAxes, aCI.GetRMajor(), aCI.GetRMinor());
-        aShape = BRepBuilderAPI_MakeEdge(anEll).Edge();
+        aV = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2));
+        if (aV.Magnitude() < gp::Resolution()) {
+          Standard_ConstructionError::Raise
+            ("Circle creation aborted: vector of zero length is given");
+        }
       }
     }
-  } else {
+    // Axes
+    gp_Ax2 anAxes (aP, aV);
+    // Ellipse
+    gp_Elips anEll (anAxes, aCI.GetRMajor(), aCI.GetRMinor());
+    aShape = BRepBuilderAPI_MakeEdge(anEll).Edge();
+  }
+  else {
   }
 
   if (aShape.IsNull()) return 0;
index d6628ca431256cdd69b6cb48a506255d165ca391..9a497b2e9458fc643343d06368aea882beba3610 100644 (file)
@@ -266,7 +266,9 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR
 {
   SetErrorCode(KO);
 
-  if (thePnt.IsNull() || theVec.IsNull()) return NULL;
+  // Not set thePnt means origin of global CS,
+  // Not set theVec means Z axis of global CS
+  //if (thePnt.IsNull() || theVec.IsNull()) return NULL;
 
   //Add a new Circle object
   Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
@@ -281,13 +283,18 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR
 
   GEOMImpl_ICircle aCI (aFunction);
 
-  Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
-  Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
+  if (!thePnt.IsNull()) {
+    Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
+    if (aRefPnt.IsNull()) return NULL;
+    aCI.SetCenter(aRefPnt);
+  }
 
-  if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL;
+  if (!theVec.IsNull()) {
+    Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
+    if (aRefVec.IsNull()) return NULL;
+    aCI.SetVector(aRefVec);
+  }
 
-  aCI.SetCenter(aRefPnt);
-  aCI.SetVector(aRefVec);
   aCI.SetRadius(theR);
 
   //Compute the Circle value
@@ -325,7 +332,9 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse
 {
   SetErrorCode(KO);
 
-  if (thePnt.IsNull() || theVec.IsNull()) return NULL;
+  // Not set thePnt means origin of global CS,
+  // Not set theVec means Z axis of global CS
+  //if (thePnt.IsNull() || theVec.IsNull()) return NULL;
 
   //Add a new Ellipse object
   Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_ELLIPSE);
@@ -340,13 +349,18 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse
 
   GEOMImpl_IEllipse aCI (aFunction);
 
-  Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
-  Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
+  if (!thePnt.IsNull()) {
+    Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
+    if (aRefPnt.IsNull()) return NULL;
+    aCI.SetCenter(aRefPnt);
+  }
 
-  if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL;
+  if (!theVec.IsNull()) {
+    Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
+    if (aRefVec.IsNull()) return NULL;
+    aCI.SetVector(aRefVec);
+  }
 
-  aCI.SetCenter(aRefPnt);
-  aCI.SetVector(aRefVec);
   aCI.SetRMajor(theRMajor);
   aCI.SetRMinor(theRMinor);
 
index 3a15afb1b22a13b134b2db3fca8cd71ee8dae219..3bda04930809c3c7c0eda7a24371d57bbd9c3bd8 100644 (file)
@@ -65,15 +65,22 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCirclePntVecR
   //Set a not done flag
   GetOperations()->SetNotDone();
 
-  if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
-
-  //Get the reference points
-  Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject
-    (thePnt->GetStudyID(), thePnt->GetEntry());
-  Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject
-    (theVec->GetStudyID(), theVec->GetEntry());
-
-  if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
+  // Not set thePnt means origin of global CS,
+  // Not set theVec means Z axis of global CS
+  //if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
+
+  //Get the arguments
+  Handle(GEOM_Object) aPnt, aVec;
+  if (!CORBA::is_nil(thePnt)) {
+    aPnt = GetOperations()->GetEngine()->GetObject
+      (thePnt->GetStudyID(), thePnt->GetEntry());
+    if (aPnt.IsNull()) return aGEOMObject._retn();
+  }
+  if (!CORBA::is_nil(theVec)) {
+    aVec = GetOperations()->GetEngine()->GetObject
+      (theVec->GetStudyID(), theVec->GetEntry());
+    if (aVec.IsNull()) return aGEOMObject._retn();
+  }
 
   // Make Circle
   Handle(GEOM_Object) anObject =
@@ -167,15 +174,22 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipse
   //Set a not done flag
   GetOperations()->SetNotDone();
 
-  if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
+  // Not set thePnt means origin of global CS,
+  // Not set theVec means Z axis of global CS
+  //if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
 
-  //Get the reference points
-  Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject
-    (thePnt->GetStudyID(), thePnt->GetEntry());
-  Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject
-    (theVec->GetStudyID(), theVec->GetEntry());
-
-  if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
+  //Get the arguments
+  Handle(GEOM_Object) aPnt, aVec;
+  if (!CORBA::is_nil(thePnt)) {
+    aPnt = GetOperations()->GetEngine()->GetObject
+      (thePnt->GetStudyID(), thePnt->GetEntry());
+    if (aPnt.IsNull()) return aGEOMObject._retn();
+  }
+  if (!CORBA::is_nil(theVec)) {
+    aVec = GetOperations()->GetEngine()->GetObject
+      (theVec->GetStudyID(), theVec->GetEntry());
+    if (aVec.IsNull()) return aGEOMObject._retn();
+  }
 
   // Make Ellipse
   Handle(GEOM_Object) anObject =
index d4f38a78bf0e6899fd78728f6d58fc7906fa8769..2b2f27dc3bd717d3f395ea1b09bacd6f1b5b3d03 100644 (file)
@@ -500,12 +500,22 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #  @return New GEOM_Object, containing the created circle.
         #
         #  @ref tui_creation_circle "Example"
-        def MakeCircle(self,thePnt, theVec, theR):
+        def MakeCircle(self, thePnt, theVec, theR):
             # Example: see GEOM_TestAll.py
             anObj = self.CurvesOp.MakeCirclePntVecR(thePnt, theVec, theR)
             RaiseIfFailed("MakeCirclePntVecR", self.CurvesOp)
             return anObj
 
+        ## Create a circle with given radius.
+        #  Center of the circle will be in the origin of global
+        #  coordinate system and normal vector will be codirected with Z axis
+        #  @param theR Circle radius.
+        #  @return New GEOM_Object, containing the created circle.
+        def MakeCircleR(self, theR):
+            anObj = self.CurvesOp.MakeCirclePntVecR(None, None, theR)
+            RaiseIfFailed("MakeCirclePntVecR", self.CurvesOp)
+            return anObj
+
         ## Create a circle, passing through three given points
         #  @param thePnt1,thePnt2,thePnt3 Points, defining the circle.
         #  @return New GEOM_Object, containing the created circle.
@@ -538,12 +548,23 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #  @return New GEOM_Object, containing the created ellipse.
         #
         #  @ref tui_creation_ellipse "Example"
-        def MakeEllipse(self,thePnt, theVec, theRMajor, theRMinor):
+        def MakeEllipse(self, thePnt, theVec, theRMajor, theRMinor):
             # Example: see GEOM_TestAll.py
             anObj = self.CurvesOp.MakeEllipse(thePnt, theVec, theRMajor, theRMinor)
             RaiseIfFailed("MakeEllipse", self.CurvesOp)
             return anObj
 
+        ## Create an ellipse with given radiuses.
+        #  Center of the ellipse will be in the origin of global
+        #  coordinate system and normal vector will be codirected with Z axis
+        #  @param theRMajor Major ellipse radius.
+        #  @param theRMinor Minor ellipse radius.
+        #  @return New GEOM_Object, containing the created ellipse.
+        def MakeEllipseRR(self, theRMajor, theRMinor):
+            anObj = self.CurvesOp.MakeEllipse(None, None, theRMajor, theRMinor)
+            RaiseIfFailed("MakeEllipse", self.CurvesOp)
+            return anObj
+
         ## Create a polyline on the set of points.
         #  @param thePoints Sequence of points for the polyline.
         #  @return New GEOM_Object, containing the created polyline.
index 2dcecd1bd7de445e118fd5a3ec1d117df0ca411b..b6a8dc33ff9f6f942b27c05e955af6fa1941787b 100644 (file)
@@ -152,7 +152,8 @@ void PrimitiveGUI_BoxDlg::Init()
 
   initName( tr( "GEOM_BOX" ) );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 //=================================================================================
index bdf686812c348586ccaa6b197a0b2f53996f8d51..07bf6b3eee3cd81fa1b9a521fcfae529d2d89e8f 100644 (file)
@@ -164,7 +164,8 @@ void PrimitiveGUI_ConeDlg::Init()
   
   initName( tr( "GEOM_CONE" ) );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 
index 24b8387fac013be929c8bfd2320ded2b790ba0aa..8715966158664962ef2cb8f6f0b5f8332d4adf7c 100644 (file)
@@ -159,7 +159,9 @@ void PrimitiveGUI_CylinderDlg::Init()
           SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
   
   initName( tr( "GEOM_CYLINDER" ) );
-  ConstructorsClicked( 0 );
+
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 
index bc7854fb37f301f9fed4981f61ad4ef430d94157..13bd12071dabbe92b4caff134a5465162d038557 100644 (file)
@@ -139,7 +139,8 @@ void PrimitiveGUI_SphereDlg::Init()
 
   initName( tr( "GEOM_SPHERE" ) );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 //=================================================================================
index 099cf7972332dfb9b79309164f277078f341bd61..f4dc772a9e0b467ee5c008be09f007431895add6 100644 (file)
@@ -156,7 +156,8 @@ void PrimitiveGUI_TorusDlg::Init()
   
   initName( tr( "GEOM_TORUS" ) );
 
-  ConstructorsClicked( 0 );
+  setConstructorId( 1 ); // simplest constructor
+  ConstructorsClicked( 1 );
 }
 
 //=================================================================================