Indexへ
(22684)//【22639】→(22642)
------------------------
【タイトル】円弧・曲線までの一括伸縮
【記事番号】 22639 (*)
【 日時 】07/07/26 11:55
【 発言者 】たつ

こんにちは。
円弧や曲線を基準線にして、複数の線を一括で伸縮するにはどうしたらよいのでしょうか?
直線を基準線にする方法はわかるのですが・・・
ご指導お願い致します。


Indexへ
(22639)←【22642】→(22643)
------------------------
【タイトル】Re(1):円弧・曲線までの一括伸縮
【記事番号】 22642 (22639)
【 日時 】07/07/26 13:18
【 発言者 】鈴木

▼たつさん:
>こんにちは。
>円弧や曲線を基準線にして、複数の線を一括で伸縮するにはどうしたらよいのでしょうか?
>直線を基準線にする方法はわかるのですが・・・
>ご指導お願い致します。

●確か要望があって、コジマさんが外変を作って下さったと思います。
曲線への一括伸縮という外変ですが、リードミーが添付されていないので不明です。
検索エンジンで検索できると思います。


Indexへ
(22642)←【22643】→(22644)
------------------------
【タイトル】Re(2):円弧・曲線までの一括伸縮
【記事番号】 22643 (22642)
【 日時 】07/07/26 14:24
【 発言者 】たつ

▼鈴木さん:

>●確か要望があって、コジマさんが外変を作って下さったと思います。
>曲線への一括伸縮という外変ですが、リードミーが添付されていないので不明です。
>検索エンジンで検索できると思います。

ありがとうございます。
探してみましたがこれでしょうか?
http://www.jwcad.net/log/infox3/infox3-0507-12/thread2922.htm

コジマさんの外変を試してみましたが、
選択範囲の確定をしても、図形に変化がありません。
mswin32 版 Rubyが必要ということですが、そのインストールがうまくいってないのかもしれません。
もう少し研究しようと思います。
ありがとうございました。


Indexへ
(22643)←【22644】→(22645)
------------------------
【タイトル】Re(3):円弧・曲線までの一括伸縮
【記事番号】 22644 (22643)
【 日時 】07/07/26 14:30
【 発言者 】スター

▼たつさん:
>ありがとうございます。
>探してみましたがこれでしょうか?
>http://www.jwcad.net/log/infox3/infox3-0507-12/thread2922.htm
>
>コジマさんの外変を試してみましたが、
>選択範囲の確定をしても、図形に変化がありません。
>mswin32 版 Rubyが必要ということですが、そのインストールがうまくいってないのかもしれません。

私もそのログを見ましたが、スクリプトの記述におかしいところが見られます。

以前にもあった事ですが過去ログになったスクリプトが壊れて記述されている場合がたびたびありました。


Indexへ
(22644)←【22645】→(22648)
------------------------
【タイトル】Re(3):円弧・曲線までの一括伸縮
【記事番号】 22645 (22643)
【 日時 】07/07/26 14:42
【 発言者 】コジマ

▼たつさん:
>コジマさんの外変を試してみましたが、
>選択範囲の確定をしても、図形に変化がありません。
>mswin32 版 Rubyが必要ということですが、そのインストールがうまくいってないのかもしれません。

スクリプトファイル(ex_l_pl.rb)を以下の文と差し替えてください。
(曲線までの一括伸縮です)


include Math
#sen1の線上とsen2の延長線上の交点を返す
def sen_sen_kouten3(sen1,sen2)
    sen1x=sen1[2]-sen1[0]
    sen1y=sen1[3]-sen1[1]
    sen1xy=sqrt(sen1x**2+sen1y**2)
    sen1_arg=atan2(sen1y,sen1x)
    x1_1=sen1[0]
    x1_2=sen1[0]+sen1xy
    y1_1=sen1[1]
    y1_2=sen1[1]

    x=sen2[0]-sen1[0]
    y=sen2[1]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_1=sen1[0]+xy*cos(henkaku)
    y2_1=sen1[1]+xy*sin(henkaku)

    x=sen2[2]-sen1[0]
    y=sen2[3]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_2=sen1[0]+xy*cos(henkaku)
    y2_2=sen1[1]+xy*sin(henkaku)

    x=x2_2-x2_1
    y=y2_2-y2_1
    delta=y/x

    y=y1_1-y2_1
    dx=y/delta

    kouten_x=x2_1+dx
    kouten_y=y1_1

    if x1_1kouten_x
        x=kouten_x-x1_1
        kouten_xt=x1_1+x*cos(sen1_arg)
        kouten_yt=y1_1+x*sin(sen1_arg)

        return [kouten_xt,kouten_yt]
    else
        return nil
    end
