Skip to content

Commit 620914b

Browse files
Le0Michinejsormaz
authored andcommitted
Add support for hollow tabs
1 parent 533e1e3 commit 620914b

File tree

7 files changed

+223
-62
lines changed

7 files changed

+223
-62
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ jobs:
88
name: Create release-artifacts
99
runs-on: windows-latest
1010
steps:
11-
- uses: actions/checkout@v3
11+
- uses: actions/checkout@v4
1212
- name: Create zip file for manual installation
13-
uses: vimtor/action-zip@v1
13+
uses: vimtor/action-zip@v1.2
1414
with:
1515
files: GridfinityGenerator.manifest GridfinityGenerator.py config.py LICENSE.md lib/ commands/ documentation/PRIVACY_POLICY.md
1616
recursive: false

commands/commandCreateBin/entry.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@
9292
BIN_HAS_SCOOP_INPUT_ID = 'bin_has_scoop'
9393
BIN_SCOOP_MAX_RADIUS_INPUT_ID = 'bin_scoop_max_radius'
9494
BIN_HAS_TAB_INPUT_ID = 'bin_has_tab'
95+
BIN_TAB_IS_HOLLOW_INPUT_ID = 'tab_is_hollow'
9596
BIN_TAB_LENGTH_INPUT_ID = 'bin_tab_length'
9697
BIN_TAB_WIDTH_INPUT_ID = 'bin_tab_width'
9798
BIN_TAB_POSITION_INPUT_ID = 'bin_tab_position'
99+
BIN_TAB_LABEL_ANGLE_INPUT_ID = 'bin_tab_label_angle'
98100
BIN_TAB_ANGLE_INPUT_ID = 'bin_tab_angle'
99101
BIN_WITH_LIP_INPUT_ID = 'with_lip'
100102
BIN_WITH_LIP_NOTCHES_INPUT_ID = 'with_lip_notches'
@@ -177,10 +179,12 @@ def initDefaultUiState():
177179
commandUIState.initValue(BIN_SCOOP_MAX_RADIUS_INPUT_ID, const.BIN_SCOOP_MAX_RADIUS, adsk.core.ValueCommandInput.classType())
178180

179181
commandUIState.initValue(BIN_HAS_TAB_INPUT_ID, False, adsk.core.BoolValueCommandInput.classType())
182+
commandUIState.initValue(BIN_TAB_IS_HOLLOW_INPUT_ID, False, adsk.core.BoolValueCommandInput.classType())
180183
commandUIState.initValue(BIN_TAB_LENGTH_INPUT_ID, 1, adsk.core.ValueCommandInput.classType())
181184
commandUIState.initValue(BIN_TAB_WIDTH_INPUT_ID, const.BIN_TAB_WIDTH, adsk.core.ValueCommandInput.classType())
182185
commandUIState.initValue(BIN_TAB_POSITION_INPUT_ID, 0, adsk.core.ValueCommandInput.classType())
183-
commandUIState.initValue(BIN_TAB_ANGLE_INPUT_ID, '45 deg', adsk.core.ValueCommandInput.classType())
186+
commandUIState.initValue(BIN_TAB_LABEL_ANGLE_INPUT_ID, f'{const.BIN_TAB_LABEL_ANGLE} DEG', adsk.core.ValueCommandInput.classType())
187+
commandUIState.initValue(BIN_TAB_ANGLE_INPUT_ID, f'{const.BIN_TAB_OVERHANG_ANGLE} DEG', adsk.core.ValueCommandInput.classType())
184188

