Indexへ
(3453)//【3437】→(3454)
------------------------
【タイトル】交差線の自動切断
【記事番号】 3437 (*)
【 日時 】05/07/24 19:33
【 発言者 】ゆう yukitutoryo@almond.ocn.ne.jp

電気設備の図面をかいているのですが、線の交差する部分を自動的に切断することができませんか。他社の電気設備CADのように


Indexへ
(3437)←【3454】→(3455)
------------------------
【タイトル】Re(1):交差線の自動切断
【記事番号】 3454 (3437)
【 日時 】05/07/25 12:42
【 発言者 】joker
【 リンク 】http://www.atsmile.com/jw/



▼ゆうさん:
>電気設備の図面をかいているのですが、線の交差する部分を自動的に切断することができませんか。他社の電気設備CADのように

「自動的に」という部分が いつ、どのタイミングで、自動、なのか
やや分かりにくいですが、電設ということは、設備記号等を貼り付けた時、
のような感じでしょうか?

となれば、そういう事が可能な、線記号変形や外部変形の機能を探すか
無ければ自分で作る、という事になるでしょうか。

自動配線のような機能は、専用CADでないと、無理だと思います。


Indexへ
(3454)←【3455】→(3484)
------------------------
【タイトル】Re(1):交差線の自動切断
【記事番号】 3455 (3437)
【 日時 】05/07/25 12:54
【 発言者 】コジマ

▼ゆうさん:
>電気設備の図面をかいているのですが、線の交差する部分を自動的に切断することができませんか。他社の電気設備CADのように

標準機能には、自動的に切断する機能はありません。
(一本の線に交差する、複数の線を一括切断することはできます。
「消去」→「一括処理」
但し、これを使っても、格子状に交差している線の切断処理には時間がかかります。)

他社の電気設備CADは、高価な専用CADなのでしょう?

外変で(交差線を一括切断)対抗できるか?

以下は、そういう意図で、以前に作ってみた外変です。

切断の優先順位は、先に書き出された線が切断されます。
(2本線の交差の場合。複雑に線が入り乱れている場合は、意図した切断結果にはならないかもしれませn)

mswin32 版 Ruby のインストールが必要です。
以下で入手できます。
http://www61.tok2.com/home2/gravelroad/tips/inst_msw.html

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

◎バッチファイル(ファイル名 交点分割2.bat)

@REM 交点分割
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #zz
REM #zw
REM #c切断間隔(図寸)・・・無指定:1/_/a
REM #h2
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 交点分割2.rb temp.txt %1 > jwc_temp.txt

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

def kouten(sen1,sen2)
    include Math
    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(y2_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_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]
        end
    end
end
def ika3(x)
    a=(((x.to_f)*1000).to_i/1000.to_f)
    return a
end

sen=[];by=[];zahyo=[];kankaku=1
while ARGV.size >1
    case augument=ARGV.pop
        when /\/a/
            kankaku=augument[2..-1].to_f
    end
end

