Skip to content

Commit c0585f0

Browse files
committed
feat: added baseplate padding option to prevent baseplate from sliding inside drawers
1 parent 1bec3d0 commit c0585f0

File tree

4 files changed

+198
-16
lines changed

4 files changed

+198
-16
lines changed

commands/commandCreateBaseplate/entry.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
PLATE_FEATURES_GROUP = 'plate_features'
5353
MAGNET_SOCKET_GROUP = 'magnet_cutout_group'
5454
SCREW_HOLE_GROUP = 'screw_hole_group'
55+
SIDE_PADDING_GROUP = 'side_padding_group'
5556
ADVANCED_PLATE_SIZE_GROUP = 'advanced_plate_size_group'
5657
INPUT_CHANGES_GROUP = 'input_changes_group'
5758
PREVIEW_GROUP = 'preview_group'
@@ -75,6 +76,12 @@
7576
BASEPLATE_SCREW_DIAMETER_INPUT = 'screw_diameter'
7677
BASEPLATE_SCREW_HEIGHT_INPUT = 'screw_head_diameter'
7778

79+
BASEPLATE_WITH_SIDE_PADDING_INPUT = 'with_side_padding'
80+
BASEPLATE_SIDE_PADDING_LEFT_INPUT = 'side_padding_left'
81+
BASEPLATE_SIDE_PADDING_TOP_INPUT = 'side_padding_top'
82+
BASEPLATE_SIDE_PADDING_RIGHT_INPUT = 'side_padding_right'
83+
BASEPLATE_SIDE_PADDING_BOTTOM_INPUT = 'side_padding_bottom'
84+
7885
BASEPLATE_EXTRA_THICKNESS_INPUT = 'extra_bottom_thickness'
7986
BASEPLATE_BIN_Z_CLEARANCE_INPUT = 'bin_z_clearance'
8087
BASEPLATE_HAS_CONNECTION_HOLE_INPUT = 'has_connection_hole'
@@ -237,6 +244,36 @@ def command_created(args: adsk.core.CommandCreatedEventArgs):
237244
screwHeadSizeInput.tooltip = "Must be greater than screw diameter"
238245
uiState.registerCommandInput(screwHeadSizeInput)
239246

