Indexへ
(3093)//【2922】→(2936)
------------------------
【タイトル】一括伸縮について
【記事番号】 2922 (*)
【 日時 】05/08/19 17:23
【 発言者 】N忠

多数の直線を、ある曲線に対して一括で伸縮させる方法は有るでしょうか?


Indexへ
(2922)←【2936】→(2937)
------------------------
【タイトル】Re: 一括伸縮について
【記事番号】 2936 (2922)
【 日時 】05/08/21 14:13
【 発言者 】wakui wakui@v003.vaio.ne.jp_NoVirus

N忠さん、こんにちは。

一括伸縮の対象は直線のみ、と理解しています。

ただ外部変形を使えば円弧に対しては可能です。(その他の曲線は不可かと)

http://www.page.sannet.ne.jp/kiyoaki-oikawa/index.htm

の中の「線端処理」です。

作者様ありがとうございます。円、円弧でというならお試しください。


jww4.09d  ■コマント゛選択をAUTOモート゛クロックメニュー
winXP_HE SP1 sony PCG-Z1VE
-- CMN v0.49kβ --


Indexへ
(2936)←【2937】→(2938)
------------------------
【タイトル】Re(1): 一括伸縮について
【記事番号】 2937 (2936)
【 日時 】05/08/21 17:08
【 発言者 】N忠

wakuiさん、有難う御座います。

御紹介戴いた「外部変形」を、早速試して見ました。

円弧に対してのみですが、作図能率を上げるのに十分役立つと思います。

wakuiさん、並びに外変作者様に御礼申し上げます。


Indexへ
(2937)←【2938】→(2939)
------------------------
【タイトル】Re(1):オリジナル
【記事番号】 2938 (2922)
【 日時 】05/08/21 20:42
【 発言者 】コジマ

▼N忠さん:
>多数の直線を、ある曲線に対して一括で伸縮させる方法は有るでしょうか?

以下、オリジナル外変です。
この外変の実行には、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 #h1
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)
    if sen1[0]>sen1[2]
        sen1[0],sen1[2]=sen1[2],sen1[0]
        sen1[1],sen1[3]=sen1[3],sen1[1]
    elsif sen1[0]==sen1[2]
        if sen1[1]>sen1[3]
            sen1[1],sen1[3]=sen1[3],sen1[1]
        end
    end

    if sen2[0]>sen2[2]
        sen2[0],sen2[2]=sen2[2],sen2[0]
        sen2[1],sen2[3]=sen2[3],sen2[1]
    elsif sen2[0]==sen2[2]
        if sen2[1]>sen2[3]
            sen2[1],sen2[3]=sen2[3],sen2[1]
        end
    end

    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


k_sen=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^pl|^\#/
        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]=~/^pl|^#/
            kyokusen2=xy[0]
            print line
        elsif xy[0]=~/^\d|^-/
            kouten=[]
            xy.collect!{|item|item.to_f}
            n=0
            if kyokusen2=="\#"

                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]
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[1]-y1).abs>(xy[3]-y1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[1]-y1).abs<(xy[3]-y1).abs
                        else
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[0]-x1).abs>(xy[2]-x1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[0]-x1).abs<(xy[2]-x1).abs

                        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")

                end
                print line if n==0
            else
                print line
            end
        else
            print line
        end
    end
}
else
printf("h#曲線がありません\n")
end


Indexへ
(2938)←【2939】→(2940)
------------------------
【タイトル】Re2: オリジナル
【記事番号】 2939 (2938)
【 日時 】05/08/21 22:32
【 発言者 】wakui wakui@v003.vaio.ne.jp_NoVirus

コジマさん、こんばんは。

外変公開、ありがとうございました。曲線への一括伸縮、確認しました。

あと、対象直線を全範囲選択しないと実行できないかと思いますが、
その直線の一部でも範囲にあれば実行される、という方が私の場合
図面の中で作業しやすいように思いました。

ありがとうございました。


jww4.09d  ■コマント゛選択をAUTOモート゛クロックメニュー
winXP_HE SP1 sony PCG-Z1VE
-- CMN v0.49kβ --


