lithop 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE +21 -0
  4. data/README.md +126 -0
  5. data/RELEASING.md +63 -0
  6. data/bin/lithop +6 -0
  7. data/docs/README.md +44 -0
  8. data/docs/artifacts.md +122 -0
  9. data/docs/bambu-studio.md +93 -0
  10. data/docs/calibration.md +126 -0
  11. data/docs/color-model.md +114 -0
  12. data/docs/command.md +182 -0
  13. data/docs/config.md +201 -0
  14. data/docs/getting-started.md +98 -0
  15. data/docs/troubleshooting.md +112 -0
  16. data/lib/lithop/calibration/export.rb +102 -0
  17. data/lib/lithop/calibration/profile.rb +127 -0
  18. data/lib/lithop/calibration/profile_measurements.rb +82 -0
  19. data/lib/lithop/calibration/recipe_selector.rb +54 -0
  20. data/lib/lithop/calibration/target.rb +135 -0
  21. data/lib/lithop/calibration/target_svg.rb +89 -0
  22. data/lib/lithop/calibration/thickness_selector.rb +35 -0
  23. data/lib/lithop/cli/calibration.rb +40 -0
  24. data/lib/lithop/cli/image_options.rb +69 -0
  25. data/lib/lithop/cli/options.rb +95 -0
  26. data/lib/lithop/cli/settings.rb +34 -0
  27. data/lib/lithop/cli.rb +102 -0
  28. data/lib/lithop/export/calibration.rb +46 -0
  29. data/lib/lithop/export/color_metadata.rb +80 -0
  30. data/lib/lithop/export/generation.rb +122 -0
  31. data/lib/lithop/export/job.rb +49 -0
  32. data/lib/lithop/export/metadata.rb +85 -0
  33. data/lib/lithop/export/planning.rb +78 -0
  34. data/lib/lithop/export/previews.rb +35 -0
  35. data/lib/lithop/export/print_readme.rb +69 -0
  36. data/lib/lithop/export/result.rb +21 -0
  37. data/lib/lithop/formats/stl.rb +60 -0
  38. data/lib/lithop/formats/three_mf/bambu_metadata.rb +105 -0
  39. data/lib/lithop/formats/three_mf/mesh.rb +55 -0
  40. data/lib/lithop/formats/three_mf/model_writer.rb +114 -0
  41. data/lib/lithop/formats/three_mf/part_writer.rb +49 -0
  42. data/lib/lithop/formats/three_mf.rb +128 -0
  43. data/lib/lithop/image/pipeline.rb +175 -0
  44. data/lib/lithop/image/placement.rb +54 -0
  45. data/lib/lithop/image/preview.rb +63 -0
  46. data/lib/lithop/image/svg_loader.rb +218 -0
  47. data/lib/lithop/instrumentation.rb +22 -0
  48. data/lib/lithop/job_directory.rb +55 -0
  49. data/lib/lithop/layer_structure.rb +134 -0
  50. data/lib/lithop/mesh/column_geometry.rb +161 -0
  51. data/lib/lithop/mesh/column_topology.rb +262 -0
  52. data/lib/lithop/mesh/geometry.rb +116 -0
  53. data/lib/lithop/mesh/validator.rb +123 -0
  54. data/lib/lithop/mesh/voxel_geometry.rb +113 -0
  55. data/lib/lithop/mesh/voxel_topology.rb +79 -0
  56. data/lib/lithop/model/filament_profile.rb +79 -0
  57. data/lib/lithop/model/material_display_map.rb +61 -0
  58. data/lib/lithop/model/material_model.rb +106 -0
  59. data/lib/lithop/model/palette.rb +101 -0
  60. data/lib/lithop/model/thickness.rb +45 -0
  61. data/lib/lithop/reference_three_mf.rb +119 -0
  62. data/lib/lithop/sampling_grid.rb +41 -0
  63. data/lib/lithop/settings.rb +295 -0
  64. data/lib/lithop/settings_file.rb +56 -0
  65. data/lib/lithop/version.rb +5 -0
  66. data/lib/lithop.rb +55 -0
  67. data/sig/lithop.rbs +291 -0
  68. metadata +155 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 13a626692e6ae5bd67e88bb4f81e0cf8ae8ad6fb220e5cdb4822a582eaec6dd7
