Indexへ
(12542)//【12530】→(12534)
------------------------
【タイトル】線の一括伸縮
【記事番号】 12530 (*)
【 日時 】06/06/03 12:52
【 発言者 】いんぎー sekkei@h-bridge.co.jp

多量の線の長さを交差する線まで一括で揃える作図をする場合、伸縮コマンドの一括処理ボタンを押して処理しています。交差する線が曲線の場合、上記のコマンドは使えませんので曲線を右クリックで指示してから一本づつ長さを揃えているのですが、もう少しスムースに処理する方法をご存知の方、いらっしゃいましたら教えて下さい。


Indexへ
(12530)←【12534】→(12535)
------------------------
【タイトル】Re(1):線の一括伸縮
【記事番号】 12534 (12530)
【 日時 】06/06/03 16:19
【 発言者 】鈴木

▼いんぎーさん:
>多量の線の長さを交差する線まで一括で揃える作図をする場合、伸縮コマンドの一括処理ボタンを押して処理しています。交差する線が曲線の場合、上記のコマンドは使えませんので曲線を右クリックで指示してから一本づつ長さを揃えているのですが、もう少しスムースに処理する方法をご存知の方、いらっしゃいましたら教えて下さい。

●この掲示板常連のコジマさんという方が作られた外部変形ソフトで可能です。
外部変形ソフトは使ったことがありますか?
ご本人からのコメントがあるか待ちましょう。


Indexへ
(12534)←【12535】→(12537)
------------------------
【タイトル】Re(2):線の一括伸縮
【記事番号】 12535 (12534)
【 日時 】06/06/03 17:24
【 発言者 】いんぎー sekkei@h-bridge.co.jp

鈴木さん

ご回答ありがとうございます。なるほど、外部変形ツールですか。早速検索して見ます。今まで袋文字や三斜等ぐらいしか使ってなかったですがいろいろ探してみます。


Indexへ
(12535)←【12537】→(12546)
------------------------
【タイトル】Re(3):線の一括伸縮
【記事番号】 12537 (12535)
【 日時 】06/06/03 19:13
【 発言者 】コジマ

▼いんぎーさん:
>ご回答ありがとうございます。なるほど、外部変形ツールですか。早速検索して見ます。今まで袋文字や三斜等ぐらいしか使ってなかったですがいろいろ探してみます。

その外部変形は、この掲示板にしか公開していません。
以下、曲線までの一括伸縮の外部変形です。

尚、この外部変形の実行には mswin32 版 Ruby のインストールが必要です。
以下で入手してください。
http://www61.tok2.com/home2/gravelroad/tips/inst_msw.html

◎バッチファイル(ファイル名 ex_l_pl.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_pl.rb temp.txt > jwc_temp.txt

◎スクリプトファイル(ファイル名 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へ
(12537)←【12546】//(12540)
------------------------
【タイトル】Re(4):線の一括伸縮
【記事番号】 12546 (12537)
【 日時 】06/06/05 10:07
【 発言者 】いんぎー sekkei@h-bridge.co.jp

コジマさん:
早速インストールしてみます。ありがとうございました。