この記事はMicro Mouse Advent Calendar 2020の20日目の記事です。
昨日は_BIRDさんのロボトレースのショートカットコースをMATLABのPRMパスプランナーで生成する話でした。
ブログを作ったもののアドベントカレンダーの記事しか書いてません。つまり1年ぶりの更新です。
Autodeskの基板CADのEAGLEにはulp(User Language Programs)というプログラムを実行できる機能があります。ulpを使うと回路図や配線図を編集できたりいろいろテキストデータを吐けたりできます。KiCadだとPythonが使えたりしますけど同じような機能です。
車のワイヤーハーネスの設計をしたんですが、外部のメーカに投げる設計図を書くわけです。配線図(いわゆる回路図)と、各コネクタの何番ピンが他のコネクタのどこに繋がっているかというコネクタ情報の表が必要なんですが、これを別々で書いて合っているかチェックしていたわけです。もちろん変更があったら両方変えなきゃなりません。
そんなことやってらんねーというわけで配線図をEAGLEで書いてulpで表情報をcsvで出力するプログラムを書きました。表を自動生成すればチェックいらないよねということです。
大変でした。
BOMリストを吐くとか、部品名を置換するとかの簡単なものならすごくいいと思います。
ただ、ちょっと複雑なことをやろうとするのには向きません。
基本的にはc言語っぽく書けます。インタプリタなのでjavascriptっぽいなと感じました。(javascriptほとんどさわったことないですが)
細かいことはここに書いてあります。Fusion360のヘルプですがEAGLEのulpと同じだと思われます。
EAGLEに特化しているので、ループの部分が特殊です。(特殊じゃないかもしれないですが私は戸惑いました。)
例えば、回路図から部品名をすべてリストアップするという場合はオブジェクト階層に従って
schematic(SCH) {
SCH.sheets(SH) {
SH.nets(N) {
N.segments(SEG) {
SEG.pinrefs(P) {
printf("%s\n", P.part.name);
}
}
}
}
}
という感じにするとすべての部品名を出力してくれます。
もちろん3次元配列もだめです。1次元配列だけなので項目ごとに配列を作るはめになり、可読性が落ちました。
想定外でした。配列はすべてグローバルになりました。
組み込みのソート関数があるんですが、複数の項目を名前でソートしようとするとこうなります。
numeric string Nets[], Parts[], Instances[], Pins[]; int n = 0; int index[]; schematic(S) { S.nets(N) N.pinrefs(P) { Nets[n] = N.name; Parts[n] = P.part.name; Instances[n] = P.instance.name; Pins[n] = P.pin.name; ++n; } sort(n, index,
Parts,
Nets, Instances, Pins); for (int i = 0; i < n; ++i) printf("%s %s %s %s\n",
Parts
[index[i]],
Nets
[index[i]], Instances[index[i]], Pins[index[i]]); }
添字を格納する配列indexにソート後の添字を入れてくれるのでそれを使ってアクセスします。
また、ソート仕様はJavaScriptと同じです。
危ねぇ、 JavaScript のこのふぁっきん仕様、すっかり忘れてた! pic.twitter.com/lFGlB9pRT7
— 👻 道化師 🃏 (@wraith13) December 19, 2020
という処理を実装しました。
printfデバッグです。
部品情報をすべて出力するとか、部品名をすべて置換するとかの処理だったらulpはおすすめです。なにより簡単なダイアログも使えますし。
ただ例外処理が多かったりすると大変です。Pythonとかで書いたほうが楽だと思いました。
ulpのダメなとこをを紹介してばっかでしたが、便利な機能だと思います。
公開されてるulpから欲しい機能のものをダウンロードして、気に食わないとこだけ変えて使う、という使い方が楽だと思います。
http://eagle.autodesk.com/eagle/ulp
明日のMicro Mouse Advent Calendar 2020 21日目の記事はqtfdl94qさんの「拡大縮小ができるログViewerをelectronで雑に作る」です。
0 件のコメント:
コメントを投稿