Indexへ
(2939)←【2940】→(2941)
------------------------
【タイトル】Re(1):Re2: オリジナル
【記事番号】 2940 (2939)
【 日時 】05/08/21 23:25
【 発言者 】siegel

▼wakuiさん:

範囲選択時、少しでも「枠」に架かれば、(LL) (RR) で選択できます。


Indexへ
(2940)←【2941】→(3035)
------------------------
【タイトル】Re2: Re2: オリジナル
【記事番号】 2941 (2940)
【 日時 】05/08/21 23:41
【 発言者 】wakui wakui@v003.vaio.ne.jp_NoVirus

siegelさん、こんばんは。

ご指摘ありがとうございました。 その通りでした。

完動です。

コシ゛マさん、申し訳ありませんでした。


jww4.09d  ■コマント゛選択をAUTOモート゛クロックメニュー
winXP_HE SP1 sony PCG-Z1VE
-- CMN v0.49kβ --


Indexへ
(2941)←【3035】→(3042)
------------------------
【タイトル】公開有難う御座います。
【記事番号】 3035 (2938)
【 日時 】05/08/25 11:03
【 発言者 】N忠

コジマさん:「オリジナル外変」の公開有難う御座います。

残念ながら、この外変のインストールについては、不勉強で手順が解りません。

せっかくの御紹介を無駄にして済みません。

また勉強してから、挑戦してみます。

(初心者用の説明であれば解るかも知れません。)


Indexへ
(3035)←【3042】→(3054)
------------------------
【タイトル】Re(1):公開有難う御座います。
【記事番号】 3042 (3035)
【 日時 】05/08/25 13:41
【 発言者 】コジマ

▼N忠さん:
>残念ながら、この外変のインストールについては、不勉強で手順が解りません。

mswin32 版 Ruby のインストールについては、以下のサイトを参照してください。
http://www61.tok2.com/home2/gravelroad/tips/inst_msw.html

以下は、外変の作り方の説明です。
(OS WIN98 の場合は、メモ帳ではなく、ワードパッドを使用してください。)

1、まず、メモ帳を開いてください。
(スタート→すべてのプログラム→アクセサリ→メモ帳)

2、以下の文章をコピーして、メモ帳に貼り付ける。


@REM 直線を曲線との交点まで一括伸縮
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #ht40
REM #h1
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks ex_l_pl.rb temp.txt > jwc_temp.txt

3、「編集」→「置換」
(「検索する文字列」に全角スペース、「置換後の文字列」に半角スペースを入力して、「全て置換」をクリック)

4、「ファイル」→「名前をつけて保存」
(ファイル名を ex_l_pl.bat と入力して保存)


5、「ファイル」→「新規」

6、以下の文章をコピーして、メモ帳に貼り付ける。

include Math
#sen1の線上とsen2の延長線上の交点を返す
def sen_sen_kouten3(sen1,sen2)
    if sen1[0]>sen1[2]
        sen1[0],sen1[2]=sen1[2],sen1[0]
        sen1[1],sen1[3]=sen1[3],sen1[1]
    elsif sen1[0]==sen1[2]
        if sen1[1]>sen1[3]
            sen1[1],sen1[3]=sen1[3],sen1[1]
        end
    end

    if sen2[0]>sen2[2]
        sen2[0],sen2[2]=sen2[2],sen2[0]
        sen2[1],sen2[3]=sen2[3],sen2[1]
    elsif sen2[0]==sen2[2]
        if sen2[1]>sen2[3]
            sen2[1],sen2[3]=sen2[3],sen2[1]
        end
    end

    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


k_sen=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^pl|^\#/
        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]=~/^pl|^#/
            kyokusen2=xy[0]
            print line
        elsif xy[0]=~/^\d|^-/
            kouten=[]
            xy.collect!{|item|item.to_f}
            n=0
            if kyokusen2=="\#"

                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]
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[1]-y1).abs>(xy[3]-y1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[1]-y1).abs<(xy[3]-y1).abs
                        else
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[0]-x1).abs>(xy[2]-x1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[0]-x1).abs<(xy[2]-x1).abs

                        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")

                end
                print line if n==0
            else
                print line
            end
        else
            print line
        end
    end
}
else
printf("h#曲線がありません\n")
end


