3 from SketchResult import SketchResult
8 class PythonFeaturesPlugin_Box(ModelAPI.ModelAPI_Feature):
10 "Feature to create a box by drawing a sketch and extruding it"
13 ModelAPI.ModelAPI_Feature.__init__(self)
33 return "box_ref_width"
37 return "box_ref_length"
41 return "box_ref_height"
44 return PythonFeaturesPlugin_Box.ID()
46 def initAttributes(self):
47 # C++ static methods (in example "type()" of the ModelAPI_AttributeDouble
48 # should be called like this: moduleName.ClassName_staticMethod()
49 self.data().addAttribute(self.WIDTH_ID(), ModelAPI.ModelAPI_AttributeDouble_typeId())
50 self.data().addAttribute(self.LENGTH_ID(), ModelAPI.ModelAPI_AttributeDouble_typeId())
51 self.data().addAttribute(self.HEIGHT_ID(), ModelAPI.ModelAPI_AttributeDouble_typeId())
52 self.data().addAttribute(self.WIDTH_REF_ID(), ModelAPI.ModelAPI_AttributeReference_typeId())
53 self.data().addAttribute(self.LENGTH_REF_ID(), ModelAPI.ModelAPI_AttributeReference_typeId())
54 self.data().addAttribute(self.HEIGHT_REF_ID(), ModelAPI.ModelAPI_AttributeReference_typeId())
55 aSession = ModelAPI.ModelAPI_Session.get()
56 aSession.validators().registerNotObligatory(self.getKind(), self.WIDTH_REF_ID())
57 aSession.validators().registerNotObligatory(self.getKind(), self.LENGTH_REF_ID())
58 aSession.validators().registerNotObligatory(self.getKind(), self.HEIGHT_REF_ID())
59 aSession.validators().registerConcealment(self.getKind(), self.HEIGHT_REF_ID())
60 self.mySketch = None # not yet initialized
61 self.myExtrusion = None # not yet initialized
64 aWidth = self.real(self.WIDTH_ID()).value()
65 aLength = self.real(self.LENGTH_ID()).value()
66 aHeight = self.real(self.HEIGHT_ID()).value()
67 aWidthRefValue = self.reference(self.WIDTH_REF_ID()).value()
68 aLengthRefValue = self.reference(self.LENGTH_REF_ID()).value()
69 aHeightRefValue = self.reference(self.HEIGHT_REF_ID()).value()
71 if not all((aWidthRefValue, aLengthRefValue, aHeightRefValue)):
72 aResult = extrusion.getBody(self.makeBox(aLength, aWidth, aHeight))
74 aHeightProxyResult = ModelAPI.modelAPI_Result(aHeightRefValue)
75 aWidthFeature = ModelAPI.modelAPI_Feature(aWidthRefValue)
76 aLengthFeature = ModelAPI.modelAPI_Feature(aLengthRefValue)
77 aHeightResult = ModelAPI.modelAPI_ResultBody(aHeightProxyResult)
78 aWidthFeature.real("ConstraintValue").setValue(aWidth)
79 aLengthFeature.real("ConstraintValue").setValue(aLength)
80 if aHeightResult is not None:
81 aHeightFeature = aHeightResult.document().feature(aHeightResult)
82 aHeightFeature.real("extrusion_size").setValue(aHeight)
83 aResult = extrusion.getBody(aHeightFeature)
84 # create a new result with copied shape from extrusion
85 aResultBody = self.document().createBody(self.data())
86 if not aResult is None:
87 aResultBody.store(aResult.shape())
88 self.setResult(aResultBody)
91 def makeBox(self, aWidth, aLength, aHeight):
92 aSession = ModelAPI.ModelAPI_Session.get()
93 aPart = aSession.activeDocument()
95 aSketch = sketch.addTo(aPart)
96 self.mySketch = sketch
97 sketch.setXOYPlane(aSketch)
99 l1 = sketch.addLine(10, 10, 10, 60, aSketch)
100 l2 = sketch.addLine(10, 60, 60, 60, aSketch)
101 l3 = sketch.addLine(60, 60, 60, 10, aSketch)
102 l4 = sketch.addLine(60, 10, 10, 10, aSketch)
104 # Creating the constraints
105 sketch.makeCoincident(sketch.getEndPoint(l1), sketch.getStartPoint(l2), aSketch)
106 sketch.makeCoincident(sketch.getEndPoint(l2), sketch.getStartPoint(l3), aSketch)
107 sketch.makeCoincident(sketch.getEndPoint(l3), sketch.getStartPoint(l4), aSketch)
108 sketch.makeCoincident(sketch.getEndPoint(l4), sketch.getStartPoint(l1), aSketch)
109 sketch.makeParallel(sketch.getGeometry(l1), sketch.getGeometry(l3), aSketch)
110 sketch.makeParallel(sketch.getGeometry(l2), sketch.getGeometry(l4), aSketch)
111 sketch.makePerpendicular(sketch.getGeometry(l1), sketch.getGeometry(l4), aSketch)
112 # Set to 0X and 0Y lines defined length
113 aWidthFeature = sketch.makeConstantLength(sketch.getGeometry(l4), aWidth, aSketch)
114 aLengthFeature = sketch.makeConstantLength(sketch.getGeometry(l1), aLength, aSketch)
115 # Finalisation of the operation
116 builder = SketchResult(aSketch)
117 # Creating a feature Extrusion
118 aHeightFeature = extrusion.addNew(builder, aHeight, aPart)
119 self.myExtrusion = aHeightFeature
121 self.reference(self.WIDTH_REF_ID()).setValue(aWidthFeature)
122 self.reference(self.LENGTH_REF_ID()).setValue(aLengthFeature)
123 self.reference(self.HEIGHT_REF_ID()).setValue(aHeightFeature.firstResult())
124 return aHeightFeature
129 if __name__=='__main__':
130 session = ModelAPI.ModelAPI_Session.get()
131 part = session.activeDocument()
132 session.startOperation()
133 feature = part.addFeature('Box')
134 feature.real('box_width').setValue(10)
135 feature.real('box_length').setValue(10)
136 feature.real('box_height').setValue(10)
138 session.finishOperation()