end

#線と線の交点を返す(延長線上は含まない)

def sen_sen_kouten(sen1,sen2)


    sen1x=sen1[2]-sen1[0]
    sen1y=sen1[3]-sen1[1]
    sen1xy=sqrt(sen1x**2+sen1y**2)
    sen1_arg=atan2(sen1y,sen1x)
    x1_1=sen1[0]
    x1_2=sen1[0]+sen1xy
    y1_1=sen1[1]
    y1_2=sen1[1]

    x=sen2[0]-sen1[0]
    y=sen2[1]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_1=sen1[0]+xy*cos(henkaku)
    y2_1=sen1[1]+xy*sin(henkaku)

    x=sen2[2]-sen1[0]
    y=sen2[3]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_2=sen1[0]+xy*cos(henkaku)
    y2_2=sen1[1]+xy*sin(henkaku)

    x=x2_2-x2_1
    y=y2_2-y2_1
    delta=y/x

    if ika3(y2_1)>=ika3(y1_1) &&
        ika3(y2_2)<=ika3(y1_1) or
        ika3(y2_1)<=ika3(y1_1) &&
        ika3(y2_2)>=ika3(y1_1)

        y=y1_1-y2_1
        dx=y/delta
        kouten_x=x2_1+dx
        kouten_y=y1_1

        if kouten_x>=x1_1 && kouten_x<=x1_2
            x=kouten_x-x1_1
            y=kouten_y-y1_1
            xy=sqrt(x**2+y**2)
            kouten_xt=x1_1+xy*cos(sen1_arg)
            kouten_yt=y1_1+xy*sin(sen1_arg)

            return [kouten_xt,kouten_yt]
        end
    end
end
def ika3(x)
    a=(((x.to_f)*1000).to_i/1000.to_f)

    return a
end

