rt-541

writing / 2026-09-19

From one cabinet to a CAD pipeline

How a single filament cabinet plan turned into a way of making build plans: one Python module per build, drawings and checks from the same numbers, prices from real listings, and a skill that remembers the lessons.

The first physical plan on this site was a cabinet for 3D printer filament. It started as a claude.ai artifact and moved here the same day, because a plan in a chat is hard to find, revise or link.

The spool cabinet, four revisions in two days

Revision A (2026-09-12) was a cabinet with acrylic doors and a heater box running at 75 C. The same evening it got a Fusion 360 script, a STEP file and a GLB, so the plan had an editable model and not just drawings.

  • B lowered the dryer to 65 C. The shelf holds PLA, PETG and TPU, and PLA should not be stored much above 55 C.
  • C fixed the shelves with pocket screws and 1x3 aprons. Clip shelves on a loaded 46 in span would creep.
  • D (2026-09-13) rebuilt the case around IKEA OXBERG tempered-glass doors, dropped the heater box, and added a shopping list where every price was checked against a listing. Drying became a job for a bought dehydrator.

A two-bay version holding 112 spools lasted about an hour before it was trimmed to one BILLY-width bay: two OXBERG doors, 56 spools standing edge-on at a 4 in pitch. The earlier elevations had drawn the spools as circles seen from the front, which was wrong for spools sitting along the rails; the owner caught it, and the pitch and the drawings were corrected together.

The first price estimates were off in both directions: too high for plywood and studs, too low for acrylic and poplar. From then on a price was a listing read that day with the store named, or it stayed out of the total.

The garage shop, a whole room

The garage shop (2026-09-18) was a bigger problem: a room with a parked truck, a wall cabinet, rolling tools, a dust cart and a subpanel. Revision A was drawn on an assumed garage. Revision B (2026-09-19) was drawn on the measured one, with a landing across the back wall, a house door that sat somewhere other than where the photos suggested, and no table saw on hand.

A room with this many moving parts could not be checked by eye on a flat drawing.

shopcad: one module, every output

So on 2026-09-18 the CAD became a framework. Each build is one Python module. Its DEFAULTS hold every number a person would change, in inches. A build function places boxes and cylinders by those numbers, and a checks function returns pass or fail with the figures in the message.

From that one module come:

  • a three.js viewer with states (doors open, bench flipped);
  • a STEP file for the scene and one per build;
  • PNG renders for the sheets, shot by headless Chrome with software WebGL;
  • a Fusion 360 script whose user parameters are the same numbers;
  • the checks, which stop the export when a number stops working.

The spool cabinet was rebuilt on it the same day, with ten checks. The garage reached 24 checks at revision B and 40 later. The rule that came out of it: when the model disagrees with a sheet, the model is usually right, because it had to close the geometry. A cabinet on a French cleat stands 1.5 in off the wall whether or not the sheet says so.

Writing it down as skills

The workflow went into a Claude Code plugin called workshop, in a personal skill marketplace kept in the homelab repo. It has two skills. build-plan owns the design dialogue, the engineering checks, the drawing set, the prices and the delivery. shopcad-model owns the plan module and its outputs. Version 1.1.0 folded in what the garage and the rock screen had taught, so the next plan does not relearn it.

The rock screen, a small jig

The rock screen (2026-09-19) cleans river rock from under a pool into 50 lb burlap sacks. It is a 24 x 48 in tilt tray on a 2x4 stand, pivoted 9 in behind the discharge end so it tips 35 degrees with about 23 lb at the handle when loaded, and pours through a plywood funnel into a sack standing on a hand truck.

Its drawings are generated by a script from geometry constants rather than drawn by hand. The sack size drives the spout, and the 50 lb sack forced an 11 x 11 in spout down to 9 x 9. One constant changed, and the funnel, the cut list and the copy followed. The fill rule became a sheet line too: rock runs about 100 lb a cubic foot, so a sack is three shovels, 45 lb, and about 60 sacks make a yard.

Then the backyard

The next plan was a deck and a patio drawn from drone photos, and it pushed the framework outdoors and into photo-style rendering. That story is in a backyard, drawn from drone photos; the plan is at /projects/backyard.

What carries forward

  • Every limit becomes a sheet line or a model check. A swing radius, a working space, a sack weight or a shelf span is either printed on a sheet or enforced by the model, preferably both.
  • Prices come only from listings that were actually read. The store is named, the date is recorded, and a price that could not be read is marked “not read” and left out of the total.
  • Pages are rendered and checked at desktop and narrow widths. Each sheet is shot alone with the real fonts at 1100 and 720 px before publishing, because people read these on half a monitor.
  • The PDF is printed headless. A print wrapper and headless Chrome make it, and the page count is compared with the previous PDF so narrow-layout rules do not quietly double it.
  • Plans live on the site, not in chat artifacts. The spool cabinet was the first to move, and every plan since has started here.

1つのキャビネットからCADパイプラインへ

1つのフィラメントキャビネットの計画が、構築計画の作り方になるまで: 1つの構築ごとに1つのPythonモジュール、同じ数値から図面とチェック、実際の商品掲載情報からの価格、そして教訓を覚えるスキル。

この記事はローカルモデルによる機械翻訳です。原文は英語です。

