スキル一覧に戻る
racurry

underware-openscad

by racurry

Claude code marketplace

0🍴 0📅 2025年12月27日
GitHubで見るManusで実行

SKILL.md


name: underware-openscad description: Reference guide for generating Underware cable management channel OpenSCAD code. Provides channel type selection, parameter quick reference, and QuackWorks integration. Use when generating OpenSCAD files for Underware cable routing systems.

Underware OpenSCAD Code Generation

Generates OpenSCAD code for parametric cable management channels compatible with OpenGrid/Multiboard wall-mounted systems.

Required Reading Before Generating Code

Authoritative source (fetch every time):

Local reference clone (if GitHub unavailable):

  • /Users/aaron/workspace/infra/neat-little-package/.tmp/QuackWorks/Underware/*.scad

Related documentation:

Core Understanding (Critical Architecture)

What Makes Underware Different From Generic Cable Channels

Two-part snap system: Every channel consists of separate Base + Top pieces:

  • Base: Mounts to wall/surface with various mounting methods
  • Top: Clips onto base, removable for cable access
  • Snap profile: Precision-engineered interlock (~3mm overlap)
  • Why this matters: User can route cables, snap on tops, remove tops later without unmounting

Path-sweep construction: All channels use BOSL2 path_sweep() for complex geometries:

// Profile defines cross-section shape
// Turtle commands define path through space
path_sweep(baseProfile(widthMM = 25), turtle(["move", lengthMM]))

Profile scaling for width: Multi-unit channels expand by stretching center rectangle:

// 1-unit channel: 25mm wide (standard profile)
// 2-unit channel: 50mm wide (profile halves moved apart, rectangle fills gap)
function baseProfile(widthMM = 25) =
    union(
        left((widthMM-25)/2, selectBaseProfile),  // Left half
        right((widthMM-25)/2, mirror([1,0], selectBaseProfile)),  // Right half mirrored
        back(3.5/2, rect([widthMM-25+0.02, 3.5]))  // Center fill rectangle
    );

Grid-based dimensioning: All dimensions in 25mm grid units (OpenGrid/Multiboard standard):

  • Grid_Size = 25 (constant, do not modify)
  • Channel_Width_in_Units = 1 → 25mm wide channel
  • Channel_Length_Units = 5 → 125mm long straight channel

BOSL2 Dependencies (Required)

All channel files require:

include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>

Why these specific libraries:

  • std.scad: Core geometry operations (path_sweep, turtle, attachable)
  • rounding.scad: Smooth corners on profiles
  • threading.scad: Threaded snap connector generation

Channel Type Selection Framework (Decision Layer)

By Cable Routing Need

Routing NeedChannel TypeKey FileRead Subpage
Straight run with cord exitsI ChannelUnderware_I_Channel.scad./straight-runs.md
90° corner, independent arm lengthsL ChannelUnderware_L_Channel.scad./corners-junctions.md
3-way intersectionT ChannelUnderware_T_Channel.scad./corners-junctions.md
4-way crossX ChannelUnderware_X_Channel.scad./corners-junctions.md
Split one path to twoY Channel (Branch Split)Underware_Branch_Split_Channel.scad./corners-junctions.md
Smooth diagonal transitionS ChannelUnderware_S_Channel.scad./curves-transitions.md
Quarter/half/full circleC ChannelUnderware_C_Channel.scad./curves-transitions.md
45° angled cornerMitre ChannelUnderware_Mitre_Channel.scad./curves-transitions.md
Vertical level changeHeight Change ChannelUnderware_Height_Change_Channel.scad./curves-transitions.md

By Use Case Examples

User wants toRecommended approachNotes
Route desk power cables horizontallyI Channel with cord cutoutsUse Both Sides cutouts for multiple exit points
Turn corner around desk edgeL ChannelSet L_Channel_Length_in_Units_Y/X_Axis independently
Create cable junction boxT or X ChannelT for 3-way, X for 4-way crossroads
Branch to two monitor cablesY ChannelY_Output_Direction = "Forward" keeps both outputs same direction
Gradually shift cable run diagonallyS ChannelBezier curve, specify Units_Over and Units_Up
Route around circular desk legC ChannelSet Arc_Angle for quarter (90°) or half (180°) circle
Transition cables up/down wallHeight Change ChannelSmooth vertical transitions

When Pattern Is Unclear

Ask these questions:

  1. Path shape: Straight, corner, curve, or multi-junction?
  2. Exit points: Where do cables enter/exit the channel?
  3. Direction changes: 90°, 45°, or smooth curve?
  4. Mounting surface: Flat wall, under desk, around obstacles?

Default: When unclear, use I Channel (straight) - user can connect multiple segments later.

Universal Parameters (All Channels)

Required Parameters (Always Define)

/*[Choose Part]*/
Base_Top_or_Both = "Both"; // [Base, Top, Both] - Export control