247+
sidePaddingGroup = plateFeaturesGroup.children.addGroupCommandInput(SIDE_PADDING_GROUP, 'Side padding')
248+
sidePaddingGroup.isExpanded = uiState.getState(SIDE_PADDING_GROUP)
249+
uiState.registerCommandInput(sidePaddingGroup)
250+
generateSidePaddingInput = sidePaddingGroup.children.addBoolValueInput(BASEPLATE_WITH_SIDE_PADDING_INPUT, 'Add side padding', True, '', uiState.getState(BASEPLATE_WITH_SIDE_PADDING_INPUT))
251+
uiState.registerCommandInput(generateSidePaddingInput)
252+
253+
sidePaddingLeftInput = sidePaddingGroup.children.addValueInput(BASEPLATE_SIDE_PADDING_LEFT_INPUT, 'Padding left', defaultLengthUnits, adsk.core.ValueInput.createByReal(uiState.getState(BASEPLATE_SIDE_PADDING_LEFT_INPUT)))
254+
sidePaddingLeftInput.minimumValue = 0
255+
sidePaddingLeftInput.isMinimumInclusive = True
256+
sidePaddingLeftInput.tooltip = "Must be equal or greater than 0"
257+
uiState.registerCommandInput(sidePaddingLeftInput)
258+
259+
sidePaddingTopInput = sidePaddingGroup.children.addValueInput(BASEPLATE_SIDE_PADDING_TOP_INPUT, 'Padding top', defaultLengthUnits, adsk.core.ValueInput.createByReal(uiState.getState(BASEPLATE_SIDE_PADDING_TOP_INPUT)))
260+
sidePaddingTopInput.minimumValue = 0
261+
sidePaddingTopInput.isMinimumInclusive = True
262+
sidePaddingTopInput.tooltip = "Must be equal or greater than 0"
263+
uiState.registerCommandInput(sidePaddingTopInput)
264+
265+
sidePaddingRightInput = sidePaddingGroup.children.addValueInput(BASEPLATE_SIDE_PADDING_RIGHT_INPUT, 'Padding right', defaultLengthUnits, adsk.core.ValueInput.createByReal(uiState.getState(BASEPLATE_SIDE_PADDING_RIGHT_INPUT)))
266+
sidePaddingRightInput.minimumValue = 0
267+
sidePaddingRightInput.isMinimumInclusive = True
268+
sidePaddingRightInput.tooltip = "Must be equal or greater than 0"
269+
uiState.registerCommandInput(sidePaddingRightInput)
270+
271+
sidePaddingBottomInput = sidePaddingGroup.children.addValueInput(BASEPLATE_SIDE_PADDING_BOTTOM_INPUT, 'Padding bottom', defaultLengthUnits, adsk.core.ValueInput.createByReal(uiState.getState(BASEPLATE_SIDE_PADDING_BOTTOM_INPUT)))
272+
sidePaddingBottomInput.minimumValue = 0
273+
sidePaddingBottomInput.isMinimumInclusive = True
274+
sidePaddingBottomInput.tooltip = "Must be equal or greater than 0"
275+
uiState.registerCommandInput(sidePaddingBottomInput)
276+
240277
advancedPlateSizeGroup = plateFeaturesGroup.children.addGroupCommandInput(ADVANCED_PLATE_SIZE_GROUP, 'Advanced plate size options')
241278
advancedPlateSizeGroup.isExpanded = uiState.getState(ADVANCED_PLATE_SIZE_GROUP)
242279
uiState.registerCommandInput(advancedPlateSizeGroup)
@@ -399,6 +436,11 @@ def generateBaseplate(args: adsk.core.CommandEventArgs):
399436
baseplateGeneratorInput.hasScrewHoles = inputsState.hasScrewHoles
400437
baseplateGeneratorInput.screwHolesDiameter = inputsState.screwHoleSize
401438
baseplateGeneratorInput.screwHeadCutoutDiameter = inputsState.screwHeadSize
439+
baseplateGeneratorInput.hasPadding = inputsState.hasPadding
440+
baseplateGeneratorInput.paddingLeft = inputsState.paddingLeft
441+
baseplateGeneratorInput.paddingTop = inputsState.paddingTop
442+
baseplateGeneratorInput.paddingRight = inputsState.paddingRight
443+
baseplateGeneratorInput.paddingBottom = inputsState.paddingBottom
402444
baseplateGeneratorInput.bottomExtensionHeight = inputsState.extraBottomThickness
403445
baseplateGeneratorInput.binZClearance = inputsState.verticalClearance
404446
baseplateGeneratorInput.hasConnectionHoles = inputsState.hasConnectionHoles
@@ -410,7 +452,7 @@ def generateBaseplate(args: adsk.core.CommandEventArgs):
410452

411453
if des.designType == 1:
412454
# group features in timeline
413-
plateGroup = des.timeline.timelineGroups.add(newCmpOcc.timelineObject.index, newCmpOcc.timelineObject.index + gridfinityBaseplateComponent.features.count + gridfinityBaseplateComponent.constructionAxes.count + gridfinityBaseplateComponent.sketches.count)
455+
plateGroup = des.timeline.timelineGroups.add(newCmpOcc.timelineObject.index, newCmpOcc.timelineObject.index + gridfinityBaseplateComponent.features.count + gridfinityBaseplateComponent.constructionAxes.count + gridfinityBaseplateComponent.constructionPlanes.count + gridfinityBaseplateComponent.sketches.count)
414456
plateGroup.name = baseplateName
415457
except UnsupportedDesignTypeException as err:
416458
args.executeFailed = True
@@ -432,6 +474,7 @@ def initUiState():
432474
uiState.initValue(SCREW_HOLE_GROUP, True, adsk.core.GroupCommandInput.classType())
433475
uiState.initValue(ADVANCED_PLATE_SIZE_GROUP, True, adsk.core.GroupCommandInput.classType())
434476
uiState.initValue(INPUT_CHANGES_GROUP, True, adsk.core.GroupCommandInput.classType())
477+
uiState.initValue(SIDE_PADDING_GROUP, True, adsk.core.GroupCommandInput.classType())
435478
uiState.initValue(PREVIEW_GROUP, True, adsk.core.GroupCommandInput.classType())
436479