このサイトの最初の物理的な計画は、3Dプリンタ用フィラメントのキャビネットでした。これは最初にClaude.aiのアーティファクトとして作成され、その日のうちにこのサイトに移動しました。なぜなら、チャット内に置かれた計画は見つけるのが難しく、修正やリンクも難しいからです。

スプールキャビネット、2日間で4回のリビジョン

リビジョンA(2026-09-12)は、アクリル製のドアと75℃で動作するヒーターBOXを持つキャビネットでした。同じ日の夜にはFusion 360のスクリプト、STEPファイル、GLBが追加され、計画には編集可能なモデルが含まれるようになりました。

  • B はドライヤーの温度を65℃に下げました。棚はPLA、PETG、TPUを保持し、PLAは55℃以上で保存されることは推奨されていません。
  • C は棚をポケットスクリューと1x3のアパロンで固定しました。満載された46インチのスパンに取り付けたクリップ式の棚は、クリープ(変形)を起こす可能性がありました。
  • D(2026-09-13)は、IKEAのOXBERG製の耐熱ガラスドアを用いてケースを再構築し、ヒーターBOXを削除し、買い物リストを追加しました。リストに載っている価格を確認してから、購入する予定の乾燥機を購入して乾燥作業を担当することにしました。

2つのベイを持つバージョンで112本のスプールを保持していましたが、1時間ほどで1つのBILLY幅のベイに縮小されました:2つのOXBERGドア、56本のスプールが4インチのピッチでエッジオンに立ち並んでいます。以前の図面では、スプールを前面から見た円形として描いていましたが、これはレールに沿って配置されたスプールの表示としては誤っていました。所有者がこれを指摘し、ピッチと図面が一緒に修正されました。

最初の価格見積もりは両方向に外れていました:合板とスタッドの価格は高すぎ、アクリルとポプラは低すぎました。それ以降、価格はその日に店名とともに確認したリストからのものとなり、それ以外のものは合計から外されました。

車庫の店、一室まるごと

ガレージショップ(2026-09-18)は、より大きな問題だった:駐車したトラック、壁のキャビネット、ローリングする工具、埃のカート、サブパネルが設置された部屋。リビジョンAは仮定されたガレージに基づいて描かれた。リビジョンB(2026-09-19)は測定されたガレージに基づいて描かれたが、背面の壁に設置されたランディング、写真では示されていなかった場所に設置された家のドア、そして手持ちのテーブルソーがなかった。

このように多くの動的な部品を持つ部屋は、平面図で目視チェックするだけでは対応できなかった。

shopcad: 1つのモジュール、すべての出力

2026-09-18にCADはフレームワークになった。各構築は1つのPythonモジュールである。このモジュールのDEFAULTSは、人が変更するであろうすべての数値(インチ単位)を保持している。build関数は、それらの数値に基づいてボックスや円柱を配置し、checks関数はメッセージに数値を含めて、通過または失敗を返す。

この1つのモジュールから以下が生成される:

  • three.jsのビューアー(ドアが開いている、ベンチが反転しているなどの状態);
  • シーン用のSTEPファイル、および各構築用のSTEPファイル;
  • ヘッドレスChromeでソフトウェアWebGLを使用してレンダリングされたPNG画像(シート用);
  • Fusion 360用のスクリプト、そのユーザー定義パラメータは同じ数値;
  • 検査機能、数値が動作しなくなるとエクスポートを停止する。

同日のうちに、スプールキャビネットは10の検査とともに再構築された。リビジョンBではガレージは24の検査に達し、後に40に達した。そこから導き出されたルールは、モデルがシートと一致しない場合、モデルが通常正しいということである。なぜなら、モデルはジオメトリを閉じる必要があったからだ。フランスクリートに設置されたキャビネットは、シートに記載されているかどうかに関係なく、壁から1.5インチの高さに設置されている。

書き下すことはスキルである

ワークフローは、Claude Code プラグイン workshop に送られ、ホームラボリポジトリに保存されている個人のスキルマーケットプレイスに収められました。このスキルマーケットプレイスには2つのスキルがあります。build-plan はデザインダイアログ、エンジニアリングチェック、図面セット、価格、納品を担当します。shopcad-model はプランモジュールとその出力を担当します。バージョン 1.1.0 では、ガレージやロックスクリーンから学んだことを取り入れており、次のプランでは再学習する必要がありません。

ロックスクリーン、小さなジョグ

ロックスクリーン(2026-09-19)は、プールの下にある川の岩を50ポンドの麻袋に分類して清掃します。これは、2x4のスタンド上に設置された24 x 48インチの傾斜トレイで、排水端から9インチ後ろに回転軸を設置し、満タンのときには約23ポンドの力でハンドルを押すと、35度傾いて、パlywoodのファunnelを通して手推車の上に立った袋に流し込みます。

この図面は、幾何学的な定数から生成されるスクリプトによって作成され、手で描かれたものではありません。袋のサイズがスパウトを決定し、50ポンドの袋は11 x 11インチのスパウトを9 x 9インチにまで小さくしました。1つの定数が変更されると、ファunnel、カットリスト、コピーもそれに従って変化しました。満たすルールもシートのラインに加えられました:岩は1立方フィートで約100ポンドなので、1袋は3つのシャベルで45ポンド、そして約60袋で1ヤードになります。