4
+ data.tar.gz: 1497a224597acc9416aa67961969aeeb868981581af93cff6fb7e0bada32d781
5
+ SHA512:
6
+ metadata.gz: 879e0cc070dfd33464e12504d5409b2b98df8ff1f576e716c818968875cab637a9f315ddf41bd021c391e3c88e222ebc3eddb29dcbbecf002531b9b80068a743
7
+ data.tar.gz: 3ce5b71121d43b5c58ffb9bee086cf59e36ab1550554a007742ffc76852a2350b2e3dc49ec14596f4bc4caa4022efb1a53b752103eddfb18084d60a1ca454b31
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 - 2026-10-12
4
+
5
+ - Converts JPEG, PNG, and validated self-contained SVG files up to 15 MB into a White reference STL and a single-plate multipart CMYW 3MF.
6
+ - Uses the standard 0.2 mm nozzle profile with two White base layers, seven `Cyan -> Magenta -> Yellow -> White` color layers, and a continuous upper White surface; four- and five-layer comparisons remain available.
7
+ - Maps material display colors and five-percent chart mixtures to labeled recipes, and generates matching 140 × 104 mm calibration SVG/3MF files with all 120 recipes and eight White thickness stages.
8
+ - Supports optional measured color and physical White-thickness calibration, JSON/CLI overrides, image placement, independent color cells, atomic output, Bambu metadata, previews, manifests, and safe cleanup; the 0.2 mm fine-line target is print-verified, while the current full chart and numerical color measurement remain pending.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 ogom
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # Lithop
2
+
3
+ Create backlit color lithophanes locally.
4
+
5
+ Lithop is a command-line CMYW color lithophane generator. It turns a JPEG, PNG, or validated self-contained SVG image into a single-plate multipart CMYW 3MF and a White reference STL without uploading, modifying, or copying the source image into the output job.
6
+
7
+ ## Status and safety
8
+
9
+ The standard profile uses:
10
+
11
+ | Setting | Standard value |
12
+ | --- | --- |
13
+ | Model size | 140 × 104 mm |
14
+ | Thickness grid | 637 × 473 cells, approximately 0.22 mm per cell |
15
+ | Nozzle | 0.2 mm |
16
+ | White base | Two 0.1 mm layers |
17
+ | Color region | Seven 0.1 mm CMYW layers in `Cyan -> Magenta -> Yellow -> White` order |
18
+ | Upper White | Continuous height field from 1.0 to 2.14689422 mm, sliced at 0.04 mm |
19
+ | Extruders | Cyan=1, Magenta=2, Yellow=3, White=4 |
20
+
21
+ Bambu Studio restores the generated single `lithophane` plate and its White/Cyan/Magenta/Yellow assignments. The bundled fine-line target has been printed successfully with the current 0.2 mm, seven-layer standard. The current 140 × 104 mm color chart has been sliced and inspected in Bambu Studio, but it has not been physically printed with the 0.2 mm standard; its 120 recipes and eight White thickness stages have not been measured numerically. Colorimetric accuracy is not guaranteed.
22
+
23
+ Before printing, inspect every layer and confirm the Cyan, Magenta, Yellow, and White assignments. Do not move, align, scale, or merge individual material parts. Lithop does not slice models, send print jobs, or control a printer or AMS.
24
+
25
+ ## Requirements
26
+
27
+ - macOS and Ruby 4.0 or later
28
+ - libvips with JPEG, PNG, SVG (librsvg), and ICC profile support
29
+ - For physical printing: Bambu Studio, an AMS-capable printer, and the required PLA Basic Cyan, Magenta, Yellow, and White filaments
30
+
31
+ ## Install
32
+
33
+ To install the 0.1.0 release from RubyGems, install libvips and the matching Lithop version:
34
+
35
+ ```sh
36
+ brew install vips
37
+ gem install lithop -v 0.1.0
38
+ lithop --version
39
+ ```
40
+
41
+ The version command must print `0.1.0`.
42
+
43
+ To work from a source checkout instead:
44
+
45
+ ```sh
46
+ bin/setup
47
+ bundle exec lithop --version
48
+ ```
49
+
50
+ ## Quick start
51
+
52
+ With an installed gem, generate a model from one JPEG, PNG, or SVG:
53
+
54
+ ```sh
55
+ lithop path/to/image.png
56
+ ```
57
+
58
+ From a source checkout, use the bundled sample and a coarse cell size for a faster first run:
59
+
60
+ ```sh
61
+ bundle exec lithop examples/cmy-fine-line.svg --width 20 --height 15 --pixel-size 0.5
62
+ ```
63
+
64
+ The standard command generates the 140 × 104 × 2.14689422 mm, 0.2 mm-nozzle layout:
65
+
66
+ ```sh
67
+ bundle exec lithop path/to/image.jpeg
68
+ ```
69
+
70
+ It writes `lithop.3mf` with a single `lithophane` plate and White/Cyan/Magenta/Yellow extruders. Its layer preview and physical print still require manual verification.
71
+
72
+ The command reports estimated and final triangle counts and creates a new `build/<job_id>/` directory. Completed jobs are never overwritten. Inspect `preview.png`, `transmission.png`, `thickness.png`, and the four material masks, then import `lithop.3mf` into Bambu Studio as a model. The 3MF contains geometry, fixed extruder numbers, and layer-height metadata. It does not select a printer, physical build plate, AMS slot, or complete slicing preset.
73
+
74
+ The bundled color chart at standard settings produces 2,660,706 CMYW 3MF triangles, below the default 5,000,000-triangle limit. Runtime and memory depend on the image and machine; use a smaller model and a coarser cell size for initial checks.
75
+
76
+ See [installation and basic use](docs/getting-started.md), the [artifact reference](docs/artifacts.md), and the [Bambu Studio checklist](docs/bambu-studio.md) before printing.
77
+
78
+ ## Input and settings
79
+
80
+ JPEG and PNG input supports EXIF orientation, transparency composited over White, and embedded ICC conversion to sRGB. SVG input is rendered in memory through librsvg and must be an uncompressed, static, self-contained document no larger than 15,000,000 bytes. External files, network URLs, data URLs, external CSS, DTDs, scripts, animation, and `foreignObject` are rejected.
81
+
82
+ Settings resolve in `command line > JSON file > built-in defaults` order. A project can keep reusable overrides in `config/settings.json`:
83
+
84
+ ```json
85
+ {
86
+ "layout_profile": "standard",
87
+ "width": 140.0,
88
+ "height": 104.0
89
+ }
90
+ ```
91
+
92
+ The command-line options can override individual profile values. Use `--color-pixel-size` to make CMYW recipe cells coarser than the White thickness grid, and `--image-fit`, crop, and margin options to control placement. See [options and settings](docs/config.md) for the complete input schema and validation rules.
93
+
94
+ ## Other commands
95
+
96
+ - `lithop calibrate` creates a 140 × 104 mm calibration SVG and matching printable 3MF with all 120 seven-layer recipes, eight White thickness stages, and a measurement-profile template. A completed measured profile can select both color recipes and the physical White height used by the 3MF, STL, previews, thickness map, and material masks. See [color calibration](docs/calibration.md).
97
+ - `lithop clean` permanently removes the selected project's complete `build/` directory, not one job. See the [command reference](docs/command.md#生成物を削除する) before using it.
98
+ - `lithop --help`, `lithop calibrate --help`, and `lithop clean --help` show the current command syntax.
99
+
100
+ ## Documentation
101
+
102
+ - [Documentation index and verification status](docs/README.md)
103
+ - [Installation and basic use](docs/getting-started.md)
104
+ - [Bambu Studio verification and printing](docs/bambu-studio.md)
105
+ - [Options and settings](docs/config.md)
106
+ - [Artifacts and generation records](docs/artifacts.md)
107
+ - [CMYW color model and layer structure](docs/color-model.md)
108
+ - [Optional measured calibration](docs/calibration.md)
109
+ - [Command reference](docs/command.md)
110
+ - [Troubleshooting](docs/troubleshooting.md)
111
+
112
+ ## Ruby API and development
113
+
114
+ The RubyGem and CLI command are named `lithop`; the Ruby namespace is `Lithop`. Supported public signatures are declared in [`sig/lithop.rbs`](sig/lithop.rbs). Helper classes under `lib/lithop/export/`, `lib/lithop/cli/`, and `lib/lithop/formats/three_mf/` are internal unless listed there.
115
+
116
+ ```sh
117
+ bin/setup
118
+ bundle exec rake
119
+ bundle exec rbs validate
120
+ ```
121
+
122
+ Before publishing, run `bundle exec rake release:check` and follow [RELEASING.md](RELEASING.md).
123
+
124
+ ## License
125
+
126
+ [MIT](LICENSE)
data/RELEASING.md ADDED
@@ -0,0 +1,63 @@
1
+ # Releasing lithop
2
+
3
+ This checklist prepares and publishes one immutable gem version. Run every command from the repository root.
4
+
5
+ ## 1. Prepare the version
6
+
7
+ 1. Update `Lithop::VERSION` in `lib/lithop/version.rb`.
8
+ 2. Add or update the matching version and release date in `CHANGELOG.md`. Keep the changelog concise; add an `Unreleased` section only when subsequent changes need one.
9
+ 3. Confirm the README installation and usage examples match the release.
10
+ 4. Manually open the external links in `README.md` and `docs/`; automated tests intentionally validate only local links and anchors.
11
+ 5. Commit all intended files and verify that `git status --short` is empty.
12
+ 6. Run the non-publishing release check:
13
+
14
+ ```sh
15
+ bundle exec rake release:check
16
+ ```
17
+
18
+ The check runs the specs, RuboCop, and RBS validation; builds the gem; checks its version, metadata, runtime dependency, and packaged documentation; installs it into a temporary isolated gem directory; and executes the installed `lithop --version` command.
19
+
20
+ ## 2. Prepare publishing services
21
+
22
+ Confirm the release commit is on the intended release branch, the repository has an `origin` remote, and GitHub CLI authentication is active:
23
+
24
+ ```sh
25
+ git branch --show-current
26
+ git remote -v
27
+ gh auth status
28
+ ```
29
+
30
+ Before the first release, confirm that the `lithop` name is available on RubyGems.org. For manual publishing, sign in and enable MFA:
31
+
32
+ ```sh
33
+ gem signin
34
+ ```
35
+
36
+ For later releases, confirm that the account owns the gem:
37
+
38
+ ```sh
39
+ gem owner lithop
40
+ ```
41
+
42
+ Alternatively, configure a RubyGems.org trusted publisher for this repository and its exact publishing workflow. Never commit an API key or `~/.gem/credentials`.
43
+
44
+ ## 3. Publish deliberately
45
+
46
+ `bundle exec rake release` is a publishing command. It creates and pushes the version tag and publishes the gem to RubyGems.org. Run it only after `release:check` passes and the working tree is clean:
47
+
48
+ ```sh
49
+ bundle exec rake release
50
+ ```
51
+
52
+ After the tag exists on GitHub, create a GitHub Release and attach the exact gem that passed validation. Replace `0.1.0` for later versions:
53
+
54
+ ```sh
55
+ gh release create v0.1.0 lithop-0.1.0.gem --verify-tag --generate-notes
56
+ ```
57
+
58
+ Finally, install the published version in a clean environment and verify the CLI:
59
+
60
+ ```sh
61
+ gem install lithop -v 0.1.0
62
+ lithop --version
63
+ ```
data/bin/lithop ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "lithop"
5
+
6
+ exit Lithop::CLI.run(ARGV)
data/docs/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Lithopドキュメント
2
+
3
+ Lithopは、JPEG、PNG、SVGからCMYW材料のカラーLithophane(リトファン)3MFと、White参照STLを生成するローカルCLIです。画像を外部へ送信せず、入力画像自体を生成ジョブへコピーしません。
4
+
5
+ ## 安全と現在の検証範囲
6
+
7
+ - 標準は0.2 mmノズル、White下地2層、CMYW色領域7層、連続高のWhite上面を使います。
8
+ - Bambu Studioで単一プレートとWhite/Cyan/Magenta/Yellowの割り当て復元を確認済みです。0.2 mmノズルで実機印刷済みなのは細線評価片です。現行140 × 104 mmカラーチャートはBambu Studioで形状を確認済みですが、実機印刷は未実施です。
9
+ - 現行カラーチャートの120レシピとWhite厚み8段階は数値測色していません。
10
+ - 数値測色は必須にしておらず、入力画像やプレビューとの測色的一致は保証しません。
11
+ - Lithopはスライス、印刷開始、プリンタやAMSの操作を行いません。
12
+ - 印刷前にBambu Studioで材料割り当てと全レイヤーを確認してください。
13
+
14
+ ## 初めて使う
15
+
16
+ - [導入と基本操作](getting-started.md) — インストール、小型モデルの生成、最初に見る成果物
17
+
18
+ ## 印刷・校正する
19
+
20
+ - [Bambu Studioでの確認と印刷](bambu-studio.md) — 材料割り当て、スライス条件、印刷前チェック
21
+ - [色校正](calibration.md) — 校正片、目視確認、任意の実測プロファイル
22
+
23
+ ## 仕様を調べる
24
+
25
+ - [生成物と記録](artifacts.md) — ジョブ、全成果物、プレビュー、`settings.json`、`manifest.json`
26
+ - [生成オプションと設定ファイル](config.md) — 設定の優先順位、入力JSON、既定値、検証規則
27
+ - [コマンドリファレンス](command.md) — 構文、全オプション、終了ステータス
28
+ - [CMYWの色モデルと積層構造](color-model.md) — 材料、減法混色、White厚み、3MF構造
29
+
30
+ ## 問題を解決する
31
+
32
+ - [トラブルシューティング](troubleshooting.md) — 読み込み、材料、色、サイズ、削除に関する対処
33
+
34
+ CLIの現在の構文は、次のコマンドでも確認できます。
35
+
36
+ ```sh
37
+ lithop --help
38
+ lithop calibrate --help
39
+ lithop clean --help
40
+ ```
41
+
42
+ ## 文書の位置づけ
43
+
44
+ `docs/`は、人がLithopを操作・印刷・評価するための利用者向け文書で、RubyGemにも含まれます。実装上の不変条件は`spec/`、設計検討や未確定の作業計画は配布対象外の`doc/`に置きます。
data/docs/artifacts.md ADDED
@@ -0,0 +1,122 @@
1
+ # 生成物と記録
2
+
3
+ Lithopは生成中のファイルを一時ディレクトリへ書き、すべて成功した後に完了済みジョブとして公開します。このページは通常ジョブと校正ジョブの成果物、およびJSON記録の正本です。
4
+
5
+ ## ジョブディレクトリ
6
+
7
+ 通常生成は`build/<job_id>/`、校正片生成は`build/<job_id>-calibration/`へ保存します。ジョブIDはUTC時刻とランダム値から作られます。
8
+
9
+ 生成中は`build/.tmp-<job_id>/`を排他的に取得します。失敗または中断した実行は自分が作成した一時領域だけを回収し、入力画像、別の実行の一時領域、完了済みジョブを削除しません。完了済みジョブと同じIDは上書きしません。
10
+
11
+ ## 通常ジョブのファイル
12
+
13
+ | ファイル | 内容 |
14
+ | --- | --- |
15
+ | `lithop.3mf` | 使用するCyan、Magenta、Yellow、Whiteの材料別メッシュを持つカラー用モデル |
16
+ | `cmyk_white.stl` | 厚さマップから作るWhite単色の参照リトファン |
17
+ | `preview.png` | 公称レシピ色に相対的な厚さの明暗を重ねた確認用画像 |
18
+ | `transmission.png` | White厚さによる相対透過明度 |
19
+ | `thickness.png` | セル単位の厚さマップ |
20
+ | `cyan-mask.png` | Cyanの層数マップ |
21
+ | `magenta-mask.png` | Magentaの層数マップ |
22
+ | `yellow-mask.png` | Yellowの層数マップ |
23
+ | `white-mask.png` | Whiteの層数マップ |
24
+ | `settings.json` | 解決済み設定、実効値、制限値、入力元のパス |
25
+ | `manifest.json` | 寸法、ハッシュ、材料、レシピ、三角形数、成果物の記録 |
26
+ | `PRINT_README.md` | そのジョブ固有の印刷前チェック |
27
+ | `calibration-profile.json` | 実測プロファイルを指定した場合だけ保存するコピー |
28
+
29
+ 標準ジョブは単一プレートと非一様レイヤー情報を持つ`lithop.3mf`を出力します。未使用のCyan、Magenta、Yellowは3MFのメッシュから省略されるため、材料部品は1〜4個です。Whiteは必ず含まれます。`cmyk_white.stl`は比較用で、CMYWの材料分離情報を持ちません。
30
+
31
+ ## プレビューの座標と値
32
+
33
+ 全プレビューの1画素は3MFの1セルに対応し、左上がモデルの`+Y`側です。材料マスクは黒が0層で、明るいほど層数が多く、4材料で同じ明度尺度を使います。
34
+
35
+ `preview.png`は、3MFと同じ材料モデルが選択したレシピとWhite厚さを可視化します。表示色そのものの明るさも含むため、異なる色同士のWhite高さを比較する画像ではありません。高さは`thickness.png`、材料層数は4枚のマスクで確認します。未校正時はフィラメントの実測透過色を使わないため、入力画像や印刷物との測色的一致を予測するものではありません。
36
+
37
+ 通常画像の連続White高さはRec.601輝度から求めます。材料表示色と同梱カラーチャートの配合色には定義済みの明暗値を使うため、同じ明暗行ではYellowを含む全色列が同じ高さになります。
38
+
39
+ 実測校正プロファイルを指定した場合は、White厚み8段階の測定輝度から最も近い高さを選びます。選択結果は3MF、参照STL、プレビュー、厚み画像、材料マスクで共通です。
40
+
41
+ ## 出力される settings.json
42
+
43
+ `settings.json`は入力用設定ファイルではなく、そのジョブで確定した値の記録です。代表的な構造は次のとおりです。
44
+
45
+ ```json
46
+ {
47
+ "layout_profile": "standard",
48
+ "width": 140.0,
49
+ "height": 104.0,
50
+ "margin_top": 0.0,
51
+ "margin_right": 0.0,
52
+ "margin_bottom": 0.0,
53
+ "margin_left": 0.0,
54
+ "image_fit": "cover",
55
+ "crop_position_x": 0.5,
56
+ "crop_position_y": 0.5,
57
+ "crop_scale": 1.0,
58
+ "minimum_thickness": 1.0,
59
+ "maximum_thickness": 2.14689422,
60
+ "pixel_size": 0.22,
61
+ "color_pixel_size": null,
62
+ "grid_columns": null,
63
+ "grid_rows": null,
64
+ "first_layer_height": 0.1,
65
+ "layer_height": 0.1,
66
+ "base_white_layers": 2,
67
+ "top_layer_height": 0.04,
68
+ "top_white_start": 1.0,
69
+ "minimum_top_white_layers": 0,
70
+ "exact_maximum_thickness": true,
71
+ "nozzle_diameter": 0.2,
72
+ "color_model": "cmy",
73
+ "color_layer_count": 7,
74
+ "pigment_order": ["cyan", "magenta", "yellow"],
75
+ "bambu_project": true,
76
+ "maximum_input_pixels": 20000000,
77
+ "maximum_triangles": 5000000,
78
+ "effective_color_pixel_size": 0.22,
79
+ "effective_minimum_thickness": 1.0,
80
+ "effective_maximum_thickness": 2.14689422,
81
+ "columns": 637,
82
+ "rows": 473,
83
+ "pixel_size_x": 0.21978021978021978,
84
+ "pixel_size_y": 0.21987315010570824,
85
+ "schema_version": 1,
86
+ "generator_version": "0.1.0",
87
+ "input_path": "/absolute/path/to/image.png",
88
+ "input_settings_path": "/absolute/path/to/config/settings.json",
89
+ "calibration_profile_id": null,
90
+ "calibration_profile_path": null
91
+ }
92
+ ```
93
+
94
+ 入力可能なキーに加え、レイヤー境界へ丸めた実効厚さ、格子寸法、生成器版、入力元、校正情報を含みます。そのまま`config/settings.json`として再利用せず、[生成設定](config.md#生成設定)にある入力キーだけをコピーしてください。
95
+
96
+ ## manifest.jsonとの違い
97
+
98
+ | ファイル | 目的 |
99
+ | --- | --- |
100
+ | 入力側の`config/settings.json` | 繰り返し使う生成条件を指定する |
101
+ | 出力側の`settings.json` | CLIと設定ファイルを統合した確定値、実効値、制限値、入力元を記録する |
102
+ | `manifest.json` | ジョブID、入力SHA-256、寸法、印刷条件、材料プロファイル、積層構造、使用材料、レシピ、三角形数、成果物一覧を記録する |
103
+
104
+ `manifest.json`の`dimensions_mm`には幅、高さ、実効最大厚さを保存します。`color_model`には、校正ID、色領域の層数と顔料順、White厚み構造、使用/未使用材料、材料別三角形数、レシピ集計、プレビュー方式が入ります。計画時と書き出し後の3MF三角形数は一致を検証してから保存します。
105
+
106
+ ## 校正ジョブのファイル
107
+
108
+ | ファイル | 内容 |
109
+ | --- | --- |
110
+ | `calibration.svg` | 140 × 104 mmの編集可能なパッチ配置図。パッチIDと向きの確認用 |
111
+ | `calibration.3mf` | 全120レシピ、White厚み8段階、向き判別列を持つ校正片 |
112
+ | `calibration-profile.json` | 各パッチの反復測定値を追加するプロファイル雛形 |
113
+ | `manifest.json` | 積層条件、配置、材料数、三角形数を記録する生成情報 |
114
+ | `CALIBRATION_README.md` | パッチ配置と測定値の記入方法 |
115
+
116
+ 校正プロファイルの記入と適用は[色校正](calibration.md)を参照してください。
117
+
118
+ ## ローカルパスと共有時の注意
119
+
120
+ 入力画像自体はジョブへコピーされません。ただし、`settings.json`の`input_path`、`input_settings_path`、`calibration_profile_path`にはローカルのディレクトリ名やファイル名が含まれます。Issueや第三者へ共有する前に機密情報がないか確認してください。
121
+
122
+ `manifest.json`には入力画像のSHA-256が含まれます。公開してよい識別情報か判断してから共有してください。
@@ -0,0 +1,93 @@
1
+ # Bambu Studioでの確認と印刷
2
+
3
+ 標準の`lithop.3mf`は、単一`lithophane`プレート、CMYW割り当て、上部Whiteのレイヤー範囲を持ちます。単一プレートとWhite/Cyan/Magenta/Yellow割り当ての復元はBambu Studioで確認済みです。G-code、温度、速度、AMS実スロット、機種固有の開始・終了コードを含まないため、その他の印刷条件はBambu Studio側で確認します。
4
+
5
+ 標準構造は0.2 mmノズル、White下地2層、7層の`Cyan -> Magenta -> Yellow -> White`、連続高のWhite上面を使います。以下の確認をすべて終えるまで印刷を開始しないでください。
6
+
7
+ ## 現在の確認範囲
8
+
9
+ - 単一プレートとWhite/Cyan/Magenta/Yellow割り当ての復元は確認済み
10
+ - 0.2 mmノズル、7層構造の細線評価片は問題なく印刷完了
11
+ - 現行カラーチャートを0.2 mmノズル・0.1 mm積層ピッチで再スライスし、第1・8・15・30・39層の外形、グリッド、ラベル、各セルに形状欠落がないことを確認済み
12
+ - 現行140 × 104 mmカラーチャートの0.2 mmノズルによる実機印刷は未実施
13
+ - 120レシピの数値測色は未実施で、測色的一致は保証しない
14
+
15
+ 材料製品、表示色、積層の設計は[CMYWの色モデルと積層構造](color-model.md)を参照してください。
16
+
17
+ ## 小型モデルを準備する
18
+
19
+ 最初は同梱画像と粗いXYセルで小型モデルを作ります。
20
+
21
+ ```sh
22
+ bundle exec lithop examples/cmy-fine-line.svg --width 20 --height 15 --pixel-size 0.5
23
+ ```
24
+
25
+ 表示された`build/<job_id>/`で、`preview.png`、`PRINT_README.md`、`settings.json`、`manifest.json`を確認してから`lithop.3mf`を開きます。自分のジョブIDと印刷条件は`manifest.json`に記録されています。
26
+
27
+ ## 3MFを読み込む
28
+
29
+ 1. `cmyk_white.stl`ではなく`lithop.3mf`をモデルとして読み込む。
30
+ 2. 一つの親オブジェクトの下に、使用材料の部品が同じ位置で組み立てられていることを確認する。
31
+ 3. 部品を個別に移動、整列、拡大縮小、結合しない。
32
+ 4. 各部品のExtruder番号と材料を確認する。
33
+ 5. Extruderと実際に装填したAMSスロットの対応を確認する。
34
+
35
+ | Extruder | 材料 |
36
+ | ---: | --- |
37
+ | 1 | PLA Basic Cyan |
38
+ | 2 | PLA Basic Magenta |
39
+ | 3 | PLA Basic Yellow |
40
+ | 4 | PLA Basic White |
41
+
42
+ 標準出力はCyan=1、Magenta=2、Yellow=3、White=4です。Blackスロットは追加しません。
43
+
44
+ 未使用のCyan、Magenta、Yellowは省略されますが、残る番号は詰めません。Bambu Studioの表示は版によって異なるため、部品名や画面上の色だけで判断しないでください。
45
+
46
+ ## スライス条件を合わせる
47
+
48
+ | 項目 | 確認内容 |
49
+ | --- | --- |
50
+ | ノズル | 生成時の0.2 mmまたは0.4 mm。既定は0.2 mm |
51
+ | 下地White | 既定は0.1 mmを2層 |
52
+ | 色レイヤー | 既定は0.1 mm |
53
+ | 色領域 | 既定は7層、Cyan -> Magenta -> Yellow -> White |
54
+ | 上部White | Z=1.0 mm以上を0.04 mmでスライス |
55
+ | 充填 | 100 % rectilinear |
56
+ | 向き | 平らな背面をZ=0、完成後は+Z側から見る |
57
+
58
+ 実際の値はそのジョブの`settings.json`と`PRINT_README.md`を優先します。生成側とスライサー側のZ境界が異なると、材料層が消失または混在する可能性があります。
59
+
60
+ フィラメントの取り扱いと対応アクセサリは、製品情報と[Bambu LabのCMYKリトファン印刷ガイド](https://wiki.bambulab.com/en/knowledge-sharing/CMYK-color-lithophane-printing-instructions)で最新情報を確認してください。
61
+
62
+ ## レイヤープレビューを確認する
63
+
64
+ レイヤープレビューを下から上まで動かし、すべて確認します。
65
+
66
+ - 最初の2層が連続したWhiteである
67
+ - 色領域の層数と材料順が`settings.json`、`manifest.json`と一致する
68
+ - 0.9〜1.0 mmがWhiteで、1.0 mm以上に連続高のWhite上面がある
69
+ - Cyan、Magenta、Yellowの必要な領域が消えていない
70
+ - 材料同士の重複、穴、孤立領域、浮遊形状がない
71
+ - 画像の上下左右が正しい
72
+ - 幅、高さ、最大厚さが生成記録と一致する
73
+
74
+ 一つでも確認できない場合は印刷を開始しないでください。材料が分かれない場合は[3MFの材料が期待した色に分かれない](troubleshooting.md#3mfの材料が期待した色に分かれない)を参照してください。
75
+
76
+ 標準ジョブではWhite下地2層、元画像のsRGBから選ぶCMY/W色領域7層、0.9〜1.0 mmのWhite、その上の0.04 mmレイヤーを確認します。外周、Black部品、写真フレーム、導光板は含みません。
77
+
78
+ ## 初回印刷を記録する
79
+
80
+ 小型モデルを白色バックライトで確認し、少なくとも次を記録します。
81
+
82
+ ```text
83
+ Lithop version / Job ID:
84
+ Bambu Studio version:
85
+ Printer / nozzle / build plate:
86
+ First layer / layer height / infill:
87
+ AMS slot 1 / 2 / 3 / 4:
88
+ Filament product and lot:
89
+ Backlight:
90
+ Result and observations:
91
+ ```
92
+
93
+ 条件の異なる結果を混在させないため、校正を行う場合もこの記録を使用します。
@@ -0,0 +1,126 @@
1
+ # 色校正
2
+
3
+ Lithopの標準構造は、2層のWhite下地、7層のCMYW色領域、連続した上部Whiteで構成されます。未校正出力は材料の表示色を基準にレシピを選ぶため、実際のフィラメント、プリンタ、バックライトを含む測色的一致は保証しません。
4
+
5
+ 目視結果で用途を満たす場合、数値校正は不要です。使用する材料と観察条件で透過色を測り、入力色に近いレシピと明るさに対応する厚みを選びたい場合に、任意の実測プロファイルを使用します。
6
+
7
+ ## 現在の校正片
8
+
9
+ `lithop calibrate`は画像を変換せず、標準パレットのセルから校正SVGと印刷用3MFを直接生成します。レイアウトの物理サイズは[`examples/cmy-color-chart.svg`](../examples/cmy-color-chart.svg)と同じ140 × 104 mmです。
10
+
11
+ | 項目 | 現在の仕様 |
12
+ | --- | --- |
13
+ | 物理サイズ | 140 × 104 mm |
14
+ | 配置 | 16列 × 9行 |
15
+ | レシピ | `R000`〜`R119`の120種類 |
16
+ | White厚み | `W00`〜`W07`の8段階 |
17
+ | 標準ノズル | 0.2 mm |
18
+ | 第1層/通常レイヤー | 0.1 mm/0.1 mm |
19
+ | 色領域 | 7層、`Cyan -> Magenta -> Yellow -> White` |
20
+
21
+ 120レシピは、7層をCyan、Magenta、Yellow、Whiteへ配分できる全組み合わせです。レシピは先頭8行の15列を使い、鑑賞面から見て上段左の`R000`から行優先で並びます。各セルは横8.125 mm、縦約11.111 mmです。
22
+
23
+ 下段の`W00`から`W07`は、全7色層をWhiteに固定して上部Whiteの厚みだけを変えます。現在の標準設定では、総厚は順に1.0、1.16、1.32、1.48、1.64、1.8、2.0、2.14689422 mmです。値は最小・最大厚さと印刷可能なZ境界から算出されるため、厚さ設定を変更した場合は生成された`calibration-profile.json`の`total_thickness_mm`を正本とします。
24
+
25
+ 右端は向き判別用のWhite列で、上端に`TOP`を表示します。下段の未使用セルもWhiteです。`calibration.svg`はパッチID、色、向きを確認する編集可能な配置図です。材料の積層と厚みを持つ印刷データは、同時に生成される`calibration.3mf`です。
26
+
27
+ ## 校正片を生成する
28
+
29
+ プロジェクトの`config/settings.json`を使う場合は次を実行します。
30
+
31
+ ```sh
32
+ bundle exec lithop calibrate
33
+ ```
34
+
35
+ 別の設定ファイルを使う場合は`--config`、別のプロジェクトへ出力する場合は`--project-dir`を指定します。校正片は7層・`cyan,magenta,yellow`順と、相異なるWhite厚みを8段階生成できる厚さ範囲を要求します。画像用の幅、高さ、余白、配置、ピクセルサイズは使用しません。
36
+
37
+ `build/<job_id>-calibration/`へ次の5ファイルを生成します。
38
+
39
+ | ファイル | 用途 |
40
+ | --- | --- |
41
+ | `calibration.svg` | 140 × 104 mmのパッチ配置、ID、向きを確認する |
42
+ | `calibration.3mf` | Bambu Studioで材料、積層、厚みを確認して印刷する |
43
+ | `calibration-profile.json` | 材料、光源、測定条件、各パッチの測定値を記録する |
44
+ | `manifest.json` | 積層構造、配置、材料数、三角形数を確認する |
45
+ | `CALIBRATION_README.md` | 生成時の設定とパッチ配置を確認する |
46
+
47
+ 全ファイルの定義は[校正ジョブのファイル](artifacts.md#校正ジョブのファイル)、コマンドの全オプションは[校正片を生成する](command.md#校正片を生成する)、読み込む設定は[校正片に使う設定](config.md#校正片に使う設定)を参照してください。
48
+
49
+ 印刷前に[Bambu Studioのレイヤープレビュー](bambu-studio.md#レイヤープレビューを確認する)で、単一プレート、White/Cyan/Magenta/Yellowの割り当て、全レイヤー、140 × 104 mmの寸法を確認します。3MFの寸法、レイヤー高さ、材料順は変更しません。
50
+
51
+ ## 測定プロファイルを記入する
52
+
53
+ 生成直後の`calibration-profile.json`は`status: "draft"`の雛形です。次の条件を記録します。
54
+
55
+ - Cyan、Magenta、Yellow、Whiteの材料ロット
56
+ - バックライトの種類、色温度、照度
57
+ - 測定方法、機器、測定不確かさ
58
+ - 光源だけを測った白点と、遮光時の黒点
59
+ - 120レシピとWhite厚み8段階の測定値
60
+
61
+ 各パッチの`measurements`配列へ、同じ条件で測った値を1件以上追加します。反復測定は複数件をそのまま追加できます。
62
+
63
+ ```json
64
+ {
65
+ "transmitted_srgb": [0.81, 0.62, 0.35],
66
+ "luminance": 118.4,
67
+ "error": 1.7
68
+ }
69
+ ```
70
+
71
+ `transmitted_srgb`は0〜1の3要素、`luminance`は0以上、任意の`error`も0以上です。`measurement.white_point`と`measurement.black_point`にも同じ形式の測定値を記録します。条件が変わった場合は値を混在させず、新しい校正ジョブまたはプロファイルとして管理します。
72
+
73
+ カメラを使う場合は、自動露出、自動ホワイトバランス、HDR、画像補正を無効にし、同じ撮影条件を維持します。カメラ値を測色計の値と同等には扱わず、`measurement.method`と`measurement.device`へ方法と機器を記録します。
74
+
75
+ ## 測定手順
76
+
77
+ 1. `calibration.svg`でパッチIDと向きを確認する。
78
+ 2. `calibration.3mf`をBambu Studioで開き、材料割り当てと全レイヤーを確認して印刷する。
79
+ 3. 十分に冷却し、一定のバックライトと周囲光を用意する。
80
+ 4. 各パッチの中央を測色するか、固定した条件でRAW撮影する。
81
+ 5. 光源だけの白点と、遮光時の黒点を測る。
82
+ 6. 測定値を対応するパッチの`measurements`へ追加する。
83
+ 7. 必要に応じて同じ条件で反復し、材料、光源、機器、誤差を記録する。
84
+
85
+ ## 実測プロファイルを使う
86
+
87
+ 全128パッチと白点・黒点を記入したプロファイルを、通常生成の`--calibration-profile`へ指定します。
88
+
89
+ ```sh
90
+ bundle exec lithop image.png \
91
+ --calibration-profile build/<calibration-job-id>-calibration/calibration-profile.json
92
+ ```
93
+
94
+ 読み込み時には、次の条件を検証します。
95
+
96
+ - スキーマ版とJSONの形式が正しい
97
+ - ノズル径、レイヤー高さ、色領域の層数、顔料順が現在の設定と一致する
98
+ - 120レシピが現在のパレットと一致する
99
+ - White厚みパッチが相異なる8段階ある
100
+ - 全パッチに1件以上の測定値がある
101
+ - 白点と黒点がある
102
+ - White厚みの測定輝度に差がある
103
+
104
+ 条件を満たさない場合は、通常ジョブを作る前に生成を中止します。
105
+
106
+ ## 実測値の使い方
107
+
108
+ 同じパッチに複数の測定値がある場合、`transmitted_srgb`と`luminance`をそれぞれ平均します。
109
+
110
+ 色レシピは、各パッチの平均`transmitted_srgb`を最大成分で正規化し、入力色から求めたRGB比に最も近いものを120レシピから選びます。この段階では明るさを除いた色成分を比較します。
111
+
112
+ 厚みは、入力のWhite明暗密度0〜1を、White厚み8段階で測った最も明るい輝度から最も暗い輝度までへ線形に対応させ、目標輝度に最も近い段階を選びます。通常画像のWhite明暗密度はRec.601輝度から求め、材料表示色と同梱カラーチャートの配合色では定義済みの明暗値を使います。選択した厚みは現在のレイヤー境界へ丸めます。
113
+
114
+ 選択した同じWhite高さを`lithop.3mf`のWhite形状、`cmyk_white.stl`、材料モデル、`preview.png`、`transmission.png`、`thickness.png`、4材料マスクへ渡します。このため、実測プロファイル適用後の形状と確認画像で異なる厚みを使いません。
115
+
116
+ 使用したプロファイルは通常ジョブへ`calibration-profile.json`としてコピーされ、`settings.json`と`manifest.json`へプロファイルID、元パス、選択方式を記録します。
117
+
118
+ 色レシピと明るさは独立に選択します。レシピごとの明るさの違いや、色と厚みの相互作用を同時に補正する色管理方式ではありません。
119
+
120
+ ## 現在の検証範囲
121
+
122
+ - 140 × 104 mm、16列 × 9行のSVGと3MFの寸法・配置を自動検証している
123
+ - 7層120レシピ、White厚み8段階、向き判別列の生成を自動検証している
124
+ - プロファイルの生成、JSON検証、積層条件照合、反復測定の平均、レシピと厚みの選択を自動検証している
125
+ - 現行140 × 104 mm校正片の0.2 mmノズルによる実機印刷は完了していない
126
+ - 7層120レシピについて、実機での数値測色と色差評価は完了していない