Added inner diameter parameter for shaft wizard

This commit is contained in:
jrheinlaender 2012-12-03 18:53:26 +04:30 committed by wmayer
parent 48f06f64b8
commit 3a8b127e6a
3 changed files with 57 additions and 25 deletions

View File

@ -28,13 +28,15 @@ from ShaftDiagram import Diagram
class ShaftSegment:
length = 0.0
diameter = 0.0
innerdiameter = 0.0
loadType = "None"
loadSize = 0.0
loadLocation = 0.0
def __init__(self, l, d):
def __init__(self, l, d, di):
self.length = l
self.diameter = d
self.innerdiameter = di
class Shaft:
"The axis of the shaft is always assumed to correspond to the X-axis"
@ -62,20 +64,23 @@ class Shaft:
result += self.segments[i].length
return result
def addSegment(self, l, d):
def addSegment(self, l, d, di):
#print "Adding segment: ", l, " : ", d
self.segments.append(ShaftSegment(l,d))
self.sketch.addSegment(l, d)
self.segments.append(ShaftSegment(l,d,di))
self.sketch.addSegment(l, d, di)
# We don't call equilibrium() here because the new segment has no loads defined yet
def updateSegment(self, index, length = None, diameter = None):
def updateSegment(self, index, length = None, diameter = None, innerdiameter = None):
oldLength = self.segments[index].length
#print "Old length of ", index, ": ", oldLength, ", new Length: ", length, " diameter: ", diameter
if length is not None:
self.segments[index].length = length
if diameter is not None:
self.segments[index].diameter = diameter
self.sketch.updateSegment(index, oldLength, self.segments[index].length, self.segments[index].diameter)
if innerdiameter is not None:
self.segments[index].innerdiameter = innerdiameter
self.sketch.updateSegment(index, oldLength, self.segments[index].length,
self.segments[index].diameter, self.segments[index].innerdiameter)
self.equilibrium()
self.updateDiagrams()

View File

@ -42,7 +42,7 @@ class ShaftFeature:
self.sketch = self.Doc.addObject("Sketcher::SketchObject","SketchShaft")
self.sketch.Placement = self.App.Placement(self.App.Vector(0,0,0),self.App.Rotation(0,0,0,1))
def addSegment(self, length, diameter):
def addSegment(self, length, diameter, innerdiameter):
"Add a segment at the end of the shaft"
# Find constraint indices of vertical line constraint, horizontal line constraint
# FIXME: Should have a unique id instead of indices that might change with user editing
@ -53,6 +53,7 @@ class ShaftFeature:
# etc. etc.
constrRadius = 4 + self.segments * 6
constrLength = 7 + self.segments * 6
constrInnerRadius = 1 + self.segments * 6
# Find line index of vertical segment, horizontal segment, last shaft segment
# FIXME: Should have a unique id instead of indices that might change with user editing
segRadius = 1 + self.segments * 2
@ -62,6 +63,7 @@ class ShaftFeature:
segEnd = prevSegEnd + 2
radius = diameter / 2
innerradius = innerdiameter / 2
oldLength = self.totalLength
self.totalLength += length
self.segments += 1
@ -70,13 +72,13 @@ class ShaftFeature:
# First segment of shaft
# Create centerline
self.sketch.addGeometry(Part.Line(self.App.Vector(0,0,0), self.App.Vector(self.totalLength,0,0)))
self.sketch.addConstraint(Sketcher.Constraint('DistanceX',0, self.totalLength)) # Constraint1
self.sketch.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-1)) # Constraint2
self.sketch.addConstraint(Sketcher.Constraint('DistanceX',0, self.totalLength)) # Constraint1
self.sketch.addConstraint(Sketcher.Constraint('DistanceY', -1,1,0,1,innerradius)) # Constraint2
self.sketch.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-2)) # Constraint3
self.sketch.addConstraint(Sketcher.Constraint('Horizontal', 0)) # Constraint4
# Create first segment
self.sketch.addGeometry(Part.Line(self.App.Vector(0,0,0), self.App.Vector(0,radius,0)))
self.sketch.addConstraint(Sketcher.Constraint('DistanceY',1,radius)) # Constraint5
self.sketch.addGeometry(Part.Line(self.App.Vector(0,innerradius,0), self.App.Vector(0,radius,0)))
self.sketch.addConstraint(Sketcher.Constraint('DistanceY',-1,1,1,2,radius)) # Constraint5
self.sketch.addConstraint(Sketcher.Constraint('Coincident',0,1,1,1)) # Constraint6
self.sketch.addConstraint(Sketcher.Constraint('Vertical',1)) # Constraint7
self.sketch.addGeometry(Part.Line(self.App.Vector(0,radius,0), self.App.Vector(length,radius,0)))
@ -91,7 +93,7 @@ class ShaftFeature:
self.sketch.setDatum(0,self.totalLength)
# Add segment at the end
self.sketch.addGeometry(Part.Line(self.App.Vector(oldLength,self.lastRadius,0), self.App.Vector(oldLength,radius,0)))
self.sketch.addConstraint(Sketcher.Constraint('DistanceY', 0, 1, segRadius, 2, radius))
self.sketch.addConstraint(Sketcher.Constraint('DistanceY', -1,1, segRadius, 2, radius))
self.sketch.addConstraint(Sketcher.Constraint('Coincident',segRadius,1,prevSegLength,2))
self.sketch.addConstraint(Sketcher.Constraint('Vertical',segRadius))
self.sketch.addGeometry(Part.Line(self.App.Vector(oldLength,radius,0), self.App.Vector(oldLength+length,radius,0)))
@ -100,10 +102,10 @@ class ShaftFeature:
self.sketch.addConstraint(Sketcher.Constraint('Horizontal',segLength))
# close the sketch
self.sketch.addGeometry(Part.Line(self.App.Vector(oldLength+length,radius,0), self.App.Vector(oldLength+length,0,0)))
self.sketch.addGeometry(Part.Line(self.App.Vector(oldLength+length,radius,0), self.App.Vector(oldLength+length,innerradius,0)))
self.sketch.addConstraint(Sketcher.Constraint('Coincident',0,2,segEnd,2))
self.sketch.addConstraint(Sketcher.Constraint('Coincident',segEnd,1,segLength,2))
lastRadius = radius
self.lastRadius = radius
if oldLength == 0:
# create feature
@ -118,16 +120,20 @@ class ShaftFeature:
# FIXME: Will give a warning in the console if the active window is not the feature
self.Gui.SendMsgToActiveView("ViewFit")
def updateSegment(self, segment, oldLength, length, diameter):
def updateSegment(self, segment, oldLength, length, diameter, innerdiameter):
constrRadius = 4 + segment * 6
constrLength = 7 + segment * 6
constrInnerRadius = 1 # Currently we don't allow multiple different innner diameters
# update total length
self.totalLength = self.totalLength - oldLength + length
# Adjust length of centerline
self.sketch.setDatum(0,self.totalLength)
# Adjust segment length
self.sketch.setDatum(constrLength, length)
# Adjust diameter
self.sketch.setDatum(constrRadius, diameter/2)
# Adjust inner diameter
self.sketch.setDatum(constrInnerRadius, innerdiameter/2)
# Update feature
self.Doc.recompute()
self.Gui.SendMsgToActiveView("ViewFit")