その後の裏庭

次のプランは、ドローンの写真から作成されたデッキとパティオで、フレームワークを屋外へと押し出し、写真風レンダリングに進化しました。その物語は ドローンの写真から描かれた裏庭 に、プランは /projects/backyard にあります。

進化を続けるもの

  • すべての制限はシートの線またはモデルのチェックになる。 スイング半径、作業スペース、袋の重さ、棚の幅は、シートに印刷されるか、モデルによって強制される。できれば両方で。
  • 価格は実際に読み取られたリストからしか来ない。 店名と日付は記録され、読み取れなかった価格は「未読」とマークされ、合計には含まれない。
  • ページはデスクトップと狭い幅でレンダリングされ、チェックされる。 出版前に、実際のフォントを使用して1100pxと720pxの幅で各シートを個別にレンダリングし、チェックする。人々はこれらのページを半分のモニタで読むからだ。
  • PDFはヘッドレスで印刷される。 プリントラッパーとヘッドレスChromeを使用して印刷され、前のPDFとのページ数を比較することで、狭いレイアウトルールが静かにページ数を倍増しないようにする。
  • 計画はサイト上に存在し、チャットアーテファクトにはない。 スプールキャビネットが最初に移動したように、以降のすべての計画はここから始まる。

한 개의 캐비닛에서 CAD 파이프라인으로

한 개의 필라멘트 캐비닛 계획이 건설 계획을 만드는 방식으로 발전한 방법: 각 건설에 하나의 Python 모듈, 동일한 숫자에서 도면과 검사, 실제 상품 목록에서의 가격, 그리고 교훈을 기억하는 기술.

이 글은 로컬 모델이 기계 번역한 것입니다. 원문은 영어입니다.

이 사이트의 첫 번째 물리적 설계는 3D 프린터 필라멘트용 캐비닛이었습니다. 처음에는 claude.ai의 아티팩트로 시작했고, 같은 날 이곳으로 이동했습니다. 왜냐하면 채팅에서의 설계는 찾기, 수정하거나 연결하기가 어렵기 때문입니다.

스풀 캐비닛, 2일 만에 4개의 수정판

Revision A (2026-09-12)는 아크릴 문과 75°C에서 작동하는 가열 박스가 있는 캐비닛이었습니다. 같은 저녁에 Fusion 360 스크립트, STEP 파일, GLB 파일이 추가되어 설계는 편집 가능한 모델을 포함하게 되었고, 그 이상의 도면만으로는 끝나지 않았습니다.

  • B는 건조 온도를 65°C로 낮췄습니다. 선반은 PLA, PETG, TPU를 보관할 수 있으며, PLA는 55°C 이상으로 보관하는 것이 좋지 않습니다.
  • C는 선반을 포켓 나사와 1x3의 둥근 테이블을 사용해 고정했습니다. 46인치의 간격으로 가득 채운 클립 선반은 시간이 지나면 움직일 수 있습니다.
  • D (2026-09-13)는 IKEA OXBERG의 템퍼드 글라스 문을 기반으로 캐비닛을 재구성하고, 가열 박스를 제거하며, 쇼핑 목록을 추가했습니다. 이 목록에서는 모든 가격이 매장의 목록과 비교되어 확인되었습니다. 건조 작업은 구매한 건조기로 수행하게 되었습니다.

2개의 베이를 가진 버전은 112개의 스풀을 담을 수 있었지만, 약 1시간 만에 하나의 BILLY 너비 베이로 줄여졌습니다: 두 개의 OXBERG 문, 56개의 스풀이 4인치의 기울기로 세워져 있습니다. 이전의 설계에서는 스풀을 앞에서 본 원형으로 그렸는데, 이는 레일에 놓인 스풀에 잘못 적용된 것이었습니다. 소유자가 이를 발견했고, 기울기와 도면 모두 함께 수정되었습니다.

첫 번째 가격 추정은 양쪽 모두 틀렸습니다: 페인트 목재와 스터드는 너무 높게, 아크릴과 팝러는 너무 낮게 추정되었습니다. 이후로 가격은 그날 읽은 매장 목록에 명시된 가격이었거나, 총 가격에서 제외되었습니다.

차고 상점, 전체 방

가정 차고점 (2026-09-18)은 더 큰 문제였다: 주차된 트럭, 벽에 설치된 캐비닛, 굴러다니는 도구, 먼지 카트, 그리고 서브 패널이 있는 방이었다. 리비전 A는 가정된 차고에 그려졌으며, 리비전 B (2026-09-19)는 측정된 차고에 그려졌는데, 뒷벽에 있는 랜딩, 사진에서 예상했던 위치보다 다른 곳에 있는 집 문, 그리고 손으로 사용할 수 있는 테이블 세어가 없었다.

이렇게 많은 움직이는 부품이 있는 방은 평평한 도면에서 눈으로 확인할 수 없었다.

shopcad: 하나의 모듈, 모든 출력

그래서 2026-09-18에 CAD는 프레임워크가 되었다. 각각의 빌드는 하나의 파이썬 모듈이다. 이 DEFAULTS은 사람이 변경할 수 있는 모든 수치를 인치 단위로 포함한다. build 함수는 이 수치에 따라 박스와 원통을 배치하고, checks 함수는 메시지에 수치를 포함하여 통과 또는 실패 여부를 반환한다.