while ARGF.gets
    xy =split
    if xy[0]=~/^hs/
        xy[1..-1].each{|item|by<    end
    if xy[0]=~/^lg/
        lg=xy[0][2,1]
        zusun=by[lg.hex]
    end
    if xy[0]=~/^[0-9]/ or xy[0]=~ /^-/
        xy.collect!{|item|item.to_f}
        if xy[0]>xy[2]
            xy[0],xy[2]=xy[2],xy[0]
            xy[1],xy[3]=xy[3],xy[1]
        elsif xy[0]==xy[2]
            if xy[1]>xy[3]
                xy[1],xy[3]=xy[3],xy[1]
            end
        end
        sen << (xy)
    end
end

puts"hd"
m=0
open("temp.txt","r"){|f|
    while line=f.gets
        m += 1
        xy=line.split
        if xy[0]=~/^hq/
        elsif xy[0]=~/^z/
            print line
            zno=m
            z=xy[0]
        elsif xy[0]=~/^[0-9]/ or xy[0]=~ /^-/
            if zno
                m==zno+1 ? zokusei=z : zokusei=""
            end
            xy.collect!{|item|item.to_f}
            if xy[0]>xy[2]
                xy[0],xy[2]=xy[2],xy[0]
                xy[1],xy[3]=xy[3],xy[1]
            elsif xy[0]==xy[2]
                if xy[1]>xy[3]
                    xy[1],xy[3]=xy[3],xy[1]
                end
            end
            x=xy[2]-xy[0]
            y=xy[3]-xy[1]
            xyl=Math.sqrt(x**2+y**2)
            dx=x/xyl
            dy=y/xyl

            zahyo=[]
            sen.shift
            sen.each{|item1|
            if kouten(item1,xy) != nil
                zahyo << kouten(item1,xy)
            end
            }
            if zahyo.size==0
                print line
            elsif zahyo.size==1
                printf("%10f %10f %10f %10f \n",
                xy[0],xy[1],
                zahyo[0][0]-kankaku*zusun*dx,
                zahyo[0][1]-kankaku*zusun*dy)
                unless zokusei==""
                    puts zokusei
                end
                printf("%10f %10f %10f %10f \n",
                xy[2],xy[3],
                zahyo[0][0]+kankaku*zusun*dx,
                zahyo[0][1]+kankaku*zusun*dy)

            else
                if xy[0]==xy[2]
                    zahyo1=zahyo.sort{|a,b| a[1]<=>b[1]}
                else
                    zahyo1=zahyo.sort{|a,b| a[0]<=>b[0]}
                end
                printf("%10f %10f %10f %10f \n",xy[0],xy[1],zahyo1[0][0]-kankaku*zusun*dx,zahyo1[0][1]-kankaku*zusun*dy)

                unless zokusei==""
                    puts zokusei
                end
                printf("%10f %10f %10f %10f \n",xy[2],xy[3],zahyo1[-1][0]+kankaku*zusun*dx,zahyo1[-1][1]+kankaku*zusun*dy)

                n=0
                while n                unless zokusei==""
                    puts zokusei
                end
                    printf("%10f %10f %10f %10f \n",zahyo1[n][0]+kankaku*zusun*dx,zahyo1[n][1]+kankaku*zusun*dy,zahyo1[n+1][0]-kankaku*zusun*dx,zahyo1[n+1][1]-kankaku*zusun*dy)
                n+=1
                end
            end
        else
            print line
        end
    end
}


Indexへ
(3455)←【3484】→(3485)
------------------------
【タイトル】Re(1):交差線の自動切断
【記事番号】 3484 (3437)
【 日時 】05/07/25 19:54
【 発言者 】コジマ

▼ゆうさん:
>電気設備の図面をかいているのですが、線の交差する部分を自動的に切断することができませんか。他社の電気設備CADのように

以下、連続線の作図及びその作図ルートと交差する線を切断する外変です。
(バッチファイル:1 スクリプトファイル:2)

必要レイヤ以外は、表示のみで実行しないと、速度が遅くなるので、実用には?

文字数に限度がありますので、二つ目のスクリプトファイルは後で送信します。

◎バッチファイル(ファイル名 連線記入.bat)

@REM 連続線の記入と交差線の切断
@echo off
REM #jww
REM #cd
REM #h4
REM #ht10
REM #ht30
REM #zz
REM #zw
REM #cR面取寸法 無指定:200/_/a
REM #c切断間隔(図寸) 無指定:1 /_/b
REM #1/基準点を指示 Free(L) Read(R) 左AM1:00方向ドラッグで15度切替
REM #99#
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 連線記入.rb temp.txt %1 %2> jwc_temp.txt


◎スクリプトファイル(ファイル名 連線記入.rb)

include Math
require "交点.rb"
$by=200;kankaku=1
while ARGV.size>1
    case argument=ARGV.pop
        when /\/a/
            $by=argument[2..-1].to_f
        when /\/b/
            kankaku=argument[2..-1].to_f
    end
end

by=[];$hp=[]
while ARGF.gets
    xy =split
    if xy[0]=~/^hs/
        xy[1..-1].each{|item|by<    end
    if xy[0]=~/^lg/
        lg=xy[0][2,1]
        zusun=by[lg.hex]
    end
    if xy[0] =~ /^hp/
        $hp<<[xy[1].to_f,xy[2].to_f]
    end
end
sen=[]
0.upto($hp.size-2){|i|sen<<[$hp[i],$hp[i+1]].flatten}

$date=[];$point=[]

0.upto(sen.size-2){|i|
    kakudo1=arg(sen[i])
    kakudo2=arg(sen[i+1])
    henkaku=kakudo2-kakudo1

    x=sen[i+1][2]-sen[i][0]
    y=sen[i+1][3]-sen[i][1]
    xyl=sqrt(x**2*y**2)

    y2=xyl*sin(henkaku)

    if y2>=0

        sen1=[sen[i][0]-$by*sin(kakudo1),
            sen[i][1]+$by*cos(kakudo1),
            sen[i][2]-$by*sin(kakudo1),
            sen[i][3]+$by*cos(kakudo1)]

        sen2=[sen[i+1][0]-$by*sin(kakudo2),
            sen[i+1][1]+$by*cos(kakudo2),
            sen[i+1][2]-$by*sin(kakudo2),
            sen[i+1][3]+$by*cos(kakudo2)]

        sikaku=kakudo1-90*2*PI/360
        syukaku=kakudo2-90*2*PI/360

        sikaku1=sikaku*360/(2*PI)
        syukaku1=syukaku*360/(2*PI)

        $date<<[kouten(sen1,sen2),sikaku,syukaku,sikaku1,syukaku1]
        $point<<[kouten(sen1,sen2)[0]+$by*cos(sikaku),
            kouten(sen1,sen2)[1]+$by*sin(sikaku)]
        $point<<[kouten(sen1,sen2)[0]+$by*cos(syukaku),
            kouten(sen1,sen2)[1]+$by*sin(syukaku)]

    else
        sen1=[sen[i][0]+$by*sin(kakudo1),
            sen[i][1]-$by*cos(kakudo1),
            sen[i][2]+$by*sin(kakudo1),
            sen[i][3]-$by*cos(kakudo1)]

        sen2=[sen[i+1][0]+$by*sin(kakudo2),
            sen[i+1][1]-$by*cos(kakudo2),
            sen[i+1][2]+$by*sin(kakudo2),
            sen[i+1][3]-$by*cos(kakudo2)]

        sikaku=kakudo2+90*2*PI/360
        syukaku=kakudo1+90*2*PI/360

        sikaku1=sikaku*360/(2*PI)
        syukaku1=syukaku*360/(2*PI)

        $date<<[kouten(sen1,sen2),sikaku,syukaku,sikaku1,syukaku1]

        $point<<[kouten(sen1,sen2)[0]+$by*cos(syukaku),
                kouten(sen1,sen2)[1]+$by*sin(syukaku)]
        $point<<[kouten(sen1,sen2)[0]+$by*cos(sikaku),
                kouten(sen1,sen2)[1]+$by*sin(sikaku)]
    end
            }
def itisen
    $date.each{|item|printf("ci %f %f %f %f %f %f %f\n",
        item[0][0],item[0][1],$by,item[3],item[4],1,0)
        }

    1.step($point.size-3,2){|i| puts [$point[i][0],$point[i][1],
            $point[i+1][0],$point[i+1][1]].join("\s")
        }

    puts [$hp[0][0],$hp[0][1],$point[0][0],$point[0][1]].join("\s")

    puts [$hp[-1][0],$hp[-1][1],$point[-1][0],$point[-1][1]].join("\s")

end
itisen()

puts"hd"
m=0
open("temp.txt","r"){|f|
    while line=f.gets
        m += 1
        xy=line.split
        if xy[0]=~/^hq/
        elsif xy[0]=~/^z/
            print line
            zno=m
            z=xy[0]
        elsif xy[0]=~/^[0-9]/ or xy[0]=~ /^-/
            if zno
                m==zno+1 ? zokusei=z : zokusei=""
            end
            xy.collect!{|item|item.to_f}
            if xy[0]>xy[2]
                xy[0],xy[2]=xy[2],xy[0]
                xy[1],xy[3]=xy[3],xy[1]
            elsif xy[0]==xy[2]
                if xy[1]>xy[3]
                    xy[1],xy[3]=xy[3],xy[1]
                end
            end
            x=xy[2]-xy[0]
            y=xy[3]-xy[1]
            xyl=Math.sqrt(x**2+y**2)
            dx=x/xyl
            dy=y/xyl

            zahyo=[]

            sen.each{|item1|
            if sen_kouten(item1,xy) != nil
                zahyo << sen_kouten(item1,xy)
            end
            }
            if zahyo.size==0
                print line
            elsif zahyo.size==1
                printf("%10f %10f %10f %10f \n",
                xy[0],xy[1],
                zahyo[0][0]-kankaku*zusun*dx,
                zahyo[0][1]-kankaku*zusun*dy)
                unless zokusei==""
                    puts zokusei
                end
                printf("%10f %10f %10f %10f \n",
                xy[2],xy[3],
                zahyo[0][0]+kankaku*zusun*dx,
                zahyo[0][1]+kankaku*zusun*dy)

            else
                if xy[0]==xy[2]
                    zahyo1=zahyo.sort{|a,b| a[1]<=>b[1]}
                else
                    zahyo1=zahyo.sort{|a,b| a[0]<=>b[0]}
                end
                printf("%10f %10f %10f %10f \n",xy[0],xy[1],zahyo1[0][0]-kankaku*zusun*dx,zahyo1[0][1]-kankaku*zusun*dy)

                unless zokusei==""
                    puts zokusei
                end
                printf("%10f %10f %10f %10f \n",xy[2],xy[3],zahyo1[-1][0]+kankaku*zusun*dx,zahyo1[-1][1]+kankaku*zusun*dy)

                n=0
                while n                unless zokusei==""
                    puts zokusei
                end
                    printf("%10f %10f %10f %10f \n",zahyo1[n][0]+kankaku*zusun*dx,zahyo1[n][1]+kankaku*zusun*dy,zahyo1[n+1][0]-kankaku*zusun*dx,zahyo1[n+1][1]-kankaku*zusun*dy)
                n+=1
                end
            end
        else
            print line
        end
    end
}


Indexへ
(3484)←【3485】//(3439)
------------------------
【タイトル】Re(2):二つ目のスクリプトファイル
【記事番号】 3485 (3484)
【 日時 】05/07/25 20:00
【 発言者 】コジマ

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

def kouten(sen1,sen2)
    include Math
    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[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

    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]
end

#線の角度を返す(ラジアン)
def arg(zahyo)
    include Math

    zahyo.to_a
    x=zahyo[2]-zahyo[0]
    y=zahyo[3]-zahyo[1]
    kakudo=atan2(y,x)

    return kakudo
end
def sen_kouten(sen1,sen2)
    include Math
    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(y2_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_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]
        end
    end
end
def ika3(x)
    a=(((x.to_f)*1000).to_i/1000.to_f)
    return a
end
#線の長さを返す(mm)
def nagasa(zahyo)
    include Math
    zahyo.to_a
    x=zahyo[2]-zahyo[0]
    y=zahyo[3]-zahyo[1]
    l=sqrt(x**2+y**2)

    return l
end