Page 104 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼オブジェクト範囲の表示 kojima 15/09/29(火) 15:09 ┗Re: オブジェクト範囲の表示 外注図面屋 15/09/30(水) 13:08 ┗Re(1): オブジェクト範囲の表示 kojima 15/09/30(水) 14:06 ┗Re2: オブジェクト範囲の表示 外注図面屋 15/09/30(水) 16:36 ┣Re(1):Re2: オブジェクト範囲の表示 kojima 15/09/30(水) 16:53 ┃ ┗Re2: Re2: オブジェクト範囲の表示 外注図面屋 15/09/30(水) 18:08 ┗Re3: オブジェクト範囲の表示 外注図面屋 15/09/30(水) 18:58 ┗Re(1):Re3: オブジェクト範囲の表示 いっち 15/10/06(火) 15:39 ┣Re(2):Re3: オブジェクト範囲の表示 kojima 15/10/06(火) 16:21 ┃ ┗Re(3):Re3: オブジェクト範囲の表示 いっち 15/10/06(火) 16:52 ┗Re2: Re3: オブジェクト範囲の表示 外注図面屋 15/10/07(水) 11:58 ─────────────────────────────────────── ■題名 : オブジェクト範囲の表示 ■名前 : kojima ■日付 : 15/09/29(火) 15:09 -------------------------------------------------------------------------
画面をオブジェクト範囲の表示に切り替える外部変形です。 このようなステップでオブジェクト範囲の表示にします。 ↓ 外部変形で全データのX座標Y座標を集計して、表示の中心座標及び 表示倍率を計算し、上書き保存したあと、図面を閉じます。 外部変形で求められた中心座標・倍率を起動オプションとして 再度図面を開きます。 他社から貰ったDXFを元に作成されたJWWファイルの用紙外データの 有無を確認する為のものです。 この外部変形の実行にはRubyとAutoITのインストールが必要です。 (Ruby1.8.6及びRuby2.1.4にて動作確認済み) バッチファイルにRubyスクリプトを記述するタイプの外部変形です。 コピペ後、全角スペースを半角スペースに一括置換してください。 @REM オブジェクト範囲表示でJWWファイルを開き直す @echo off REM #jww REM #cd REM #bz REM #hf REM #zs REM #h4 REM #hp REM #g1 REM #e copy jwc_temp.txt temp.txt > nul echo h#>jwc_temp.txt start ruby -x %~f0 temp.txt goto end #!ruby -Ks require 'win32ole' include Math path=Dir.pwd x_array=[];y_array=[] while ARGF.gets xy=$_.split if xy[0] =~ /^file=/ file=$'.chomp end if xy[0] =~ /^hzs/ paper_x=xy[1].to_f paper_y=xy[2].to_f end if xy[0]=~/^\d|-/ xy.collect!{|item|item.to_f} x_array<<xy[0]<<xy[2] y_array<<xy[1]<<xy[3] end if xy[0]=~/^ci|^s[ecog]/ xy.collect!{|item|item.to_f} x,y,r=xy[1],xy[2],xy[3] if xy.size==4 x_array<<x-r<<x+r y_array<<y-r<<y+r else sikaku=xy[4] syukaku=xy[5] ziku_arg=xy[7]*2*PI/360 bunkaku=1.0 if sikaku==syukaku sikaku,syukaku=0,360 elsif sikaku>syukaku sikaku -= 360 end arg=sikaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] arg2=atan2(y,x) l=sqrt(x**2+y**2) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) arg=syukaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] arg2=atan2(y,x) l=sqrt(x**2+y**2) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) if xy[7]==0 or xy[6]==1 if sikaku+xy[7]<0 && syukaku+xy[7]>0 arg=0*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<90 && syukaku+xy[7]>90 or sikaku+xy[7]<-270 && syukaku+xy[7]>-270 arg=90*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<180 && syukaku+xy[7]>180 or sikaku+xy[7]<-180 && syukaku+xy[7]>-180 arg=180*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<270 && syukaku+xy[7]>270 or sikaku+xy[7]<-90 && syukaku+xy[7]>-90 arg=270*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end else while syukaku > sikaku arg=sikaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] l=sqrt(x**2+y**2) arg2=atan2(y,x) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) sikaku += bunkaku end end end end if xy[0]=~/^pt/ xy.collect!{|item|item.to_f} x_array<<xy[1] y_array<<xy[2] end if xy[0]=~/^sl/ xy.collect!{|item|item.to_f} 1.step(xy.size-2,2){|i| x_array<<xy[i] y_array<<xy[i+1] } end if xy[0]=~/^c[hvsroptkz2]/ x1=xy[1].to_f;y1=xy[2].to_f l=hypot(xy[4].to_f,xy[3].to_f) arg=atan2(xy[4].to_f,xy[3].to_f) x2=x1+l*cos(arg);y2=y1+l*sin(arg) x_array<<x1<<x2 y_array<<y1<<y2 end if xy[0]=~/^BL/ x_array<<xy[1].to_f y_array<<xy[2].to_f end end if x_array.size<4 STDERR.puts "データが少な過ぎます 処理を終了します","終了するには、どれかキーを押してください" STDIN.gets exit end x_max,x_min=x_array.max,x_array.min y_max,y_min=y_array.max,y_array.min x=x_max-x_min y=y_max-y_min by_x=paper_x/x by_y=paper_y/y by_x<by_y ? bairitu=by_x : bairitu=by_y cl_x = (paper_x/2)-(x_min+x/2) cl_y = (paper_y/2)-(y_min+y/2) dir,fname=File.split(file) itx=WIN32OLE.new("AutoITX3.Control") itx.WinActivate fname itx.WinMenuSelectItem(fname,"","ファイル","上書き保存") itx.WinMenuSelectItem(fname,"","ファイル","jw_cadの終了") itx.Winclose fname system("c:\\jww\\jw_win #{file} -P#{cl_x*-1},#{cl_y*-1},#{bairitu}") __END__ :end |
kojimaさん、こんにちは。 やってみましたが、JW_CADでは読み込めないファイルです、とダイアログが出ます。 連続閲覧の外部変形は動作するので、ruby と autoit は動作してると思います。 -- CMN v0.61aβ -- |
▼外注図面屋さん: >kojimaさん、こんにちは。 > >やってみましたが、JW_CADでは読み込めないファイルです、とダイアログが出ます。 > >連続閲覧の外部変形は動作するので、ruby と autoit は動作してると思います。 > >-- CMN v0.61aβ -- フォルダ名またはファイル名に半角スペースがありませんか? 以下だと半角スペースいりのフルパスファイル名にも対応します。 @REM オブジェクト範囲表示でJWWファイルを開き直す @echo off REM #jww REM #cd REM #bz REM #hf REM #zs REM #h4 REM #hp REM #g1 REM #e copy jwc_temp.txt temp.txt > nul echo h#>jwc_temp.txt start ruby -x %~f0 temp.txt goto end #!ruby -Ks require 'win32ole' include Math path=Dir.pwd x_array=[];y_array=[] while ARGF.gets xy=$_.split if $_ =~ /^file=/ file=$'.chomp end if xy[0] =~ /^hzs/ paper_x=xy[1].to_f paper_y=xy[2].to_f end if xy[0]=~/^\d|-/ xy.collect!{|item|item.to_f} x_array<<xy[0]<<xy[2] y_array<<xy[1]<<xy[3] end if xy[0]=~/^ci|^s[ecog]/ xy.collect!{|item|item.to_f} x,y,r=xy[1],xy[2],xy[3] if xy.size==4 x_array<<x-r<<x+r y_array<<y-r<<y+r else sikaku=xy[4] syukaku=xy[5] ziku_arg=xy[7]*2*PI/360 bunkaku=1.0 if sikaku==syukaku sikaku,syukaku=0,360 elsif sikaku>syukaku sikaku -= 360 end arg=sikaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] arg2=atan2(y,x) l=sqrt(x**2+y**2) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) arg=syukaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] arg2=atan2(y,x) l=sqrt(x**2+y**2) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) if xy[7]==0 or xy[6]==1 if sikaku+xy[7]<0 && syukaku+xy[7]>0 arg=0*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<90 && syukaku+xy[7]>90 or sikaku+xy[7]<-270 && syukaku+xy[7]>-270 arg=90*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<180 && syukaku+xy[7]>180 or sikaku+xy[7]<-180 && syukaku+xy[7]>-180 arg=180*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end if sikaku+xy[7]<270 && syukaku+xy[7]>270 or sikaku+xy[7]<-90 && syukaku+xy[7]>-90 arg=270*2*PI/360 x_array<<xy[1]+r*cos(arg) y_array<<xy[2]+r*sin(arg)*xy[6] end else while syukaku > sikaku arg=sikaku*2*PI/360 x=r*cos(arg) y=r*sin(arg)*xy[6] l=sqrt(x**2+y**2) arg2=atan2(y,x) x_array<<xy[1]+l*cos(arg2+ziku_arg) y_array<<xy[2]+l*sin(arg2+ziku_arg) sikaku += bunkaku end end end end if xy[0]=~/^pt/ xy.collect!{|item|item.to_f} x_array<<xy[1] y_array<<xy[2] end if xy[0]=~/^sl/ xy.collect!{|item|item.to_f} 1.step(xy.size-2,2){|i| x_array<<xy[i] y_array<<xy[i+1] } end if xy[0]=~/^c[hvsroptkz2]/ x1=xy[1].to_f;y1=xy[2].to_f l=hypot(xy[4].to_f,xy[3].to_f) arg=atan2(xy[4].to_f,xy[3].to_f) x2=x1+l*cos(arg);y2=y1+l*sin(arg) x_array<<x1<<x2 y_array<<y1<<y2 end if xy[0]=~/^BL/ x_array<<xy[1].to_f y_array<<xy[2].to_f end end if x_array.size<4 STDERR.puts "データが少な過ぎます 処理を終了します","終了するには、どれかキーを押してください" STDIN.gets exit end x_max,x_min=x_array.max,x_array.min y_max,y_min=y_array.max,y_array.min x=x_max-x_min y=y_max-y_min by_x=paper_x/x by_y=paper_y/y by_x<by_y ? bairitu=by_x : bairitu=by_y cl_x = (paper_x/2)-(x_min+x/2) cl_y = (paper_y/2)-(y_min+y/2) dir,fname=File.split(file) itx=WIN32OLE.new("AutoITX3.Control") itx.WinActivate fname itx.WinMenuSelectItem(fname,"","ファイル","上書き保存") itx.WinMenuSelectItem(fname,"","ファイル","jw_cadの終了") itx.Winclose fname system("start c:\\jww\\jw_win \"#{file}\" -P#{cl_x*-1},#{cl_y*-1},#{bairitu}") __END__ :end |
kojimaさん、こんにちは。 autoit3をruby同様にc:\にインストールし直して、 環境変数でパスを切ったらダイアログは出なくなりましたけど、それでいいのでしょうか? 何か、一旦JWが終了して、また立ち上がって終わりですけど。 用紙枠範囲外に不要な線データ等があれば消しているのでしょうか? -- CMN v0.61aβ -- |
▼外注図面屋さん: >kojimaさん、こんにちは。 > >autoit3をruby同様にc:\にインストールし直して、 >環境変数でパスを切ったらダイアログは出なくなりましたけど、それでいいのでしょうか? >何か、一旦JWが終了して、また立ち上がって終わりですけど。 > >用紙枠範囲外に不要な線データ等があれば消しているのでしょうか? > >-- CMN v0.61aβ -- 用紙枠範囲外にデータがなく、用紙範囲に四角形が作図されていれば 中心座標0,0 倍率1 用紙範囲表示で再度図面を開きます。 用紙範囲枠に四角形が作図されていなければ、用紙内のデータを全て表示する 中心座標と倍率で図面を開きます。 用紙枠外のみにデータがある場合は、用紙外のデータを全て表示する 中心座標と倍率で図面を開きます。(用紙枠は表示されません) |
kojimaさん、こんにちは。 ためしに、用紙枠外に線を一本引いてやってみたところ、 枠外の線も見えるように大きめに表示して立ち上がってきました (^_^)v -- CMN v0.61aβ -- |
見ている人が勘違いしないように訂正。 >autoit3をruby同様にc:\にインストールし直して、 は、AutoIt3を C:\に適当なフォルダーを作ってその中にインストールし直して、です。 間違っても C:\で展開しないでください。 -- CMN v0.61aβ -- |
>見ている人が勘違いしないように訂正。 私は、C:\Program Files (x86)\AutoIt3にインストールしています。 環境変数でパスを切ってもいません。 AutoIt外部変形実行時は、start /wait スクリプト名.au3としています。 それが一番簡単だからです。 しかし、kojimaさんのスクリプトは、AutoItスプリプトではなく、 Rubyスクリプトなので、そのような事は関係ないと思います。 「オブジェクト範囲表示でJWWファイルを開き直す」の外変は 確かに、大きいファイルでは、実行できませんでした。 しかし、 itx.WinActivate fname itx.WinWaitActive fname # 追加 とか、 itx.Winclose fname itx.WinWaitClose fname # 追加 とすれば開けるようです。 C:\AutoIt3などにインストールするメリットも無いとは言いませんが、 わざわざインストールし直すほどのものでは無い気がしています。 |
▼いっちさん: >>見ている人が勘違いしないように訂正。 > >私は、C:\Program Files (x86)\AutoIt3にインストールしています。 >環境変数でパスを切ってもいません。 パスが通ったファルダであれば、どこでもかまいません。 > >AutoIt外部変形実行時は、start /wait スクリプト名.au3としています。 >それが一番簡単だからです。 >しかし、kojimaさんのスクリプトは、AutoItスプリプトではなく、 >Rubyスクリプトなので、そのような事は関係ないと思います。 いえいえ、大いに重要です。 start ruby -x %~f0 temp.txt だと正常に動作しますが start /wait ruby -x %~f0 temp.txt や ruby -x %~f0 temp.txt だと正常に動作しなはず? (スクリプトが終了するまでバッチファイルは終了しない) start ruby -x %~f0 temp.txt だとスクリプトファイルをスタートさせたら、スクリプトの終了 を待たずにバッチファイルは終了します。 このタイプの外変はstartコマンドが重要です。 > >「オブジェクト範囲表示でJWWファイルを開き直す」の外変は >確かに、大きいファイルでは、実行できませんでした。 > >しかし、 > >itx.WinActivate fname >itx.WinWaitActive fname # 追加 > >とか、 > >itx.Winclose fname >itx.WinWaitClose fname # 追加 > >とすれば開けるようです。 > ここは手抜きでした。 |
▼kojimaさん: こんにちは。 > start ruby -x %~f0 temp.txt > だと正常に動作しますが > start /wait ruby -x %~f0 temp.txt > や > ruby -x %~f0 temp.txt > だと正常に動作しなはず? > (スクリプトが終了するまでバッチファイルは終了しない) 3通り全て動作させてみました。 > (スクリプトが終了するまでバッチファイルは終了しない) というか、パソコンが応答していない旨のメッセージを出しました。 > このタイプの外変はstartコマンドが重要です。 それは、そうですね。 |
いっちさん、こんにちは。 >私は、C:\Program Files (x86)\AutoIt3にインストールしています。 >環境変数でパスを切ってもいません。 こっちはxp環境なんで違うのかな?と思い、念のため再度、外変を実行してみると、 「JW_CADでは読み込めないファイルです」と、ダイアログが出て終了してしまいまいました。 色々とやってみても解決しないので、ファイル名半角スペース対応の方で.batを作ってみたところ、 ちゃんと実行、終了しました。 そこで、AUTOIT3をC:\Program Files にインストールし直し環境変数のパスも消してみてテストしたところ、 同じように実行、終了できました。 どーも、私の思い違いだったようです (^^ゞ 前回うまくいった理由は、ファイル名に半角スペースが無かったからだと思います。 -- CMN v0.61aβ -- |