13 Commits

Author SHA1 Message Date
378853c641 bundle: update (2026-06-22)
All checks were successful
version / update-version (release) Successful in 10s
2026-06-22 09:22:23 +00:00
7aea02f3af version: knoxmakers-inkscape-20260621
All checks were successful
bundle / bundle (push) Successful in 22s
2026-06-21 09:22:32 +00:00
337b00601a bundle: update (2026-06-21)
All checks were successful
version / update-version (release) Successful in 12s
2026-06-21 09:22:22 +00:00
ee650f2b71 version: knoxmakers-inkscape-20260122
All checks were successful
bundle / bundle (push) Successful in 27s
2026-01-22 15:00:59 +00:00
a5ddc33a27 bundle: update (2026-01-22)
All checks were successful
version / update-version (release) Successful in 13s
2026-01-22 15:00:45 +00:00
a9c87f2adf create version file for future use 2026-01-22 09:58:10 -05:00
5692f4bb08 force new release 2026-01-22 09:55:57 -05:00
9af24d49ee Merge branch 'main' of ssh://git.knoxmakers.org:2222/KnoxMakers/knoxmakers-inkscape 2026-01-22 09:53:29 -05:00
7211fd44ef release changes 2026-01-22 09:53:22 -05:00
b72b468ad4 bundle: update (2026-01-19)
All checks were successful
bundle / bundle (push) Successful in 18s
2026-01-19 09:23:04 +00:00
8a126fec7d bundle: update (2026-01-18)
All checks were successful
bundle / bundle (push) Successful in 16s
2026-01-18 09:23:06 +00:00
e0dc82c22d Merge branch 'main' of ssh://git.knoxmakers.org:2222/KnoxMakers/knoxmakers-inkscape
All checks were successful
bundle / bundle (push) Successful in 15s
2026-01-17 23:53:24 -05:00
c2fa54d3b4 readme 2026-01-17 23:53:16 -05:00
14 changed files with 171 additions and 23 deletions

View File

@@ -45,8 +45,8 @@ jobs:
git push origin HEAD:main
# Create a unique tag for this bundle run
DATETIME="$(date -u +%Y%m%d-%H%M%S)"
TAG="knox-makers-inkscape-${DATETIME}"
DATETIME="$(date -u +%Y%m%d)"
TAG="knoxmakers-inkscape-${DATETIME}"
SHA="$(git rev-parse HEAD)"
git tag -a "$TAG" -m "Automated bundle: $TAG ($SHA)"
@@ -67,7 +67,7 @@ jobs:
CREATE_JSON="$(jq -n \
--arg tag "$TAG" \
--arg name "$TAG" \
--arg body "Automated bundle release.\n\nExcludes: scripts/, .gitea/\nCommit: $SHA\nUTC: $(date -u +'%Y-%m-%d %H:%M:%S')" \
--arg body "Automated bundle release." \
'{tag_name:$tag, name:$name, body:$body, draft:false, prerelease:false}')"
RELEASE_RESP="$(curl -fsS -X POST "$API_CREATE" \

View File