/*[Channel Size]*/
Channel_Width_in_Units = 1;          // Width in grid units (25mm each)
Channel_Internal_Height = 12;        // Interior height 12-72mm (6mm increments)

/*[Mounting Options]*/
Mounting_Method = "Threaded Snap Connector";
// Options: Threaded Snap Connector, Direct Multiboard Screw,
//          Direct Multipoint Screw, Magnet, Wood Screw, Flat

Mounting Method Selection

MethodUse WhenParameters NeededPrint Orientation
Threaded Snap ConnectorOpenGrid/Multiboard with connectorsNone (default)Base flat, Top upside-down
Direct Multiboard ScrewScrew directly into board holesNoneBase flat (pre-drilled holes)
Direct Multipoint ScrewHoneycomb Storage WallNoneBase flat (larger holes)
MagnetCurved surfaces, repositionableMagnet_Diameter, Magnet_ThicknessBase flat (magnet recesses)
Wood ScrewDirect wall/desk mountingWood_Screw_Thread_DiameterBase flat (countersink holes)
FlatAdhesive mounting, testingNoneBase flat (no mounting features)

Common mistake: Using Flat for production installs. This removes all mounting features - only use for adhesive mounting or prototyping.

Advanced Options (Modify Rarely)

/*[Advanced Options]*/
Grid_Size = 25;                      // ALWAYS 25 for OpenGrid compatibility
Profile_Type = "Original";           // [Original, v2.5] - BETA: v2.5 inverse clip
Flex_Compensation_Scaling = 0.99;    // For wide/tall channels, reduce flex
Additional_Holding_Strength = 0.0;   // [0:0.1:1.5] - Increase for larger channels

When to use Advanced Options:

  • Profile_Type = "v2.5": BETA feature, inverse inside clip (not backwards compatible)
  • Flex_Compensation_Scaling: Channels wider than 1 unit or taller than 18mm may flex - scale to 0.99
  • Additional_Holding_Strength: Wide channels (2+ units) benefit from 0.6 extra holding strength

Code Generation Workflow

Step 1: Determine Channel Type

Use decision framework above → select appropriate channel file as reference.

Step 2: Read Channel-Specific Subpage

Navigate to relevant subpage for detailed parameter reference:

  • ./straight-runs.md: I Channel (cord cutouts, length parameters)
  • ./corners-junctions.md: L, T, X, Y Channels (arm lengths, mitered corners)
  • ./curves-transitions.md: S, C, Mitre, Height Change (curve parameters, angles)
  • ./mounting-accessories.md: Keyholes, Hooks, Item Holders, Connectors

Step 3: Gather User Requirements

Dimension questions:

  • How wide should the channel be? (units × 25mm)
  • How tall inside? (12mm min, 72mm max, 6mm increments)
  • Length/distance for straight sections? (units × 25mm)

Mounting questions:

  • Where mounting? (OpenGrid board, direct wall, desk underside)
  • Mounting hardware available? (snap connectors, screws, magnets)

Cable exit questions:

  • Where do cables exit? (for I Channel cord cutouts)
  • How many cables? (affects cutout count/spacing)

Step 4: Generate OpenSCAD Code

Code structure pattern:

/*Created by [Your context]
Based on QuackWorks Underware by BlackjackDuck (Andy) and Hands on Katie
Licensed Creative Commons 4.0 Attribution Non-Commercial Share-Alike (CC-BY-NC-SA)

Documentation: https://handsonkatie.com/underware-2-0-the-made-to-measure-collection/
*/

include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>

/*[Choose Part]*/
Base_Top_or_Both = "Both";

/*[Channel Size]*/
Channel_Width_in_Units = 1;
Channel_Internal_Height = 12;
// ... channel-specific size parameters

/*[Mounting Options]*/
Mounting_Method = "Threaded Snap Connector";
// ... mounting-specific parameters

/*[Advanced Options]*/
Grid_Size = 25;
Global_Color = "SlateBlue";
Profile_Type = "Original";

// ... include complete module code from QuackWorks reference

DO NOT write modules from scratch - copy/adapt from QuackWorks repository:

  1. Fetch latest .scad file from QuackWorks
  2. Preserve all module code (profiles, path_sweep operations)
  3. Only modify user-facing parameters section
  4. Keep attribution comments intact (CC BY-NC-SA license requirement)

Common Pitfalls

Pitfall #1: Hardcoding Dimensions Instead of Grid Units

Problem: User requests 75mm long channel, code sets lengthMM = 75.

Why it fails: Underware uses grid units for mounting alignment. 75mm doesn't align to 25mm grid - mounting holes won't match OpenGrid.

Better approach:

// User wants 75mm → suggest 75mm = 3 grid units
Channel_Length_Units = 3;  // 3 × 25mm = 75mm

