KiCADで出力フォルダを一発で開けるようにする

# はじめに
オープンソースな回路CAD、KiCADに新たな機能を実装してマージされるまでのお話です。  
※このページはとある大学の演習レポートの子記事です。親記事はこちら

https://qiita.com/ogirin/private/38afdb348fe4acad56a9

# 実装した機能
今回は、次のissueで提案された機能を実装しました。

https://gitlab.com/kicad/code/kicad/-/issues/17659

内容を簡単に説明すると、KiCADで出力した基板の製造用データを確認するとき、わざわざファイルエクスプローラを開いて自分で出力先を探さないといけないのは面倒じゃない？？というものです。

そこでissueでも提案されているとおり、製造用データの出力画面からボタン一つで自動で出力先を開く機能を実装しました。

# デバッガを使った解析
まずは製造用データの出力画面がどのファイルで定義されているかをデバッガを使って確認します。

VSCodeのlldb拡張を使ってどのように確認するかを説明します。

### 1.launch.jsonを作成する
まずはVSCodeでデバッガを起動するために必要なlaunch.jsonを作成します。

これはビルド時にインストール先を`/home/ikoma/Lecture/daikibo_oss/install`にした場合のサンプルです

```
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      "program": "/home/ikoma/Lecture/daikibo_oss/install/bin/kicad",
      "args": [],
      "cwd": "${workspaceFolder}",
      "env": {
        "LD_LIBRARY_PATH": "/home/ikoma/Lecture/daikibo_oss/install/lib"
      }
    }
  ]
}
```

### 2.KiCADをデバッガで起動する
VSCodeのサイドメニューにある「実行とデバッグ」タブから上で作成したプロファイルを起動します

![Screenshot from 2024-11-21 14-02-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/5ae3d3ac-c2d6-605d-9570-04667ab97878.png)

KiCADとデバッガが起動してホーム画面が表示されると思います。

KiCADが正常に起動したら、製造用データの出力画面を開いたところでVSCodeの上部に表示されている「一時停止」ボタンをクリックします。

![Screenshot from 2024-11-21 14-08-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/538d3eed-ad1e-0083-5926-40d10d2b5495.png)

一時停止した状態で、「実行とデバッグ」タブの下部に表示されている「コールスタック」の欄を上から順に確認していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/b73c3c18-b38c-a5ac-bc88-01bda1ff7806.png)

こうすることで一時停止した段階でプログラム走っていた場所とその呼び出し元を順に辿ることができます。

コールスタックの上から順に見ていくと、`PCB_EDIT_FRAME::ToPlotter(int)`が怪しく見えます。

ここをクリックしてみると、プログラムの実行位置が次の場所にあることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/9dde0a4e-3623-c1a4-889f-10f60258f7b4.png)

プログラムは現在`DIALOG_PLOT`を表示していそうですね

DIALOG_PLOTに定義ジャンプしてみると......

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/2330904d-d74b-f913-b4f3-8ffaef416a6f.png)

無事出力画面の実装ファイルを見つけることができました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/41ca9d18-66f5-d084-034f-aa4413e223d5.png)

描画部分にブレークポイントを置いて再度実行すると、出力用画面を開いたときにブレークポイントで停止することも確認できたのでこのファイルで間違いなさそうです。

# ボタンの実装
同じファイルにあったボタンや出力先ファイルパスの取得の実装を参考に、issueで提案されていたようなボタンを実装しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/74611a7f-09fc-491e-d8d1-30d690cdff0f.png)

実装したものはウィンドウ下部にある"Open Output Directory"という名前のボタンです。

実装した際のdiffです↓

https://gitlab.com/kicad/code/kicad/-/merge_requests/2042/diffs?commit_id=c581ecdc1b94e537f68f0f0a564a7eea52b107f8

# MRの作成
機能の実装が完了したので、本家KiCADにマージリクエストを作成しました。

https://gitlab.com/kicad/code/kicad/-/merge_requests/2042?commit_id=c581ecdc1b94e537f68f0f0a564a7eea52b107f8

すると、このMRに対して次のようなコメントがつきました
> I'd prefer that this button be next to the directory name, between that and the open folder button.  This can be an icon with help text saying "Open output directory"

確かに今回実装したボタンは横に長く、出力用画面の下部のボタンも多すぎてあまりスマートでないように思えます。

そこでコメントで指摘されたとおり、ボタンをアイコンにして簡潔に表示できるように実装を変更しました。

# アイコンボタンを実装する
KiCADにすでに含まれているアイコンには、今回のボタンに適切なものがなかったため、[KiCADのアイコンのデザイン規約](https://dev-docs.kicad.org/en/rules-guidelines/icon-design/index.html)を参照しながら新たに次のようなアイコンを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/7e216cb4-475f-b1a6-66c5-b2a1c96961f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/32e84ff9-9677-ba3e-1c42-d5868782e0f1.png)

（KiCADのアイコンは  SVGで作成　→　CMake時にSVGからビットマップへ自動で変換　→　プログラムでビットマップの読み込み  という仕組みになっていて、このCMake時にオプションを変更しなければならないことに気づけず時間を溶かしてしまいました）

ボタンの位置の修正や、アイコンボタンへの変更、ボタンの説明の追加なども行い、全体的なdiffは次のようになりました。

https://gitlab.com/kicad/code/kicad/-/merge_requests/2042/diffs?commit_id=94f262a83377fcdceceaa385ee9dc3de49791c60#diff-content-af2adbd8c8cb7a13001d3a8f20e8574a1bfa5dd9

# そしてマージ
アイコンを使ったボタンに変更した後、MRは無事マージされました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/7e20d4d0-4ec9-508e-86f0-7a875d4c886b.png)

普段使ってるソフトウェアに自分の実装が反映されるのは感慨深いものがありますね

↓実装したボタン

![Peek 2024-11-21 15-24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940981/d09b2319-cf80-ef25-7e94-288317e5d52f.gif)

# 追加のMR
ボタンの実装で、一部UI作成用の外部ツールで自動生成しなければならないコードを直接編集してしまっていることに気がついたので、自動生成したコードに修正して追加でMRを作成しました。

https://gitlab.com/kicad/code/kicad/-/merge_requests/2053

これも無事マージされました。

# さいごに
もう一つのissueへの取り組みと感想は↓の記事にあります

https://qiita.com/ogirin/private/38afdb348fe4acad56a9