7、「編集」→「置換」
(「検索する文字列」に全角スペース、「置換後の文字列」に半角スペースを入力して、「全て置換」をクリック)

8、「ファイル」→「名前をつけて保存」
(ファイル名を ex_l_pl.rb と入力して保存)

以上で、外変の作成は完了です。


Indexへ
(3042)←【3054】→(3062)
------------------------
【タイトル】Re(2):公開有難う御座います。
【記事番号】 3054 (3042)
【 日時 】05/08/25 16:19
【 発言者 】ショウブ

▼コジマさん:

横から失礼します。
拝見しておりました。
一通りやってみましたがうまく動きません。最後のクリック後、
伸縮されません。
どこか自分の手順が間違っていると思いますが教えてください。
このbatとrbはどこに置いても(保存しても)よいのですね?


Indexへ
(3054)←【3062】→(3063)
------------------------
【タイトル】Re(3):公開有難う御座います。
【記事番号】 3062 (3054)
【 日時 】05/08/25 17:04
【 発言者 】ショウブ

すみません。できました。
rbファイルに【◎スクリプトファイル(ex_l_pl.rb)】という
文字までうっかりしてコピーしておりました。

ありがたく使わせていただきます。


Indexへ
(3062)←【3063】→(3077)
------------------------
【タイトル】Re(3):公開有難う御座います。
【記事番号】 3063 (3054)
【 日時 】05/08/25 17:04
【 発言者 】コジマ

▼ショウブさん:
>▼コジマさん:
>
>横から失礼します。
>拝見しておりました。
>一通りやってみましたがうまく動きません。最後のクリック後、
>伸縮されません。

これは、範囲選択して実行する形式なので、クリックは、必要ないのですが?
(追加選択のクリックなのでしょうか?「選択確定」のクリックでしょうか?)


>どこか自分の手順が間違っていると思いますが教えてください。
>このbatとrbはどこに置いても(保存しても)よいのですね?

(batとrbは同じフォルダに置いてください。)

このままでは、原因が分からないので、バッチファイルを以下のように書き換えてください。
コマンドプロンプトにエラーメッセージが表示されます。

その内容によって原因が探れます。


@REM 直線を曲線との交点まで一括伸縮
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #ht40
REM #h2
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks ex_l_pl.rb temp.txt > jwc_temp.txt
pause


Indexへ
(3063)←【3077】→(3139)
------------------------
【タイトル】Re(4):公開有難う御座います。
【記事番号】 3077 (3063)
【 日時 】05/08/26 10:40
【 発言者 】ショウブ

▼コジマさん:
ご返事が遅くなりましてすみません。
前後しましたがクリックとは範囲確定時のことでしたが
前述のとおりできる様になりました。
どうもお手数をお掛けしました。ありがとうございました。


Indexへ
(3077)←【3139】→(3140)
------------------------
【タイトル】Re(4):公開有難う御座います。
【記事番号】 3139 (3063)
【 日時 】05/08/29 12:39
【 発言者 】N忠

コジマさんへ:

一通りやってみましたがうまく動きません。

因みに当方はこのbatとrbは「c:\jww4.05a\線端処理-2」のフォルダーに、そのままの内容で置きました。

>このままでは、原因が分からないので、バッチファイルを以下のように書き換えてください。
>コマンドプロンプトにエラーメッセージが表示されます。

「'ruby' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .」
と言うエラーメッセージが表示されます。

ご迷惑でなければ教えて戴けないでしょうか?


Indexへ
(3139)←【3140】→(3146)
------------------------
【タイトル】Re(5):公開有難う御座います。
【記事番号】 3140 (3139)
【 日時 】05/08/29 13:17
【 発言者 】コジマ

▼N忠さん:
>「'ruby' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>続行するには何かキーを押してください . . .」
>と言うエラーメッセージが表示されます。
>
>ご迷惑でなければ教えて戴けないでしょうか?


rubyがpathの通ったフォルダに展開されていません。
再度、以下を参照してください。
http://www61.tok2.com/home2/gravelroad/libraries.html