이 하나의 모듈에서 나온다:

  • three.js 뷰어와 상태(문이 열림, 벤치가 뒤집힘);
  • 시나리오를 위한 STEP 파일과 빌드별 하나의 STEP 파일;
  • 시트용 PNG 렌더링, 헤드리스 크롬으로 소프트웨어 WebGL을 사용하여 촬영;
  • 사용자 파라미터가 동일한 수치인 Fusion 360 스크립트;
  • 체크, 수치가 작동하지 않을 때 내보내기를 중단하는 기능.

같은 날, 스풀 캐비닛은 10개의 체크와 함께 재구성되었으며, 차고는 리비전 B에서 24개의 체크를 달성했고 이후에는 40개가 되었다. 이로 인해 도출된 규칙은 다음과 같다: 모델이 시트와 달라질 경우, 모델이 일반적으로 옳은데, 이는 기하학을 닫아야 했기 때문이다. 프랑스 클리트에 설치된 캐비닛은 시트가 무엇이라고 하든 벽에서 1.5인치 떨어진 위치에 서 있다.

그것을 기록하는 것은 기술이다

워크플로는 개인 스킬 시장인 homelab 리포지토리에 포함된 Claude Code 플러그인 workshop에 들어갔습니다. 이 시장에는 두 가지 스킬이 있습니다. build-plan은 디자인 대화, 엔지니어링 검사, 도면 세트, 가격 및 배송을 담당합니다. shopcad-model는 계획 모듈과 그 출력물을 담당합니다. 버전 1.1.0은 가라지와 암석 스크린에서 배운 내용을 반영했기 때문에 다음 계획은 그것을 다시 학습하지 않습니다.

암석 스크린, 작은 조이그

암석 스크린 (2026-09-19)은 수영장 아래에 있는 강석을 50파운드짜리 Burlap 주머니에 정리합니다. 이 것은 2x4 기둥 위에 놓인 24 x 48인치의 경사대이며, 배출 끝에서 9인치 떨어진 위치에 회전축이 있어, 주머니가 채워졌을 때 약 23파운드의 무게가 손잡이에 걸리며 35도의 경사가 생깁니다. 이는 페인트 판으로 만든 흐름구멍을 통해 수동 트럭 위에 세워진 주머니에 쏟아집니다.

이 설계도는 수작업 대신 기하학적 상수를 기반으로 한 스크립트로 생성되었습니다. 주머니의 크기로 흐름구멍의 크기를 결정했으며, 50파운드짜리 주머니는 11 x 11인치의 흐름구멍을 9 x 9인치로 줄였습니다. 하나의 상수가 바뀌었고, 그에 따라 흐름구멍, 자재 목록 및 복사본도 변경되었습니다. 채우는 규칙도 시트 라인으로 추가되었습니다: 암석은 약 100파운드 당 입방피트이므로, 주머니는 삼개의 삽으로 채워지며 45파운드이고, 약 60개의 주머니가 1야드를 만듭니다.

그리고 뒷마당

다음 계획은 드론 사진으로부터 그려낸 데크와 파티오였으며, 이는 프레임워크를 실외로 확장하고 사진 스타일 렌더링으로 이어졌습니다. 이 이야기는 드론 사진으로부터 그려낸 뒷마당에 있으며, 계획은 /projects/backyard에 있습니다.

앞으로 이어지는 것

  • 모든 제한은 시트 라인 또는 모델 체크가 된다. 회전 반경, 작업 공간, 가방 무게 또는 셀프의 너비는 시트에 인쇄되거나 모델이 이를 강제하게 하며, 가능하면 둘 다 적용된다.
  • 가격은 실제로 읽힌 목록에서만 나온다. 가격이 읽히지 않은 경우 “읽지 않음”으로 표시하고 총합에서 제외되며, 가격은 읽힌 목록에서만 산출된다. 매장 이름과 날짜는 기록된다.
  • 페이지는 데스크탑과 좁은 너비에서 렌더링되고 확인된다. 출판 전에 실제 폰트를 사용하여 각 시트는 1100px와 720px의 너비에서 각각 렌더링되고 촬영된다. 사람들은 반monitor 크기의 화면에서 이 페이지를 읽기 때문이다.
  • PDF는 헤드리스로 인쇄된다. 인쇄 래퍼와 헤드리스 크롬을 사용하여 PDF를 인쇄하고, 이전 PDF와 페이지 수를 비교하여 좁은 레이아웃 규칙이 조용히 페이지 수를 두 배로 늘리지 않도록 한다.
  • 계획은 사이트에 저장되고, 채팅 아티팩트에 있지 않다. 스풀 캐비닛이 처음으로 이동했고, 이후 모든 계획은 여기서 시작되었다.

从一个柜子到 CAD 流程

一个单个的3D打印耗材柜设计如何演变成制定构建计划的方法:每个构建一个Python模块,图纸和检查来自相同的数字,价格来自真实的商品清单,并掌握从中吸取的经验教训。

本文由本地模型机器翻译,原文为英文。

