]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Renaud's patch "python_plugin_11_20.patch"
authorsbh <sergey.belash@opencascade.com>
Mon, 24 Nov 2014 08:33:05 +0000 (11:33 +0300)
committersbh <sergey.belash@opencascade.com>
Mon, 24 Nov 2014 08:33:05 +0000 (11:33 +0300)
src/PythonFeaturesPlugin/CMakeLists.txt
src/PythonFeaturesPlugin/FeaturesAPI.py [new file with mode: 0644]
src/PythonFeaturesPlugin/PythonFeaturesPlugin_Box.py
src/PythonFeaturesPlugin/SketchResult.py [new file with mode: 0644]
src/PythonFeaturesPlugin/examples.py [new file with mode: 0644]
src/PythonFeaturesPlugin/extrusion.py [new file with mode: 0644]
src/PythonFeaturesPlugin/sketch.py [new file with mode: 0644]

index bbfe436ead7c8c571aa644b28cf8b1c091b231a6..1e600b3dfab9099220cc0fc9771e560434d24813 100644 (file)
@@ -3,6 +3,10 @@ INCLUDE(Common)
 SET(PYTHON_FILES
   PythonFeaturesPlugin_Box.py
   PythonFeaturesPlugin.py
+  sketch.py
+  extrusion.py
+  examples.py
+  SketchResult.py
 )
 
 SET(XML_RESSOURCES
diff --git a/src/PythonFeaturesPlugin/FeaturesAPI.py b/src/PythonFeaturesPlugin/FeaturesAPI.py
new file mode 100644 (file)
index 0000000..feef525
--- /dev/null
@@ -0,0 +1,42 @@
+from ModelAPI import *
+from GeomDataAPI import *
+from GeomAlgoAPI import *
+
+# NOTE : I think this style should be chosen 
+# for function as recommended by Python programming
+# standards
+def build_face_from_sketch (sketch, edges=None) :
+  # If no edges have been selected, get the whole sketch 
+  # edges
+  if edges == None:
+    result = sketch.firstResult()
+    edges  = modelAPI_ResultConstruction(result).shape()
+  
+  # Build the face
+  origin = geomDataAPI_Point( sketch.attribute("Origin") ).pnt()
+  dirX   = geomDataAPI_Dir( sketch.attribute("DirX") ).dir()
+  dirY   = geomDataAPI_Dir( sketch.attribute("DirY") ).dir()
+  normal = geomDataAPI_Dir( sketch.attribute("Norm") ).dir()
+  faces  = ShapeList()
+  GeomAlgoAPI_SketchBuilder.createFaces(origin, dirX, dirY, normal, edges, faces)
+  return faces[0]
+
+# NOTE : with an optional argument it is not
+# a so good idea to put part as last argument
+# it would result in a mandatory argument
+# put after an optionnal one
+def addExtrusion(part, sketch, size, reverse=False, subshapes=None):
+  feature = part.addFeature("Extrusion")
+  
+  # Build apropriate face
+  face = build_face_from_sketch(sketch, subshapes)
+  # Get sketch result
+  sketchResult = sketch.firstResult()
+  
+  # Set attributes and execute the feature
+  feature.selection("extrusion_face").setValue(sketchResult, face)
+  feature.real("extrusion_size").setValue(size)
+  feature.boolean("extrusion_reverse").setValue(False)
+  feature.execute()
+  
+  return feature
index 2a4f5b8191b3bceba5d0bee9455bc447845e8fda..b0359dc4e9b1350bb8fd35dbded6fa76916816f0 100644 (file)
@@ -1,4 +1,5 @@
 import ModelAPI
+import examples
 
 class PythonFeaturesPlugin_Box(ModelAPI.ModelAPI_Feature):
   "Feature to create a box by drawing a sketch and extruding it"
@@ -35,12 +36,26 @@ class PythonFeaturesPlugin_Box(ModelAPI.ModelAPI_Feature):
     aWidth  = self.real(PythonFeaturesPlugin_Box.WIDTH_ID()).value()
     aLength = self.real(PythonFeaturesPlugin_Box.LENGTH_ID()).value()
     aHeight = self.real(PythonFeaturesPlugin_Box.HEIGHT_ID()).value()
-    # print ("Box W:{0} L:{1} H:{2}".format(aWidth, aLength, aHeight))
-    # aResult = document().createBody(data())
-    # aResult.store(UserPackage.makeBox(aLength, aWidth, aHeight)
-    # self.setResult(aResult)
-
-
-    
+    print ("Box W:{0} L:{1} H:{2}".format(aWidth, aLength, aHeight))
+    aResultBody = self.document().createBody(self.data())
+    aResult = examples.makeBox(aLength, aWidth, aHeight)
+    #aShape = modelAPI_ResultConstruction(aResult).shape()
+    #aResultBody.store(aShape)
+    self.setResult(aResultBody)
+
+# TEST
+"""
+if __name__=='__main__':
+  session = ModelAPI.ModelAPI_Session.get()
+  part = session.activeDocument()
+  session.startOperation()
+  feature = part.addFeature('Box')
+  feature.real('box_width').setValue(10)
+  feature.real('box_length').setValue(10)
+  feature.real('box_height').setValue(10)
+  feature.execute()
+  session.finishOperation()
+"""
+  
 
 
diff --git a/src/PythonFeaturesPlugin/SketchResult.py b/src/PythonFeaturesPlugin/SketchResult.py
new file mode 100644 (file)
index 0000000..364e89a
--- /dev/null
@@ -0,0 +1,28 @@
+from ModelAPI import *
+from GeomDataAPI import *
+from GeomAlgoAPI import *
+
+
+class SketchResult:
+
+  def __init__(self, sketch):
+    self.geom   = sketch.firstResult()
+    self.faces  = ShapeList()
+    self.edges  = modelAPI_ResultConstruction(self.geom).shape()
+    self.origin = geomDataAPI_Point( sketch.attribute("Origin") ).pnt()
+    self.dirX   = geomDataAPI_Dir( sketch.attribute("DirX") ).dir()
+    self.dirY   = geomDataAPI_Dir( sketch.attribute("DirY") ).dir()
+    self.normal = geomDataAPI_Dir( sketch.attribute("Norm") ).dir()
+
+
+  def setEdges(self, edges):
+    self.edges = edges
+
+
+  def geometry(self):
+    return self.geom
+
+
+  def face(self):
+    GeomAlgoAPI_SketchBuilder.createFaces(self.origin, self.dirX, self.dirY, self.normal, self.edges, self.faces)
+    return self.faces[0]
\ No newline at end of file
diff --git a/src/PythonFeaturesPlugin/examples.py b/src/PythonFeaturesPlugin/examples.py
new file mode 100644 (file)
index 0000000..75c5e77
--- /dev/null
@@ -0,0 +1,56 @@
+from ModelAPI import *
+import sketch
+import extrusion
+from SketchResult import *
+#reload(sketch) # Pour tester plus facilement
+#reload(extrusion) # Pour tester plus facilement
+
+def makeBox(aLength, aWidth, aHeight):
+  print "makeBox"
+  # Getting the active document
+
+  session = ModelAPI_Session.get()
+  part = session.activeDocument()
+
+
+  # Starting the Sketch
+
+  session.startOperation()
+  base = sketch.addTo(part)
+  sketch.setXOYPlane(base)
+
+
+  # Creating the lines
+
+  l1  = sketch.addLine(10, 10, 10, 50, base)
+  l2  = sketch.addLine(10, 50, 60, 60, base)
+  l3  = sketch.addLine(60, 60, 50, 10, base)
+  l4  = sketch.addLine(50, 10, 10, 10, base)
+
+
+  # Creating the constraints
+  
+  # NOTE : the following lines are currently not working in BR_PYTHON_PLUGIN branch
+  """
+  sketch.makeCoincident(sketch.getEndPoint(l1), sketch.getStartPoint(l2), base)
+  sketch.makeCoincident(sketch.getEndPoint(l2), sketch.getStartPoint(l3), base)
+  sketch.makeCoincident(sketch.getEndPoint(l3), sketch.getStartPoint(l4), base)
+  sketch.makeCoincident(sketch.getEndPoint(l4), sketch.getStartPoint(l1), base)
+
+  sketch.makeParallel(sketch.getGeometry(l1), sketch.getGeometry(l3))
+  sketch.makeParallel(sketch.getGeometry(l2), sketch.getGeometry(l4))
+
+  sketch.makePerpendicular(sketch.getGeometry(l1), sketch.getGeometry(l4))
+  """
+
+  # Finalisation of the operation
+  
+  builder = SketchResult(base)
+
+  # Creating a feature Extrusion
+  box = extrusion.addNew(builder, 50, part)
+  session.finishOperation()
+
+  #return base.lastResult()
+  return extrusion.getBody(box)
+  
diff --git a/src/PythonFeaturesPlugin/extrusion.py b/src/PythonFeaturesPlugin/extrusion.py
new file mode 100644 (file)
index 0000000..ccd103a
--- /dev/null
@@ -0,0 +1,14 @@
+from ModelAPI import *
+
+
+def addNew(builder, length, part, edges=None, reverse=False):
+  feature = part.addFeature("Extrusion")
+  feature.selection("extrusion_face").setValue(builder.geometry(), builder.face())
+  feature.real("extrusion_size").setValue(length)
+  feature.boolean("extrusion_reverse").setValue(reverse)
+  feature.execute()
+  return feature
+
+
+def getBody(extrusion):
+  return extrusion.firstResult()
\ No newline at end of file
diff --git a/src/PythonFeaturesPlugin/sketch.py b/src/PythonFeaturesPlugin/sketch.py
new file mode 100644 (file)
index 0000000..462c180
--- /dev/null
@@ -0,0 +1,114 @@
+from ModelAPI     import *
+from GeomDataAPI  import *
+
+
+# Initialization of the Sketch
+# ----------------------------
+
+def addTo(doc):
+  return modelAPI_CompositeFeature( doc.addFeature("Sketch") )
+
+
+def setXOYPlane(sketch):
+  geomDataAPI_Point( sketch.attribute("Origin") ).setValue(0, 0, 0)
+  geomDataAPI_Dir( sketch.attribute("DirX") ).setValue(1, 0, 0)
+  geomDataAPI_Dir( sketch.attribute("DirY") ).setValue(0, 1, 0)
+  geomDataAPI_Dir( sketch.attribute("Norm") ).setValue(0, 0, 1)
+
+
+# Point geometry
+# --------------
+
+def addPoint(x, y, sketch):
+  point = sketch.addFeature("SketchPoint")
+  geomDataAPI_Point2D( point.attribute("PointCoordindates") ).setValue(x, y)
+  point.execute()     #Required to get the result, if needed for creating constraints
+  return point
+
+
+def getGeometry(point):
+  return geomDataAPI_Point2D( point.attribute("PointCoordindates") )
+
+
+# Line geometry
+# -------------
+
+def addClosedBrokenLine(coords, sketch):
+  c0 = coords[0]
+  c1 = coords[1]
+  bl = []
+  l1 = sketch.addFeature("SketchLine")
+  geomDataAPI_Point2D( l1.attribute("StartPoint") ).setValue(c0.x(), c0.y())
+  geomDataAPI_Point2D( l1.attribute("EndPoint") ).setValue(c1.x(), c1.y())
+  l1.execute()
+  bl.append(l1)
+  l0 = l1
+
+  for c2 in coords[2:]:
+    l2 = sketch.addFeature("SketchLine")
+    geomDataAPI_Point2D( l2.attribute("StartPoint") ).setValue(c1.x(), c1.y())
+    geomDataAPI_Point2D( l2.attribute("EndPoint") ).setValue(c2.x(), c2.y())
+    l2.execute()
+    bl.append(l2)
+    constraint = sketch.addFeature("SketchConstraintCoincidence")
+    constraint.refattr("ConstraintEntityA").setAttr( l1.attribute("EndPoint") )
+    constraint.refattr("ConstraintEntityB").setAttr( l2.attribute("StartPoint") )
+    c1 = c2
+    l1 = l2
+
+  if len(coords) > 2:
+    l2 = sketch.addFeature("SketchLine")
+    geomDataAPI_Point2D( l2.attribute("StartPoint") ).setValue(c1.x(), c1.y())
+    geomDataAPI_Point2D( l2.attribute("EndPoint") ).setValue(c0.x(), c0.y())
+    l2.execute()
+    bl.append(l2)
+    constraint = sketch.addFeature("SketchConstraintCoincidence")
+    constraint.refattr("ConstraintEntityA").setAttr( l1.attribute("EndPoint") )
+    constraint.refattr("ConstraintEntityB").setAttr( l2.attribute("StartPoint") )
+
+    constraint = sketch.addFeature("SketchConstraintCoincidence")
+    constraint.refattr("ConstraintEntityA").setAttr( l2.attribute("EndPoint") )
+    constraint.refattr("ConstraintEntityB").setAttr( l0.attribute("StartPoint") )
+
+  return bl
+
+
+def addLine(x1, y1, x2, y2, sketch):
+  line = sketch.addFeature("SketchLine")
+  geomDataAPI_Point2D( line.attribute("StartPoint") ).setValue(x1, y1)
+  geomDataAPI_Point2D( line.attribute("EndPoint") ).setValue(x2, y2)
+  line.execute()      #Required to get the result, if needed for creating constraints
+  return line
+
+
+def getGeometry(line):
+  return line.firstResult()
+
+
+def getStartPoint(line):
+  return geomDataAPI_Point2D( line.attribute("StartPoint") )
+
+
+def getEndPoint(line):
+  return geomDataAPI_Point2D( line.attribute("EndPoint") )
+
+
+# Constraints
+# -----------
+
+def makeCoincident(p1, p2, sketch):
+  constraint = sketch.addFeature("SketchConstraintCoincidence")
+  constraint.refattr("ConstraintEntityA").setAttr(p1)
+  constraint.refattr("ConstraintEntityB").setAttr(p2)
+
+
+def makeParallel(l1, l2, sketch):
+  constraint = sketch.addFeature("SketchConstraintParallel")
+  constraint.refattr("ConstraintEntityA").setObject(l1)
+  constraint.refattr("ConstraintEntityB").setObject(l2)
+
+
+def makePerpendicular(l1, l2, sketch):
+  constraint  = sketch.addFeature("SketchConstraintPerpendicular")
+  constraint.refattr("ConstraintEntityA").setObject(l1)
+  constraint.refattr("ConstraintEntityB").setObject(l2)