最近の解凍ソフトは、自動的にサブフォルダを作られる場合があります。
その時は、サブフォルダの中身(フォルダ・ファイル)を指定されているフォルダに移動してください。
(WIN XP なら C:\WINDOWS\system32に移動)


Indexへ
(3140)←【3146】→(3147)
------------------------
【タイトル】Re(6):公開有難う御座います。
【記事番号】 3146 (3140)
【 日時 】05/08/29 17:57
【 発言者 】N忠

▼コジマさん:
度々のサポート有難う御座います。

>rubyがpathの通ったフォルダに展開されていません。

>最近の解凍ソフトは、自動的にサブフォルダを作られる場合があります。
>その時は、サブフォルダの中身(フォルダ・ファイル)を指定されているフォルダに移動してください。

早速、サブフォルダの中身(フォルダ・ファイル)をC:\WINDOWS\system32に移動してみました。

「ex_l_pl.rb:1: warning: parenthesize argument(s) for future version
ex_l_pl.rb:1: undefined local variable or method `ex_l_pl' for main:Object (NameError)続行するには何かキーを押してください . . .」

と言うエラーメッセージが表示されます。

何処にまだ問題があるのでしょうか?


Indexへ
(3146)←【3147】→(3149)
------------------------
【タイトル】Re(7):公開有難う御座います。
【記事番号】 3147 (3146)
【 日時 】05/08/29 18:57
【 発言者 】コジマ

▼N忠さん:
>「ex_l_pl.rb:1: warning: parenthesize argument(s) for future version
>ex_l_pl.rb:1: undefined local variable or method `ex_l_pl' for main:Object (NameError)続行するには何かキーを押してください . . .」
>
>と言うエラーメッセージが表示されます。
>
>何処にまだ問題があるのでしょうか?

1行目に構文(スクリプトの中身)以外の文章がコピペされていませんか?

とりあえず1行目の文章を削除して、実行してみてください。


Indexへ
(3147)←【3149】→(3150)
------------------------
【タイトル】Re(8):公開有難う御座います。
【記事番号】 3149 (3147)
【 日時 】05/08/29 19:36
【 発言者 】N忠

コジマさん:

>1行目に構文(スクリプトの中身)以外の文章がコピペされていませんか?
>

とりあえず1行目の文章を削除しましたが、

「ruby: No such file or directory -- ex_l_pl.rb (LoadError)
続行するには何かキーを押してください . . .」

と言うエラーメッセージが表示されます。

因みに、「ex_l_pl.rb」の中身は、

一行目 include Math
二行目 #sen1の線上とsen2の延長線上の交点を返す
三行目 def sen_sen_kouten3(sen1,sen2)

となっています。


Indexへ
(3149)←【3150】→(3152)
------------------------
【タイトル】Re(9):公開有難う御座います。
【記事番号】 3150 (3149)
【 日時 】05/08/29 19:59
【 発言者 】N忠

コジマさん:前の返信Re(8)の内容を間違いました。

>1行目に構文(スクリプトの中身)以外の文章がコピペされていませんか?

とりあえず1行目の文章を削除しましたが、

「続行するには何かキーを押してください . . .」

と言うエラーメッセージが表示され、また、JWWの画面隅には、

「曲線がありません」

と言う表示が出ました。

因みに、「ex_l_pl.rb」の中身は、

一行目 include Math
二行目 #sen1の線上とsen2の延長線上の交点を返す
三行目 def sen_sen_kouten3(sen1,sen2)

となっています。


Indexへ
(3150)←【3152】→(3155)
------------------------
【タイトル】Re(10):公開有難う御座います。
【記事番号】 3152 (3150)
【 日時 】05/08/29 23:32
【 発言者 】コジマ

▼N忠さん:
>「続行するには何かキーを押してください . . .」
>
>と言うエラーメッセージが表示され、また、JWWの画面隅には、
>

エラーメッセージではありません。
バッチファイルにpauseの記述があると、
その位置で、処理が中断されます。
キーを押すと、再開されます。

>「曲線がありません」
>
>と言う表示が出ました。

曲線が作図されていない、または、曲線が選択されていません。
範囲選択のとき、曲線ごと囲むか、追加選択で曲線をクリックしてください。
(曲線が赤色表示していないと伸縮しませn)