本网站上的第一个实物计划是3D打印机耗材柜。它最初是 Claude.ai 的一个 artifact,同一天就转移到了这里,因为聊天中的计划很难查找、修改或链接。

耗材柜,两天内四次修订

修订版 A(2026-09-12)是一个带有亚克力门和运行在 75 C 的加热箱的柜子。当天晚上,它获得了一个 Fusion 360 脚本、一个 STEP 文件和一个 GLB 文件,因此这个计划不仅有图纸,还有一个可编辑的模型。

  • B 将干燥温度降低到 65 C。架子上放着 PLA、PETG 和 TPU,PLA 的存储温度不应超过 55 C 太多。
  • C 用沉头螺丝和 1x3 的边条固定了架子。在满载的 46 英寸跨度上,夹式架子可能会发生蠕变。
  • D(2026-09-13)围绕着 IKEA OXBERG 的钢化玻璃门重建了外壳,去掉了加热箱,并添加了一个购物清单,其中每个价格都与清单进行了核对。干燥工作现在由购买的除湿机完成。

一个双格版本可以容纳 112 个线轴,但不到一小时就被缩减为一个 BILLY 宽度的格子:两个 OXBERG 门,56 个线轴以 4 英寸的倾斜度竖直放置。之前的图纸将线轴画成了从正面看的圆形,这与线轴沿着轨道放置的情况不符;业主发现了这一点,与他一起修正了倾斜度和图纸。

第一次的价格预估在两个方向上都出现了偏差:胶合板和木 studs 的价格太高,而亚克力和白杨木的价格太低。从那时起,价格就是当天在指定商店查看的清单,否则就不计入总成本。

车库商店,整个房间

车库店铺(2026-09-18)是一个更大的问题:一个停着卡车的房间,一个墙上的柜子,滚动的工具,一个灰尘推车和一个子配电箱。修订版A是基于一个假设的车库绘制的。修订版B(2026-09-19)是基于实际测量绘制的,有一个横跨后墙的平台,一个房屋门的位置与照片显示的不一致,而且没有手边的台锯。

一个有这么多活动部件的房间,无法通过平面图纸用肉眼检查。

shopcad:一个模块,所有输出

因此在2026-09-18,CAD变成了一个框架。每个构建都是一个Python模块。它的 DEFAULTS 保存了一个人会更改的所有数字,单位为英寸。一个 build 函数通过这些数字放置盒子和圆柱体,而一个 checks 函数则根据消息中的数字返回通过或失败。

从这一个模块中可以生成:

  • 一个带有状态的three.js查看器(门打开、工作台翻转);
  • 一个STEP文件用于整个场景,以及每个构建一个;
  • 用于图纸的PNG渲染,通过无头Chrome和软件WebGL生成;
  • 一个Fusion 360脚本,其用户参数与这些数字相同;
  • 检查功能,当某个数字不再有效时,会停止导出。

当天,用它重建了线轴柜,并进行了十次检查。修订版B时,车库达到了24次检查,之后达到了40次。由此得出的规则是:当模型与图纸不一致时,模型通常是正确的,因为它必须闭合几何形状。例如,一个放在法式夹板上的柜子,无论图纸上是否说明,都会离墙1.5英寸。

将其写下来作为技能

该工作流程被整合进了一个名为 workshop 的 Claude Code 插件中,该插件保存在个人技能市场中,位于 homelab 仓库中。它包含两个技能。 build-plan 负责设计对话、工程检查、图纸集、价格和交付。 shopcad-model 负责计划模块及其输出。版本 1.1.0 整合了车库和岩石筛所学到的内容,因此下一个计划不需要重新学习这些内容。

岩石筛,一个小型夹具

岩石筛(2026-09-19)将泳池下方的河石清理到 50 磅的麻袋中。它是一个 24 x 48 英寸的倾斜托盘,安装在 2x4 的支架上,倾斜托盘的末端向后倾斜了 9 英寸,因此在装满时,手柄处的重量约为 23 磅,倾斜角度为 35 度,通过一块胶合板漏斗倒入手推车上的麻袋中。

它的图纸是由一个脚本从几何常量生成,而不是手工绘制。麻袋的尺寸决定了漏斗的大小,而 50 磅的麻袋将 11 x 11 英寸的漏斗缩小到 9 x 9 英寸。只要改变一个常量,漏斗、切割清单和图纸都会随之改变。填充规则也变成了一条图纸线:岩石每立方英尺大约重 100 磅,因此一个麻袋需要三铲,约 45 磅,大约 60 个麻袋组成一立方码。

然后是后院

下一个计划是根据无人机照片绘制的甲板和庭院,它将框架推到了户外,并进入了照片风格的渲染。这个故事在 从无人机照片绘制的后院 中有描述;计划文件位于 /projects/backyard。

延续的内容

  • 每个限制都成为一张纸上的线条或模型检查。 摆动半径、工作空间、袋子重量或货架跨度,要么打印在纸上,要么由模型强制执行,最好是两者都有。
  • 价格只来自实际读取的清单。 商店名称会被记录,日期也会被记录,无法读取的价格会被标记为“未读取”,并从总数中排除。
  • 页面在桌面和窄屏宽度下进行渲染和检查。 每张纸在发布前都会用实际字体在 1100 像素和 720 像素的宽度下单独拍摄,因为人们在半个显示器上阅读这些内容。
  • PDF 是无头打印的。 使用一个打印包装器和无头 Chrome 来完成,同时将页数与之前的 PDF 进行比较,以确保窄屏布局规则不会悄悄地使页数翻倍。
  • 计划保存在网站上,而不是聊天记录中。 线轴柜 是第一个移动的,自那以后,每个计划都从这里开始。

