Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
just paths

- name: Generate site
uses: yawkat/web-openscad-editor@35cd9bbb2bdec1fe98462d853833ea4c3058f89f # main
uses: yawkat/web-openscad-editor@323ca329f12ea210428ed6407f57f870fba548b7 # main
with:
config: editor.toml
output: out
Expand Down
2 changes: 2 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
This repository is dual-licensed under MIT and CC-BY 4.0.

Some models in opengrid/ are licenes under CC-BY 4.0 by https://www.printables.com/@DavidD and https://www.printables.com/@mitufy .

CC-BY 4.0: https://creativecommons.org/licenses/by/4.0/

MIT License
Expand Down
65 changes: 65 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ For inserting magnets, check out [the jig](#jig).
- [Top plate wall](#top-plate-wall)
- [Bottom plate wall](#bottom-plate-wall)
- [Variable wall height](#variable-wall-height)
- [openGrid Adapter](#opengrid-adapter)
- [Adapter types](#adapter-types)
- [Standard openGrid](#standard-opengrid)
- [openConnect](#openconnect)
- [Vertical Screws](#vertical-screws)
- [Screw dimensions](#screw-dimensions)
- [Screw locations](#screw-locations)
Expand Down Expand Up @@ -564,6 +568,67 @@ The top and bottom wall height can also be adjusted individually for each corner
> [!NOTE]
> Variable height does not currently render correctly with segmented baseplates.

## openGrid Adapter

**[Customizer with recommended openConnect layout](https://gridflock.yawk.at/#eyJwbGF0ZV9zaXplIjpbNDIsNDJdLCJwbGF0ZV93YWxsX3RoaWNrbmVzcyI6WzAsMSw0LDFdLCJwbGF0ZV93YWxsX2Fib3ZlIjpbMTQsMCwwLDE0XSwiYWRhcHRlcl9ub3J0aCI6dHJ1ZSwiYWRhcHRlcl9lYXN0Ijp0cnVlLCJhZGFwdGVyX3NvdXRoIjp0cnVlLCJhZGFwdGVyX3dlc3QiOnRydWV9)**

You can use GridFlock to generate Gridfinity "shelves" that can be attached to an [openGrid](https://www.opengrid.world/) system. Configure a plate wall of sufficient height, and then enable `adapter_north`, `adapter_east`, `adapter_west`, or `adapter_south`. For example, the following shelf has been generated with `plate_wall_thickness=[0,1,1,1]` (1mm wall everywhere except north) and `plate_wall_above=[20,0,0,20]` (20mm wall at south-east and south-west corners):

<!-- openscad -o docs/images/adapter-simple.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=6 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/adapter-simple.png" alt="Shelf" />

Note that openConnect is preferred over directly printing openGrid snaps, see below.

The wall will automatically be filled with as many adapters as possible:

<!-- openscad -o docs/images/adapter-multi.png --camera=0,0,0,60,0,20,100 -D plate_size='[88, 42]' -D adapter_south=true -D adapter_mode=6 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/adapter-multi.png" alt="Shelf" />

> [!NOTE]
> Adapters do not render correctly with segmented baseplates.

### Adapter types

GridFlock offers various adapter variants.

#### Standard openGrid

You can print the standard openGrid connector directly onto the wall. Normal and lite, directional and non-directional variants are available. There is also a "vertical" variant of each which cuts a 45° angle from the bottom of each connector which makes printing without supports possible, but reduces strength.

> [!NOTE]
> The printability vs strength tradeoff is substantial with this adapter. The vertical variants don't stay in place nearly as well, but the non-vertical type is very difficult to print. The openConnect system described below is the preferred option for connecting to openGrid.

The standard connector works with standard openGrid plates, but not lite plates:

<!-- openscad -o docs/images/opengrid-standard.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=0 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/opengrid-standard.png" alt="Standard connector" />

The lite connector works with all openGrid plates, but has reduced strength:

<!-- openscad -o docs/images/opengrid-lite.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=1 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/opengrid-lite.png" alt="Lite connector" />

The directional connector has increased strength:

<!-- openscad -o docs/images/opengrid-directional.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=2 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/opengrid-directional.png" alt="Directional connector" />

The vertical variants make the connector actually printable:

<!-- openscad -o docs/images/opengrid-vertical.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=4 -D plate_wall_thickness='[0,1,1,1]' -D plate_wall_above='[20,0,0,20]' -->
<img src="docs/images/opengrid-vertical.png" alt="Vertical connector" />

#### openConnect

[openConnect](https://www.printables.com/model/1559478-openconnect-opengrids-own-connector-system) is a system that adds a separately printed connector in between GridFlock and openGrid. This makes vertical printing a breeze without compromising attachment strength.

Since the GridFlock side of the connector is recessed, this requires a thicker wall of ~4mm, but vertical height can be lower.

<!-- openscad -o docs/images/openconnect-standard.png --camera=0,0,0,60,0,20,100 -D plate_size='[42, 42]' -D adapter_south=true -D adapter_mode=10 -D plate_wall_thickness='[0,1,4,1]' -D plate_wall_above='[14,0,0,14]' -->
<img src="docs/images/openconnect-standard.png" alt="Standard openConnect" />

There is also a "lock" variant that increases the connection strength to the openConnect interconnect. This connection is so strong that you may need a hammer to install the interconnect. This is my preferred option.

## Vertical Screws

Vertical screws are inserted at cell intersections. They can be used to screw down the plate. Screws can be placed at various positions depending on use case.
Expand Down
Binary file added docs/images/adapter-multi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/adapter-simple.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/openconnect-standard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/opengrid-directional.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/opengrid-lite.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/opengrid-standard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/opengrid-vertical.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 16 additions & 1 deletion editor.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ description-extra-html = """
<span style="display: none" class="alert alert-warning" data-display-condition="connector_intersection_puzzle && connector_edge_puzzle">You have enabled both the edge and intersection puzzle connectors. While technically possible, it is better to focus on and tune one connector type.</span>
"""
umami-track-render = []
umami-track-export = ["magnets", "magnet_style", "connector_intersection_puzzle", "connector_edge_puzzle", "bed_size", "click", "click_style", "filler_x", "filler_y", "stacked_print"]
umami-track-export = ["magnets", "magnet_style", "connector_intersection_puzzle", "connector_edge_puzzle", "bed_size", "click", "click_style", "filler_x", "filler_y", "stacked_print", "adapter_mode"]

[model.param-metadata.bed_size.presets]
text = "Printer Presets"
Expand Down Expand Up @@ -153,6 +153,21 @@ help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#plate-wall"
[model.param-metadata.plate_wall_height]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#plate-wall"

[model.tab-metadata.openGrid]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#opengrid-adapter"
collapsed = true
[model.param-metadata.adapter_north]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#opengrid-adapter"
[model.param-metadata.adapter_east]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#opengrid-adapter"
[model.param-metadata.adapter_south]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#opengrid-adapter"
[model.param-metadata.adapter_west]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#opengrid-adapter"
[model.param-metadata.adapter_mode]
help-link = "https://github.com/yawkat/GridFlock/blob/main/README.md#adapter-types"
display-condition = {js = "adapter_north || adapter_east || adapter_south || adapter_west"}

[model.tab-metadata."Vertical Screws"]
collapsed = true
[model.param-metadata.vertical_screw_diameter]
Expand Down
72 changes: 72 additions & 0 deletions gridflock.scad
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,19 @@ plate_wall_above = [0, 0, 0, 0];
// Variable wall height, below the plate. Specified for each corner individually. Corners are SW, NW, NE, SE.
plate_wall_below = [0, 0, 0, 0];

/* [openGrid] */

// Generate openGrid adapters on the north wall. Requires a plate wall of sufficient height/thickness on that side
adapter_north = false;
// Generate openGrid adapters on the east wall. Requires a plate wall of sufficient height/thickness on that side
adapter_east = false;
// Generate openGrid adapters on the south wall. Requires a plate wall of sufficient height/thickness on that side
adapter_south = false;
// Generate openGrid adapters on the west wall. Requires a plate wall of sufficient height/thickness on that side
adapter_west = false;
// Style of the openGrid adapter. The plain openGrid connectors can be printed directly, in normal or 'lite' strength, and in a directional or non-directional variant. The 'vertical' variants of each cut a 45° angle to allow printing without supports, at the cost of reduced strength. The openConnect variants instead cut a slot for a separately printed openConnect connector, which is the recommended option
adapter_mode = 11; // [0:openGrid, 1:openGrid/lite, 2:openGrid/directional, 3:openGrid/lite/directional, 4:openGrid/vertical, 5:openGrid/lite/vertical, 6:openGrid/directional/vertical, 7:openGrid/lite/directional/vertical, 10:openConnect Slot, 11:openConnect Slot w/ Lock]

/* [Vertical Screws] */

// Radius of vertical screws
Expand Down Expand Up @@ -243,6 +256,14 @@ assert(!magnets || magnet_frame_style != _MAGNET_SOLID || magnet_style != _MAGNE

assert(!thumbscrews || solid_base > 0 || (magnets && magnet_frame_style == _MAGNET_SOLID), "Thumbscrew holes require some sort of solid base, such as magnet_style solid, or an explicit solid_base.");

_OPENGRID_LITE = 1;
_OPENGRID_DIRECTIONAL = 2;
_OPENGRID_VERTICAL = 4;
_OPENGRID_MAX = 7;

_ADAPTER_SLOT_OPENCONNECT = 10;
_ADAPTER_SLOT_OPENCONNECT_LOCK = 11;

$fn=40;

// dimensions of the magnet extraction slot
Expand Down Expand Up @@ -951,6 +972,53 @@ module chamfer_triangle() {
polygon([[-extend, -extend], [1 + extend, -extend], [-extend, 1 + extend]]);
}

module adapter_side(side, size) {
min_below = min(plate_wall_below[(side+1)%4], plate_wall_below[(side+2)%4]);
min_above = min(plate_wall_above[(side+1)%4], plate_wall_above[(side+2)%4]);
height_side = _total_height + plate_wall_height[0] + plate_wall_height[1] + min_below + min_above;
area = [
size[side == _WEST || side == _EAST ? 1 : 0] - plate_corner_radius*2,
height_side
];
connector_size =
adapter_mode <= _OPENGRID_MAX ? [24.6, 24.6] :
adapter_mode == _ADAPTER_SLOT_OPENCONNECT || adapter_mode == _ADAPTER_SLOT_OPENCONNECT_LOCK ? [26, 18] :
assert(false);
count = [for (i = [0,1]) floor((area[i] + 28 - connector_size[i]) / 28)];
for (xi = [0:count.x-1], yi = [0:count.y-1]) translate([(-count.x/2+xi+0.5)*28, size[side == _WEST || side == _EAST ? 0 : 1]/2, (-count.y/2+yi+0.5)*28 - _extra_height - plate_wall_height[1] - min_below + height_side / 2]) {
if (adapter_mode <= _OPENGRID_MAX) {
depth = (adapter_mode & _OPENGRID_LITE) == 0 ? 6.8 : 3.4;
translate([0, depth, 0]) rotate([90, 0, 0]) {
difference() {
if ((adapter_mode & _OPENGRID_DIRECTIONAL) == 0) {
if ((adapter_mode & _OPENGRID_LITE) == 0) import("opengrid/opengrid-bare-snap.3mf");
else import("opengrid/opengrid-bare-lite-snap.3mf");
} else {
if ((adapter_mode & _OPENGRID_LITE) == 0) import("opengrid/opengrid-bare-directional-snap-v21.3mf");
else import("opengrid/opengrid-bare-directional-lite-snap-v2.3mf");
}
if ((adapter_mode & _OPENGRID_VERTICAL) != 0) translate([0, -12.3, 0]) rotate([0, -90, 0]) linear_extrude(h=28, center=true) polygon([[0, -depth], [depth, -depth], [depth, 0], [0, depth]]);
}
}
} else if (adapter_mode == _ADAPTER_SLOT_OPENCONNECT || adapter_mode == _ADAPTER_SLOT_OPENCONNECT_LOCK) {
rotate([90, 0, 180]) translate([0, 0, -2.7]) {
if (adapter_mode == _ADAPTER_SLOT_OPENCONNECT) import("opengrid/openconnect_slot_negative.3mf");
else import("opengrid/openconnect_slot_negative_lock.3mf");
}
}
}
}

module adapter(size, connector, negative) {
mode_negative = adapter_mode == _ADAPTER_SLOT_OPENCONNECT || adapter_mode == _ADAPTER_SLOT_OPENCONNECT_LOCK;
if (negative == mode_negative) {
if (adapter_north && !connector[_NORTH]) adapter_side(_NORTH, size);
if (adapter_east && !connector[_EAST]) rotate([0,0,-90]) adapter_side(_EAST, size);
if (adapter_south && !connector[_SOUTH]) rotate([0,0,180]) adapter_side(_SOUTH, size);
if (adapter_west && !connector[_WEST]) rotate([0,0,90]) adapter_side(_WEST, size);
}
}

function compute_segment_size(trace, padding) = [
BASEPLATE_DIMENSIONS.x * cumulate(trace.x)[len(trace.x)] + padding[_EAST] + padding[_WEST],
BASEPLATE_DIMENSIONS.y * cumulate(trace.y)[len(trace.y)] + padding[_NORTH] + padding[_SOUTH],
Expand Down Expand Up @@ -1085,6 +1153,8 @@ module segment(trace=[[1], [1]], padding=[0, 0, 0, 0], connector=[false, false,
}
}
}

adapter(size, connector, negative=false);

if (connector_intersection_puzzle) translate([0, 0, -_extra_height]) linear_extrude(height = _total_height) segment_intersection_connectors(true, trace, size, padding, connector);
if (connector_edge_puzzle) {
Expand All @@ -1103,6 +1173,8 @@ module segment(trace=[[1], [1]], padding=[0, 0, 0, 0], connector=[false, false,
}
}
}
adapter(size, connector, negative=true);

if (connector_edge_puzzle) {
translate([0, 0, -_extra_height]) linear_extrude(height = _extra_height+edge_puzzle_height_female) segment_edge_connectors(false, trace, size, padding, connector);
}
Expand Down
Binary file added opengrid/openconnect_slot_negative.3mf
Binary file not shown.
Binary file added opengrid/openconnect_slot_negative_lock.3mf
Binary file not shown.
Binary file not shown.
Binary file added opengrid/opengrid-bare-directional-snap-v21.3mf
Binary file not shown.
Binary file added opengrid/opengrid-bare-lite-snap.3mf
Binary file not shown.
Binary file added opengrid/opengrid-bare-snap.3mf
Binary file not shown.
Loading