Indexへ
(3152)←【3155】→(3157)
------------------------
【タイトル】Re(11):第一段階は動作OKです
【記事番号】 3155 (3152)
【 日時 】05/08/30 10:07
【 発言者 】N忠

コジマさん:

>範囲選択のとき、曲線ごと囲むか、追加選択で曲線をクリックしてください。

御指示通りにしましたら、動作OKでした。(^u^)

そこで、「ショウブさん」が提案された「内外伸縮の選択」をするために
修正されたプログラムを、試したところ伸縮しませんでした。
それでbatの最後にpauseを付て確認したところ

「ex_l_pl.rb:1:in `require': No such file to load -- 交点.rb (LoadError)
    from ex_l_pl.rb:1
続行するには何かキーを押してください . . .」

のエラーメッセージが表示されました。

もう一歩で完動できそうですので、宜しく御願いします。


Indexへ
(3155)←【3157】→(3158)
------------------------
【タイトル】Re(12):第一段階は動作OKです
【記事番号】 3157 (3155)
【 日時 】05/08/30 10:30
【 発言者 】コジマ

▼N忠さん:
>「ex_l_pl.rb:1:in `require': No such file to load -- 交点.rb (LoadError)
>    from ex_l_pl.rb:1
>続行するには何かキーを押してください . . .」
>
>のエラーメッセージが表示されました。
>
>もう一歩で完動できそうですので、宜しく御願いします。

こちらは、二つのスクリプトファイルが必要です。

タイトル「二つ目のスクリプト」に記載してある、スクリプト構文をコピペして、
ファイル名を 交点.rb として、同じフォルダに保存してください。


Indexへ
(3157)←【3158】→(3179)
------------------------
【タイトル】Re(13):完全動作OKです
【記事番号】 3158 (3157)
【 日時 】05/08/30 10:39
【 発言者 】N忠

コジマさん:

>こちらは、二つのスクリプトファイルが必要です。
>
>タイトル「二つ目のスクリプト」に記載してある、スクリプト構文をコピペして、
>ファイル名を 交点.rb として、同じフォルダに保存してください。

一つのファイルに、二つ続けていれておりましたが、御指示通りしましたら・・・

完全動作しました。\(^o^)/ 今後、有用に利用させて戴きます。

長時間に渡るサポート大変有難う御座いました。


Indexへ
(3158)←【3179】→(3180)
------------------------
【タイトル】お願いします。
【記事番号】 3179 (3152)
【 日時 】05/08/30 18:53
【 発言者 】s.nabe

いつも有難く勉強させていただいています。

円弧へ直線の一括伸縮という機能は、とても魅力的で
さっそく飛びついて、何回も試行してみたのですが

「曲線がありません」 が出て、一向に伸縮してくれません。

コジマ様の書き込み提供してくださってる、多くの外変を
有難く使わせていただいるのですが。(平行四辺形に外接楕円は
出来ないでいるのですが・・・)

皆さんの書き込みを見ていて、操作方法を間違ってるかと思い
ご指導お願いしたいと思い書き込みさせていただきました。

このように操作しているのですが↓

角形に90°でハッチし、枠線を消去し、少し下に凹円弧を描いたのち
平行している直線を範囲指定すると、赤の点線に変わります→
下の円弧をクリックすると赤い線になり→選択確定をクリック
・・でも 「曲線がありません」となり動いてくれません。
円弧を平行線の上に移動して交点を作ってみても同じです。
何処が間違っているのか見当がつきません。

よろしくお願いいたします。

jww4.10 winXP
C:\Gaibu\コジマさん\円弧に一括伸縮\ex_l_pl.bat・ex_l_pl.rb


Indexへ
(3179)←【3180】→(3181)
------------------------
【タイトル】Re(1):お願いします。
【記事番号】 3180 (3179)
【 日時 】05/08/30 20:41
【 発言者 】hogehoge

横から失礼致します。

コジマ様の外変は、円弧に伸縮できるとは何処にも記載が有りません。
(曲線コマンドから作図された)曲線の属性を持つ線でお試し下さい。