#範囲の内(true)外(false)を返す
def area(x,y)
    hn=[]
    open("temp.txt","r"){|f|
    while line=f.gets
        xy =line.split
        if xy[0] =~ /^hn/
            hnx1=xy[1].to_f
            hny1=xy[2].to_f
            hnx2=xy[3].to_f
            hny2=xy[4].to_f

            hn<<[hnx1,hny1,hnx1,hny2]
            hn<<[hnx1,hny2,hnx2,hny2]
            hn<<[hnx2,hny2,hnx2,hny1]
            hn<<[hnx2,hny1,hnx1,hny1]
        end
    end
    }
    zahyo=[]
    hn.each{|item|zahyo<
    if zahyo.size==1 or zahyo.size>1 && zahyo.size%2==1
        return true
    else
        return false
    end
end

k_sen=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^[^\d,-]/
        kyokusen=xy[0]
    end
    if xy[0]=~/^\d|^-/
        if kyokusen=="pl"
            xy.collect!{|item|item.to_f}
            k_sen<        end
    end
end

if k_sen.size>0

puts "hd"
open("temp.txt","r"){|f|
    while line=f.gets
        xy=line.split
        if xy[0]=~/^hq/
        elsif xy[0]=~/^[^\d,-]/
            kyokusen2=xy[0]
            print line
        elsif xy[0]=~/^\d|^-/
            kouten=[]
            xy.collect!{|item|item.to_f}
            n=0
            if kyokusen2!="pl"

                k_sen.each{|item|
                    if sen_sen_kouten3(item,xy) !=nil

                        x1=sen_sen_kouten3(item,xy)[0]
                        y1=sen_sen_kouten3(item,xy)[1]

                        if xy[0]==xy[2]
                            if area(xy[2],xy[3]) && area(xy[0],xy[1])==false
                                kouten<< [x1,y1,xy[0],xy[1]]
                            elsif area(xy[0],xy[1]) && area(xy[2],xy[3])==false
                                kouten<< [x1,y1,xy[2],xy[3]]
                            else
                                kouten<< [x1,y1,xy[2],xy[3]] if (xy[1]-y1).abs<(xy[3]-y1).abs;kouten<< [x1,y1,xy[0],xy[1]] if (xy[1]-y1).abs>(xy[3]-y1).abs
                            end


                        else
                            if area(xy[2],xy[3]) && area(xy[0],xy[1])==false
                                kouten<< [x1,y1,xy[0],xy[1]]
                            elsif area(xy[0],xy[1]) && area(xy[2],xy[3])==false
                                kouten<< [x1,y1,xy[2],xy[3]]
                            else
                                kouten<< [x1,y1,xy[2],xy[3]] if (xy[0]-x1).abs<(xy[2]-x1).abs;kouten<< [x1,y1,xy[0],xy[1]] if (xy[0]-x1).abs>(xy[2]-x1).abs
                            end
                        end
                        n+=1
                    end
                }

                if kouten.size>1
                    kouten2=[]
                    kouten.each{|item|
                    kouten2<                    itemx=item[2]-item[0]
                    itemy=item[3]-item[1]
                    itemxy=sqrt(itemx**2+itemy**2)
                    kouten2x=kouten2[0][2]-kouten2[0][0]
                    kouten2y=kouten2[0][3]-kouten2[0][1]
                    kouten2xy=sqrt(kouten2x**2+kouten2y**2)
                    kouten2<                    }
                    puts kouten2[-1].join("\s")
                else
                    puts kouten[0].join("\s") if n>0
                end
                print line if n==0
            else
                print line
            end
        else
            print line
        end
    end
}
else
printf("h#曲線がありません\n")
end


Indexへ
(22645)←【22648】→(22646)
------------------------
【タイトル】Re(4):円弧・曲線までの一括伸縮
【記事番号】 22648 (22645)
【 日時 】07/07/26 14:52
【 発言者 】たつ

▼スターさん コジマさん:

ありがとうございます。
rbファイル入れ替えましたが、やはりうまくいきません。
mswin32 版 Rubyのインストールの方法がよくわからないのですが、
どこか参考になるサイトはありますか?


Indexへ
(22648)←【22646】→(22647)
------------------------
【タイトル】Re(1):円弧・曲線までの一括伸縮
【記事番号】 22646 (22639)
【 日時 】07/07/26 14:49
【 発言者 】コジマ

▼たつさん:
>こんにちは。
>円弧や曲線を基準線にして、複数の線を一括で伸縮するにはどうしたらよいのでしょうか?
>直線を基準線にする方法はわかるのですが・・・
>ご指導お願い致します。

円弧までの一括伸縮

◎スクリプトファイル(ファイル名 ex_l_ci.rb)

include Math
#enとsen2の延長線上の交点を返す
#3円と線の延長線上の交点角度の配列を返す
def sen_en_kakudo2(en,sen)

    kakudo=[]

    if en.size==4
        x=en[1]
        y=en[2]
        r=en[3]
        en[4]=0
        en[5]=0
        en[6]=1
        en[7]=0
    else
        x=en[1]
        y=en[2]
        r=en[3]
    end

    hen=en[6]
    ziku=en[7]
    ziku_arg=ziku*2*PI/360

    sen_x=sen[2]-sen[0]
    sen_y=sen[3]-sen[1]
    sen_kakudo1=atan2(sen_y,sen_x)

    en_x1=x-sen[0]
    en_y1=y-sen[1]
    en_x2=sen[2]-x
    en_y2=sen[3]-y
    en_xy1=sqrt(en_x1**2+en_y1**2)
    en_xy2=sqrt(en_x2**2+en_y2**2)
    en_kakudo1=atan2(en_y1,en_x1)
    en_kakudo2=atan2(en_y2,en_x2)

    sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg)
    sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen
    sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg)
    sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen

    if sen_x1>sen_x2
        sen_x1,sen_x2=sen_x2,sen_x1
        sen_y1,sen_y2=sen_y2,sen_y1
    elsif sen_x1==sen_x2
        if sen_y1>sen_y2
            sen_y1,sen_y2=sen_y2,sen_y1
        end
    end

    senx=(sen_x2-sen_x1)
    seny=(sen_y2-sen_y1)
    sen_kakudo2=atan2(seny,senx)

    en_kakudo2_1=atan2((y-sen_y1),x-sen_x1)
    en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2)
    en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2)
    henkaku=sen_kakudo2-en_kakudo2_1
    y1=en_xy2_1*sin(henkaku)

    if r>y1.abs

        x1=sqrt(r**2-y1**2)
        kakudo1=atan2(y1,-x1)
        kakudo2=atan2(y1,x1)

        kakudo<<(kakudo1+sen_kakudo2)*360/(2*PI)
        kakudo<<(kakudo2+sen_kakudo2)*360/(2*PI)
    end

    if kakudo.size!=0

        kakudo.collect!{|item|if item<0
                        360+item
                    else
                        item
                    end}

        kakudo.delete_if{|item|if en[4]                        en[4]>item && en[5]>item or en[4]                    elsif en[4]>en[5]
                        en[4]>item && en[5]                    end}

        return kakudo
    end