View File

@ -30,17 +30,19 @@ class WizardShaftTable:
rowDict = {
"Length" : 0,
"Diameter" : 1,
"LoadType" : 2,
"LoadSize" : 3,
"LoadLocation" : 4,
"StartEdgeType" : 5,
"StartEdgeSize" : 6,
"EndEdgeType" : 7,
"EndEdgeSize" : 8
"InnerDiameter" : 2,
"LoadType" : 3,
"LoadSize" : 4,
"LoadLocation" : 5,
"StartEdgeType" : 6,
"StartEdgeSize" : 7,
"EndEdgeType" : 8,
"EndEdgeSize" : 9
}
rowDictReverse = {}
headers = ["Length [mm]",
"Diameter [mm]",
"Inner diameter [mm]",
"Load type",
"Load [N]",
"Location [mm]",
@ -61,7 +63,7 @@ class WizardShaftTable:
self.shaft = s
# Create table widget
self.widget = QtGui.QTableWidget(len(self.rowDict), 0)
self.widget.resize(QtCore.QSize(300,100))
self.widget.resize(QtCore.QSize(300,200))
#self.widget.setFocusPolicy(QtCore.Qt.StrongFocus)
# Label rows and columns
@ -102,16 +104,18 @@ class WizardShaftTable:
index = self.widget.columnCount()
# Make an intelligent guess at the length/dia of the next segment
if index > 0:
length = self.shaft.segments[index-1].length
length = self.shaft.segments[index-1].length
diameter = self.shaft.segments[index-1].diameter
if index > 2:
diameter -= 5.0
else:
diameter += 5.0
innerdiameter = self.shaft.segments[index-1].innerdiameter
else:
length = 20.0
diameter = 10.0
self.shaft.addSegment(length, diameter)
innerdiameter = 0.0
self.shaft.addSegment(length, diameter, innerdiameter)
self.widget.insertColumn(index)
self.widget.setHorizontalHeaderItem(index + 1, QtGui.QTableWidgetItem("Section %s" % (index + 1)))
@ -132,6 +136,14 @@ class WizardShaftTable:
widget.setValue(diameter)
widget.valueChanged.connect(self.slotValueChanged)
widget.editingFinished.connect(self.slotEditingFinished)
# inner Diameter
widget = QtGui.QDoubleSpinBox(self.widget)
widget.setMinimum(0)
widget.setMaximum(1E9)
self.widget.setCellWidget(self.rowDict["InnerDiameter"], index, widget)
widget.setValue(innerdiameter)
widget.valueChanged.connect(self.slotValueChanged)
widget.editingFinished.connect(self.slotEditingFinished)
# Load type
widget = QtGui.QComboBox(self.widget)
widget.insertItem(0, "None")
@ -203,6 +215,8 @@ class WizardShaftTable:
self.shaft.updateSegment(self.editedColumn, length = self.getDoubleValue(rowName, self.editedColumn))
elif rowName == "Diameter":
self.shaft.updateSegment(self.editedColumn, diameter = self.getDoubleValue(rowName, self.editedColumn))
elif rowName == "InnerDiameter":
self.shaft.updateSegment(self.editedColumn, innerdiameter = self.getDoubleValue(rowName, self.editedColumn))
elif rowName == "LoadType":
self.shaft.updateLoad(self.editedColumn, loadType = self.getListValue(rowName, self.editedColumn))
elif rowName == "LoadSize":
@ -232,6 +246,13 @@ class WizardShaftTable:
def getDiameter(self, column):
return self.getDoubleValue("Diameter", column)
def setInnerDiameter(self, column, d):
self.setDoubleValue("InnerDiameter", column, d)
self.shaft.updateSegment(column, innerdiameter = d)
def getInnerDiameter(self, column):
return self.getDoubleValue("InnerDiameter", column)
@QtCore.pyqtSlot('QString')
def slotLoadType(self, text):
if text != "Fixed":