全年全月8日の投稿[27件](2ページ目)
2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する
共有メモリの衝突回避ですが、共有メモリの中にハンドシェイク表すフラグを入れたらそれでいいんじゃないかと。
そのフラグが立っていれば極々わずかな時間sleepを繰り返す処理です。
while(flag1 == 1)
{
sleep(0.001);
}
flag2 = 1;
/* 共有メモリ処理 */
flag2 = 0;
みたいなものです。
別プロセスがフラグを0にすればwhileを抜けます。
簡易的なモノですが、フラグを書き換えられるプロセスを一つにしておけばイイんじゃないかと。最も簡単なセマフォはこういうことですし。
子プロセスの停止制御も同様の考え方が使えます。
動作し続けるってことは繰り返し処理です。単なる繰り返しはwhile(1)とかで無限ループすることが多いので、while(flag==1)とかにすればいい。共有メモリ上のフラグが1ならwhileでループし0になったら抜ければいいのです。抜けたら終了処理をしてプロセスを落とすと。子プロセスが完全に終わったことはスタックしておいたプロセスIDを見ればわかります。
この辺りまで決まれば次はランチャーです。
#C言語
そのフラグが立っていれば極々わずかな時間sleepを繰り返す処理です。
while(flag1 == 1)
{
sleep(0.001);
}
flag2 = 1;
/* 共有メモリ処理 */
flag2 = 0;
みたいなものです。
別プロセスがフラグを0にすればwhileを抜けます。
簡易的なモノですが、フラグを書き換えられるプロセスを一つにしておけばイイんじゃないかと。最も簡単なセマフォはこういうことですし。
子プロセスの停止制御も同様の考え方が使えます。
動作し続けるってことは繰り返し処理です。単なる繰り返しはwhile(1)とかで無限ループすることが多いので、while(flag==1)とかにすればいい。共有メモリ上のフラグが1ならwhileでループし0になったら抜ければいいのです。抜けたら終了処理をしてプロセスを落とすと。子プロセスが完全に終わったことはスタックしておいたプロセスIDを見ればわかります。
この辺りまで決まれば次はランチャーです。
#C言語
共有メモリに構造体を配置してみましたが、割と簡単でした。
構造体のタグ(ひな形)をヘッダーファイルに作り、親プロセスと子プロセスにinclude。共有メモリのサイズは構造体のタグから得て設定。共有メモリ上に置く変数を独立したポインタにするとオフセットをそれぞれ計算して与えないといけませんが、構造体なら一括設定出来て便利です。
構造体をポインタにすると表記が独特になりますが、意味合いが明示的となって読みやすいかもしれません。
この辺りには、本文中に出来るだけ定数を直書きしないという方針にも繋がってきます。
次は共有メモリの衝突回避を調べないといけません。
#C言語
構造体のタグ(ひな形)をヘッダーファイルに作り、親プロセスと子プロセスにinclude。共有メモリのサイズは構造体のタグから得て設定。共有メモリ上に置く変数を独立したポインタにするとオフセットをそれぞれ計算して与えないといけませんが、構造体なら一括設定出来て便利です。
構造体をポインタにすると表記が独特になりますが、意味合いが明示的となって読みやすいかもしれません。
この辺りには、本文中に出来るだけ定数を直書きしないという方針にも繋がってきます。
次は共有メモリの衝突回避を調べないといけません。
#C言語
屋外で開催される成人式関連のイベントで電源出しです。
起動してしまえばやることはありません。
本日の課題は共有メモリのテストです。
次のページにあるソースをそのまま使って挙動を確認です。
プロセス間でのメモリ共有
親プロセス「ShareMemTest1」を起動した後、待機時間(20秒)のうちにコンソールで「ShareMemTest2」に共有メモリのIDを与えて起動するというもの。一貫したプログラムではありませんが、やりたいことはプロセス間でのメモリ共有ですからむしろわかりやすい。
ちなみに、コンソールでプログラムを起動する際、末尾に「&」を付けると新規プロセスで実行します。
ここサンプルを使うなら、
<親プロセスを起動>
$ ./ShareMemTest1 &
<起動後表示>
nShareMemID = 23 /* IDは都度変わります */
process1 : nVar1 = 1, nVar2 = 2
・・・ここで20秒Sleepしてます・・・
<子プロセスを起動>
$ ./ShareMemTest2 23 &
<起動後表示>
nShareMemID = 23
process2 : nVar1 = 1, nVar2 = 2
process2 : nVar1 = 2, nVar2 = 2
・・・子プロセスはここで終了・・・
・・・20秒後、親プロセスが再開・・・
process2 : nVar1 = 2, nVar2 = 2
・・・親プロセスも終了・・・
となります。
正に記述にある通り。
$ ipcs -m
や
$ free
を用いるとSharedメモリの状況がわかります。
実際のテストではgetpid()を用いてプロセスIDも表示しながら確認しましたが、確かに別プロセスでした。
共有メモリの容量は、無意味に8MBくらい設定してみましたが何の問題も無し。
親側の設定は、typedefで構造体を定義し、構造体のポインタ変数を作り、構造体のメモリサイズ(sizeof()で取得)をもとに共有メモリを作り、構造体のポインタ変数に共有メモリを割り当てる、といった流れでしょうか。
子側は、typedefで構造体を定義し、構造体のポインタ変数を作り、親から取得したIDから構造体のポインタ変数に共有メモリを割り当てる、といった流れ?
共有メモリ上に変数(構造体)を構築した後は共有メモリを意識する必要は無いと思います。もちろん、衝突回避は常に考えないといけませんけど。
勘違いしていた点ですが、共有メモリのIDは管理用の通し番号であってポインタに設定するアドレスではないことです。C言語では何かにつけてポインタ渡しなのでこれもそうかと思ってしまいました。
共有メモリに構造体を配置することが次の課題ですが、構造体についてもう少し勉強してからです。
#C言語
起動してしまえばやることはありません。
本日の課題は共有メモリのテストです。
次のページにあるソースをそのまま使って挙動を確認です。
プロセス間でのメモリ共有
親プロセス「ShareMemTest1」を起動した後、待機時間(20秒)のうちにコンソールで「ShareMemTest2」に共有メモリのIDを与えて起動するというもの。一貫したプログラムではありませんが、やりたいことはプロセス間でのメモリ共有ですからむしろわかりやすい。
ちなみに、コンソールでプログラムを起動する際、末尾に「&」を付けると新規プロセスで実行します。
ここサンプルを使うなら、
<親プロセスを起動>
$ ./ShareMemTest1 &
<起動後表示>
nShareMemID = 23 /* IDは都度変わります */
process1 : nVar1 = 1, nVar2 = 2
・・・ここで20秒Sleepしてます・・・
<子プロセスを起動>
$ ./ShareMemTest2 23 &
<起動後表示>
nShareMemID = 23
process2 : nVar1 = 1, nVar2 = 2
process2 : nVar1 = 2, nVar2 = 2
・・・子プロセスはここで終了・・・
・・・20秒後、親プロセスが再開・・・
process2 : nVar1 = 2, nVar2 = 2
・・・親プロセスも終了・・・
となります。
正に記述にある通り。
$ ipcs -m
や
$ free
を用いるとSharedメモリの状況がわかります。
実際のテストではgetpid()を用いてプロセスIDも表示しながら確認しましたが、確かに別プロセスでした。
共有メモリの容量は、無意味に8MBくらい設定してみましたが何の問題も無し。
親側の設定は、typedefで構造体を定義し、構造体のポインタ変数を作り、構造体のメモリサイズ(sizeof()で取得)をもとに共有メモリを作り、構造体のポインタ変数に共有メモリを割り当てる、といった流れでしょうか。
子側は、typedefで構造体を定義し、構造体のポインタ変数を作り、親から取得したIDから構造体のポインタ変数に共有メモリを割り当てる、といった流れ?
共有メモリ上に変数(構造体)を構築した後は共有メモリを意識する必要は無いと思います。もちろん、衝突回避は常に考えないといけませんけど。
勘違いしていた点ですが、共有メモリのIDは管理用の通し番号であってポインタに設定するアドレスではないことです。C言語では何かにつけてポインタ渡しなのでこれもそうかと思ってしまいました。
共有メモリに構造体を配置することが次の課題ですが、構造体についてもう少し勉強してからです。
#C言語
2022年9月 この範囲を時系列順で読む この範囲をファイルに出力する
舞台仕事の先輩から譲ってもらったLED星球が不調です。
どうも電源モジュールがおかしい。DC12vのモノですが電圧が出ていません。スイッチング素子の前の平滑コンデンサには電圧が出ているので、スイッチング素子が飛んだか、センシング回路が誤作動している感じです。
そもそもの原因が電源モジュール単体の故障なのか、他の部位の不調によって電源モジュールが故障したのかは不明ですが、正常な別電源に繋いでみないとわかりません。
幸い主回路の基板には破損や焼損は見受けられませんので電源モジュール単体の不調だと思います。
帰宅してチェックです。
こういう故障は原因の特定が難しいことがあります。
部品を交換して動いても現場で使ったらやっぱりダメってことが少なくありません。本丸が別なところにあって微妙な関係性で故障に至っている場合です。
精神的にも辛い修理のパターンですが、こういった事例から学ぶことは多いので、まぁいいかなと。
追記
電源モジュールを交換して治りました。
中華電器から電源モジュールをまとめ買いしておいたのが役に立ったようです。
#照明器具
どうも電源モジュールがおかしい。DC12vのモノですが電圧が出ていません。スイッチング素子の前の平滑コンデンサには電圧が出ているので、スイッチング素子が飛んだか、センシング回路が誤作動している感じです。
そもそもの原因が電源モジュール単体の故障なのか、他の部位の不調によって電源モジュールが故障したのかは不明ですが、正常な別電源に繋いでみないとわかりません。
幸い主回路の基板には破損や焼損は見受けられませんので電源モジュール単体の不調だと思います。
帰宅してチェックです。
こういう故障は原因の特定が難しいことがあります。
部品を交換して動いても現場で使ったらやっぱりダメってことが少なくありません。本丸が別なところにあって微妙な関係性で故障に至っている場合です。
精神的にも辛い修理のパターンですが、こういった事例から学ぶことは多いので、まぁいいかなと。
追記
電源モジュールを交換して治りました。
中華電器から電源モジュールをまとめ買いしておいたのが役に立ったようです。
#照明器具
2022年8月 この範囲を時系列順で読む この範囲をファイルに出力する
LCD Monitor Controller の基板を中国に発注しました。
試してもいない回路を発注するのはどうかって話もありますが、感光基板で自作するには密度があり過ぎますし、間違いがあっても許せる金額だからいいかなと。
そんな品物、PICに与えるクロックを内蔵のRC発振子か外付け発振子で8MHzにしようかと思っていたのですが7.3728MHzにしようかと。
一見半端な数値ですが、PICでRS232系のシリアル通信でありがちなボーレート(例えば9600bps)などを扱うならキリがいいのです。計算上ですがエラー率が0%になります。
目的のLCDモニタは単純なパラレルなので厳密な時間管理は不要だし、I2Cはクロック同期式のスレーブなのでタイミングはマスター任せです。しかし、シリアル通信は非同期なので受信側もボーレートを合わせなければなりません。PICはシステムクロックでボーレートを起こしますので、他に支障を来さない範囲でシリアル通信に都合の良いシステムクロックを使った方がいいのです。
これまでは国内の販売店で7.3728MHzの水晶発振子を見つけられなかったので使っていませんでしたが、試しに中国で探したら普通にあります。1個59円と安いので買っておきました。例によって送料の方が高い。。。
シリアル通信に都合が良いクロックは他にもありますが、この値を使うのはPICの都合です。16系PICのクロックは32MHzが上限で、そのままのクロックを与えてもいいのですが、内蔵の4倍PLLを使えば8MHzを与えることで32MHzで動作します。PLLを使った方が外部ノイズに強いのもありますから、8MHz以下でシリアル通信に都合が良い最大値である7.3728MHzはよろしいのです。
同じ理由で、PICでDMXを扱うなら250kHzの二乗数倍がよろしいのです。
#電子工作
試してもいない回路を発注するのはどうかって話もありますが、感光基板で自作するには密度があり過ぎますし、間違いがあっても許せる金額だからいいかなと。
そんな品物、PICに与えるクロックを内蔵のRC発振子か外付け発振子で8MHzにしようかと思っていたのですが7.3728MHzにしようかと。
一見半端な数値ですが、PICでRS232系のシリアル通信でありがちなボーレート(例えば9600bps)などを扱うならキリがいいのです。計算上ですがエラー率が0%になります。
目的のLCDモニタは単純なパラレルなので厳密な時間管理は不要だし、I2Cはクロック同期式のスレーブなのでタイミングはマスター任せです。しかし、シリアル通信は非同期なので受信側もボーレートを合わせなければなりません。PICはシステムクロックでボーレートを起こしますので、他に支障を来さない範囲でシリアル通信に都合の良いシステムクロックを使った方がいいのです。
これまでは国内の販売店で7.3728MHzの水晶発振子を見つけられなかったので使っていませんでしたが、試しに中国で探したら普通にあります。1個59円と安いので買っておきました。例によって送料の方が高い。。。
シリアル通信に都合が良いクロックは他にもありますが、この値を使うのはPICの都合です。16系PICのクロックは32MHzが上限で、そのままのクロックを与えてもいいのですが、内蔵の4倍PLLを使えば8MHzを与えることで32MHzで動作します。PLLを使った方が外部ノイズに強いのもありますから、8MHz以下でシリアル通信に都合が良い最大値である7.3728MHzはよろしいのです。
同じ理由で、PICでDMXを扱うなら250kHzの二乗数倍がよろしいのです。
#電子工作
コロナの反動で5月から7月の中旬まで忙しくさせて頂きましたが、例年なら夏祭りが続く8月上旬が中止の多発で少し空きました。
このところ基板を書きまくっているのは時間が取れたのと秋の現場に向けて作っておかねばならない案件だからです。
それにしてもKiCADは慣れると素晴らしく使いやすいです。基板CAD全般が持つ独特の風味に違和感を感じるところはありますが、CADLUS-Xは覚えるのに数か月かかったのに対して数時間です。CADLUS-Xで基板CADの流儀を覚えたからかもしれませんけどね。
KiCADの良い所は、回路図と基板がリンクしていることです。自動ではありませんが回路図の修正がワンクリックで基板に反映されます。やったことはありませんが、基板を修正して回路図に反映することも出来るようです。CADLUS-Xではこれが出来なかったので大きな変更が出ると大変でした。
また、3Dビューもいいですね。単にそれを見て楽しむのもいいですが、シルクの仕上がり具合いと部品の干渉を確認出来るのがいい。ガーバーデータのビュワーもシームレスに使えますので、入稿データを2つの手段で確認出来るのは校正手段としてとてもありがたい。
ver6になって「シュミレーター」というメニュー項目を見つけました。以前からあったのかもしれませんし、まだ試していませんが、回路シュミレーターのSpiceなどを当てられるとしたらこれは凄いです。Spiceは少し扱いが面倒ですが、条件を整えてあげるとどの端子にどういう波形が出るかを確認出来るので、特にアナログ回路を作る際には初期確認として便利です。もっとも、私が組むアナログ回路ならSpiceをセッティングするよりブレッドボードで仮組みしてオシロを眺めた方が短時間で済むのですけどね。
漠然とした気持ちを汲んで作ってくれるほど優しくありませんが、回路図からガーバーデータまで一貫した作業環境を提供してくれるKiCADは素晴らしいの一言です。
ちなみに基板とは層を成した板切れです。ガーバーデータはどの層にどんな形を描くかを指示するデータですので、基板の層の構成とそれに対応したレイヤーの名前の関係性を理解すればイラストレーターに馴染んだ人なら描くことは難しくないと思います。実際の層とデータレイヤーの関係には暗黙の縛りがあり、作者が勝手に決めることはまず無いってだけです。この辺りを丁寧に説明してくれている情報が皆無なので取っ付き難いのはあります。
工程としては、回路図作成、基板デザイン、ガーバーデータ作成、入稿となりますが、基板製作を学ぶには逆順で理解していくといいのかもしれません。
#CAD #電子工作
このところ基板を書きまくっているのは時間が取れたのと秋の現場に向けて作っておかねばならない案件だからです。
それにしてもKiCADは慣れると素晴らしく使いやすいです。基板CAD全般が持つ独特の風味に違和感を感じるところはありますが、CADLUS-Xは覚えるのに数か月かかったのに対して数時間です。CADLUS-Xで基板CADの流儀を覚えたからかもしれませんけどね。
KiCADの良い所は、回路図と基板がリンクしていることです。自動ではありませんが回路図の修正がワンクリックで基板に反映されます。やったことはありませんが、基板を修正して回路図に反映することも出来るようです。CADLUS-Xではこれが出来なかったので大きな変更が出ると大変でした。
また、3Dビューもいいですね。単にそれを見て楽しむのもいいですが、シルクの仕上がり具合いと部品の干渉を確認出来るのがいい。ガーバーデータのビュワーもシームレスに使えますので、入稿データを2つの手段で確認出来るのは校正手段としてとてもありがたい。
ver6になって「シュミレーター」というメニュー項目を見つけました。以前からあったのかもしれませんし、まだ試していませんが、回路シュミレーターのSpiceなどを当てられるとしたらこれは凄いです。Spiceは少し扱いが面倒ですが、条件を整えてあげるとどの端子にどういう波形が出るかを確認出来るので、特にアナログ回路を作る際には初期確認として便利です。もっとも、私が組むアナログ回路ならSpiceをセッティングするよりブレッドボードで仮組みしてオシロを眺めた方が短時間で済むのですけどね。
漠然とした気持ちを汲んで作ってくれるほど優しくありませんが、回路図からガーバーデータまで一貫した作業環境を提供してくれるKiCADは素晴らしいの一言です。
ちなみに基板とは層を成した板切れです。ガーバーデータはどの層にどんな形を描くかを指示するデータですので、基板の層の構成とそれに対応したレイヤーの名前の関係性を理解すればイラストレーターに馴染んだ人なら描くことは難しくないと思います。実際の層とデータレイヤーの関係には暗黙の縛りがあり、作者が勝手に決めることはまず無いってだけです。この辺りを丁寧に説明してくれている情報が皆無なので取っ付き難いのはあります。
工程としては、回路図作成、基板デザイン、ガーバーデータ作成、入稿となりますが、基板製作を学ぶには逆順で理解していくといいのかもしれません。
#CAD #電子工作
LCDモニタモジュールをI2CやSerialで制御する補助基板を書いてみました。
制御チップがSC2004の「LCDキャラクタディスプレイモジュール 20×4行」用です。
LCDの裏側から挿して使います。
ちょっと面倒なパラレル制御なのをI2CやSerialでANSIエスケープシーケンスっぽい制御が出来る様にします。
補助的な品物ですが、これがあると製作が楽になります。
ちなみに、信号の電圧変換とバッファを兼ねてPCA9306Dを入れています。LCDは5v制御ですがRaspberryPiなどは3.3vだからです。
そういや手首は痛くありません。アームレストのおかげ?
作業姿勢は大事ですね。
#電子工作
制御チップがSC2004の「LCDキャラクタディスプレイモジュール 20×4行」用です。
LCDの裏側から挿して使います。
ちょっと面倒なパラレル制御なのをI2CやSerialでANSIエスケープシーケンスっぽい制御が出来る様にします。
補助的な品物ですが、これがあると製作が楽になります。
ちなみに、信号の電圧変換とバッファを兼ねてPCA9306Dを入れています。LCDは5v制御ですがRaspberryPiなどは3.3vだからです。
そういや手首は痛くありません。アームレストのおかげ?
作業姿勢は大事ですね。
#電子工作
2022年7月 この範囲を時系列順で読む この範囲をファイルに出力する
シリアル化の手順は次の通りです。
オレメモです。
1) ライブラリをインポートします。
>>> import numpy as np
>>> import pickle
2) テスト用のnumpy.arrayを作ります。とりあえずはすべてゼロのuint8です。
>>> z = np.zeros(( 192, 8, 512 ), dtype=np.uint8 )
※ dtypeで変数の型を指定します。指定しないとOSのbit長のintになります。
※ 値の計算をするならuint16以上の型にしなければなりませんが、今のところArt-Netエンジン内では置き換えと比較しかしませんのでuint8で運用できそうです。
3) テスト用のtupleを作ります。
>>> y = ( 'tests', z )
※ 'tests'という文字列と(2)で作ったnumpy.arrayのtupleです。
4) シリアル化します。
>>> x = pickle.dumps( y )
これでtuple:yが一列のバイナリとなり、scoketで通信できる状態になります。
5) 復号します。
>>> w = pickle.loads( x )
※ wはyと同じtupleです。正しく復号されました。
numpy自体にもシリアル化/復号の方法があるようですが、型の違うデータを一括でやり取りしたいのでtupleをpickleで扱います。
この処理の速度が十分かどうかはこれからの確認です。
#Python
オレメモです。
1) ライブラリをインポートします。
>>> import numpy as np
>>> import pickle
2) テスト用のnumpy.arrayを作ります。とりあえずはすべてゼロのuint8です。
>>> z = np.zeros(( 192, 8, 512 ), dtype=np.uint8 )
※ dtypeで変数の型を指定します。指定しないとOSのbit長のintになります。
※ 値の計算をするならuint16以上の型にしなければなりませんが、今のところArt-Netエンジン内では置き換えと比較しかしませんのでuint8で運用できそうです。
3) テスト用のtupleを作ります。
>>> y = ( 'tests', z )
※ 'tests'という文字列と(2)で作ったnumpy.arrayのtupleです。
4) シリアル化します。
>>> x = pickle.dumps( y )
これでtuple:yが一列のバイナリとなり、scoketで通信できる状態になります。
5) 復号します。
>>> w = pickle.loads( x )
※ wはyと同じtupleです。正しく復号されました。
numpy自体にもシリアル化/復号の方法があるようですが、型の違うデータを一括でやり取りしたいのでtupleをpickleで扱います。
この処理の速度が十分かどうかはこれからの確認です。
#Python
2022年6月 この範囲を時系列順で読む この範囲をファイルに出力する
近所に新しい劇場が出来ます。
ホール管理の業務が取れたので舞台資料を作ることになりました。
まだ建築中なので舞台の細かい仕様はわかりませんが、基本図面がCADデータとして手に入ったので、各種資料に使える施設全図をまとめています。
これがまた手ごわい。
まずデータのフォーマットで躓く。
最新のAutoCADのデータの様ですが、VectorWorks2016でも開けず、ネットやフリーウェアでもデータが大きすぎて変換できず。
困り果てていたのですが、ふと思い出してAutoCAD互換のDraftsightを使ったところすんなり変換完了。最強のフリーCADだったので便利に使っていましたが、最近サブスク化(ようは有料化)してしまいました。されど、30日間は無料で全機能のお試しが出来るので取り急ぎはこれで対応。後日もっと細かいデータが入荷すると思いますが、お試し期間が切れたらサブスク登録するしかありません。一番低いグレードで変換出来るかわかりませんが、AutoCADとの互換性が極めて高いCADが年間1万円(一番安いグレード)ですから文句を言ったらいけません。
本製作は骨董品のVectorWorks9.5を使います。2016は便利ですが、データが大きすぎるのと、3Dデータのカスで右往左往して反応が遅い。線を描くだけなら9.5が反応が軽くていい。
そんでも、オブジェクトがグループ化されたりパーツ化されているので丁寧に処理(分解)しなければなりません。最終的にイラストレーターでも読めるDXFで書き出すことも重要です。
#本業
ホール管理の業務が取れたので舞台資料を作ることになりました。
まだ建築中なので舞台の細かい仕様はわかりませんが、基本図面がCADデータとして手に入ったので、各種資料に使える施設全図をまとめています。
これがまた手ごわい。
まずデータのフォーマットで躓く。
最新のAutoCADのデータの様ですが、VectorWorks2016でも開けず、ネットやフリーウェアでもデータが大きすぎて変換できず。
困り果てていたのですが、ふと思い出してAutoCAD互換のDraftsightを使ったところすんなり変換完了。最強のフリーCADだったので便利に使っていましたが、最近サブスク化(ようは有料化)してしまいました。されど、30日間は無料で全機能のお試しが出来るので取り急ぎはこれで対応。後日もっと細かいデータが入荷すると思いますが、お試し期間が切れたらサブスク登録するしかありません。一番低いグレードで変換出来るかわかりませんが、AutoCADとの互換性が極めて高いCADが年間1万円(一番安いグレード)ですから文句を言ったらいけません。
本製作は骨董品のVectorWorks9.5を使います。2016は便利ですが、データが大きすぎるのと、3Dデータのカスで右往左往して反応が遅い。線を描くだけなら9.5が反応が軽くていい。
そんでも、オブジェクトがグループ化されたりパーツ化されているので丁寧に処理(分解)しなければなりません。最終的にイラストレーターでも読めるDXFで書き出すことも重要です。
#本業