437480
uiState.initValue(BASEPLATE_BASE_UNIT_WIDTH_INPUT, DIMENSION_DEFAULT_WIDTH_UNIT, adsk.core.ValueCommandInput.classType())
@@ -447,6 +490,12 @@ def initUiState():
447490
uiState.initValue(BASEPLATE_MAGNET_HEIGHT_INPUT, const.DIMENSION_MAGNET_CUTOUT_DEPTH, adsk.core.ValueCommandInput.classType())
448491
uiState.initValue(BASEPLATE_WITH_SCREWS_INPUT, True, adsk.core.BoolValueCommandInput.classType())
449492

493+
uiState.initValue(BASEPLATE_WITH_SIDE_PADDING_INPUT, False, adsk.core.BoolValueCommandInput.classType())
494+
uiState.initValue(BASEPLATE_SIDE_PADDING_LEFT_INPUT, 0, adsk.core.BoolValueCommandInput.classType())
495+
uiState.initValue(BASEPLATE_SIDE_PADDING_TOP_INPUT, 0, adsk.core.BoolValueCommandInput.classType())
496+
uiState.initValue(BASEPLATE_SIDE_PADDING_RIGHT_INPUT, 0, adsk.core.BoolValueCommandInput.classType())
497+
uiState.initValue(BASEPLATE_SIDE_PADDING_BOTTOM_INPUT, 0, adsk.core.BoolValueCommandInput.classType())
498+
450499
uiState.initValue(BASEPLATE_SCREW_DIAMETER_INPUT, const.DIMENSION_PLATE_SCREW_HOLE_DIAMETER, adsk.core.ValueCommandInput.classType())
451500
uiState.initValue(BASEPLATE_SCREW_HEIGHT_INPUT, const.DIMENSION_SCREW_HEAD_CUTOUT_DIAMETER, adsk.core.ValueCommandInput.classType())
452501
uiState.initValue(BASEPLATE_EXTRA_THICKNESS_INPUT, const.BASEPLATE_EXTRA_HEIGHT, adsk.core.ValueCommandInput.classType())
@@ -493,6 +542,11 @@ def getInputsState():
493542
uiState.getState(BASEPLATE_WITH_SCREWS_INPUT),
494543
uiState.getState(BASEPLATE_SCREW_DIAMETER_INPUT),
495544
uiState.getState(BASEPLATE_SCREW_HEIGHT_INPUT),
545+
uiState.getState(BASEPLATE_WITH_SIDE_PADDING_INPUT),
546+
uiState.getState(BASEPLATE_SIDE_PADDING_LEFT_INPUT),
547+
uiState.getState(BASEPLATE_SIDE_PADDING_TOP_INPUT),
548+
uiState.getState(BASEPLATE_SIDE_PADDING_RIGHT_INPUT),
549+
uiState.getState(BASEPLATE_SIDE_PADDING_BOTTOM_INPUT),
496550
uiState.getState(BASEPLATE_EXTRA_THICKNESS_INPUT),
497551
uiState.getState(BASEPLATE_BIN_Z_CLEARANCE_INPUT),
498552
uiState.getState(BASEPLATE_HAS_CONNECTION_HOLE_INPUT),

commands/commandCreateBaseplate/inputState.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ class InputState:
1919
screwHoleSize: float
2020
screwHeadSize: float
2121

22+
hasPadding: bool
23+
paddingLeft: float
24+
paddingTop: float
25+
paddingRight: float
26+
paddingBottom: float
27+
2228
extraBottomThickness: float
2329
verticalClearance: float
2430

lib/gridfinityUtils/baseplateGenerator.py

