From: sbh Date: Mon, 24 Nov 2014 08:33:05 +0000 (+0300) Subject: Renaud's patch "python_plugin_11_20.patch" X-Git-Tag: V_0.7.0_rc1~57^2~3^2~10 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=b2cbf117bd01fa9d1dfd486f01c30c2d9a3e59d8;p=modules%2Fshaper.git Renaud's patch "python_plugin_11_20.patch" --- diff --git a/src/PythonFeaturesPlugin/CMakeLists.txt b/src/PythonFeaturesPlugin/CMakeLists.txt index bbfe436ea..1e600b3df 100644 --- a/src/PythonFeaturesPlugin/CMakeLists.txt +++ b/src/PythonFeaturesPlugin/CMakeLists.txt @@ -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 index 000000000..feef52528 --- /dev/null +++ b/src/PythonFeaturesPlugin/FeaturesAPI.py @@ -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 diff --git a/src/PythonFeaturesPlugin/PythonFeaturesPlugin_Box.py b/src/PythonFeaturesPlugin/PythonFeaturesPlugin_Box.py index 2a4f5b819..b0359dc4e 100644 --- a/src/PythonFeaturesPlugin/PythonFeaturesPlugin_Box.py +++ b/src/PythonFeaturesPlugin/PythonFeaturesPlugin_Box.py @@ -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 index 000000000..364e89aa8 --- /dev/null +++ b/src/PythonFeaturesPlugin/SketchResult.py @@ -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 index 000000000..75c5e7733 --- /dev/null +++ b/src/PythonFeaturesPlugin/examples.py @@ -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 index 000000000..ccd103a81 --- /dev/null +++ b/src/PythonFeaturesPlugin/extrusion.py @@ -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 index 000000000..462c1808a --- /dev/null +++ b/src/PythonFeaturesPlugin/sketch.py @@ -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)