過去ログ

                                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

 ───────────────────────────────────────  ■題名 : Re: オブジェクト範囲の表示  ■名前 : 外注図面屋  ■日付 : 15/09/30(水) 13:08  -------------------------------------------------------------------------
   kojimaさん、こんにちは。

やってみましたが、JW_CADでは読み込めないファイルです、とダイアログが出ます。

連続閲覧の外部変形は動作するので、ruby と autoit は動作してると思います。

-- CMN v0.61aβ --

 ───────────────────────────────────────  ■題名 : Re(1): オブジェクト範囲の表示  ■名前 : kojima  ■日付 : 15/09/30(水) 14:06  -------------------------------------------------------------------------
   ▼外注図面屋さん:
>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

 ───────────────────────────────────────  ■題名 : Re2: オブジェクト範囲の表示  ■名前 : 外注図面屋  ■日付 : 15/09/30(水) 16:36  -------------------------------------------------------------------------
   kojimaさん、こんにちは。

autoit3をruby同様にc:\にインストールし直して、
環境変数でパスを切ったらダイアログは出なくなりましたけど、それでいいのでしょうか?
何か、一旦JWが終了して、また立ち上がって終わりですけど。

用紙枠範囲外に不要な線データ等があれば消しているのでしょうか?

-- CMN v0.61aβ --

 ───────────────────────────────────────  ■題名 : Re(1):Re2: オブジェクト範囲の表示  ■名前 : kojima  ■日付 : 15/09/30(水) 16:53  -------------------------------------------------------------------------
   ▼外注図面屋さん:
>kojimaさん、こんにちは。
>
>autoit3をruby同様にc:\にインストールし直して、
>環境変数でパスを切ったらダイアログは出なくなりましたけど、それでいいのでしょうか?
>何か、一旦JWが終了して、また立ち上がって終わりですけど。
>
>用紙枠範囲外に不要な線データ等があれば消しているのでしょうか?
>
>-- CMN v0.61aβ --

用紙枠範囲外にデータがなく、用紙範囲に四角形が作図されていれば
中心座標0,0 倍率1 用紙範囲表示で再度図面を開きます。

用紙範囲枠に四角形が作図されていなければ、用紙内のデータを全て表示する
中心座標と倍率で図面を開きます。
用紙枠外のみにデータがある場合は、用紙外のデータを全て表示する
中心座標と倍率で図面を開きます。(用紙枠は表示されません)

 ───────────────────────────────────────  ■題名 : Re2: Re2: オブジェクト範囲の表示  ■名前 : 外注図面屋  ■日付 : 15/09/30(水) 18:08  -------------------------------------------------------------------------
   kojimaさん、こんにちは。

ためしに、用紙枠外に線を一本引いてやってみたところ、
枠外の線も見えるように大きめに表示して立ち上がってきました (^_^)v

-- CMN v0.61aβ --

 ───────────────────────────────────────  ■題名 : Re3: オブジェクト範囲の表示  ■名前 : 外注図面屋  ■日付 : 15/09/30(水) 18:58  -------------------------------------------------------------------------
   見ている人が勘違いしないように訂正。

>autoit3をruby同様にc:\にインストールし直して、
は、AutoIt3を C:\に適当なフォルダーを作ってその中にインストールし直して、です。

間違っても C:\で展開しないでください。

-- CMN v0.61aβ --

 ───────────────────────────────────────  ■題名 : Re(1):Re3: オブジェクト範囲の表示  ■名前 : いっち  ■日付 : 15/10/06(火) 15:39  -------------------------------------------------------------------------
   >見ている人が勘違いしないように訂正。

私は、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などにインストールするメリットも無いとは言いませんが、
わざわざインストールし直すほどのものでは無い気がしています。

 ───────────────────────────────────────  ■題名 : Re(2):Re3: オブジェクト範囲の表示  ■名前 : kojima  ■日付 : 15/10/06(火) 16:21  -------------------------------------------------------------------------
   ▼いっちさん:
>>見ている人が勘違いしないように訂正。
>
>私は、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 # 追加
>
>とすれば開けるようです。
>

ここは手抜きでした。

 ───────────────────────────────────────  ■題名 : Re(3):Re3: オブジェクト範囲の表示  ■名前 : いっち  ■日付 : 15/10/06(火) 16:52  -------------------------------------------------------------------------
   ▼kojimaさん:
こんにちは。
> start ruby -x %~f0 temp.txt
> だと正常に動作しますが
> start /wait ruby -x %~f0 temp.txt
> や
> ruby -x %~f0 temp.txt
> だと正常に動作しなはず?
> (スクリプトが終了するまでバッチファイルは終了しない)
3通り全て動作させてみました。

> (スクリプトが終了するまでバッチファイルは終了しない)
というか、パソコンが応答していない旨のメッセージを出しました。

> このタイプの外変はstartコマンドが重要です。
それは、そうですね。

 ───────────────────────────────────────  ■題名 : Re2: Re3: オブジェクト範囲の表示  ■名前 : 外注図面屋  ■日付 : 15/10/07(水) 11:58  -------------------------------------------------------------------------
   いっちさん、こんにちは。

>私は、C:\Program Files (x86)\AutoIt3にインストールしています。
>環境変数でパスを切ってもいません。

こっちはxp環境なんで違うのかな?と思い、念のため再度、外変を実行してみると、
「JW_CADでは読み込めないファイルです」と、ダイアログが出て終了してしまいまいました。

色々とやってみても解決しないので、ファイル名半角スペース対応の方で.batを作ってみたところ、
ちゃんと実行、終了しました。

そこで、AUTOIT3をC:\Program Files にインストールし直し環境変数のパスも消してみてテストしたところ、
同じように実行、終了できました。

どーも、私の思い違いだったようです (^^ゞ
前回うまくいった理由は、ファイル名に半角スペースが無かったからだと思います。


-- CMN v0.61aβ --

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 104