diff --git a/CLAUDE.md b/CLAUDE.md index 80b1c2d..67714a0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## 開発進捗 -最新: 白板撮影モードにフルフレーム(クロップなし)保存を追加(ビネット確認用・ROI と 2 枚保存・DFK 23UX249) +最新: 白板撮影モードの出し分けを `#if DEBUG` から専用ビルド記号 `WHITEBOARD` に変更(Designer の条件コンパイル全廃・白板ボタン配置修正) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは GUIDE_05「進捗記録の運用ルール(CLAUDE.md / PROGRESS.md)」を参照. ## 必須ルール(コード実装時) diff --git a/TIASshot/Cameras/CameraBase.cs b/TIASshot/Cameras/CameraBase.cs index ef475df..de879d6 100644 --- a/TIASshot/Cameras/CameraBase.cs +++ b/TIASshot/Cameras/CameraBase.cs @@ -23,9 +23,9 @@ public abstract void Disconnect(); protected abstract void Shot(int numImages=1, int interval=0); -#if DEBUG +#if WHITEBOARD /// - /// 白板撮影(DEBUG 限定).IScam でのみ実装. + /// 白板撮影(WHITEBOARD 限定).IScam でのみ実装. /// 未対応の派生クラス(Lucam 等)はこのデフォルト実装でユーザーに通知して何もしない. /// /// 撮影枚数 diff --git a/TIASshot/Cameras/IScam.cs b/TIASshot/Cameras/IScam.cs index c775b41..e50b8ba 100644 --- a/TIASshot/Cameras/IScam.cs +++ b/TIASshot/Cameras/IScam.cs @@ -16,9 +16,6 @@ namespace TIASshot { internal class IScam : CameraBase { - // Color Enhancement プロパティの GUID(DFK23UX249.xml に記載) - private static readonly Guid ColorEnhancementGuid = new Guid("{3A3A8F77-6440-46CC-940A-8752B02E6C29}"); - ICImagingControl _ic; VCDRangeProperty _brightness; VCDRangeProperty _gain; @@ -204,13 +201,16 @@ /// protected override void EndShot() { } -#if DEBUG +#if WHITEBOARD // --------------------------------------------------------------- - // 白板撮影(DEBUG 限定・照明均一性評価用) + // 白板撮影(WHITEBOARD 限定・照明均一性評価用) // --------------------------------------------------------------- + // Color Enhancement プロパティの GUID(DFK23UX249.xml に記載) + private static readonly Guid ColorEnhancementGuid = new Guid("{3A3A8F77-6440-46CC-940A-8752B02E6C29}"); + /// - /// 白板撮影を実行する(DEBUG 限定). + /// 白板撮影を実行する(WHITEBOARD 限定). /// チャート検出・WB 自動調整・TCC 色補正を一切行わず,カメラ素の RGB を保存する. /// 校正未完了でも撮影可能. /// diff --git a/TIASshot/TIASshot.csproj b/TIASshot/TIASshot.csproj index 25c30e2..9a3cd3a 100644 --- a/TIASshot/TIASshot.csproj +++ b/TIASshot/TIASshot.csproj @@ -22,7 +22,7 @@ full false bin\Debug\ - DEBUG;TRACE + DEBUG;TRACE;WHITEBOARD prompt 4 true @@ -40,7 +40,7 @@ true bin\x64\Debug\ - DEBUG;TRACE + DEBUG;TRACE;WHITEBOARD full x64 7.3 @@ -131,6 +131,9 @@ Form1.cs + + Form1.cs + diff --git a/TIASshot/UI/Form1.Designer.cs b/TIASshot/UI/Form1.Designer.cs index e8357a6..b69b7c0 100644 --- a/TIASshot/UI/Form1.Designer.cs +++ b/TIASshot/UI/Form1.Designer.cs @@ -49,27 +49,10 @@ this.icImagingControl1 = new TIS.Imaging.ICImagingControl(); this.txtConvElemNum = new System.Windows.Forms.TextBox(); this.label9 = new System.Windows.Forms.Label(); -#if DEBUG - this.btnWhiteBoard = new System.Windows.Forms.Button(); -#endif ((System.ComponentModel.ISupportInitialize)(this.picPreview)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.picDisplay)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.icImagingControl1)).BeginInit(); this.SuspendLayout(); -#if DEBUG - // - // btnWhiteBoard [DEBUG] - // - this.btnWhiteBoard.BackColor = System.Drawing.Color.LightYellow; - this.btnWhiteBoard.Font = new System.Drawing.Font("MS UI Gothic", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.btnWhiteBoard.Location = new System.Drawing.Point(15, 375); - this.btnWhiteBoard.Name = "btnWhiteBoard"; - this.btnWhiteBoard.Size = new System.Drawing.Size(268, 35); - this.btnWhiteBoard.TabIndex = 25; - this.btnWhiteBoard.Text = "[DEBUG] 白板撮影(均一性評価用)"; - this.btnWhiteBoard.UseVisualStyleBackColor = false; - this.btnWhiteBoard.Click += new System.EventHandler(this.btnWhiteBoard_Click); -#endif // // btnShotOne // @@ -358,9 +341,6 @@ this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.btnShotOne); -#if DEBUG - this.Controls.Add(this.btnWhiteBoard); -#endif this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "Form1"; this.Text = "Form1"; @@ -402,9 +382,6 @@ private TIS.Imaging.ICImagingControl icImagingControl1; private System.Windows.Forms.TextBox txtConvElemNum; private System.Windows.Forms.Label label9; -#if DEBUG - private System.Windows.Forms.Button btnWhiteBoard; -#endif } } diff --git a/TIASshot/UI/Form1.WhiteBoard.cs b/TIASshot/UI/Form1.WhiteBoard.cs new file mode 100644 index 0000000..a5eb69b --- /dev/null +++ b/TIASshot/UI/Form1.WhiteBoard.cs @@ -0,0 +1,65 @@ +#if WHITEBOARD +using System; +using System.Windows.Forms; + +namespace TIASshot { + public partial class Form1 { + + /// + /// 白板撮影ボタンの初期化(WHITEBOARD 限定) + /// InitializeComponent() 完了後にコンストラクタから呼び出す. + /// + private void InitializeWhiteBoardButton() { + this.btnWhiteBoard = new System.Windows.Forms.Button(); + // + // btnWhiteBoard [WB] + // + this.btnWhiteBoard.BackColor = System.Drawing.Color.LightYellow; + this.btnWhiteBoard.Font = new System.Drawing.Font("MS UI Gothic", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.btnWhiteBoard.Location = new System.Drawing.Point(15, 225); + this.btnWhiteBoard.Name = "btnWhiteBoard"; + this.btnWhiteBoard.Size = new System.Drawing.Size(268, 28); + this.btnWhiteBoard.TabIndex = 25; + this.btnWhiteBoard.Text = "[WB] 白板撮影(均一性評価用)"; + this.btnWhiteBoard.UseVisualStyleBackColor = false; + this.btnWhiteBoard.Click += new System.EventHandler(this.btnWhiteBoard_Click); + this.Controls.Add(this.btnWhiteBoard); + } + + /// + /// [WB] 白板撮影ボタン(照明均一性評価用) + /// 校正ゲートを通さず IScam の白板撮影パスを呼び出す. + /// WHITEBOARD シンボルが定義されていない構成(Release 等)には含まれない. + /// + private void btnWhiteBoard_Click(object sender, EventArgs e) { + int numImages = GetNumMultiShots(); + if (numImages < 1) numImages = 1; + + btnWhiteBoard.Enabled = false; + ShowMessage($"白板撮影開始({numImages} 枚)..."); + + // 撮影は UI スレッドをブロックしないよう別スレッドで実行 + var thread = new System.Threading.Thread(() => { + try { + _camera.ShotWhiteBoard(numImages); + } catch (Exception ex) { + System.Diagnostics.Debug.WriteLine($"[WhiteBoard] 撮影スレッドエラー: {ex.Message}"); + ShowMessage($"白板撮影エラー: {ex.Message}"); + } finally { + if (InvokeRequired) { + Invoke((MethodInvoker)delegate { + btnWhiteBoard.Enabled = true; + }); + } else { + btnWhiteBoard.Enabled = true; + } + } + }); + thread.Name = "WhiteBoardShotThread"; + thread.Start(); + } + + private System.Windows.Forms.Button btnWhiteBoard; + } +} +#endif diff --git a/TIASshot/UI/Form1.cs b/TIASshot/UI/Form1.cs index 4c6a0c0..7cf2b2c 100644 --- a/TIASshot/UI/Form1.cs +++ b/TIASshot/UI/Form1.cs @@ -31,6 +31,9 @@ /// public Form1() { InitializeComponent(); +#if WHITEBOARD + InitializeWhiteBoardButton(); +#endif var version = Assembly.GetExecutingAssembly().GetName().Version; Text = $"{APP_NAME} ver.{version.Major}.{version.Minor}"; @@ -248,40 +251,5 @@ _isLightOn = true; } } - -#if DEBUG - /// - /// [DEBUG] 白板撮影ボタン(照明均一性評価用) - /// 校正ゲートを通さず IScam の白板撮影パスを呼び出す. - /// Release ビルドには含まれない. - /// - private void btnWhiteBoard_Click(object sender, EventArgs e) { - int numImages = GetNumMultiShots(); - if (numImages < 1) numImages = 1; - - btnWhiteBoard.Enabled = false; - ShowMessage($"白板撮影開始({numImages} 枚)..."); - - // 撮影は UI スレッドをブロックしないよう別スレッドで実行 - var thread = new System.Threading.Thread(() => { - try { - _camera.ShotWhiteBoard(numImages); - } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"[WhiteBoard] 撮影スレッドエラー: {ex.Message}"); - ShowMessage($"白板撮影エラー: {ex.Message}"); - } finally { - if (InvokeRequired) { - Invoke((MethodInvoker)delegate { - btnWhiteBoard.Enabled = true; - }); - } else { - btnWhiteBoard.Enabled = true; - } - } - }); - thread.Name = "WhiteBoardShotThread"; - thread.Start(); - } -#endif } } diff --git "a/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" "b/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" index f0807d2..13cff86 100644 --- "a/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" +++ "b/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" @@ -83,7 +83,7 @@ 通常の TIASshot(舌診用途)は「チャート検出 → WB 自動調整 → TCC 色補正 → sRGB 出力」という校正フローを行う.しかし照明均一性評価では色を合わせること自体が目的でないため,白板撮影では **WB 自動調整・TCC 色補正・チャート検出を一切行わず,カメラ素の RGB のみを保存**する.WB のチャンネルゲインは設定ファイル/デバイス状態の**固定値**のまま. -> TIASshot には校正を前提としない独立撮影パス(`#if DEBUG` 限定の白板撮影モード)を実装済み.本 Part はその撮影が用いる設定を記す. +> TIASshot には校正を前提としない独立撮影パス(`#if WHITEBOARD` 限定の白板撮影モード)を実装済み.本 Part はその撮影が用いる設定を記す. ## カメラ構成と出力形式 (Cameras & Output) diff --git "a/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" index ea05593..41ce621 100644 --- "a/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" +++ "b/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" @@ -4,7 +4,7 @@ ## 概要 (Overview) -- TIASshot の **白板撮影モード(照明均一性評価用・DEBUG 限定)** で取得した素の RGB 画像データ. +- TIASshot の **白板撮影モード(照明均一性評価用・`WHITEBOARD` ビルド限定)** で取得した素の RGB 画像データ. - カメラ: **ImagingSource DFK 23UX249**(USB3 カラー産業用,Sony IMX249). - **校正なし**で撮影する(チャート検出・ホワイトバランス自動調整・TCC 色補正を一切行わない).得られるのはカメラ素の RGB. - 1 撮影セッション = 1 フォルダ(例: `<時刻>-白板/`). diff --git "a/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" "b/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" index 91ff57f..dce04e8 100644 --- "a/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" +++ "b/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" @@ -70,7 +70,7 @@ - ファイル: `Utils/ImageStats.cs` - 飽和統計(飽和率・p99・チャンネル別 mean/max)の算出と JSON サイドカー生成.ハードウェアに依存しない純粋計算. -- 白板撮影モード(`#if DEBUG`)から使用される(テスト可能なピュアロジック層). +- 白板撮影モード(`#if WHITEBOARD`)から使用される(テスト可能なピュアロジック層). ## 継承関係 (Inheritance) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 23b819a..6384396 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -60,3 +60,8 @@ - 追加(フルフレーム保存): ビネット(周辺減光)は ROI で切り出すと四隅が消えて見えないため、フレームごとに ROI 画像(`WhiteBoard_*`)に加え**クロップなしのフルフレーム**(`WhiteBoard_full_*`)も保存。飽和統計は ROI のみ(白板領域の露出チェックが目的)。実機で full=1200×1920・ROI=1136×1528 が設定どおりと確認。 - LSC 調査結果: DFK 23UX249 は産業用カメラで**在カメラのレンズシェーディング補正を持たない**(device-state の全プロパティに項目なし+公式仕様にも記載なし)。補正データも付加されない。→ ビネット除去は SmTIAS 推奨の「独立な一様光源でのフラットフィールド」一択(在カメラ補正は不可と確定)。 - 保留・後段: LSC/ビネット補正は未実装(JSON に「未補正」と状態記録のみ)。フラットフィールド/ダークフレーム撮影・Lucam 対応は未対応。白板撮影後に Color Enhancement が OFF のまま戻らない(同一セッションで通常撮影に戻る場合は要再起動。`finally` での状態復元は今後の検討事項)。JSON の固定状態文字列(gamma_setting 等)は device-state 由来の決め打ちで動的読取ではない。 + +- [x] **白板撮影の出し分けを専用ビルド記号 `WHITEBOARD` に変更** (2026-06-18): 白板撮影モードを `#if DEBUG` から独立した `#if WHITEBOARD` に切り替え、`Form1.Designer.cs` の条件コンパイルを全廃(白板ボタンを専用 partial ファイルに分離)。あわせて白板ボタンの長年のレイアウト衝突(データ保存フォルダ欄との重なり)を修正。撮影ロジックは不変。 + - 動機: 「デバッグビルドか」と「白板撮影を含めるか」は別関心事なのに DEBUG で結合していた。本番(Release)からの除外は維持しつつ独立制御できるようにする。Designer.cs に `#if` が入っていると WinForms デザイナで破損するリスクがあったため全廃が主目的。 + - 設計判断: 専用ビルド記号案 vs 実行時 config フラグ案。本番バイナリにコードごと残さず除外したい要件から前者を採用(Debug 構成にのみ `WHITEBOARD` を定義、Release は未定義)。 + - UI: 白板ボタン配置は試行の末「1 枚撮影」直下の空き帯に収めた(フォーム下端拡張案は「下すぎる」ため不採用)。WHITEBOARD ビルド時のみ実行時に動的追加するため本番レイアウトは不変。