@@ -0,0 +1,45 @@
name: version
on:
release:
types: [published]
jobs:
update-version:
runs-on: [ubuntu-24.04]
steps:
- name: Checkout repository
run: |
set -euo pipefail
rm -rf .git || true
rm -rf ./* ./.??* || true
git clone --depth 1 https://git.knoxmakers.org/KnoxMakers/knoxmakers-inkscape.git .
git checkout main
- name: Configure git identity
run: |
git config user.name "haxbot"
git config user.email "haxbot@knoxmakers.sh"
- name: Write version file
run: |
echo "${{ gitea.event.release.name }}" > version
- name: Commit and push version file
env:
HAXBOT_TOKEN: ${{ secrets.HAXBOT_TOKEN }}
run: |
set -euo pipefail
git add version
if git diff --cached --quiet; then
echo "No changes to version file"
exit 0
fi
git commit -m "version: ${{ gitea.event.release.name }}"
REPO_URL="https://x-access-token:${HAXBOT_TOKEN}@git.knoxmakers.org/KnoxMakers/knoxmakers-inkscape.git"
git remote set-url origin "$REPO_URL"
git push origin HEAD:main

View File

@@ -1,2 +1,27 @@
# knoxmakers-inkscape
A bundled collection of Inkscape extensions for Knox Makers makerspace.
## Installation
Download the latest release zip and extract into to your Inkscape extensions directory:
- **Linux**: `~/.config/inkscape/extensions/`
- **Linux (Flatpak)**: `~/.var/app/org.inkscape.Inkscape/config/inkscape/extensions/`
- **Linux (Snap)**: `~/snap/inkscape/current/.config/inkscape/extensions/`
- **macOS**: `~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions/`
- **Windows**: `%APPDATA%\inkscape\extensions\`
## Included Extensions
- **botbox3000** - Box generator for laser cutting
- **km-living-hinge** - Living hinge pattern generator
- **km-plot** - Detect and send designs to serial HPGL plotters/vinyl cutters
- **km-hatch** - Hatching/fill patterns
- **km-hershey** - Single Line text for plotting/engraving
Extensions appear under **Extensions > Knox Makers** in Inkscape.
## Releases
Automated bundles are created daily when upstream repositories have changes.

View File

@@ -1,6 +1,9 @@
# Hidden files and directories (everything starting with .)
.*
# Build output (release zips and their signatures)
dist/
# Python cache (but keep bundled deps/)
__pycache__/
*.py[cod]

View File

@@ -0,0 +1 @@
1.0.1

View File

@@ -1,4 +1,6 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 jondale
import sys
from pathlib import Path
@@ -182,7 +184,7 @@ class Boxbot(inkex.EffectExtension):
self.top_hole_inset = PathElement()
self.top_hole_inset.set_id(self.svg.get_unique_id("top_hole_inset"))
self.top_hole_inset.set('d', top_hole_inset_d)
self.top_hole_inset.style = self.CUT_OUTER_STYLE
self.top_hole_inset.style = self.CUT_INNER_STYLE
top_tabs_group.append(self.top_hole_inset)
except ValueError:
pass

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

@@ -1,4 +1,6 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 jondale
import sys
from pathlib import Path

View File

@@ -1,4 +1,6 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 jondale
import math

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Build a distributable Inkscape extension zip at dist/boxbot-<version>.zip
#
# Usage:
# ./package.sh [version] [--sign]
#
# version Set the version explicitly (used as-is, no bump). Saved to VERSION.
# With no version, the patch number in VERSION is incremented (x.y.Z+1).
# --sign Also produce a detached GPG signature (dist/boxbot-<version>.zip.sig).
#
# The zip bundles only the extension's own files in a boxbot/ folder. It does
# NOT include deps/ — the extension falls back to the inkex shipped with
# Inkscape (the sys.path shim is a no-op when deps/ is absent).
set -euo pipefail
repo_root="$(cd "$(dirname "$0")" && pwd)"
cd "$repo_root"
# Files that go into the package (allowlist: anything not here is excluded).
files="boxbot.inx boxbot.py offset.py placements.py livinghinge.py LICENSE README.md"
pkg="boxbot"
# Increment the patch component of a MAJOR.MINOR.PATCH version string.
bump_patch() {
local major minor patch
IFS='.' read -r major minor patch <<< "$1"
printf '%s.%s.%s' "${major:-0}" "${minor:-0}" "$(( ${patch:-0} + 1 ))"
}
version=""
sign=0
while [ $# -gt 0 ]; do
case "$1" in
--sign) sign=1 ;;
-*) echo "error: unknown option: $1" >&2; exit 1 ;;
*) version="$1" ;;
esac
shift
done
if [ -z "$version" ]; then
current="$(cat VERSION 2>/dev/null || true)"
[ -n "$current" ] || { echo "error: no VERSION file to increment" >&2; exit 1; }
version="$(bump_patch "$current")"
fi
# Persist so the next run increments from here.
printf '%s\n' "$version" > VERSION
stage="$(mktemp -d)"
trap 'rm -rf "$stage"' EXIT
mkdir -p "$stage/$pkg"
for f in $files; do
[ -f "$f" ] || { echo "error: missing file: $f" >&2; exit 1; }
cp "$f" "$stage/$pkg/"
done
mkdir -p dist
out="dist/boxbot-${version}.zip"
rm -f "$out"
( cd "$stage" && zip -rq "$repo_root/$out" "$pkg" )
if [ "$sign" -eq 1 ]; then
rm -f "$out.sig"
gpg --output "$out.sig" --detach-sign "$out"
echo "signed -> $out.sig"
fi
echo "built $out"
unzip -l "$out"

View File

@@ -1,4 +1,6 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 jondale
import sys
from pathlib import Path
@@ -82,6 +84,16 @@ def point_at_length(path, target_length):
return (last_point[0], last_point[1]), (1.0, 0.0)
def _apply_placement(item, x, y, angle):
# Bake placement into the path data; leaving it as a transform attr lets
# Inkscape shift the shape on ungroup (near-identity matrices lose the X translate).
transform = Transform()
transform.add_translate(x, y)
transform.add_rotate(angle)
item.path = item.path.transform(transform)
return item
def pattern_along_path(path, num_items, item_width, start_offset, spacing, create_shape_fn):
if isinstance(path, str):
@@ -104,12 +116,7 @@ def pattern_along_path(path, num_items, item_width, start_offset, spacing, creat
angle = math.degrees(math.atan2(tangent[1], tangent[0]))
item = create_shape_fn(i)
transform = Transform()
transform.add_translate(point[0], point[1])
transform.add_rotate(angle)
item.transform = transform
_apply_placement(item, point[0], point[1], angle)
items.append(item)
elif spacing == "endpoints":
@@ -120,12 +127,7 @@ def pattern_along_path(path, num_items, item_width, start_offset, spacing, creat
angle = math.degrees(math.atan2(tangent[1], tangent[0]))
item = create_shape_fn(i)
transform = Transform()
transform.add_translate(point[0], point[1])
transform.add_rotate(angle)
item.transform = transform
_apply_placement(item, point[0], point[1], angle)
items.append(item)
elif spacing == "simple":
@@ -138,12 +140,7 @@ def pattern_along_path(path, num_items, item_width, start_offset, spacing, creat
angle = math.degrees(math.atan2(tangent[1], tangent[0]))
item = create_shape_fn(i)
transform = Transform()
transform.add_translate(point[0], point[1])
transform.add_rotate(angle)
item.transform = transform
_apply_placement(item, point[0], point[1], angle)
items.append(item)
return items

View File

@@ -18,5 +18,5 @@ An Inkscape extension that fills closed shapes with parallel hatch lines. The ex
Inspiration, examples, and code came from:
- **Hatch Fill** from Evil Mad Scientist Laboratories and their EggBot extensions
- **Hatch Fill** from Evil Mad Scientist Laboratories and their EggBot extensions
https://github.com/evil-mad/EggBot/

1
version Normal file
View File

@@ -0,0 +1 @@
knoxmakers-inkscape-20260621