Lines changed: 97 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ def createGridfinityBaseplate(input: BaseplateGeneratorInput, targetComponent: a
197197
cuttingTools = cuttingTools + list(rectangularPattern.bodies)
198198

199199
# create baseplate body
200+
baseplateTrueWidth = input.baseplateWidth * input.baseWidth - input.xyClearance * 2
201+
baseplateTrueLength = input.baseplateLength * input.baseLength - input.xyClearance * 2
200202
binInterfaceBody = shapeUtils.simpleBox(
201203
targetComponent.xYConstructionPlane,
202204
0,
@@ -208,25 +210,105 @@ def createGridfinityBaseplate(input: BaseplateGeneratorInput, targetComponent: a
208210
)
209211

210212
if input.binZClearance > 0:
211-
binZClearance = extrudeUtils.simpleDistanceExtrude(
212-
faceUtils.getTopFace(binInterfaceBody),
213-
adsk.fusion.FeatureOperations.NewBodyFeatureOperation,
214-
input.binZClearance,
215-
adsk.fusion.ExtentDirections.NegativeExtentDirection,
216-
[],
217-
targetComponent,
218-
)
219-
binZClearance.name = "flatten top side"
220-
binZClearance.bodies.item(0).name = "top negative volume"
221-
cuttingTools.append(binZClearance.bodies.item(0))
213+
binZClearance = shapeUtils.simpleBox(
214+
targetComponent.xYConstructionPlane,
215+
0,
216+
baseplateTrueWidth + input.paddingLeft + input.paddingRight,
217+
baseplateTrueLength + input.paddingBottom + input.paddingTop,
218+
-input.binZClearance,
219+
geometryUtils.createOffsetPoint(
220+
targetComponent.originConstructionPoint.geometry,
221+
byX=-input.paddingLeft,
222+
byY=-input.paddingBottom
223+
),
224+
targetComponent
225+
)
226+
binZClearance.name = "Top negative volume"
227+
cuttingTools.append(binZClearance)
228+
229+
if input.hasPadding:
230+
paddingHeigth = const.BIN_BASE_HEIGHT
231+
mergeTools = []
232+
if input.paddingLeft > 0:
233+
paddingLeftBody = shapeUtils.simpleBox(
234+
targetComponent.xYConstructionPlane,
235+
0,
236+
input.paddingLeft,
237+
baseplateTrueLength + input.paddingBottom + input.paddingTop,
238+
-paddingHeigth,
239+
geometryUtils.createOffsetPoint(
240+
targetComponent.originConstructionPoint.geometry,
241+
byX=-input.paddingLeft,
242+
byY=-input.paddingBottom
243+
),
244+
targetComponent
245+
)
246+
paddingLeftBody.name = "Padding left"
247+
mergeTools.append(paddingLeftBody)
248+
if input.paddingTop > 0:
249+
paddingTopBody = shapeUtils.simpleBox(
250+
targetComponent.xYConstructionPlane,
251+
0,
252+
baseplateTrueWidth + input.paddingLeft + input.paddingRight,
253+
input.paddingTop,
254+
-paddingHeigth,
255+
geometryUtils.createOffsetPoint(
256+
targetComponent.originConstructionPoint.geometry,
257+
byX=-input.paddingLeft,
258+
byY=baseplateTrueLength
259+
),
260+
targetComponent
261+
)
262+
paddingTopBody.name = "Padding top"
263+
mergeTools.append(paddingTopBody)
264+
if input.paddingRight > 0:
265+
paddingRightBody = shapeUtils.simpleBox(
266+
targetComponent.xYConstructionPlane,
267+
0,
268+
input.paddingRight,
269+
baseplateTrueLength + input.paddingTop + input.paddingBottom,
270+
-paddingHeigth,
271+
geometryUtils.createOffsetPoint(
272+
targetComponent.originConstructionPoint.geometry,
273+
byX=baseplateTrueWidth,
274+
byY=-input.paddingBottom
275+
),
276+
targetComponent
277+
)
278+
paddingRightBody.name = "Padding right"
279+
mergeTools.append(paddingRightBody)
280+
if input.paddingBottom > 0:
281+
paddingBottomBody = shapeUtils.simpleBox(
282+
targetComponent.xYConstructionPlane,
283+
0,
284+
baseplateTrueWidth + input.paddingLeft + input.paddingRight,
285+
input.paddingBottom,
286+
-paddingHeigth,
287+
geometryUtils.createOffsetPoint(
288+
targetComponent.originConstructionPoint.geometry,
289+
byX=-input.paddingLeft,
290+
byY=-input.paddingBottom
291+
),
292+
targetComponent
293+
)
294+
paddingBottomBody.name = "Padding bottom"
295+
mergeTools.append(paddingBottomBody)
296+
if len(mergeTools) > 0:
297+
paddingCombineFeature = combineUtils.joinBodies(
298+
binInterfaceBody,
299+
commonUtils.objectCollectionFromList(mergeTools),
300+
targetComponent,
301+
)
302+
paddingCombineFeature.name = "Combine base with padding bodies"
303+
binInterfaceBody = paddingCombineFeature.bodies.item(0)
222304

223305
cornerFillet = filletUtils.filletEdgesByLength(
224306
binInterfaceBody.faces,
225307
input.cornerFilletRadius - input.xyClearance,
226308
const.BIN_BASE_HEIGHT,
227309
targetComponent,
228310
)
229-
cornerFillet.name = "round outer corners"
311+
cornerFillet.name = "Round outer corners"
230312

231313
if input.hasExtendedBottom:
232314
baseplateBottomLayer = extrudeUtils.simpleDistanceExtrude(
@@ -243,11 +325,11 @@ def createGridfinityBaseplate(input: BaseplateGeneratorInput, targetComponent: a
243325
bottomChamfer = filletUtils.chamferEdgesByLength(
244326
[faceUtils.getBottomFace(binInterfaceBody)],
245327
0.05,
246-
input.baseplateLength * input.baseLength,
328+
baseplateTrueLength + (input.paddingTop + input.paddingBottom if input.hasPadding else 0),
247329
const.BIN_CORNER_FILLET_RADIUS * 3,
248330
targetComponent,
249331
)
250-
bottomChamfer.name = "bottom shamfer"
332+
bottomChamfer.name = "Bottom chamfer"
251333

252334
if not connectionHoleYTool is None and not connectionHoleXTool is None:
253335
holeToolsXFeature = patternUtils.recPattern(
@@ -294,7 +376,7 @@ def createGridfinityBaseplate(input: BaseplateGeneratorInput, targetComponent: a
294376
toolBodies,
295377
targetComponent,
296378
)
297-
finalCut.name = "final baseplate cut"
379+
finalCut.name = "Final baseplate cut"
298380

299381
return binInterfaceBody
300382

lib/gridfinityUtils/baseplateGeneratorInput.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,46 @@ def hasScrewHoles(self) -> bool:
105105
def hasScrewHoles(self, value: bool):
106106
self._hasScrewHoles = value
107107

108+
@property
109+
def hasPadding(self) -> bool:
110+
return self._hasPadding
111+
112+
@hasPadding.setter
113+
def hasPadding(self, value: bool):
114+
self._hasPadding = value
115+
116+
@property
117+
def paddingLeft(self) -> float:
118+
return self._paddingLeft
119+
120+
@paddingLeft.setter
121+
def paddingLeft(self, value: float):
122+
self._paddingLeft = value
123+
124+
@property
125+
def paddingTop(self) -> float:
126+
return self._paddingTop
127+
128+
@paddingTop.setter
129+
def paddingTop(self, value: float):
130+
self._paddingTop = value
131+
132+
@property
133+
def paddingRight(self) -> float:
134+
return self._paddingRight
135+
136+
@paddingRight.setter
137+
def paddingRight(self, value: float):
138+
self._paddingRight = value
139+
140+
@property
141+
def paddingBottom(self) -> float:
142+
return self._paddingBottom
143+
144+
@paddingBottom.setter
145+
def paddingBottom(self, value: float):
146+
self._paddingBottom = value
147+
108148
@property
109149
def hasConnectionHoles(self) -> bool:
110150
return self._hasConnectionHoles

0 commit comments

Comments
 (0)