De un gabinete a una tubería CAD

Cómo un solo plan de un armario para filamento de impresión 3D se convirtió en una forma de hacer planes de construcción: un módulo Python por construcción, dibujos y verificaciones a partir de los mismos números, precios de listas reales, y una habilidad que recuerda las lecciones aprendidas.

Este artículo es una traducción automática hecha por un modelo local. El original está en inglés.

El primer plan físico en este sitio fue un estante para filamento de impresora 3D. Comenzó como un artefacto de claude.ai y se movió aquí el mismo día, porque un plan en un chat es difícil de encontrar, revisar o vincular.

El estante para bobinas, cuatro revisiones en dos días

La revisión A (2026-09-12) era un estante con puertas de acrílico y una caja de calentamiento que funcionaba a 75 C. Esa misma noche obtuvo un script de Fusion 360, un archivo STEP y un GLB, por lo que el plan tenía un modelo editable y no solo dibujos.

  • B redujo el secador a 65 C. El estante contiene PLA, PETG y TPU, y el PLA no debe almacenarse mucho por encima de 55 C.
  • C fijó los estantes con tornillos de bolsillo y 1x3 de cenefas. Los estantes sujetos con clips en un claro de 46 in tenderían a deformarse.
  • D (2026-09-13) reconstruyó la caja alrededor de las puertas de vidrio templado de IKEA OXBERG, eliminó la caja de calentamiento y añadió una lista de compras donde cada precio se verificó contra una lista. El secado se convirtió en un trabajo para un deshidratador comprado.

Una versión de dos bahías que contenía 112 bobinas duró aproximadamente una hora antes de que se redujera a una bahía de ancho BILLY: dos puertas OXBERG, 56 bobinas colocadas de forma vertical con un pitch de 4 in. Las elevaciones anteriores dibujaron las bobinas como círculos vistos desde el frente, lo cual era incorrecto para las bobinas colocadas a lo largo de las vías; el propietario lo detectó, y el pitch y los dibujos se corrigieron juntos.

Las primeras estimaciones de precios estaban equivocadas en ambas direcciones: demasiado alto para el contrachapado y los marcos, demasiado bajo para el acrílico y el poplar. Desde entonces, un precio era una lista leída ese día con el nombre del almacén, o se mantenía fuera del total.

La tienda del garaje, toda una habitación

La tienda de garaje (2026-09-18) fue un problema más grande: una habitación con un camión estacionado, un armario de pared, herramientas móviles, un carrito de polvo y un subpanel. La revisión A se dibujó en un garaje asumido. La revisión B (2026-09-19) se dibujó en el medido, con un descanso a través de la pared trasera, una puerta de la casa que se ubicaba en algún lugar distinto al que sugerían las fotos, y sin sierra de mesa a mano.

Una habitación con tantas piezas móviles no podía ser verificada a simple vista en un dibujo plano.

shopcad: un módulo, cada salida

Así que el 2026-09-18 el CAD se convirtió en un marco de trabajo. Cada construcción es un módulo de Python. Su DEFAULTS contiene cada número que una persona cambiaría, en pulgadas. Una build función coloca cajas y cilindros según esos números, y una checks función devuelve pasar o fallar con las figuras en el mensaje.

Desde ese único módulo se generan:

  • un visor de three.js con estados (puertas abiertas, banco volteado);
  • un archivo STEP para la escena y uno por construcción;
  • renders en PNG para las hojas, capturados por Chrome sin cabeza con WebGL de software;
  • un script de Fusion 360 cuyos parámetros de usuario son los mismos números;
  • las verificaciones, que detienen la exportación cuando un número deje de funcionar.

El armario de bobinas se reconstruyó en el mismo día con diez verificaciones. El garaje alcanzó 24 verificaciones en la revisión B y 40 más tarde. La regla que surgió de ello: cuando el modelo no coincide con una hoja, el modelo suele tener razón, porque tuvo que cerrar la geometría. Un armario en una clavija francesa se encuentra a 1.5 in de la pared, independientemente de lo que diga la hoja.

Escribirlo como habilidades

El flujo de trabajo se integró en un plugin de Claude Code llamado workshop, en un mercado personal de habilidades mantenido en el repositorio homelab. Tiene dos habilidades. build-plan posee el diálogo de diseño, las verificaciones de ingeniería, el conjunto de dibujos, los precios y la entrega. shopcad-model posee el módulo de planificación y sus salidas. La versión 1.1.0 incorporó lo que el garaje y la pantalla de roca habían enseñado, por lo que el próximo plan no lo vuelve a aprender.

La pantalla de roca, un pequeño dispositivo