185189
commandUIState.initValue(BIN_GENERATE_BASE_INPUT_ID, True, adsk.core.BoolValueCommandInput.classType())
186190
commandUIState.initValue(BIN_SCREW_HOLES_INPUT_ID, False, adsk.core.BoolValueCommandInput.classType())
@@ -449,6 +453,7 @@ def is_all_input_valid(inputs: adsk.core.CommandInputs):
449453
binTabLength: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_LENGTH_INPUT_ID)
450454
binTabWidth: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_WIDTH_INPUT_ID)
451455
binTabPosition: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_POSITION_INPUT_ID)
456+
binTabLabelAngle: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_LABEL_ANGLE_INPUT_ID)
452457
binTabAngle: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_ANGLE_INPUT_ID)
453458
binTypeDropdownInput: adsk.core.DropDownCommandInput = inputs.itemById(BIN_TYPE_DROPDOWN_ID)
454459
binCompartmentGridTypeDropdownInput: adsk.core.DropDownCommandInput = inputs.itemById(BIN_COMPARTMENTS_GRID_TYPE_ID)
@@ -603,12 +608,20 @@ def command_created(args: adsk.core.CommandCreatedEventArgs):
603608
commandUIState.registerCommandInput(binTabFeaturesGroup)
604609
generateTabCheckboxinput = binTabFeaturesGroup.children.addBoolValueInput(BIN_HAS_TAB_INPUT_ID, 'Add label tab (along bin width)', True, '', commandUIState.getState(BIN_HAS_TAB_INPUT_ID))
605610
commandUIState.registerCommandInput(generateTabCheckboxinput)
611+
binTabIsHollowInput = binTabFeaturesGroup.children.addBoolValueInput(BIN_TAB_IS_HOLLOW_INPUT_ID, 'Hollow tab', True, '', commandUIState.getState(BIN_TAB_IS_HOLLOW_INPUT_ID))
612+
commandUIState.registerCommandInput(binTabIsHollowInput)
606613
binTabLengthInput = binTabFeaturesGroup.children.addValueInput(BIN_TAB_LENGTH_INPUT_ID, 'Tab length (u)', '', adsk.core.ValueInput.createByReal(commandUIState.getState(BIN_TAB_LENGTH_INPUT_ID)))
607614
commandUIState.registerCommandInput(binTabLengthInput)
608615
binTabWidthInput = binTabFeaturesGroup.children.addValueInput(BIN_TAB_WIDTH_INPUT_ID, 'Tab width (mm)', defaultLengthUnits, adsk.core.ValueInput.createByReal(commandUIState.getState(BIN_TAB_WIDTH_INPUT_ID)))
609616
commandUIState.registerCommandInput(binTabWidthInput)
610617
binTabPostionInput = binTabFeaturesGroup.children.addValueInput(BIN_TAB_POSITION_INPUT_ID, 'Tab offset (u)', '', adsk.core.ValueInput.createByReal(commandUIState.getState(BIN_TAB_POSITION_INPUT_ID)))
611618
commandUIState.registerCommandInput(binTabPostionInput)
619+
binTabLabelAngleInput = binTabFeaturesGroup.children.addValueInput(BIN_TAB_LABEL_ANGLE_INPUT_ID, 'Tab label angle', 'deg', adsk.core.ValueInput.createByString(str(commandUIState.getState(BIN_TAB_LABEL_ANGLE_INPUT_ID))))
620+
binTabLabelAngleInput.minimumValue = math.radians(0)
621+
binTabLabelAngleInput.isMinimumInclusive = True
622+
binTabLabelAngleInput.maximumValue = math.radians(90)
623+
binTabLabelAngleInput.isMaximumInclusive = True
624+
commandUIState.registerCommandInput(binTabLabelAngleInput)
612625
tabObverhangAngleInput = binTabFeaturesGroup.children.addValueInput(BIN_TAB_ANGLE_INPUT_ID, 'Tab overhang angle', 'deg', adsk.core.ValueInput.createByString(str(commandUIState.getState(BIN_TAB_ANGLE_INPUT_ID))))
613626
tabObverhangAngleInput.minimumValue = math.radians(30)
614627
tabObverhangAngleInput.isMinimumInclusive = True
@@ -821,8 +834,10 @@ def onChangeValidate():
821834
commandUIState.getInput(BIN_SCOOP_MAX_RADIUS_INPUT_ID).isEnabled = generateScoop
822835