end
#5線と円の交点座標の配列を返す(扁平率・軸角考慮)
def sen_en_zahyo(sen,en)

    zahyo=[]

    if en.size==4
        x=en[1]
        y=en[2]
        r=en[3]
        en[4]=0
        en[5]=0
        en[6]=1
        en[7]=0
    else
        x=en[1]
        y=en[2]
        r=en[3]
    end
    hen=en[6]
    ziku=en[7]

    kakudo=sen_en_kakudo2(en,sen)

    if kakudo
        kakudo.each{|item| rajian=item*2*PI/360
            ziku_arg=ziku*2*PI/360
            ax=r*cos(rajian)
            ay=r*sin(rajian)*hen
            axy=sqrt(ax**2+ay**2)
            arg=atan2(ay,ax)

            axt=x+axy*cos(arg+ziku_arg)
            ayt=y+axy*sin(arg+ziku_arg)
            zahyo<<[axt,ayt]
        }
    end

    return zahyo
end

#線と線の交点を返す(延長線上は含まない)
def sen_sen_kouten(sen1,sen2)

    sen1x=sen1[2]-sen1[0]
    sen1y=sen1[3]-sen1[1]
    sen1xy=sqrt(sen1x**2+sen1y**2)
    sen1_arg=atan2(sen1y,sen1x)
    x1_1=sen1[0]
    x1_2=sen1[0]+sen1xy
    y1_1=sen1[1]
    y1_2=sen1[1]

    x=sen2[0]-sen1[0]
    y=sen2[1]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_1=sen1[0]+xy*cos(henkaku)
    y2_1=sen1[1]+xy*sin(henkaku)

    x=sen2[2]-sen1[0]
    y=sen2[3]-sen1[1]
    xy=sqrt(x**2+y**2)
    arg=atan2(y,x)
    henkaku=arg-sen1_arg
    x2_2=sen1[0]+xy*cos(henkaku)
    y2_2=sen1[1]+xy*sin(henkaku)

    x=x2_2-x2_1
    y=y2_2-y2_1
    delta=y/x

    if (y2_1)>=(y1_1) && (y2_2)<(y1_1) or
        (y2_1)<(y1_1) && (y2_2)>=(y1_1)

        y=y1_1-y2_1
        dx=y/delta
        kouten_x=x2_1+dx
        kouten_y=y1_1

        if kouten_x>=x1_1 && kouten_xkouten_x>x1_1 && kouten_x<=x1_2
            x=kouten_x-x1_1
            y=kouten_y-y1_1
            xy=sqrt(x**2+y**2)
            kouten_xt=x1_1+xy*cos(sen1_arg)
            kouten_yt=y1_1+xy*sin(sen1_arg)

            return [kouten_xt,kouten_yt]
        else
            nil
        end
    end
end