// Or: User wants 80mm → explain rounding
Channel_Length_Units = 3;  // 75mm (closest grid alignment)
// Note to user: "Using 3 units (75mm) for grid alignment.
//                For 100mm use 4 units."

Pitfall #2: Ignoring Two-Part Export

Problem: Code generates only base or only top, user can't assemble.

Why it fails: Underware requires both parts to function. Base alone has no cable retention, top alone can't mount.

Better approach:

// ALWAYS default to Both for user convenience
Base_Top_or_Both = "Both";

// Explain in comments:
// For printing: Export "Both", slice with parts separated
// For troubleshooting: Export "Base" or "Top" individually

Pitfall #3: Wrong Mounting Method for Use Case

Problem: User mounting to OpenGrid, code uses Flat method.

Why it fails: No mounting features generated - channel won't attach.

Better approach:

// Ask about mounting surface first
// OpenGrid/Multiboard → "Threaded Snap Connector"
// Direct wall → "Wood Screw" with Wood_Screw_Thread_Diameter = 3.5
// Metal desk → "Magnet" with Magnet_Diameter = 4.0, Magnet_Thickness = 1.5

Pitfall #4: Forgetting BOSL2 Dependencies

Problem: User can't render code, errors about undefined path_sweep.

Why it fails: BOSL2 library not included or not installed in OpenSCAD.

Better approach:

// ALWAYS include these three at top of file:
include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>

// Add comment explaining BOSL2 requirement:
// Requires BOSL2 library: https://github.com/BelfrySCAD/BOSL2
// Install: Download and place in OpenSCAD libraries folder

Pitfall #5: Using Beta Features Without Warning

Problem: Code sets Profile_Type = "v2.5" without explaining implications.

Why it fails: v2.5 inverse clip is not backwards compatible with Original profile. User can't mix old and new channels.

Better approach:

// Only use beta features if explicitly requested
Profile_Type = "Original";  // Default, backwards compatible

// If user wants stronger hold:
Additional_Holding_Strength = 0.6;  // Stable, works with Original

// If user explicitly requests beta:
// Profile_Type = "v2.5";  // BETA: Inverse clip, NOT compatible with Original profile

Quality Checklist

Before delivering OpenSCAD code:

QuackWorks compliance:

  • ✓ Code copied from QuackWorks reference (not written from scratch)
  • ✓ Attribution comments intact (CC BY-NC-SA license)
  • ✓ BOSL2 includes present (std.scad, rounding.scad, threading.scad)
  • ✓ Module structure preserved (baseProfile, topProfile functions)

Parameter validation:

  • Grid_Size = 25 (never modified)
  • Channel_Width_in_Units is integer (1, 2, 3, not 1.5)
  • Channel_Internal_Height in 6mm increments (12, 18, 24, ... 72)
  • ✓ Mounting method appropriate for user's surface
  • Base_Top_or_Both = "Both" unless user needs individual parts

Dimensional sanity:

  • ✓ Dimensions specified in grid units (not raw mm)
  • ✓ Channel width accounts for cable bundle size + clearance
  • ✓ Internal height sufficient for thickest cable + movement
  • ✓ Length/arm dimensions align to 25mm grid for mounting

Channel-specific requirements:

  • ✓ I Channel: Cord cutout count/spacing matches cable exit needs
  • ✓ L Channel: X and Y axis lengths set independently
  • ✓ T/X Channels: Mitered corners option considered for thick cables
  • ✓ Y Channel: Output direction (Forward/Turn) matches user's layout
  • ✓ S/C Channels: Curve parameters create smooth transitions (no sharp bends)

User communication:

  • ✓ Explained channel type selection rationale
  • ✓ Noted any dimension rounding to grid units
  • ✓ Documented mounting method choice
  • ✓ Warned if using beta features (v2.5 profile)
  • ✓ Provided print orientation guidance (Base flat, Top upside-down)

Read these subpages for detailed parameter reference:

SubpageContainsUse For
./straight-runs.mdI Channel (straight with cord cutouts)Linear cable runs, desktop cable management
./corners-junctions.mdL, T, X, Y ChannelsCorner turns, multi-path junctions, cable splits
./curves-transitions.mdS, C, Mitre, Height Change ChannelsSmooth curves, diagonal transitions, vertical routing
./mounting-accessories.mdKeyholes, Hooks, Item Holders, ConnectorsWall mounting, accessory integration, modular connections

Documentation References

Official Underware sources:

BOSL2 library:

Related spirograph skills:

  • home-organization/SKILL.md: System selection (when to use Underware vs other systems)
  • opengrid-openscad/SKILL.md: OpenGrid accessory code generation (complementary system)

Ecosystem integration:

  • Underware integrates natively with OpenGrid mounting systems
  • Use OpenGrid boards under desk, snap Underware channels into grid
  • See home-organization skill for Underware + OpenGrid combination strategies

スコア

総合スコア

50/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です