823836
generateTab: bool = commandUIState.getState(BIN_HAS_TAB_INPUT_ID)
837+
commandUIState.getInput(BIN_TAB_IS_HOLLOW_INPUT_ID).isEnabled = generateTab
824838
commandUIState.getInput(BIN_TAB_LENGTH_INPUT_ID).isEnabled = generateTab
825839
commandUIState.getInput(BIN_TAB_WIDTH_INPUT_ID).isEnabled = generateTab
840+
commandUIState.getInput(BIN_TAB_LABEL_ANGLE_INPUT_ID).isEnabled = generateTab
826841
commandUIState.getInput(BIN_TAB_ANGLE_INPUT_ID).isEnabled = generateTab
827842
commandUIState.getInput(BIN_TAB_POSITION_INPUT_ID).isEnabled = generateTab
828843

@@ -866,9 +881,11 @@ def generateBin(args: adsk.core.CommandEventArgs):
866881
has_scoop: adsk.core.BoolValueCommandInput = inputs.itemById(BIN_HAS_SCOOP_INPUT_ID)
867882
binScoopMaxRadius: adsk.core.ValueCommandInput = inputs.itemById(BIN_SCOOP_MAX_RADIUS_INPUT_ID)
868883
hasTabInput: adsk.core.BoolValueCommandInput = inputs.itemById(BIN_HAS_TAB_INPUT_ID)
884+
binTabIsHollow: adsk.core.BoolValueCommandInput = inputs.itemById(BIN_TAB_IS_HOLLOW_INPUT_ID)
869885
binTabLength: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_LENGTH_INPUT_ID)
870886
binTabWidth: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_WIDTH_INPUT_ID)
871887
binTabPosition: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_POSITION_INPUT_ID)
888+
binTabLabelAngle: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_LABEL_ANGLE_INPUT_ID)
872889
binTabAngle: adsk.core.ValueCommandInput = inputs.itemById(BIN_TAB_ANGLE_INPUT_ID)
873890
binTypeDropdownInput: adsk.core.DropDownCommandInput = inputs.itemById(BIN_TYPE_DROPDOWN_ID)
874891
binCompartmentGridTypeDropdownInput: adsk.core.DropDownCommandInput = inputs.itemById(BIN_COMPARTMENTS_GRID_TYPE_ID)
@@ -938,9 +955,11 @@ def generateBin(args: adsk.core.CommandEventArgs):
938955
binBodyInput.hasScoop = has_scoop.value and isHollow
939956
binBodyInput.scoopMaxRadius = binScoopMaxRadius.value
940957
binBodyInput.hasTab = hasTabInput.value and isHollow
958+
binBodyInput.isTabHollow = binTabIsHollow.value
941959
binBodyInput.tabLength = binTabLength.value
942960
binBodyInput.tabWidth = binTabWidth.value
943961
binBodyInput.tabPosition = binTabPosition.value
962+
binBodyInput.tabLabelAngle = binTabLabelAngle.value
944963
binBodyInput.tabOverhangAngle = binTabAngle.value
945964
binBodyInput.compartmentsByX = compartmentsX.value
946965
binBodyInput.compartmentsByY = compartmentsY.value
@@ -1017,9 +1036,11 @@ def generateBin(args: adsk.core.CommandEventArgs):
10171036
compartmentTabInput.origin = tabOriginPoint
10181037
compartmentTabInput.length = max(0, min(binBodyInput.tabLength, binBodyInput.binWidth)) * binBodyInput.baseWidth - binBodyInput.wallThickness * 2 - binBodyInput.xyClearance * 2
10191038
compartmentTabInput.width = binBodyInput.tabWidth
1039+
compartmentTabInput.isTabHollow = binBodyInput.isTabHollow
1040+
compartmentTabInput.labelAngle = binBodyInput.tabLabelAngle
10201041
compartmentTabInput.overhangAngle = binBodyInput.tabOverhangAngle
10211042
compartmentTabInput.topClearance = const.BIN_TAB_TOP_CLEARANCE
1022-
tabBody = createGridfinityBinBodyTab(compartmentTabInput, gridfinityBinComponent)
1043+
tabBody, tabBodiesToSubtract = createGridfinityBinBodyTab(compartmentTabInput, gridfinityBinComponent)
10231044
combineInput = combineFeatures.createInput(tabBody, commonUtils.objectCollectionFromList([binBody]))
10241045
combineInput.operation = adsk.fusion.FeatureOperations.CutFeatureOperation
10251046
combineInput.isKeepToolBodies = True