#範囲の内(true)外(false)を返す
def area(x,y)
    hn=[]
    open("temp.txt","r"){|f|
    while line=f.gets
        xy =line.split
        if xy[0] =~ /^hn/
            hnx1=xy[1].to_f
            hny1=xy[2].to_f
            hnx2=xy[3].to_f
            hny2=xy[4].to_f

            hn<<[hnx1,hny1,hnx1,hny2]
            hn<<[hnx1,hny2,hnx2,hny2]
            hn<<[hnx2,hny2,hnx2,hny1]
            hn<<[hnx2,hny1,hnx1,hny1]
        end
    end
    }
    zahyo=[]
    hn.each{|item|zahyo<
    if zahyo.size==1 or zahyo.size>1 && zahyo.size%2==1
        return true
    else
        return false
    end
end

en=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^ci/
        xy.collect!{|item|item.to_f}
        en<    end
end

if en.size>0

puts "hd"
open("temp.txt","r"){|f|
    while line=f.gets
        xy=line.split
        if xy[0]=~/^hq/

        elsif xy[0]=~/^\d|^-/
            kouten=[]
            xy.collect!{|item|item.to_f}
            n=0

            en.each{|item|
                if sen_en_zahyo(xy,item).size>0
                    sen_en_zahyo(xy,item).each{|item2|
                        x1=item2[0]
                        y1=item2[1]

                        if xy[0]==xy[2]
                            if area(xy[2],xy[3]) && area(xy[0],xy[1])==false
                                kouten<< [x1,y1,xy[0],xy[1]]
                            elsif area(xy[0],xy[1]) && area(xy[2],xy[3])==false
                                kouten<< [x1,y1,xy[2],xy[3]]
                            else
                                kouten<< [x1,y1,xy[2],xy[3]] if (xy[1]-y1).abs<(xy[3]-y1).abs;kouten<< [x1,y1,xy[0],xy[1]] if (xy[1]-y1).abs>(xy[3]-y1).abs
                            end
                        else
                            if area(xy[2],xy[3]) && area(xy[0],xy[1])==false
                                kouten<< [x1,y1,xy[0],xy[1]]
                            elsif area(xy[0],xy[1]) && area(xy[2],xy[3])==false
                                kouten<< [x1,y1,xy[2],xy[3]]
                            else
                                kouten<< [x1,y1,xy[2],xy[3]] if (xy[0]-x1).abs<(xy[2]-x1).abs;kouten<< [x1,y1,xy[0],xy[1]] if (xy[0]-x1).abs>(xy[2]-x1).abs
                            end
                        end
                        n+=1
                    }
                end
            }

            if kouten.size>1
                kouten2=[]
                kouten.each{|item|
                    kouten2<                    itemx=item[2]-item[0]
                    itemy=item[3]-item[1]
                    itemxy=sqrt(itemx**2+itemy**2)
                    kouten2x=kouten2[0][2]-kouten2[0][0]
                    kouten2y=kouten2[0][3]-kouten2[0][1]
                    kouten2xy=sqrt(kouten2x**2+kouten2y**2)
                    kouten2<                }
                puts kouten2[-1].join("\s")
            else
                puts kouten[0].join("\s") if n>0
            end
            print line if n==0

        else
            print line
        end
    end
}
else
    printf("h#円がありません\n")
end


Indexへ
(22646)←【22647】→(22650)
------------------------
【タイトル】Re(2):円弧・曲線までの一括伸縮
【記事番号】 22647 (22646)
【 日時 】07/07/26 14:52
【 発言者 】コジマ

円弧までの一括伸縮

◎バッチファイル(ファイル名 ex_l_ci.bat)

@REM 直線を円・円弧との交点まで一括伸縮
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #ht40
REM #hp
REM #zz
REM #zw
REM #h2
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks ex_l_ci.rb temp.txt > jwc_temp.txt


Indexへ
(22647)←【22650】→(22665)
------------------------
【タイトル】Re(1):円弧・曲線までの一括伸縮
【記事番号】 22650 (22639)
【 日時 】07/07/26 15:31
【 発言者 】たつ

▼ご回答いただいた皆さんへ

ありがとうございました。
どうにか動作するようになりました。
大変助かりました。
曲線も円弧でも同じなのですが、
範囲確定させた後に、一瞬DOS版のような黒い画面が現れるのですが、
これをなくすことは出来ますか?
作図に影響はないのですが、気になるので・・・
もしわかる方いらっしゃったら、教えてください。
宜しくお願い致します。


Indexへ
(22650)←【22665】→(22679)
------------------------
【タイトル】外部変形時のDos窓の消去方法
【記事番号】 22665 (22650)
【 日時 】07/07/27 02:39
【 発言者 】Den
【 リンク 】http://den.konjiki.jp/



▼たつさん:
以下の頁に掲載しています。

DenのJww&AutoCAD入門?
http://been-den.hp.infoseek.co.jp/

Jww外部変形 → 9.外部変形時のDos窓の消去方法 へ進んで下さい。


Indexへ
(22665)←【22679】//(22640)
------------------------
【タイトル】Re(1):外部変形時のDos窓の消去方法
【記事番号】 22679 (22665)
【 日時 】07/07/27 10:33
【 発言者 】たつ

▼Denさん:

快適になりました。
ありがとうございます。