La pantalla de roca (2026-09-19) limpia rocas de río de debajo de una piscina en sacos de burlap de 50 lb. Es una bandeja de 24 x 48 pulgadas en un soporte de 2x4, pivotada 9 pulgadas detrás del extremo de descarga, de modo que se inclina 35 grados con alrededor de 23 lb en el mango cuando está cargada, y vierte a través de un embudo de contrachapado en un saco que está sobre una carretilla de mano.

Sus dibujos se generan mediante un script a partir de constantes geométricas en lugar de dibujarse a mano. El tamaño del saco determina el caño, y el saco de 50 lb obligó a reducir el caño de 11 x 11 pulgadas a 9 x 9. Al cambiar una constante, el embudo, la lista de cortes y la copia siguieron. La regla de llenado también se convirtió en una línea de hoja: la roca pesa aproximadamente 100 lb por pie cúbico, por lo que un saco equivale a tres paladas, 45 lb, y alrededor de 60 sacos hacen un yarda cúbica.

Luego el jardín trasero

El siguiente plan fue una terraza y un patio dibujados a partir de fotos de drones, y empujó el marco hacia afuera y hacia el renderizado en estilo foto. Esa historia está en un jardín trasero, dibujado a partir de fotos de drones; el plan está en /projects/backyard.

Lo que se lleva adelante

  • Cada límite se convierte en una línea de hoja o en una verificación del modelo. Un radio de oscilación, un espacio de trabajo, un peso de saco o un ancho de estante se imprime en una hoja o se impone mediante el modelo, preferiblemente ambos.
  • Los precios provienen solo de listados que realmente se han leído. Se registra el nombre de la tienda, se anota la fecha y un precio que no se puede leer se marca como “no leído” y se excluye del total.
  • Las páginas se renderizan y verifican en anchos de escritorio y estrechos. Cada hoja se imprime sola con las fuentes reales a 1100 y 720 píxeles antes de publicar, porque la gente las lee en medio de una pantalla.
  • El PDF se imprime sin cabeza. Un envoltorio de impresión y Chrome sin cabeza lo hacen, y se compara el número de páginas con el PDF anterior para asegurar que las reglas de diseño estrecho no dupliquen silenciosamente el número de páginas.
  • Los planes viven en el sitio, no en artefactos de chat. El armario de bobina fue el primero en moverse, y cada plan desde entonces ha comenzado aquí.

Von einem Schrank zu einer CAD-Pipeline

Wie ein einzelner Spulenschrank-Plan zu einer Methode für die Erstellung von Bauplänen wurde: ein Python-Modul pro Bau, Zeichnungen und Prüfungen aus denselben Zahlen, Preise aus echten Listen, und eine Fähigkeit, die die Lehren behält.

Dieser Beitrag ist eine maschinelle Übersetzung durch ein lokales Modell. Das Original ist auf Englisch.

Der erste physische Plan auf dieser Seite war ein Schrank für 3D-Druck-Filament. Er begann als Claude.ai-Artifact und wurde am selben Tag hierher verschoben, weil ein Plan in einem Chat schwer zu finden, zu überarbeiten oder zu verlinken ist.

Der Spool-Schrank, vier Überarbeitungen in zwei Tagen

Revision A (2026-09-12) war ein Schrank mit Acryl-Türen und einem Heizkasten, der bei 75 C lief. Am selben Abend erhielt er ein Fusion 360-Skript, eine STEP-Datei und eine GLB-Datei, sodass der Plan ein bearbeitbares Modell und nicht nur Zeichnungen enthielt.

  • B senkte den Trockner auf 65 C. Die Ablage enthält PLA, PETG und TPU, und PLA sollte nicht viel über 55 C gelagert werden.
  • C befestigte die Ablagen mit Taschenschrauben und 1x3-Auflagebalken. Klemmbücher auf einer belasteten 46 in Spanne würden sich verziehen.
  • D (2026-09-13) baute den Schrank um, um ihn mit temperierten Glas-Türen von IKEA OXBERG zu versehen, entfernte den Heizkasten und fügte eine Einkaufsliste hinzu, in der jeder Preis mit einer Liste verglichen wurde. Das Trocknen wurde zu einer Aufgabe für einen gekauften Dehydrator.

Eine Version mit zwei Bays, die 112 Spulen aufnehmen konnte, hielt etwa eine Stunde, bevor sie auf eine BILLY-Breite reduziert wurde: zwei OXBERG-Türen, 56 Spulen, die mit einem 4 in Neigung an der Seite stehen. Die früheren Höhenpläne zeigten die Spulen als Kreise von vorn, was falsch war, wenn die Spulen entlang der Schienen standen; der Eigentümer bemerkte das und korrigierte die Neigung und die Zeichnungen gemeinsam.

Die ersten Preisabschätzungen waren in beide Richtungen falsch: zu hoch für Sperrholz und Ständer, zu niedrig für Acryl und Poplar. Danach war ein Preis eine Liste, die an diesem Tag mit dem Namen des Geschäfts gelesen wurde, oder es wurde aus dem Gesamtpreis ausgeschlossen.

Der Garagenladen, ein ganzer Raum

Die Garagenwerkstatt (2026-09-18) war ein größeres Problem: ein Raum mit einem abgestellten LKW, einem Wandregal, rollenden Werkzeugen, einem Staubwagen und einem Unterpanel. Die Revision A wurde anhand einer angenommenen Garage erstellt. Die Revision B (2026-09-19) wurde anhand der gemessenen Garage erstellt, mit einer Landung über der Rückwand, einer Haustür, die sich an einem anderen Ort befand als die Fotos es vermuteten, und ohne Handkreissäge.

