CadQueryでSTEP形式のファイルの差分を表示する
書いた人: inajob.icon
とはいえ、他の記事同様誰でも好き内容を加筆・修正してもらって大丈夫です!
イントロ
CADで作成したデータをを変更した際に、前回からの差分を見たくなることはよくあります。
具体的にはGitで管理している3Dファイルを参照して、以前のCommitのファイルと、現在編集中のファイルを比較し、その差分を3Dモデルとして確認する方法を紹介します。 前提
3DデータがSTEP形式のファイルで存在し、これがGitで管理されている
gitがインストールされている
実行例
https://scrapbox.io/files/656df6db73a34400249de79e.png
以前のCommitから消えた部分が赤色、増えた部分を緑色、現在の形状が薄いグレーで表示されます
これを実現するために以下2つのスクリプトを用意しました
step形式のファイルをgitで管理して差分を表示するスクリプト
与えられた2つのstep形式のファイルの差分をCadQueryで計算しOCP CAD Viewerに表示します
追加・削除が無いときにエラーになるため、そういう時は表示しないように制御しています
code: stepdiff.sh
cleanup() {
rm -rf "$tmpdir"
}
tmpdir="$(mktemp -d)"
trap cleanup EXIT
set -e
file_a="$1"
file_b="$2"
test -f "$file_a" || {
echo 1>&2 "First file $file_a not found"
exit 1
}
test -f "$file_b" || {
echo 1>&2 "Second file $file_b not found"
exit 1
}
file_a="$(realpath "$file_a")"
file_b="$(realpath "$file_b")"
cd "$tmpdir"
cat <<EOS >diff.py
import cadquery as cq
from ocp_vscode import show
f1 = "a.step"
f2 = "b.step"
addition = cq.importers.importStep(f1).cut(cq.importers.importStep(f2))
deletetion = cq.importers.importStep(f2).cut(cq.importers.importStep(f1))
r1 = cq.importers.importStep(f1)
r2 = cq.importers.importStep(f2)
objs = []
colors = []
alphas = []
if len(deletetion.val().Faces()) > 0:
objs.append(deletetion)
colors.append("red")
alphas.append(1.0)
if len(r1.val().Faces()) > 0:
objs.append(r1)
colors.append("gray")
alphas.append(0.4)
if len(addition.val().Faces()) > 0:
objs.append(addition)
colors.append("green")
alphas.append(1)
show(*objs, colors=colors, alphas=alphas)
EOS
ln -s "$file_a" "a.step"
ln -s "$file_b" "b.step"
python diff.py
Git管理されたstep形式のファイルの差分を取得
Gitを利用し、引数で与えられたファイルの1つ前のCommitを取得し今のファイルとともに上のスクリプトに渡します
code: stepdiffgit.sh
target="$1"
cp $1 current.step
LAST_COMMIT=$(git log --pretty=%H $target |head -1)
git checkout $LAST_COMMIT -- $1
stepdiff.sh current.step $1
mv current.step $1
未解決課題
本当はSTLファイルでやりたいが、CadQueryがSTLのインポートに対応していない
OpenSCADはSTLのインポートが出来るので似たようなことが出来るが、差分表示があまりきれいではない
git difftoolって打った時に出ると嬉しいかも?ikeji.icon
↓こうかな?(未確認)
code:.gitconfig
cmd = stepdiff.sh \"$LOCAL\" \"$REMOTE\"
あーなるほど、difftoolってこういうふうに使うんですねinajob.icon
cadQueryのスクリプトの差分もGUIで見たい?ikeji.icon
自分はそれはそれでgit diffで見ているのでそこまで必要性を感じませんねinajob.icon