Page 1159 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/6(木) 10:30 ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kojima 20/2/6(木) 23:36 ┣その2 kojima 20/2/6(木) 23:37 ┣補足 kojima 20/2/6(木) 23:48 ┣Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/7(金) 15:52 ┃ ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kojima 20/2/7(金) 21:40 ┃ ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/8(土) 17:53 ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/7(金) 17:59 ┗[投稿者削除] ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/9(日) 22:35 ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kojima 20/2/10(月) 11:43 ┗Re:複数jwwファイルの図番(同位置の文字列)の一括変換 kubo 20/2/11(火) 23:08 ─────────────────────────────────────── ■題名 : 複数jwwファイルの図番(同位置の文字列)の一括変換 ■名前 : kubo ■日付 : 20/2/6(木) 10:30 -------------------------------------------------------------------------
ご教示お願いします。 1つの物件の複数の図面を書いて、 (1ファイル1図面、図面「図枠」の位置は全て同じ位置) 共通した標題欄(普通図枠の下に書かれる工事名・図面名等の枠)に書く図番を、 その複数ファイルの図番(同じ位置にある文字列)を一括して、ずらせたい (変えたい)のです。 そのようなツールや外部変形(他の方法でもよい)をご存じありませんか。 例えば、 テキストファイルやエクセルファイルで(jwwファイルでもよい)、 変更前の文字列 と 変更後の文字列 を行毎に書き込んで、その情報で 図番(文字列)を変換していくというようなイメージを持っています。 よろしくお願いします。 |
1枚だけ以下の外変を実行してください。 外変を実行した図面と同じフォルダ内の全てのJWWファイルに対して 外変で指定した範囲内の文字を検索して、該当する文字ならば置換します。 RUby1.8専用の外変です。RUby1.9以降では動作しません。 実行前に、表題変更.txtをタブ区切りで作成しておいてください。 以下 その1 @REM 複数ファイルの指定範囲内にある文字の一括変更 @echo off REM #jww REM #cd REM #ht10 REM #ht30 REM #zc REM #zz REM #zs REM #hf REM #bz REM #h3 REM #g1 REM #1変更範囲の左下を指示してください REM #2変更範囲の右上を指示してください REM #hp REM #e copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt pause goto end #!ruby -Ks require 'kconv' #data_mojiとdata_noをarray2(二重配列)に収集する。 def data_no_collect(data,i,array2,data_moji,no,hash,j,b_n) data_no=no+j array2<<[data_moji,data_no] i=data_next(data,i,data_moji,hash,b_n) return i end #data_mojiのバイト数の分だけiを次へ進める。 def data_next(data,i,data_moji,hash,b_n) i2=i if data_moji=="CDataMoji" f_i=data[i+83,1].unpack("C")[0] m_i=data[i+84+f_i,1].unpack("C")[0] m_byte=83+f_i+m_i+2 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 hash[data_moji]=m_byte i += hash[data_moji] i += 236 if b_n>=420 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 size(str) if RUBY_VERSION =~/^1\.9|^2|^3/ return str.bytesize else return str.size end end #文字データの変更 def ch_henkan(data,i,data_moji,b_n,m_hash,x_min,y_min,x_max,y_max) pl,kiten,lc,sun_flg,ly,lg,z=data[i,15].unpack("LCSSSSS") x1,y1,x2,y2,mojisyu=data[i+15,36].unpack("ddddL") w,h,d,kakudo=data[i+51,32].unpack("dddd") f_i=data[i+83,1].unpack("C")[0] font=data[i+84,f_i] m_i=data[i+84+f_i,1].unpack("C")[0] if m_i==255 m_i2=data[i+84+f_i+1,1].unpack("S")[0] str=data[i+85+f_i+1,m_i2].to_s else str=data[i+85+f_i,m_i].to_s end if x_min<x1 && x_min<x2 && x_max>x1 && x_max>x2 && x_min<x1 && x_min<x2 && x_max>x1 && x_max>x2 && y_min<y1 && y_min<y2 && y_max>y1 && y_max>y2 && y_min<y1 && y_min<y2 && y_max>y1 && y_max>y2 if m_hash[str] str2=m_hash[str] else str2=str end else str2=str end $data<<[pl,kiten,lc,sun_flg,ly,lg,z].pack("LCSSSSS") $data<<[x1,y1,x2,y2,mojisyu].pack("ddddL") $data<<[w,h,d,kakudo,f_i].pack("ddddC") $data<<font if size(str2)<255 $data<<[size(str2)].pack("C") else $data<<[255].pack("C") $data<<[size(str2)].pack("S") end $data<<str2 n=1 if str==str2 n=0 end return n end printf("表題変更.txtの編集は終了していますか? YES:1 NO:2\n") i=STDIN.gets.chomp.to_i unless i==1 system("notepad 表題変更.txt") end moji_hash={} f=open("表題変更.txt","r") while f.gets xy=$_.chomp.split("\t") moji_hash[xy[0]]=xy[1] end f.close |
以下、前文からの続き $stdout=open("jwc_temp.txt","w") x_a=[];y_a=[] puts "hd" while ARGF.gets xy=$_.split if xy[0]=~/^hq/ elsif xy[0]=~/^hzs/ p_x=xy[1].to_f p_y=xy[2].to_f elsif xy[0]=~/^file=/ siz=size(xy[0]) if siz==5 STDERR.puts("ファルが保存されていないのでフォルダ名が特定できません") STDERR.puts("終了します") exit end path_file=xy[0][5..-1] path,file=File.split(path_file) # path.gsub!("\\","/") elsif xy[0]=~/^hp\d/ x_a<<xy[1].to_f y_a<<xy[2].to_f elsif xy[0]=~/^ch/ x_min=x_a.min;x_max=x_a.max y_min=y_a.min;y_max=y_a.max if $_=~/\"/ moji=$'.chomp moji_zahyo=$` end x=xy[1].to_f;y=xy[2].to_f; if x_min<x && x_max>x &&y_min<y && y_max>y if moji_hash[moji] printf("%s \"%s\n",moji_zahyo,moji_hash[moji]) else print $_ end else print $_ end else print $_ end end $stdout.close x_min=x_a.min-p_x/2;x_max=x_a.max-p_x/2 y_min=y_a.min-p_y/2;y_max=y_a.max-p_y/2 file_a=Dir.entries(path).select{|item|item=~/\.jww$/i} file_a.each{|file1| i=0;data="";$data="" open(path+"\\"+file1,"rb"){|f|data=f.read} #◎jwwデータの宣言 i += 8 #◎図面のバージョン b_n=data[i,4].unpack("L")[0]; if b_n<420 STDERR.printf("バージョンNO%dには未対応です。処理を中止します\n",b_n) exit end i += 4 #◎メモ欄の記載文 memo_byte=data[i,1].unpack("C")[0]; i += 1+memo_byte #◎図面サイズ i += 4 #◎レイヤグループ・レイヤ状態 i += 4 0.upto(15){|i1| data[i,4].unpack("L")[0] i += 20 0.upto(15){|i2|i += 8} } i += 156 #◎レイヤ名・レイヤグループ名 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 += 1140 0.upto(256){|i1|i += 8} 0.upto(256){|i1| lcn_byte=data[i,1].unpack("C")[0] i += 1+lcn_byte i += 16 } #◎SXF対応拡張線種定義拡張 0.upto(32){|i1|i += 16} 0.upto(32){|i1| ltn_byte=data[i,1].unpack("C")[0] i += 1+ltn_byte i += 84 } i += 380 #◎図形(線・円・点・文字・ソリッド・寸法図形・ブロック図形)の総数 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 i2=i $data<<data[0,i2] moji_n=0 #◎図形(線・円・点・文字・ソリッド・寸法図形・ブロック図形)のデータNOの検出 hash={"CDataSen"=>47,"CDataTen"=>35,"CDataEnko"=>75,"CDataSolid"=>79,"CDataBlock"=>59} data_moji="";array2=[];no=0;j=0;has2={} 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<<data[i2..i-1];i2=i i=data_no_collect(data,i,array2,data_moji,no,hash,j,b_n) if data_moji=="CDataMoji" moji_no=ch_henkan(data,i2,data_moji,b_n,moji_hash,x_min,y_min,x_max,y_max) moji_n +=moji_no else $data<<data[i2..i-1] end i2=i 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<<data[i2..i-1];i2=i i=data_next(data,i,data_moji,hash,b_n) if data_moji=="CDataMoji" moji_no=ch_henkan(data,i2,data_moji,b_n,moji_hash,x_min,y_min,x_max,y_max) moji_n +=moji_no else $data<<data[i2..i-1] end i2=i 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<<data[i2..i-1];i2=i i=data_next(data,i,data_moji,hash,b_n) if data_moji=="CDataMoji" moji_no=ch_henkan(data,i2,data_moji,b_n,moji_hash,x_min,y_min,x_max,y_max) moji_n +=moji_no else $data<<data[i2..i-1] end i2=i end end $data<<data[i..-1] if moji_n>0 new_file=path+"\\"+file1+".jww" open(new_file,"wb"){|f|f.write $data} STDERR.puts("#{new_file}を作成しました") else STDERR.puts("#{file1}は変更無し") end } __END__ :end |
怖いので、元の図面は変更しません。 指定範囲内に、該当する文字があった場合だけ、拡張子.jwwを追加した 新しいファイルを作成します。(拡張子.jww.jww) 同じファイル名の.jwwファイルと.jww.jwwファイルがある場合は、 .jwwファイルが.jw.jwwとなって、すでにある.jww.jwwファイル を上書きしてしまいます。 無いことを確認の上、実行してください。 |
▼kojimaさん: ありがとうございます。 R.Nさまのコメントも参考にして、実行することができました。 なお、できれば、「表題変更.txt」を置く位置は、外変のあるフォルダでは なく、外変を実行するjwwデータのあるフォルダにしていただければ、 「表題変更.txt」の作成、変更がしやすいように思いました。 kojimaさま、ありがとうございました。 R.Nさま、ありがとうございました。 |
>なお、できれば、「表題変更.txt」を置く位置は、外変のあるフォルダでは >なく、外変を実行するjwwデータのあるフォルダにしていただければ、 >「表題変更.txt」の作成、変更がしやすいように思いました。 115行目から173行目を変更してください。 ↓変更する部分 printf("表題変更.txtの編集は終了していますか? YES:1 NO:2\n") i=STDIN.gets.chomp.to_i unless i==1 system("notepad #{path}\\表題変更.txt") end moji_hash={} f=open("#{path}\\表題変更.txt","r") while f.gets xy=$_.chomp.split("\t") moji_hash[xy[0]]=xy[1] end f.close $stdout=open("jwc_temp.txt","w") x_a=[];y_a=[] puts "hd" while ARGF.gets xy=$_.split if xy[0]=~/^hq/ elsif xy[0]=~/^hzs/ p_x=xy[1].to_f p_y=xy[2].to_f elsif xy[0]=~/^file=/ siz=size(xy[0]) if siz==5 STDERR.puts("ファルが保存されていないのでフォルダ名が特定できません") STDERR.puts("終了します") exit end path_file=xy[0][5..-1] path,file=File.split(path_file) # path.gsub!("\\","/") elsif xy[0]=~/^hp\d/ x_a<<xy[1].to_f y_a<<xy[2].to_f elsif xy[0]=~/^ch/ x_min=x_a.min;x_max=x_a.max y_min=y_a.min;y_max=y_a.max if $_=~/\"/ moji=$'.chomp moji_zahyo=$` end x=xy[1].to_f;y=xy[2].to_f; if x_min<x && x_max>x &&y_min<y && y_max>y if moji_hash[moji] printf("%s \"%s\n",moji_zahyo,moji_hash[moji]) else print $_ end else print $_ end else print $_ end end $stdout.close ↓以下の文に変更 f=open("temp.txt","r") while f.gets xy=$_.split if xy[0]=~/^file=/ siz=size(xy[0]) if siz==5 STDERR.puts("ファルが保存されていないのでフォルダ名が特定できません") STDERR.puts("終了します") exit end path_file=xy[0][5..-1] path,file=File.split(path_file) end end f.close printf("表題変更.txtの編集は終了していますか? YES:1 NO:2\n") i=STDIN.gets.chomp.to_i unless i==1 system("notepad #{path}\\表題変更.txt") end moji_hash={} f=open("#{path}\\表題変更.txt","r") while f.gets xy=$_.chomp.split("\t") moji_hash[xy[0]]=xy[1] end f.close $stdout=open("jwc_temp.txt","w") x_a=[];y_a=[] puts "hd" while ARGF.gets xy=$_.split if xy[0]=~/^hq/ elsif xy[0]=~/^hzs/ p_x=xy[1].to_f p_y=xy[2].to_f elsif xy[0]=~/^hp\d/ x_a<<xy[1].to_f y_a<<xy[2].to_f elsif xy[0]=~/^ch/ x_min=x_a.min;x_max=x_a.max y_min=y_a.min;y_max=y_a.max if $_=~/\"/ moji=$'.chomp moji_zahyo=$` end x=xy[1].to_f;y=xy[2].to_f; if x_min<x && x_max>x &&y_min<y && y_max>y if moji_hash[moji] printf("%s \"%s\n",moji_zahyo,moji_hash[moji]) else print $_ end else print $_ end else print $_ end end $stdout.close |
▼kojimaさん: お世話になります。 修正をしていただき大変ありがとうございます。 「表題変更.txt」の確認・修正がしやすくなりました。 ありがとうございました。 |
▼kojimaさん: お世話になります。 実際に1物件、使用させていただきました。 図面の順番を整理して、正式に図番を確定・編集させたあと、あとから追加に なった図面以降の全ての図面の図番を、ずらせて行くのは大変でしたので、 ありがたく使用させていただきました。 ありがとうございました。 なお、変更後の図面(ファイル名)については、元が ○○○.jww としたとき 変更後が ○○○_.jww のように、拡張子の前の名前の部分に文字(全ファイル 共通で)を追加できる形にはならないでしょうか。 無理なら、 臨時のフォルダを作り、そこに文字列変更したいファイルだけコピーして、 そのフォルダで外変を実行すれば、上書きしても元のファイルは残るので 上書きの方法でもよいです。 誠に勝手を申しますが、可能なら、よろしくお願いします。 |
この書き込みは投稿者によって削除されました。(20/4/5(日) 11:19) |
▼R.Nさん: コメントありがとうございます。 .jww.jww が拡張子になるとは思っていません。 それでは、Jw_cadで読み込めないでしょうから。 また、禁則文字についても承知しています。 外変の構文は理解できないのですが、 新しい batファイルの 309 行目の new_file=path+"\\"+file1+".jww" で、新しいファイル名を作成されているということは、なんとなくわかりました。 元のファイル名(拡張子込み)の末尾に .jww を加えておられる・・・と。 それ以上のことはわかりません。 このコメントを拝見したあと、試しに、.jww を除いて new_file=path+"\\"+file1+"" にさせてもらったら、元のファイル名に上書きされました。 それで正しかったのかはわかりません。 ファイル内容を見る限り、変更したい箇所だけ書き換わっていましたので 問題ないように思いました。 >▼kuboさん: > >>なお、変更後の図面(ファイル名)については、元が ○○○.jww としたとき >>変更後が ○○○_.jww のように、拡張子の前の名前の部分に文字(全ファイル >>共通で)を追加できる形にはならないでしょうか。 >> >>無理なら、 >>臨時のフォルダを作り、そこに文字列変更したいファイルだけコピーして、 >>そのフォルダで外変を実行すれば、上書きしても元のファイルは残るので >>上書きの方法でもよいです。 > >現状の外変スクリプトで、出力される「Jwwデータファイル」は、 > 例;元ファイル名.拡張子 ⇒ 「ABC.jww」とすると、 > ┌──────────┬──────────┐ > │ 元ファイル │ 外変出力ファイル │ > ├─────┬────┼─────┬────┤ > │ファイル名│ 拡張子 │ファイル名│ 拡張子 │ > ├─────┼────┼─────┼────┤ > │ ABC │ jww │ ABC.jww │ jww │ ⇒ ABC.jww.jww(出力) > └─────┴────┴─────┴────┘ > ↑ ※ >と、なりますが、 > >要望の、「ABC_.jww」出力にスクリプトを改変したとしても、 > ┌─────┬────┬─────┬────┐ > │ ABC │ jww │ ABC_ │ jww │ ⇒ ABC_.jww(出力) > └─────┴────┴─────┴────┘ > >となるだけで、 > >何れにしても、出力ファイル名を編集するということでは、同じことかと思います。 >(拡張子が".jww.jww"となる?、と勘違いされているのでは〜、と思いましたので---、エクスプローラで"ABC.jww.jww"ファイルを左クリックすると、ファイル名(ABC.jww)が反転表示(編集状態)されますので、確認下さい) > >※ 蛇足で、 >ファイル名変更時、禁止文字を使うと、エラー吹き出し( \/:*?"<>|)が表示されます。(詳細には、ネット検索) > >出力ファイル名を外変で任意入力したい、ということであれば、話は別ですが--- |
▼kuboさん: >このコメントを拝見したあと、試しに、.jww を除いて >new_file=path+"\\"+file1+"" >にさせてもらったら、元のファイル名に上書きされました。 > >それで正しかったのかはわかりません。 >ファイル内容を見る限り、変更したい箇所だけ書き換わっていましたので >問題ないように思いました。 これは怖いからやめてください。 不具合があった時、開けなくなる可能性があります。 手作業での上書きと違って、バックファイルが作成されません。 bakファイルを作成して、元図を上書きの場合は、以下のようにしてください。 if moji_n>0 new_file=path+"\\"+file1+".jww" open(new_file,"wb"){|f|f.write $data} STDERR.puts("#{new_file}を作成しました") else STDERR.puts("#{file1}は変更無し") end を以下のように修正する。 if moji_n>0 new_file=path+"\\"+file1.sub(/\.jww$/i,".bak") open(new_file,"wb"){|fw|fw.write(data)} new_file2=path+"\\"+file1 open(new_file2,"wb"){|f|f.write $data} STDERR.puts("#{new_file}を作成し\n#{new_file2}を修正しました") else STDERR.puts("#{file1}は変更無し") end |
▼kojimaさん: 大変ありがとうございました。 より便利になりました。 >▼kuboさん: >>このコメントを拝見したあと、試しに、.jww を除いて >>new_file=path+"\\"+file1+"" >>にさせてもらったら、元のファイル名に上書きされました。 >> >>それで正しかったのかはわかりません。 >>ファイル内容を見る限り、変更したい箇所だけ書き換わっていましたので >>問題ないように思いました。 > > >これは怖いからやめてください。 >不具合があった時、開けなくなる可能性があります。 >手作業での上書きと違って、バックファイルが作成されません。 > > >bakファイルを作成して、元図を上書きの場合は、以下のようにしてください。 > >if moji_n>0 >new_file=path+"\\"+file1+".jww" >open(new_file,"wb"){|f|f.write $data} >STDERR.puts("#{new_file}を作成しました") >else >STDERR.puts("#{file1}は変更無し") >end > > >を以下のように修正する。 > > >if moji_n>0 >new_file=path+"\\"+file1.sub(/\.jww$/i,".bak") >open(new_file,"wb"){|fw|fw.write(data)} >new_file2=path+"\\"+file1 >open(new_file2,"wb"){|f|f.write $data} >STDERR.puts("#{new_file}を作成し\n#{new_file2}を修正しました") >else >STDERR.puts("#{file1}は変更無し") >end |