lib/gridfinityUtils/binBodyGenerator.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ def createGridfinityBinBody(
142142
compartmentTabInput.origin = tabOriginPoint
143143
compartmentTabInput.length = max(0, min(input.tabLength, input.binWidth)) * input.baseWidth
144144
compartmentTabInput.width = input.tabWidth
145+
compartmentTabInput.isTabHollow = input.isTabHollow
146+
compartmentTabInput.labelAngle = input.tabLabelAngle
145147
compartmentTabInput.overhangAngle = input.tabOverhangAngle
146148
compartmentTabInput.topClearance = const.BIN_TAB_TOP_CLEARANCE
147149

@@ -255,14 +257,16 @@ def createCompartment(
255257

256258
# label tab
257259
if hasTab:
258-
tabBody = createGridfinityBinBodyTab(tabInput, targetComponent)
259-
260-
intersectTabInput = targetComponent.features.combineFeatures.createInput(
261-
tabBody,
262-
commonUtils.objectCollectionFromList([innerCutoutBody]),
263-
)
264-
intersectTabInput.operation = adsk.fusion.FeatureOperations.IntersectFeatureOperation
265-
intersectTabInput.isKeepToolBodies = True
266-
intersectTabFeature = targetComponent.features.combineFeatures.add(intersectTabInput)
267-
bodiesToMerge = bodiesToMerge + [body for body in list(intersectTabFeature.bodies) if not body.revisionId == innerCutoutBody.revisionId]
260+
tabBody, tabBodiesToSubtract = createGridfinityBinBodyTab(tabInput, targetComponent)
261+
if tabBody:
262+
intersectTabInput = targetComponent.features.combineFeatures.createInput(
263+
tabBody,
264+
commonUtils.objectCollectionFromList([innerCutoutBody]),
265+
)
266+
intersectTabInput.operation = adsk.fusion.FeatureOperations.IntersectFeatureOperation
267+
intersectTabInput.isKeepToolBodies = True
268+
intersectTabFeature = targetComponent.features.combineFeatures.add(intersectTabInput)
269+
bodiesToMerge = bodiesToMerge + [body for body in list(intersectTabFeature.bodies) if not body.revisionId == innerCutoutBody.revisionId]
270+
271+
bodiesToSubtract = bodiesToSubtract + tabBodiesToSubtract
268272
return (bodiesToMerge, bodiesToSubtract)

lib/gridfinityUtils/binBodyGeneratorInput.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,14 @@ def hasTab(self) -> bool:
188188
def hasTab(self, value: bool):
189189
self._hasTab = value
190190

191+
@property
192+
def isTabHollow(self) -> bool:
193+
return self._isTabHollow
194+
195+
@isTabHollow.setter
196+
def isTabHollow(self, value: bool):
197+
self._isTabHollow = value
198+
191199
@property
192200
def tabWidth(self) -> float:
193201
return self._tabWidth
@@ -212,6 +220,14 @@ def tabPosition(self) -> float:
212220
def tabPosition(self, value: float):
213221
self._tabPosition = value
214222

223+
@property
224+
def tabLabelAngle(self) -> float:
225+
return self._tabLabelAngle
226+
227+
@tabLabelAngle.setter
228+
def tabLabelAngle(self, value: float):
229+
self._tabLabelAngle = value
230+
215231
@property
216232
def tabOverhangAngle(self) -> float:
217233
return self._tabOverhangAngle

0 commit comments

Comments
 (0)