wakui様のレスと混同されているのでは、ありませんか?
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=2936;id=003


▼s.nabeさん:
>いつも有難く勉強させていただいています。
>
>円弧へ直線の一括伸縮という機能は、とても魅力的で
>さっそく飛びついて、何回も試行してみたのですが
>
>「曲線がありません」 が出て、一向に伸縮してくれません。
>
>コジマ様の書き込み提供してくださってる、多くの外変を
>有難く使わせていただいるのですが。(平行四辺形に外接楕円は
>出来ないでいるのですが・・・)
>
>皆さんの書き込みを見ていて、操作方法を間違ってるかと思い
>ご指導お願いしたいと思い書き込みさせていただきました。
>
>このように操作しているのですが↓
>
>角形に90°でハッチし、枠線を消去し、少し下に凹円弧を描いたのち
>平行している直線を範囲指定すると、赤の点線に変わります→
>下の円弧をクリックすると赤い線になり→選択確定をクリック
>・・でも 「曲線がありません」となり動いてくれません。
>円弧を平行線の上に移動して交点を作ってみても同じです。
>何処が間違っているのか見当がつきません。
>
>よろしくお願いいたします。
>
>jww4.10 winXP
>C:\Gaibu\コジマさん\円弧に一括伸縮\ex_l_pl.bat・ex_l_pl.rb


Indexへ
(3180)←【3181】→(3190)
------------------------
【タイトル】Re(1):お願いします。
【記事番号】 3181 (3179)
【 日時 】05/08/30 22:30
【 発言者 】コジマ

>円弧を平行線の上に移動して交点を作ってみても同じです。
>何処が間違っているのか見当がつきません。

円弧への一括伸縮は、ko様の外部変形です。
以下のレスを参照してください。

http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=2936;id=003


Indexへ
(3181)←【3190】→(3103)
------------------------
【タイトル】有難うございました。
【記事番号】 3190 (3181)
【 日時 】05/08/31 09:48
【 発言者 】s.nabe

コジマさん、hogehogeさん 有難うございました。

お陰様で10日間パニクッていた状況を抜けることが出来ました。
一度歯車が狂うとなかなか修正出来ません。

MA_CADの一括伸縮の情報もあったりして・・・

本当に有難うございました。

コジマ様の外変、有難く使用させていただいているお礼も
この場を借りて述べさせていただきます。

これからもよろしくお願いいたします。


Indexへ
(3190)←【3103】→(3116)
------------------------
【タイトル】Re(2):バグ修正
【記事番号】 3103 (2938)
【 日時 】05/08/27 13:30
【 発言者 】コジマ

曲線と同レイヤ・同線種・同線色 の線でないと伸縮されませんね。

以下修正しました。(レイヤ・線種・線色 の制限なし)


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

コピペ後、全角スペースを半角スペースに一括置換してください。

@REM 直線を曲線との交点まで一括伸縮
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #ht40
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)
    if sen1[0]>sen1[2]
        sen1[0],sen1[2]=sen1[2],sen1[0]
        sen1[1],sen1[3]=sen1[3],sen1[1]
    elsif sen1[0]==sen1[2]
        if sen1[1]>sen1[3]
            sen1[1],sen1[3]=sen1[3],sen1[1]
        end
    end

    if sen2[0]>sen2[2]
        sen2[0],sen2[2]=sen2[2],sen2[0]
        sen2[1],sen2[3]=sen2[3],sen2[1]
    elsif sen2[0]==sen2[2]
        if sen2[1]>sen2[3]
            sen2[1],sen2[3]=sen2[3],sen2[1]
        end
    end

    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

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]
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[1]-y1).abs>(xy[3]-y1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[1]-y1).abs<(xy[3]-y1).abs
                        else
                            kouten<< [x1,y1,xy[0],xy[1]] if (xy[0]-x1).abs>(xy[2]-x1).abs

                            kouten<< [x1,y1,xy[2],xy[3]] if (xy[0]-x1).abs<(xy[2]-x1).abs

                        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へ
(3103)←【3116】→(3119)
------------------------
【タイトル】Re(3):バグ修正
【記事番号】 3116 (3103)
【 日時 】05/08/27 18:58
【 発言者 】ショウブ

