]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
RNC: EDF 1619, Added a constructor with end point for the arcs in the sketcher 2D.
authorgdd <gdd>
Thu, 28 Oct 2010 12:21:52 +0000 (12:21 +0000)
committergdd <gdd>
Thu, 28 Oct 2010 12:21:52 +0000 (12:21 +0000)
src/EntityGUI/EntityGUI_SketcherDlg.cxx
src/GEOM_SWIG/GEOM_Sketcher.py
src/GEOM_SWIG/geompyDC.py
src/SKETCHER/Sketcher_Profile.cxx

index 8538d514faee0f37e1acf84c371cf0a3b1d85b4d..4d7574e5d7923038d4bd7f170d2aa404ab00a39c 100644 (file)
@@ -396,7 +396,7 @@ void EntityGUI_SketcherDlg::TypeClicked( int constructorId )
   }
   else if (  myConstructorId == 1 ) { // ARC
     GroupD2->setEnabled( false );
-    MainWidget->RB_Dest1->setEnabled( false );
+    MainWidget->RB_Dest1->setEnabled( true ); 
     MainWidget->RB_Dest2->setChecked( true );
     DestClicked( 0 );
   }
@@ -440,7 +440,7 @@ void EntityGUI_SketcherDlg::PointClicked( int constructorId )
   // Get setting of step value from file configuration
   double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
 
-  if ( myConstructorId == 0 ) {  // SEGMENT
+  if ( (myConstructorId == 0) || (myConstructorId == 1) ) {  // SEGMENT OR ARC
     if ( constructorId == 1 ) {  // XY
       mySketchType = PT_ABS;
       initSpinBox( Group2Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
@@ -1214,6 +1214,18 @@ void EntityGUI_SketcherDlg::ValueChangedInSpinBox( double newValue )
     }
   }
   else if ( myConstructorId == 1 ) {  // ARC
+    if ( mySketchType == PT_ABS ) {  
+      myX = vx;
+      myY = vy;
+      myXStr = vxStr;
+      myYStr = vyStr;
+    }
+    else if ( mySketchType == PT_RELATIVE ) {
+      myDX = vx;
+      myDY = vy;
+      myDXStr = vxStr;
+      myDYStr = vyStr;
+    } 
     if ( mySketchType == DIR_ANGLE_LENGTH ) {
       myAngle = vx;
       myRadius = vy;
@@ -1338,6 +1350,14 @@ QString EntityGUI_SketcherDlg::GetNewCommand( QString& theParameters )
     }
   }
   else if ( myConstructorId == 1 ) {  // ARC
+    if ( mySketchType == PT_ABS || mySketchType == PT_SEL ) {
+      myNewCommand = myNewCommand + "AA " + QString::number( myX ) + " " + QString::number( myY );
+      theParameters = myXStr + ":" + myYStr;
+    }
+    if ( mySketchType == PT_RELATIVE) {
+      myNewCommand = myNewCommand + "A " + QString::number( myDX ) + " " + QString::number( myDY );
+      theParameters = myDXStr + ":" + myDYStr;
+    } 
     if ( mySketchType == DIR_ANGLE_LENGTH ) {
       myNewCommand = myNewCommand + "R " + QString::number( myAngle );
       myNewCommand = myNewCommand + ":" + "C " + QString::number( myRadius ) + " " + QString::number( myLength );
index 61d601e227fabc29e4cd1f1d3264e6dfbace034d..5a8edfacee61903e345249247c3c8b3ff0c7337d 100644 (file)
@@ -47,12 +47,14 @@ import geompy
 
 #To Make Arc
 #"C radius length" : Create by direction, radius and length(in degree)
+#"AA x y": Create by point at X & Y
+#"A dx dy" : Create by point with DX & DY
 
 #To finish
 #"WW" : Close Wire
 
 #Create Sketcher
-Cmd = "Sketch:F 0 0:TT 0 100:C 100 180:WW"
+Cmd = "Sketch:F 0 0:TT 0 100:C 100 180:AA -100 100:WW"
 Sketcher = geompy.MakeSketcher(Cmd) #(string)->GEOM_Shape_ptr
 
 #Add In Study
index a873fc9c8c31486b8f5ac644373b7a78a30935f0..eaf571bef507c8c32cc3de4f6fd434eb07be9c29 100644 (file)
@@ -910,6 +910,8 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #     .
         #       \n
         #     - "C radius length" : Create arc by direction, radius and length(in degree)
+       #     - "AA x y": Create arc by point at X & Y
+        #     - "A dx dy" : Create arc by point with DX & DY
         #     .
         #       \n
         #     - "WW" : Close Wire (to finish)
index 69b72731f468ff29effdee1bcc51bd859b87e14c..5e04c891e2ce15c5fbaa4389f9ff39a1bfb6df6c 100644 (file)
@@ -244,7 +244,36 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd)
           else
             move = none;
           break;
-        }
+        }    
+      case 'A':
+        { 
+          if (n1 != 3) goto badargs;
+         Standard_Real vx = a(1).RealValue();
+          Standard_Real vy = a(2).RealValue(); 
+         if (a(0) == "AA") {
+            vx -= x;
+            vy -= y;
+          }
+         Standard_Real det = (dx * vy - dy * vx);
+         if ( Abs(det) > Precision::Confusion()) {
+           Standard_Real c = (dx * vx + dy * vy)   // Cosine of alpha = arc angle / 2
+                             / Sqrt((dx * dx + dy * dy)    
+                                  * (vx * vx + vy * vy));  
+            radius = (vx * vx + vy * vy)       // radius = distance between start  
+                    * Sqrt(dx * dx + dy * dy) // and end point / 2 * sin(alpha)
+                    / (2.0 * det);            // radius is > 0 or < 0
+           if (Abs(radius) > Precision::Confusion()) {
+             angle = 2.0 * acos(c);           // angle in [0,Pi]  
+             move = circle;
+            }
+           else
+             move = none;
+           break;
+          } 
+          else
+            move = none;
+          break;
+        }       
       case 'I':
         {
           if (n1 != 2) goto badargs;