Added inner diameter parameter for shaft wizard
This commit is contained in:
parent
48f06f64b8
commit
3a8b127e6a
|
@ -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()
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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":
|
||||
|
|
Loading…
Reference in New Issue
Block a user