3 from SketchResult import SketchResult
8 class PythonFeaturesPlugin_Box(ModelAPI.ModelAPI_CompositeFeature):
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
126 def addFeature(self, theID):
129 def numberOfSubs(self):
130 # extrusion and sketch
133 def subFeature(self, theIndex):
134 if theIndex = 1: # sketch
136 return self.myExtrusion
138 def subFeatureId(self, theIndex):
141 def isSub(self, theFeature):
142 if theFeature = self.mySketch or theFeature = self.myExtrusion:
148 if __name__=='__main__':
149 session = ModelAPI.ModelAPI_Session.get()
150 part = session.activeDocument()
151 session.startOperation()
152 feature = part.addFeature('Box')
153 feature.real('box_width').setValue(10)
154 feature.real('box_length').setValue(10)
155 feature.real('box_height').setValue(10)
157 session.finishOperation()