From 3a8b127e6aae71ac939e5224e58bcf2c749f9f0b Mon Sep 17 00:00:00 2001 From: jrheinlaender Date: Mon, 3 Dec 2012 18:53:26 +0430 Subject: [PATCH] Added inner diameter parameter for shaft wizard --- src/Mod/PartDesign/WizardShaft/Shaft.py | 17 +++++--- .../PartDesign/WizardShaft/ShaftFeature.py | 24 +++++++---- .../WizardShaft/WizardShaftTable.py | 41 ++++++++++++++----- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/Mod/PartDesign/WizardShaft/Shaft.py b/src/Mod/PartDesign/WizardShaft/Shaft.py index 78716a126..e426812c8 100644 --- a/src/Mod/PartDesign/WizardShaft/Shaft.py +++ b/src/Mod/PartDesign/WizardShaft/Shaft.py @@ -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() diff --git a/src/Mod/PartDesign/WizardShaft/ShaftFeature.py b/src/Mod/PartDesign/WizardShaft/ShaftFeature.py index beac8705e..8cb606351 100644 --- a/src/Mod/PartDesign/WizardShaft/ShaftFeature.py +++ b/src/Mod/PartDesign/WizardShaft/ShaftFeature.py @@ -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") diff --git a/src/Mod/PartDesign/WizardShaft/WizardShaftTable.py b/src/Mod/PartDesign/WizardShaft/WizardShaftTable.py index a27289e20..412052175 100644 --- a/src/Mod/PartDesign/WizardShaft/WizardShaftTable.py +++ b/src/Mod/PartDesign/WizardShaft/WizardShaftTable.py @@ -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":