Ein Raum mit so vielen beweglichen Teilen konnte nicht durch bloßes Anschauen auf einer Flachzeichnung überprüft werden.

shopcad: ein Modul, jede Ausgabe

Also am 2026-09-18 wurde das CAD zu einem Framework. Jeder Bau ist ein Python-Modul. Sein DEFAULTS enthält jede Zahl, die eine Person ändern würde, in Zoll. Eine build-Funktion platziert Kästen und Zylinder anhand dieser Zahlen, und eine checks-Funktion gibt Pass oder Nicht-Pass zurück, mit den Zahlen in der Nachricht.

Aus diesem einen Modul entstanden:

  • ein three.js-Viewer mit Zuständen (Türen geöffnet, Bank umgedreht);
  • eine STEP-Datei für die Szene und eine pro Bau;
  • PNG-Renditionen für die Blätter, erstellt mit headless Chrome und Software-WebGL;
  • ein Fusion 360-Skript, dessen Benutzerparameter dieselben Zahlen sind;
  • die Prüfungen, die den Export stoppen, wenn eine Zahl nicht mehr funktioniert.

Der Spool-Schrank wurde am selben Tag mit zehn Prüfungen neu erstellt. Die Garage erreichte bei Revision B 24 Prüfungen und später 40. Die Regel, die daraus entstand: Wenn das Modell mit einem Blatt nicht übereinstimmt, ist das Modell in der Regel richtig, weil es die Geometrie schließen musste. Ein Schrank auf einem französischen Klemmholz steht 1,5 Zoll vom Wand ab, unabhängig davon, was das Blatt sagt.

Schreiben Sie es als Fähigkeiten auf

Der Workflow ging in ein Claude Code-Plugin namens workshop, in einem persönlichen Skill-Marktplatz, der im homelab-Repo gehalten wird. Es hat zwei Skills. build-plan ist für das Design-Dialog, die ingenieurtechnischen Prüfungen, das Zeichnungsset, die Preise und die Lieferung verantwortlich. shopcad-model ist für das Plan-Modul und seine Ausgaben zuständig. Version 1.1.0 integrierte, was der Garage und der Felsenscreen gelehrt hatten, sodass der nächste Plan dies nicht erneut lernt.

Der Felsenbildschirm, ein kleiner Jig

Der Felsen-Screen (2026-09-19) reinigt Kieselsteine unter einem Pool in 50 lb Leinenbeutel. Es ist ein 24 x 48 in geneigter Träger auf einem 2x4-Fußbrett, um 9 in hinter der Entleerungsende gekippt, so dass es bei Beladung mit etwa 23 lb am Griff um 35 Grad kippt und durch ein Sperrholz-Funnel in einen auf einem Handwagen stehenden Beutel abläuft.

Seine Zeichnungen werden durch ein Skript aus geometrischen Konstanten generiert, anstatt von Hand gezeichnet zu werden. Die Größe des Beutels bestimmt den Auslauf, und der 50 lb-Beutel zwang einen 11 x 11 in Auslauf auf 9 x 9. Eine Konstante geändert, und der Funnel, die Materialliste und die Kopie folgten. Die Füllregel wurde auch zu einer Blattlinie: Felsen wiegen etwa 100 lb pro Kubikfuß, also ist ein Beutel drei Schaufeln, 45 lb, und etwa 60 Beutel machen einen Kubikmeter.

Dann der Hinterhof

Der nächste Plan war ein Deck und ein Terrassenbereich, der aus Drohnenfotos erstellt wurde, und er brachte das Framework ins Freie und in die photo-stilistische Darstellung. Diese Geschichte ist in einem Hinterhof, erstellt aus Drohnenfotos; der Plan befindet sich unter /projects/backyard.

Was weitergeführt wird

  • Jede Grenze wird zu einer Blattlinie oder einem Modellcheck. Ein Schwingradius, ein Arbeitsbereich, ein Sackgewicht oder eine Regalbreite ist entweder auf einem Blatt gedruckt oder vom Modell erzwungen, am besten beides.
  • Preise stammen nur von Listen, die tatsächlich gelesen wurden. Der Laden wird benannt, das Datum wird aufgezeichnet, und ein Preis, der nicht gelesen werden konnte, wird als „nicht gelesen“ markiert und aus dem Gesamtbetrag ausgeschlossen.
  • Seiten werden bei Desktop- und schmaler Breite gerendert und geprüft. Jedes Blatt wird einzeln mit den realen Schriften bei 1100 und 720 px gerendert, bevor es veröffentlicht wird, weil Menschen diese auf halbem Monitor lesen.
  • Das PDF wird headless gedruckt. Ein Druckumhüllung und headless Chrome erledigen dies, und die Seitenzahl wird mit der vorherigen PDF-Datei verglichen, damit die Regeln für die schmale Layout nicht still die Seitenzahl verdoppeln.
  • Pläne leben auf der Website, nicht in Chat-Artefakten. Der Spulenregal war der erste, der sich bewegte, und jeder Plan seitdem begann hier.