Inkscapeのdxf_outlines.pyでDXF変換するときのスケールのバグ

 社内向けにブラウザ上でSVGデータを作りDXFファイルに変換して、最終的にCADへ読み込むようにする仕組みを作りました。ブラウザでのSVGの作成はSnap.svgで。SVGからDXF変換はInkscapeコマンドラインを採用です。
 SVGの作成といっても、簡単な円と直線。そしてすでにあるSVGデータの配置をするだけのものなので、7年前のSnap.svg v0.5.1で十分対応できました。
 SVGからDXFへの変換はUbuntu 22.04の標準パッケージでInkscape 1.1.2となります。InkscapeのDXF変換はR12とR14向けがあって、デフォルトのR12では円弧が分割された直線で表現されます。これはちょっとCADデータとしてよくないです。R14ではポリラインで出力可能。ということで、こちらの投稿を参考に、以下のようにしてR14形式でSVGからDXFに変換可能となりました。

$ /usr/bin/inkscape --actions="select-all:all;object-to-path" --export-type=dxf --export-extension=org.ekips.output.dxf_outlines --export-filename=out.dxf in.svg

 試行錯誤したのがSVG、DXFの単位系の処理でした。配置するSVGのPATHはmm単位で作ったCADのDXFファイルをIllustratorで読み込んでSVGに出力したもの。ブラウザ上のSVG作成と配置は基本px。最終的なDXFファイルはmmと、96dpiと72dpi、そして1inch=25.4mmの数値をなんとか逆算のやりくりで最終的なmm単位でのDXFファイル出力にたどり着けた感じです。
 InkscapeでのDXF出力でバグっぽい挙動がありました。図形の大きさによって、DXFファイルのデータが1.33倍になります。通常は思い通りの寸法なのに、円の半径を少し変えるだけでそうなってしまいます。テストしたほとんどの例では問題はなく、出力されたSVGファイルもpxからmmに変換すると正しく、数値以外に違いはないのでSnap.svgが原因ではなさそう。1.33倍は96/72なので、Inkscapeでの単位系の変換処理が関係してそうです。UbuntuのPPAを使ってのInkscape 1.2.2を導入しても改善しませんでした。
 InkscapeのR14形式でのDXF変換を実施しているpythonスクリプトは、

$ python3 /usr/share/inkscape/extensions/dxf_outlines.py --help
usage: dxf_outlines.py [-h] [--output OUTPUT] [--tab TAB] [-R ROBO] [-P POLY] [--units UNITS]
                       [--encoding CHAR_ENCODE] [--layer_option LAYER_OPTION]
                       [--layer_name LAYER_NAME] [--id IDS] [--selected-nodes SELECTED_NODES]
                       [INPUT_FILE]

positional arguments:
  INPUT_FILE            Filename of the input file (default is stdin)

options:
  -h, --help            show this help message and exit
  --output OUTPUT       Optional output filename for saving the result (default is stdout).
  --tab TAB
  -R ROBO, --ROBO ROBO
  -P POLY, --POLY POLY
  --units UNITS
  --encoding CHAR_ENCODE
  --layer_option LAYER_OPTION
  --layer_name LAYER_NAME
  --id IDS              id attribute of object to manipulate
  --selected-nodes SELECTED_NODES
                        id:subpath:position of selected nodes, if any

のようにunitsオプションがあって、これを指定すればいいようですが、コマンドラインにてInkscapeからエクステンションへオプションを渡す方法はないようです。
 このシステムにインストールしたInkscapeは、このコマンドラインでのDXF変換しか使わないので、最終的にdxf_outlines.pyを直接編集してunitsを固定する強引な解決方法としました。終わりの方にあるunitsからスケールを実行する

        self.groupmat = [[[scale, 0.0, 0.0], [0.0, -scale, h * scale]]]

の直前に

        scale = 72./ 96
        self.groupmat = [[[scale, 0.0, 0.0], [0.0, -scale, h * scale]]]

とscaleの値を強制的に0.75としていちおう解決です。
 dxf_outlines.pyのscaleを決定するのは、上記のちょっと上らへんを見るとviewBoxの数値から決定されているようです。
 問題のないSVG

viewBox="-39.08061599731445 -40.8072395324707 78.16123962402344 81.25476837158203"

問題のSVG

viewBox="-37.1966667175293 -38.83620071411133 74.3933334350586 77.33402252197266"

なんで、小数点以下の桁数がバグに関係してそうなんですが、実際のところどうなんでしょうね。Inkscapeのソースはちらっと見て追いかけるのはあきらめました。

追記

 PPAでInkscapeの現在の最新版1.3.2をインストールして試してみました。
 どうやら一律、1.33倍で出力されているように思います。ソースを見るとバージョン1.3からこの辺のDXF出力まわりのpyファイルが大幅に書き換えられているようで、まあ全件で1.33倍となるならまだ対応できそうです。

VMware Fusionの13.5.1が公開されていた

 先月の27日付でVMware Fusionが13.5.1になっていました。リリースノートはこちらから。MacOSの14.4が先日公開されまして適用しての再起動でFusionのバージョンアップを知った次第です。
 BroadcomVMware買収で真っ先にFusionなんか切り捨てられそうと思っていたので、パッチが出てくれるだけでもありがたいです。まあ今後バージョンアップされて14とか出るかは不明ですが。
 Mac用のx86仮想化環境ではParallelsがあるんですが、年間11500円と安くはないです。そうなると他にOracle VirtualBoxが候補となりますか。4年ほど前までは使っていたので勝手知っているのですが、安定性はFusionのほうが上でした。無料で使えるアプリを提供してもらっているだけでもありがたいのですけど。

テレビで知ったけどどこのなにかは忘れた

 ちょっと厚めの強いテープが必要で、そういう用途はダクトテープでしょ。なんかゴリラテープって聞いたことがあるってことでアマゾンで購入です。

  • KURE ゴリラテープ ブラック

 ゴリラテープはアメリカ企業の製品ですが、日本の呉工業が代理店となっているようです。1100円弱と結構しますね。
 思っていた通りの厚めの強いテープでした。少々、強すぎて使うためにリールからはがすのに力がいるぐらいです。あと匂いがありますので、未使用のまま裸で長期保管してると他のものへの移りとか、揮発して成分変わりそうっていう心配はあります。

終わってしまった映画

 アマゾンのprime videoで見ました。

 そういえばラスト・デイ見てなかったな、と初代、2、3とこれは何度か見た記憶があって、4.0ってどういう話だったっけ、と復習のため4.0から鑑賞です。
 ああ、これ昔テレビでみたわ、とすぐに気づきますが、アクションに次ぐアクションでぐいぐい引っ張られて見てしまいます。さすが一流のアクション映画でした。
 それに対してラスト・デイは初見でしたが、このクオリティの低さよ。息子が実はっていうのはいい引きですし、実際の黒幕の正体も驚かされました。でも筋書きからアクション、カメラワークまでぱっと見てわかるレベルの違い。4.0との格差がひどい。ムダなカットも多くて、予算足りなかったんじゃねと思われる内容でした。

サイズアップ

 アマゾンから届きました。

 モノタロウで買ったツールボックスの容量が足りなくなってきたので買い替えです。1700円弱でした。
 ふたにある収納と、中のトレーは位置を変えられる仕切り板があるのですが、案外ぴったりおさまらないものです。まあこれは使っていくうちにしっくりくるようになるのでしょう。前面に大きく360とかの装飾文字があっておもちゃっぽく、自分の好みじゃなかったのですが、ステッカーですので簡単にはがすことができました。