▼コジマさん:

今度は少しでも選択範囲が伸縮対象線に架かって(跨って)いれば
伸縮できるようになりましたね。

欲を言えば伸縮対象線と曲線が交差している場合、
対象線の長い線側を残して必ず縮むようですが
逆または曲線の内外伸縮の選択ができればと思いますが・・・。
(作者さまの立場を無視しての発言です。すみません)


Indexへ
(3116)←【3119】→(3120)
------------------------
【タイトル】Re(4):バグ修正
【記事番号】 3119 (3116)
【 日時 】05/08/28 10:08
【 発言者 】コジマ

▼ショウブさん:
>逆または曲線の内外伸縮の選択ができればと思いますが・・・。

選択範囲内の線端を伸縮するように、しました。範囲内に線端が無いときは、曲線から、近い方の線端を伸縮。

スクリプトが長くなるので、二つに分けます。(2回に分けて送信)

◎バッチファイル

@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 )

require "交点.rb"

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へ
(3119)←【3120】→(3128)
------------------------
【タイトル】Re(5):二つめのスクリプト
【記事番号】 3120 (3119)
【 日時 】05/08/28 10:12
【 発言者 】コジマ

◎スクリプトファイル(交点.rb)


include Math
#sen1の線上とsen2の延長線上の交点を返す
def sen_sen_kouten3(sen1,sen2)
    if sen1[0]>sen1[2]
        sen1[0],sen1[2]=sen1[2],sen1[0]
        sen1[1],sen1[3]=sen1[3],sen1[1]
    elsif sen1[0]==sen1[2]
        if sen1[1]>sen1[3]
            sen1[1],sen1[3]=sen1[3],sen1[1]
        end
    end

    if sen2[0]>sen2[2]
        sen2[0],sen2[2]=sen2[2],sen2[0]
        sen2[1],sen2[3]=sen2[3],sen2[1]
    elsif sen2[0]==sen2[2]
        if sen2[1]>sen2[3]
            sen2[1],sen2[3]=sen2[3],sen2[1]
        end
    end

    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)
    sen1.to_a
    sen2.to_a
    sen1.collect!{|item|item.to_f}
    sen2.collect!{|item|item.to_f}

    if sen1[0]>sen1[2]
        sen1[0],sen1[2]=sen1[2],sen1[0]
        sen1[1],sen1[3]=sen1[3],sen1[1]
    elsif sen1[0]==sen1[2]
        if sen1[1]>sen1[3]
            sen1[1],sen1[3]=sen1[3],sen1[1]
        end
    end

    if sen2[0]>sen2[2]
        sen2[0],sen2[2]=sen2[2],sen2[0]
        sen2[3],sen2[1]=sen2[3],sen2[1]
    elsif sen2[0]==sen2[2]
        if sen2[1]>sen2[3]
            sen2[1],sen2[3]=sen2[3],sen2[1]
        end
    end

    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


Indexへ
(3120)←【3128】→(3206)
------------------------
【タイトル】Re(6):二つめのスクリプト
【記事番号】 3128 (3120)
【 日時 】05/08/28 17:18
【 発言者 】ショウブ

▼コジマさん:

ありがとうございます!
これでバッチリですね。感謝!感激です。
おまけに曲線属性の直線であれば同様にその線まで
伸縮されることもわかりました。


Indexへ
(3128)←【3206】→(3208)
------------------------
【タイトル】Re(6):二つめのスクリプト
【記事番号】 3206 (3120)
【 日時 】05/08/31 16:41
【 発言者 】祥

▼コジマさん:
便利な外部変形なので使わせて頂きたいのですが・・・
「ex_l_pl.rb:2:in `require': No such file to load -- 交点.rb (LoadError)
    from ex_l_pl.rb:2」
エラーが出てしまいます。
どこが問題なのでしょうか教えていただけませんか・・・・?


Indexへ
(3206)←【3208】//(2924)
------------------------
【タイトル】Re(7)動作しました!
【記事番号】 3208 (3206)
【 日時 】05/08/31 17:15
【 発言者 】祥

▼コジマさん
便利な外部変形なので使わせて頂きます
ありがとうございました。