Page 672 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼JWWデータフォーマットについて BOB 17/7/17(月) 2:10 ┣Re:JWWデータフォーマットについて kojima 17/7/17(月) 22:30 ┃ ┣Re:JWWデータフォーマットについて BOB 17/8/3(木) 13:27 ┃ ┗Re:JWWデータフォーマットについて BOB 17/8/3(木) 16:01 ┣Rubyでの参考例 kojima 17/7/18(火) 22:50 ┃ ┣Re:Rubyでの参考例 いっち 17/8/2(水) 11:27 ┃ ┗Re:Rubyでの参考例 BOB 17/8/3(木) 13:42 ┃ ┗Re:Rubyでの参考例 kojima 17/8/3(木) 19:17 ┃ ┗Re:Rubyでの参考例 BOB 17/8/10(木) 22:25 ┃ ┗Re:Rubyでの参考例 kojima 17/8/11(金) 14:13 ┗Re:JWWデータフォーマットについて mirror 17/8/3(木) 21:33 ┗Re:JWWデータフォーマットについて BOB 17/8/10(木) 22:07 ┣Re:JWWデータフォーマットについて mirror 17/8/11(金) 8:02 ┗Re:JWWデータフォーマットについて マチャプチャレ 17/8/11(金) 15:56 ─────────────────────────────────────── ■題名 : JWWデータフォーマットについて ■名前 : BOB ■日付 : 17/7/17(月) 2:10 -------------------------------------------------------------------------
画像処理で線分認識し、得た線分情報をCADファイル化したい http://www.jwcad.net/jwdatafmt.txt 縦線1本描いたCADデータを上記と参照するも、雑な説明でとても解りにくい 今までいろんなファイルフォーマットの説明を見て解析してきたが、ここまで解りづらいものに巡り合ったのは初めて ◆がデータ項目で●がそのValue Meaningであるかのように書き始めているが 途中で●がデータ項目に変更されたりと混乱している。 日本語のローマ字化した変数名だったり英単語だったりと統一もされていないBit meaningにおいては千位,億位とか桁をそんな風に数える!?という記載 Offset,Sizeも記載されておらず、ソースの説明になっている 他人のソースをデバッグするほどしたくないことはない BMP,JPEG,WAV,MPEGなどでもこんな書き方したものにお目に掛かったことがない 普通にデータフォーマットが書かれた使えるものはないのでしょうか? |
▼BOBさん: >画像処理で線分認識し、得た線分情報をCADファイル化したい >http://www.jwcad.net/jwdatafmt.txt >縦線1本描いたCADデータを上記と参照するも、雑な説明でとても解りにくい >今までいろんなファイルフォーマットの説明を見て解析してきたが、ここまで解りづらいものに巡り合ったのは初めて > >◆がデータ項目で●がそのValue Meaningであるかのように書き始めているが >途中で●がデータ項目に変更されたりと混乱している。 >日本語のローマ字化した変数名だったり英単語だったりと統一もされていないBit meaningにおいては千位,億位とか桁をそんな風に数える!?という記載 >Offset,Sizeも記載されておらず、ソースの説明になっている >他人のソースをデバッグするほどしたくないことはない > >BMP,JPEG,WAV,MPEGなどでもこんな書き方したものにお目に掛かったことがない >普通にデータフォーマットが書かれた使えるものはないのでしょうか? 単に、得た線分情報をCADファイル化したいということであれば JWWには「座標ファイル」という便利なコマンドがあります。 座標ファイルとは、座標値が記載されたテキストファイルです。(拡張子.txt) 線の場合は、始点X座標 始点Y座標 終点X座標 終点Y座標を記載します。 ↓ 345.625455 145.535455 1345.625455 145.535455 1345.625455 145.535455 1345.625455 1145.535455 ・ ・ ・ のように記載します。 座標ファイルをJWW図面に反映させるには JWWを起動する その他→座標ファイル→ファイル名設定→ ファイル選択画面が表示されるので、目的の座標ファイルを選択する。 作図したい位置をクリックする。 ファイル→名前を付けて保存 これでJWWファイルの作成終了です。 |
▼kojimaさん: >▼BOBさん: >>画像処理で線分認識し、得た線分情報をCADファイル化したい >単に、得た線分情報をCADファイル化したいということであれば >JWWには「座標ファイル」という便利なコマンドがあります。 >座標ファイルとは、座標値が記載されたテキストファイルです。(拡張子.txt) > >線の場合は、始点X座標 始点Y座標 終点X座標 終点Y座標を記載します。 >↓ >345.625455 145.535455 1345.625455 145.535455 >1345.625455 145.535455 1345.625455 1145.535455 >・ >・ >・ > >のように記載します。 > >座標ファイルをJWW図面に反映させるには >JWWを起動する >その他→座標ファイル→ファイル名設定→ >ファイル選択画面が表示されるので、目的の座標ファイルを選択する。 >作図したい位置をクリックする。 >ファイル→名前を付けて保存 >これでJWWファイルの作成終了です。 ありがとうございます。 間接的なやり方ですが、目先の目的は達成できそうです。 ただ、JWWを全く使わないで図面を作りたかったので ダイレクトにCADファイルを生成したかった。 直に図形からGコードを作るソフトも作っているのですが WindowsのPAINTほどの機能にするには大変なので |
ソフトを修正し、各開始/終了座標をテキストファイル化し ご指導通り操作して、取り込みや既存データのマージもできました。 ありがとうございました。 |
▼BOBさん: >画像処理で線分認識し、得た線分情報をCADファイル化したい >http://www.jwcad.net/jwdatafmt.txt >縦線1本描いたCADデータを上記と参照するも、雑な説明でとても解りにくい そのCADデータ上で、以下の外部変形を実行してみてください。 バッチファイルにRubyスクリプトを記述するタイプ。 Rubyのインストールが必要 https://rubyinstaller.org/downloads/ そのCADデータのヘッダー情報をまるまるコピーして、中央に図寸100mm の正方形が描画されたJWWファイル(temp.jww)を作成して開きます。 以下の文をコピペして適当な名前をつけて保存してください。(拡張子.bat) ↓ @REM 四角形を描画したJWWファイルの作成 @echo off REM #jww REM #cd REM #hf REM #e copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt pause goto end #!ruby -Ks path=Dir.pwd while ARGF.gets if $_ =~ /^file=/ file=$'.chomp end end if file=="" open("jwc_temp.txt","w"){|f|f.puts "h#ファイルが保存されていません"} exit else open("jwc_temp.txt","w"){|f|f.puts "h#"} end i=0 data="" open(file,"rb"){|f|data=f.read} i += 8 #◎図面のバージョン b_n=data[i,4].unpack("L")[0]; i += 4 memo_byte=data[i,1].unpack("C")[0]; i += 1+memo_byte i += 8 0.upto(15){|i1| i += 20 0.upto(15){|i2|i += 8} } i += 14*4#ダミー i += 100 0.upto(15){|i1| 0.upto(15){|i2| byte=data[i,1].unpack("C")[0] i += byte+1 } } 0.upto(15){|i1| byte=data[i,1].unpack("C")[0] i += byte+1 } i += 96 if b_n.to_f >=3.0 1.upto(8){|i1|i += 28} else 1.upto(4){|i1|i += 24} end if b_n.to_f >=3.0 i += 44#ダミー if b_n.to_f <4.04 i += 12#ダミー else i += 12 end end 0.upto(9){|i1|i += 8} i += 8 0.upto(9){|i1|i += 8} 0.upto(9){|i1|i += 16} 2.upto(9){|i1|i += 16} 1.upto(5){|i1|i += 20} 6.upto(9){|i1|i += 16} i += 144 0.upto(256){|i1|i += 8} 0.upto(256){|i1| lcn_byte=data[i,1].unpack("C")[0] lcn=data[i+1,lcn_byte] i += 1+lcn_byte i += 16 } 0.upto(32){|i1|i += 16} 0.upto(32){|i1| ltn_byte=data[i,1].unpack("C")[0] i += 1+ltn_byte i += 4 1.upto(10){|i2|i += 8} } 1.upto(10){|i1|i += 28} i += 100 data2=data[0,i] #dataのヘッダー情報をdata2にコピーする n=4 #線の本数 data2<<[n].pack("S") data2<<[255*256+255,b_n,8].pack("SSS") data2<<"CDataSen" pl=0 #曲線属性番号 lt=1 #線種 lc=2 #線色 lw=0 #線幅 ly=0 #レイヤ lg=0 #レイヤグループ z=0 #属性 #sx:線の始点X座標 sy:線の始点Y座標 ex:線の終点X座標 ey:線の終点Y座標 sx= -100;sy= -100;ex= 100;ey= -100 data2<<[pl,lt,lc,lw,ly,lg,z,sx,sy,ex,ey].pack("LCSSSSSdddd") data2<<[128*256+1].pack("S") sx= 100;sy= -100;ex= 100;ey= 100 data2<<[pl,lt,lc,lw,ly,lg,z,sx,sy,ex,ey].pack("LCSSSSSdddd") data2<<[128*256+1].pack("S") sx= 100;sy= 100;ex= -100;ey= 100 data2<<[pl,lt,lc,lw,ly,lg,z,sx,sy,ex,ey].pack("LCSSSSSdddd") data2<<[128*256+1].pack("S") sx= -100;sy= 100;ex= -100;ey= -100 data2<<[pl,lt,lc,lw,ly,lg,z,sx,sy,ex,ey].pack("LCSSSSSdddd") bl_n=0 #ブロック定義数 gz_n=0 #画像同梱数 data2<<[bl_n,gz_n].pack("SL") open("#{path}/temp.jww","wb"){|f|f.write data2} #temp.jwwの作成 system("c:/jww/jw_win #{path}/temp.jww") #temp.jwwを開く __END__ :end |
▼kojimaさん: Rubyでの参考例ありがとうございます。 せめて、メモ位は取得出来るようになりたいと思い、参考例を拝見させて頂きました。 (私の理解が間違えていなければ)メモを取得する時は、 > memo_byte=data[i,1].unpack("C")[0]; の部分がポイントのように思いました。 memo_byte を取得すると、AutoItでもメモを簡単に取得する事が出来ました。 |
返信ありがとうございます。 >ヘッダー情報をまるまるコピーして 各要素のサイズも書かれていないのでHeaderサイズも解らないため どこまでがHeaderか解りません。 紹介いただいたことをすると何が判明するのでしょうか? JW_CADを使わず、JW_CADファイルを生成したいことが 最終目的です。 画像をALT+Print Screenでクリップ VV 画像処理ソフトでペースト/線分化 VV JWWファイル化(JW_CADで編集可能) VV NCVCでGコード化 よろしくお願いいたします。 |
▼BOBさん: >返信ありがとうございます。 > >>ヘッダー情報をまるまるコピーして >各要素のサイズも書かれていないのでHeaderサイズも解らないため >どこまでがHeaderか解りません。 JWWのヘッダー情報は可変長です。 (メモ文・レイヤ名・グループ名・SXF線種が含まれている為) >JW_CADを使わず、JW_CADファイルを生成したいことが >最終目的です。 > >画像をALT+Print Screenでクリップ > VV >画像処理ソフトでペースト/線分化 > VV >JWWファイル化(JW_CADで編集可能) > VV 前準備 1、サンプルのJWWファイル(samp.jww)を作成しておいてください。 2、画像→線データ から、JWWの座標ファイル(samp.txt)を作成してください。 以下が、samp.jwwのヘッダー情報をコピーして、samp.txtの線データを作図したJWWファイル(temp.jww)を作成するRubyスクリプト文です。 (ファイル名は、jww_creat.rb とでも付けて、samp.jwwとsamp.txtのあるフォルダに保存してください #!ruby -Ks path=Dir.pwd i=0 data="" begin open("samp.jww","rb"){|f|data=f.read} rescue STDRR.puts("samp.jwwが作成されていません") exit end i += 8 #◎図面のバージョン b_n=data[i,4].unpack("L")[0]; i += 4 memo_byte=data[i,1].unpack("C")[0]; i += 1+memo_byte i += 8 0.upto(15){|i1| i += 20 0.upto(15){|i2|i += 8} } i += 14*4#ダミー i += 100 0.upto(15){|i1| 0.upto(15){|i2| byte=data[i,1].unpack("C")[0] i += byte+1 } } 0.upto(15){|i1| byte=data[i,1].unpack("C")[0] i += byte+1 } i += 96 if b_n.to_f >=3.0 1.upto(8){|i1|i += 28} else 1.upto(4){|i1|i += 24} end if b_n.to_f >=3.0 i += 44#ダミー if b_n.to_f <4.04 i += 12#ダミー else i += 12 end end 0.upto(9){|i1|i += 8} i += 8 0.upto(9){|i1|i += 8} 0.upto(9){|i1|i += 16} 2.upto(9){|i1|i += 16} 1.upto(5){|i1|i += 20} 6.upto(9){|i1|i += 16} i += 144 0.upto(256){|i1|i += 8} 0.upto(256){|i1| lcn_byte=data[i,1].unpack("C")[0] lcn=data[i+1,lcn_byte] i += 1+lcn_byte i += 16 } 0.upto(32){|i1|i += 16} 0.upto(32){|i1| ltn_byte=data[i,1].unpack("C")[0] i += 1+ltn_byte i += 4 1.upto(10){|i2|i += 8} } 1.upto(10){|i1|i += 28} i += 100 data2=data[0,i] #dataのヘッダー情報をdata2にコピーする n=0 begin open("samp.txt","r"){|f| while f.gets xy=$_.split if xy[0]=~/^\d|^-/ n += 1 end end } rescue STDRR.puts("samp.jwwが作成されていません") exit end if n<(255*256+255) data2<<[n].pack("S") else data2<<[255*256+255,n].pack("SL") end pl=0 #曲線属性番号 lt=1 #線種 lc=2 #線色 lw=0 #線幅 ly=0 #レイヤ lg=0 #レイヤグループ z=0 #属性 #sx:線の始点X座標 sy:線の始点Y座標 ex:線の終点X座標 ey:線の終点Y座標 i2=0 open("samp.txt","r"){|f| while f.gets xy=$_.split if xy[0]=~/^\d|^-/ i2 += 1 if i2==1 data2<<[255*256+255,b_n,8].pack("SSS") data2<<"CDataSen" else data2<<[128*256+1].pack("S") end sx,sy,ex,ey=xy data2<<[pl,lt,lc,lw,ly,lg,z,sx,sy,ex,ey].pack("LCSSSSSdddd") end end } bl_n=0 #ブロック定義数 gz_n=0 #画像同梱数 data2<<[bl_n,gz_n].pack("SL") open("#{path}/temp.jww","wb"){|f|f.write data2} #temp.jwwの作成 system("start c:/jww/jw_win #{path}/temp.jww") #temp.jwwを開く |
▼kojimaさん: ありがとうございます。 ソースを解析してWindowsソフト化して行きたいと思います。 また、CADファイルを読込み、切削データ(Gコード)にする目的です。 出回っている変換ソフトもありますが、生成データが、無料バージョンの MACH3で扱えないサイズまで大きくなるので、サブルーチンを活用して 小さなGコードを生成したいのです。 それには、CADファイルを読込み、座標データ化するため、CADファイル の構造を知りたいのです。 |
▼BOBさん: >それには、CADファイルを読込み、座標データ化するため、CADファイル >の構造を知りたいのです。 図面名:temp.jww 内の線データを座標ファイル(temp.txt)に書き出すRubyスクリプト文です。 #図面内の線データを座標ファイルに書き出し #!ruby -Ks file="temp.jww" #図面名:temp.jww $stdout=open("temp.txt","w") #座標ファイル名:temp.txt #データの書き出し def data_write(data,i,data_moji) if data_moji=="CDataSen" ln_write(data,i,data_moji) end end #data_mojiとdata_noをarray2(二重配列)に収集する。 def data_no_collect(data,i,array2,data_moji,no,hash,j) data_no=no+j array2<<[data_moji,data_no] i=data_next(data,i,data_moji,hash) return i end #data_mojiのバイト数の分だけiを次へ進める。 def data_next(data,i,data_moji,hash) if data_moji=="CDataMoji" f_i=data[i+83,1].unpack("C")[0] m_i=data[i+84+f_i,1].unpack("C")[0] if m_i==255 m_i=data[i+85+f_i,2].unpack("S")[0] m_byte=83+f_i+m_i+4 else m_byte=83+f_i+m_i+2 end hash[data_moji]=m_byte i += hash[data_moji] elsif data_moji=="CDataSunpou" f_i=data[i+145,1].unpack("C")[0] m_i=data[i+146+f_i,1].unpack("C")[0] m_byte=147+f_i+m_i+236 hash[data_moji]=m_byte i += hash[data_moji] elsif data_moji=="CDataSolid" if data[i+5,1].unpack("C")[0] == 10 i += hash[data_moji]+4 else i += hash[data_moji] end elsif data_moji=="CDataTen" if data[i+4,1].unpack("C")[0] == 100 i += hash[data_moji]+20 else i += hash[data_moji] end else i += hash[data_moji] end return i end #線データの書き出し def ln_write(data,i,data_moji) pl,lt,lc,lw,ly,lg,z=data[i,15].unpack("LCSSSSS") x1,y1,x2,y2=data[i+15,8*4].unpack("dddd") zusun=$scal_a[lg] printf(" %.11f %.11f %.11f %.11f\n",x1*zusun,y1*zusun,x2*zusun,y2*zusun) end path=Dir.pwd i=0 data="" open(file,"rb"){|f|data=f.read} i += 8 #◎図面のバージョン b_n=data[i,4].unpack("L")[0]; i += 4 memo_byte=data[i,1].unpack("C")[0]; i += 1+memo_byte i += 8 $scal_a=[] 0.upto(15){|i1| i += 8 $scal_a<<data[i,8].unpack("d")[0]#レイヤグループの縮尺 i+= 12 0.upto(15){|i2|i += 8} } i += 14*4#ダミー i += 100 0.upto(15){|i1| 0.upto(15){|i2| byte=data[i,1].unpack("C")[0] i += byte+1 } } 0.upto(15){|i1| byte=data[i,1].unpack("C")[0] i += byte+1 } i += 96 if b_n.to_f >=3.0 1.upto(8){|i1|i += 28} else 1.upto(4){|i1|i += 24} end if b_n.to_f >=3.0 i += 44#ダミー if b_n.to_f <4.04 i += 12#ダミー else i += 12 end end 0.upto(9){|i1|i += 8} i += 8 0.upto(9){|i1|i += 8} 0.upto(9){|i1|i += 16} 2.upto(9){|i1|i += 16} 1.upto(5){|i1|i += 20} 6.upto(9){|i1|i += 16} i += 144 0.upto(256){|i1|i += 8} 0.upto(256){|i1| lcn_byte=data[i,1].unpack("C")[0] lcn=data[i+1,lcn_byte] i += 1+lcn_byte i += 16 } 0.upto(32){|i1|i += 16} 0.upto(32){|i1| ltn_byte=data[i,1].unpack("C")[0] i += 1+ltn_byte i += 4 1.upto(10){|i2|i += 8} } 1.upto(10){|i1|i += 28} i += 100 #◎図形(線・円・点・文字・ソリッド・寸法図形・ブロック図形)の総数 int1=data[i,1].unpack("C")[0];int2=data[i+1,1].unpack("C")[0] if int1==255 && int2==255 i += 2 n2=data[i,4].unpack("L")[0] i += 4 else n2=data[i,2].unpack("S")[0] i += 2 end puts "図形の総数:#{n2}" #◎図形(線・円・点・文字・ソリッド・寸法図形・ブロック図形)のデータNOの検出 hash={"CDataSen"=>47,"CDataTen"=>35,"CDataEnko"=>75,"CDataSolid"=>79,"CDataBlock"=>59} data_moji="";array2=[];no=0;j=0 while no<n2 no += 1 int=data[i,2].unpack("S")[0] if int==255*256+255 i += 4 n=data[i,2].unpack("S")[0] i += 2 data_moji=data[i,n] i += n data_write(data,i,data_moji) i=data_no_collect(data,i,array2,data_moji,no,hash,j) j += 1 elsif int==127*256+255 i += 2 n=data[i,4].unpack("L")[0]-(128*256*256*256) i += 4 array2.each{|item| if item[1] == n data_moji=item[0] break end } data_write(data,i,data_moji) i=data_next(data,i,data_moji,hash) else n=data[i,2].unpack("S")[0]-(128*256) i += 2 array2.each{|item| if item[1] == n data_moji=item[0] break end } data_write(data,i,data_moji) i=data_next(data,i,data_moji,hash) end end $stdout.close system("notepad temp.txt") |
▼BOBさん: 一つの例ですが https://youtu.be/CpPUFmEgzIY 1.>画像をALT+Print Screenでクリップ 2.>画像処理ソフトでペースト/線分化 3.>JWWファイル化(JW_CADで編集可能) 4.>NCVCでGコード化 1.は、本論とは無関係なので割愛します 2.を、inkskapeで行っています 3.は、inkskapeからコピーしたクリップボードデータを Jw_cad用の中間ファイル形式として座標ファイルにしています >JW_CADを使わず・・・ Jw_cadを使わないというのは、想定外でしたが そのまま、Jw_cad形式データを作成することも勿論可能です 他の使い勝手の観点から、私は敢えて座標ファイルにしています できないことはないだろう、という例ですので どのように実装できるかは、人それぞれだろうと思います 頑張ってください |
▼mirrorさん: >>JW_CADを使わず・・・ > >Jw_cadを使わないというのは、想定外でしたが >そのまま、Jw_cad形式データを作成することも勿論可能です >他の使い勝手の観点から、私は敢えて座標ファイルにしています ありがとうございます。 最終目的は、撮った写真から切削データ(Gコード)を作成し MACH3制御でCNCルーター/レーザーカッターを使って切削することです。 例えば、鍵の写真を撮って、それを基にスペアキーを作るようなこと 過渡的には手で座標を拾いますが、画像処理で特徴抽出して自動認識させ 手作業を省いてGコード作るまでを計画しています。 補正するのに中間ファイルとしてJWWファイルを出力して CADで微調整できるようにしたいのです。 CADを使わない方法でGコードを作るものを作りましたが 微調整や図面合成などを考えるとCADの中間ファイルを作れば 簡単だと考えたからです。 |
▼BOBさん: >それには、CADファイルを読込み、座標データ化するため、CADファイル >の構造を知りたいのです。 >CADを使わない方法でGコードを作るものを作りましたが >微調整や図面合成などを考えるとCADの中間ファイルを作れば >簡単だと考えたからです。 一般的に、CADソフトではベクトル(座標)データを扱います ドローソフトなどは、ラスター(ドット)データを得意とします ベクトルデータの場合、直線・円・他を違うGDI関数で表示しますが ラスターデータでは、bmp関数でドットの状態のみで描画していますので そのデータ構造は、とても簡単なもので済みます その辺りの理解ができていれば、Jw_cadデータの構造も判ります 前出のinkscapeには、ラスター/ベクター変換が実装されており 且つ、dxfファイル(txtファイル形式のベクトルデータ)の出力もあります 今回のような場合、Jw_cadのデータ構造が判りにくいのであれば dxfファイルの書式(txt)を調べ、それを編集に使うようにしたほうが 良さそうだと思います |
▼BOBさん: >微調整や図面合成などを考えるとCADの中間ファイルを作れば >簡単だと考えたからです。 mirrorさんの薦めるDXFも良いですがSFCもテキストで簡単ですよ。 他のCADですがCADデータを加工するプログラムを作る時にSFCを中間ファイルにしたら楽ちんでした。 |