Indexへ
(5627)//【5595】→(5598)
------------------------
【タイトル】データ整理
【記事番号】 5595 (*)
【 日時 】06/02/18 11:03
【 発言者 】ハマグチ

皆さん、いつもお世話になっております
今、こんな外部変形を探しています。
ひとつの線上の、異なった線種、線色のデータを整理してくれる外部変形です
以前、sugiさんが同様のコマンドを作ってくださっているのですが、
同じ線長さにたいして対応しているのです。今回線長さに関係なく短いもの(線)を消して、データ聖地してくれるといった外部変形です。
初心者のデータをいただいたのですが、あまりにも重複線(同じ線なら標準の
データ整理で処理できるのですが) が多すぎますのでどうも気になっております
どのような書き方をしたのだろう?

 よろしくお願いします。


Indexへ
(5595)←【5598】→(5601)
------------------------
【タイトル】Re(1):データ整理
【記事番号】 5598 (5595)
【 日時 】06/02/18 13:19
【 発言者 】嵐

▼ハマグチさん:
こんにちは。

>同じ線長さにたいして対応しているのです。今回線長さに関係なく短いもの(線)を消して、データ聖地してくれるといった外部変形です。
>あまりにも重複線(同じ線なら標準の
>データ整理で処理できるのですが) が多すぎますのでどうも気になっております

普通に範囲→整理→重複整理 で短い線は消せると思いますが・・・。
私も先日もらった図面が、重複ではないですが、線の終末の処理がいい加減(Tの字の交点が実は交わってなかったりする)だったりしてイライラの連続です。まあ、お互いがんばりましょう。


Indexへ
(5598)←【5601】→(5602)
------------------------
【タイトル】Re(2):データ整理
【記事番号】 5601 (5598)
【 日時 】06/02/18 14:03
【 発言者 】ハマグチ

ご返信ありがとうございます

ハイ、同線種。同色の場合は出来ますが、異線種。異色の場合は出来ないと思います 表示の問題で異なると思いますが 短い線の上に長い線がある場合
表示では見つけにくく、出力してみますと線が重なっていることが始めて
分かる状態なのです 長い線上に 後から短い線が作図されている場合は
比較的見つけやすいのですが 逆の場合は困るのです
画面表示ピッチをわざと大きく変えて表示させたり、JWLで移動を掛けたりしましたが、元データのレイヤーを変えずに作業できないかと考えた次第です。

範囲を囲み選択された部分を消したりするのですが、結構拡大して範囲を
囲む必要があり面倒なのです

勾配がついていたり、円弧上の問題、意識して2重作図している場合など、
難しいとは思うのですが

  あれば便利ですよね。


Indexへ
(5601)←【5602】→(5604)
------------------------
【タイトル】Re(3):データ整理
【記事番号】 5602 (5601)
【 日時 】06/02/18 14:59
【 発言者 】嵐

▼ハマグチさん:

>ハイ、同線種。同色の場合は出来ますが、異線種。異色の場合は出来ないと思います 表示の問題で異なると思いますが 短い線の上に長い線がある場合
>表示では見つけにくく、出力してみますと線が重なっていることが始めて
>分かる状態なのです 長い線上に 後から短い線が作図されている場合は
>比較的見つけやすいのですが 逆の場合は困るのです
>画面表示ピッチをわざと大きく変えて表示させたり、JWLで移動を掛けたりしましたが、元データのレイヤーを変えずに作業できないかと考えた次第です。
>
>範囲を囲み選択された部分を消したりするのですが、結構拡大して範囲を
>囲む必要があり面倒なのです
>
>勾配がついていたり、円弧上の問題、意識して2重作図している場合など、
>難しいとは思うのですが

書き込みをよく読まないでレス返してすみませんでした。お詫びします。
かなり難しそうですね。同じ寸法の線が2本あったとして、ソフトにそのどちらかを選ばせるわけですよネ。条件が各線によって違ってくるわけでしょう。「条件が特定できればあるいは」と思いますが・・・。やはり作図した本人に印刷したものでチェックするように言って上げるのが本人のためにもなるような気がします。差し出がましいことを言って申し訳ありませんでした。


Indexへ
(5602)←【5604】→(5612)
------------------------
【タイトル】Re(1):データ整理
【記事番号】 5604 (5595)
【 日時 】06/02/18 15:35
【 発言者 】w2

▼ハマグチさん:
>皆さん、いつもお世話になっております
>今、こんな外部変形を探しています。
>ひとつの線上の、異なった線種、線色のデータを整理してくれる外部変形です
>以前、sugiさんが同様のコマンドを作ってくださっているのですが、
>同じ線長さにたいして対応しているのです。今回線長さに関係なく短いもの(線)を消して、データ聖地してくれるといった外部変形です。

確かにこのような外部変形がありますと便利だと思います。
おそらく検討している方もおられると思いますが
もう少し条件を絞ったほうが作成しやすくなるかも
しれません。
まず重複線処理方法(内包されるかまたは一部でも重複しているのか)
線種、線色も指定して処理するか
円楕円(弧共)も対象とするのか
重複線の判定(近傍もふくめるのか)

条件によりによりアルゴリズムも変わってくると思います。


Indexへ
(5604)←【5612】→(5617)
------------------------
【タイトル】Re(1):ネックは、属性の保持と実行速度
【記事番号】 5612 (5595)
【 日時 】06/02/18 16:28
【 発言者 】コジマ

▼ハマグチさん:
>皆さん、いつもお世話になっております
>今、こんな外部変形を探しています。
>ひとつの線上の、異なった線種、線色のデータを整理してくれる外部変形です
>以前、sugiさんが同様のコマンドを作ってくださっているのですが、
>同じ線長さにたいして対応しているのです。今回線長さに関係なく短いもの(線)を消して、

これは、Ruby の最も苦手な分野です。
インタープリタ型言語は、何千回も計算を繰り返すようなスクリプトとでは、
急激に遅くなります。
Rubyの1ステップの時間はC言語の百ステップの時間に相当するとか?
条件つきでないと Rubyでの作成は、厳しいです。


異なった線種、線色のデータを整理の場合、どの線種、線色を継続するかが
問題です。(指定属性や書込属性にするのなら検討しないでよいのですが)

1本の線に完全に埋没した線を消すのなら、他の線は属性を継続できますが、
同じ長さの線や、連結線の場合、属性保持の問題がでます。

◎バッチファイル(ファイル名 埋没線整理.bat)

@REM 他の線に埋没した線の消去
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht20
REM #ht30
REM #ht40
REM #g1
REM #zz
REM #zc
REM #zw
REM #h1
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 埋没線整理.rb temp.txt > jwc_temp.txt

◎スクリプトファイル(ファイル名 埋没線整理.rb)
1回に選択できる線数は、200本以内。
これでも、200*200 40000回の計算なので、相当厳しい。


include Math
#線の角度を返す(ラジアン)
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_siten_convert(sen)
    if sen[0]>sen[2]
        sen[0],sen[2],sen[1],sen[3]=sen[2],sen[0],sen[3],sen[1]
    elsif sen[0]==sen[2]
        if sen[1]>sen[3]
            sen[1],sen[3]=sen[3],sen[1]
        end
    end
    return sen
end
def maibotu_sen?(sen_a,sen)

    c=sen_a.find{|item|
        x1=sen[0]-item[0]
        y1=sen[1]-item[1]
        l1=sqrt(y1**2+x1**2)

        x2=item[2]-item[0]
        y2=item[3]-item[1]
        l2=sqrt(y2**2+x2**2)

        x3=sen[2]-item[0]
        y3=sen[3]-item[1]
        l3=sqrt(y3**2+x3**2)

        (ika3(arg([item[0],item[1],sen[0],sen[1]])*360/(2*PI))==ika3(arg(item)*360/(2*PI)) && l1<=l2 && l3    }

    if c
        return true
    else
        false
    end
end

def ika3(x)
    (x.to_f*1000).to_i/1000.to_f

end

sen=[];sen2=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^\d|^-/
        xy.collect!{|item|item.to_f}
        sen_siten_convert(xy)
        sen<
        break if sen.size==200
    end
end

if sen.size<200
sen3=sen-sen.uniq
puts "hd"
n=0
open("temp.txt","r"){|f|
    while line=f.gets
        xy=line.split
        if xy[0] =~ /^hq/
        elsif xy[0] =~ /^\d|^-/
            xy.collect!{|item|item.to_f}
            sen_siten_convert(xy)
            sen2=sen-[xy]
            if maibotu_sen?(sen2,xy)
                n+=1
            else
                print line
            end
        else
            print line
        end
    end
}
printf("h##{n}本減\n")

else
    printf("h#線数が多すぎます。200本以内にしてください\n")
end


Indexへ
(5612)←【5617】→(5621)
------------------------
【タイトル】Re(2):ネックは、属性の保持と実行速度
【記事番号】 5617 (5612)
【 日時 】06/02/18 18:07
【 発言者 】嵐

▼コジマさん:
こんにちは。いつも素敵な外変を有難うございます。

ハマグチさん、横からすみません。

コジマさんに少し質問させてもらっていいでしょうか?

1)線数200本まで、とあるのは、範囲で囲った線数のことですよね。重複線の数で  はないですよね。

2)消去できた線と出来ない線がありました。
状況
横19本、縦11本からなる計算表ですが、その表を右横へ複写し、その複写したものを長さを短くしました。(下と左の基点は変えてません。)その後線色を変えました。で、左下の基点を合わせて元の計算表に貼り付けました。それで試したのですが、横の余分な線は全部消えましたが縦の線は、一番左端は消え、残りの10本が残ってしまいました。(元の線には実線と破線が混じっています。)


(ハマグチさんが投稿してコジマさんがレスつけられるまでわずか5時間余りですか、すごいですね。頭の中にイメージが浮かんじゃうんでしょうか。)


Indexへ
(5617)←【5621】→(5623)
------------------------
【タイトル】Re(3):許容誤差範囲?角度誤差?
【記事番号】 5621 (5617)
【 日時 】06/02/18 18:57
【 発言者 】コジマ

▼嵐さん:
>それで試したのですが、横の余分な線は全部消えましたが縦の線は、一番左端は消え、残りの10本が残ってしまいました。(元の線には実線と破線が混じっています。)
>
>

許容誤差範囲?か角度誤差?だと思います。
計算値ですので、比較値をどの程度アバウトにするかで、結果が変わります。

25行目から49行目をいかのように変更してみてください。

def maibotu_sen?(sen_a,sen)

    c=sen_a.find{|item|
        x1=sen[0]-item[0]
        y1=sen[1]-item[1]
        l1=sqrt(y1**2+x1**2)

        x2=item[2]-item[0]
        y2=item[3]-item[1]
        l2=sqrt(y2**2+x2**2)

        x3=sen[2]-item[0]
        y3=sen[3]-item[1]
        l3=sqrt(y3**2+x3**2)

        ((ika3(arg([item[0],item[1],sen[0],sen[1]])*360/(2*PI))-ika3(arg(item)*360/(2*PI))).abs<1 && l1    }

    if c
        return true
    else
        false
    end

>(ハマグチさんが投稿してコジマさんがレスつけられるまでわずか5時間余りですか、すごいですね。頭の中にイメージが浮かんじゃうんでしょうか。)

最近は、1から書くことは、あまりないです。
以前に作ったものの中から似たものを、選んで修正が多いです。

重複線整理も、牛渡様のエクセルと連携させる外変と連動させて、罫線の整理をしようと、以前に作成していたものを修正しました。
(あまりの実行速度の遅さで、オクラいりさせていたものです。)

はっきりいって、Ruby は、重複線整理やハッチ(交点計算の繰り返し)をつくるのには向きません。
(経験談です。)


Indexへ
(5621)←【5623】→(5624)
------------------------
【タイトル】Re(3):念のため、線端が揃っている線は、消去されません。
【記事番号】 5623 (5617)
【 日時 】06/02/18 19:26
【 発言者 】コジマ

>状況
>横19本、縦11本からなる計算表ですが、その表を右横へ複写し、その複写したものを長さを短くしました。(下と左の基点は変えてません。)その後線色を変えました。で、左下の基点を合わせて元の計算表に貼り付けました。それで試したのですが、横の余分な線は全部消えましたが縦の線は、一番左端は消え、残りの10本が残ってしまいました。(元の線には実線と破線が混じっています。)
>

線端が揃っている線は、消去されません。

両線端が1本の別の線内に入っていないと、消去されません。


Indexへ
(5623)←【5624】→(5626)
------------------------
【タイトル】Re(4):片側の線端が揃っている線も消去なら
【記事番号】 5624 (5623)
【 日時 】06/02/18 19:46
【 発言者 】コジマ

片側の線端が揃っている線も消去するなら
25行目〜49行目が以下のようになります。
同じ長さの線は消去しません。


def maibotu_sen?(sen_a,sen)

    c=sen_a.find{|item|
        x1=sen[0]-item[0]
        y1=sen[1]-item[1]
        l1=sqrt(y1**2+x1**2)

        x2=item[2]-item[0]
        y2=item[3]-item[1]
        l2=sqrt(y2**2+x2**2)

        x3=sen[2]-item[0]
        y3=sen[3]-item[1]
        l3=sqrt(y3**2+x3**2)

        ((ika3(arg([item[0],item[1],sen[0],sen[1]])*360/(2*PI))-ika3(arg(item)*360/(2*PI))).abs<1 && l1<=l2 && l3<=l2) or (l1==0 && l3    }

    if c
        return true
    else
        false
    end
end


Indexへ
(5624)←【5626】→(5628)
------------------------
【タイトル】Re(4):あれれ
【記事番号】 5626 (5623)
【 日時 】06/02/18 20:56
【 発言者 】嵐

▼コジマさん:   
>>状況
>>横19本、縦11本からなる計算表ですが、その表を右横へ複写し、その複写したものを長さを短くしました。(下と左の基点は変えてません。)その後線色を変えました。で、左下の基点を合わせて元の計算表に貼り付けました。それで試したのですが、横の余分な線は全部消えましたが縦の線は、一番左端は消え、残りの10本が残ってしまいました。(元の線には実線と破線が混じっています。)
>>
>
>線端が揃っている線は、消去されません。
>
>両線端が1本の別の線内に入っていないと、消去されません。

何度もすみません。前の状況報告の時少し(でも大きな)間違いがありました。横線は殆ど補助線種をつかってたので見間違えてたのですが、下半分ぐらいが必要な線も消去されてました。二度目に訂正されたものは、横線は全く同じで(横線の下半分ぐらいが必要な線も消去されてました)縦線が左半分ぐらい消去されるようになりましたが、右半分ぐらいはのこっています。やはり、消去する条件を絞り込むことが一番の難敵のようですね。
今3回目の外変を同じデータで実行してみたのですが線が一本も消去されませんでした。それで、前2回の分も試したのですが、全部線が消えなくなってしまいました。あれれ。
それぞれ別のフォルダを作って.BAT、.rbそれぞれに入れたのですが全部ダメに・・・。どうしちゃったんだろう。後の二つのフォルダを別のフォルダへ移しても変化なし。

です。おかしいな。


Indexへ
(5626)←【5628】→(5632)
------------------------
【タイトル】Re(5):直す時に、余計なところもいじっていました。
【記事番号】 5628 (5626)
【 日時 】06/02/18 22:27
【 発言者 】コジマ

直す時に、余計なところもいじっていました。

修正しましたが、速度はもっと遅くなったような?


include Math

#線の角度を返す(ラジアン)
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_siten_convert(sen)
    if sen[0]>sen[2]
        sen[0],sen[2],sen[1],sen[3]=sen[2],sen[0],sen[3],sen[1]
    elsif sen[0]==sen[2]
        if sen[1]>sen[3]
            sen[1],sen[3]=sen[3],sen[1]
        end
    end
    return sen
end
def maibotu_sen?(sen_a,sen)

    c=sen_a.find{|item|
        x1=sen[0]-item[0]
        y1=sen[1]-item[1]
        l1=sqrt(y1**2+x1**2)

        x2=item[2]-item[0]
        y2=item[3]-item[1]
        l2=sqrt(y2**2+x2**2)

        x3=sen[2]-item[0]
        y3=sen[3]-item[1]
        l3=sqrt(y3**2+x3**2)

        (ika3(arg([item[0],item[1],sen[0],sen[1]])*360/(2*PI))-ika3(arg(item)*360/(2*PI))).abs<1 && l1    }

    if c
        return true
    else
        false
    end
end

def ika3(x)
    (x.to_f*1000).to_i/1000.to_f

end

sen=[];sen2=[]
while ARGF.gets
    xy=split
    if xy[0]=~/^\d|^-/
        xy.collect!{|item|item.to_f}
        sen_siten_convert(xy)
        sen<
        break if sen.size==200
    end
end

if sen.size<200
sen3=sen-sen.uniq
puts "hd"
n=0
open("temp.txt","r"){|f|
    while line=f.gets
        xy=line.split
        if xy[0] =~ /^hq/
        elsif xy[0] =~ /^\d|^-/
            xy.collect!{|item|item.to_f}
            sen_siten_convert(xy)
            sen2=sen-[xy]
            if maibotu_sen?(sen2,xy)
                n+=1
            else
                print line
            end
        else
            print line
        end
    end
}
printf("h##{n}本減\n")
else
    printf("h#線数が多すぎます。200本以内にしてください\n")
end


Indexへ
(5628)←【5632】→(5634)
------------------------
【タイトル】Re(6):お詫びと報告
【記事番号】 5632 (5628)
【 日時 】06/02/19 10:18
【 発言者 】嵐

▼コジマさん:
おはようございます。

>直す時に、余計なところもいじっていました。
>修正しましたが、速度はもっと遅くなったような?

昨夜ダメになった理由が分かりました。バージョンごとのフォルダを作ったとき、うっかりスペースをつけてしまってたからです。お騒がせしました。スペースがいかにダメかがわかりました。
そこでもう一度試したのですが、水平垂直の線に対してはほとんどOK(作業するたびに微妙に消去される線数が違う)でした。そのデータを30度ふって複写して試したのですが、消えてはいけないのに消える線がありました。これも作業するたびに多少違ってくるのですが、水平に近い方の線19本のうち9本です。
以上ご報告まで。


Indexへ
(5632)←【5634】→(5629)
------------------------
【タイトル】Re(7):お詫びと報告
【記事番号】 5634 (5632)
【 日時 】06/02/19 10:34
【 発言者 】コジマ

線端が揃っている場合、計算値の誤差ではじかれるものがでています。

以下、sugi様に修正していただきました。
線数の制限はかっかっていないので、選択数が多すぎるとかえって非効率になります。
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=5629;id=003


Indexへ
(5634)←【5629】→(5633)
------------------------
【タイトル】Re(2):ネックは、属性の保持と実行速度
【記事番号】 5629 (5612)
【 日時 】06/02/19 02:02
【 発言者 】sugi

sugiです。
コジマさん、こんにちは。

あらかじめ削除する線の配列を用意してみてはどうでしょう。
これで多少は速くなって欲しいとの期待を込めて。:-)

微妙に変わっているのは、自分に理解しやすくさせるためなので、
あまり気にしないで下さい。

# 先程アップしたスクリプトだと同じ長さの線を削除してしまいま
# すね。
# 時間のあるときに見直してみます。> ハマグチさん

--- 埋没線整理.rb cut here ---
#! C:/usr/bin/ruby -Ks

include Math
#線の角度を返す(度)
def arg(zahyo)
 include Math
 zahyo.to_a
 x=zahyo[2]-zahyo[0]
 y=zahyo[3]-zahyo[1]
 if x==0 or y==0 then
  return 0
 else
  kakudo=atan2(y,x)
  return kakudo*360/(2*PI)
 end
end

def sen_siten_convert(sen)
 if sen[0]>sen[2]
  sen[0],sen[2],sen[1],sen[3]=sen[2],sen[0],sen[3],sen[1]
 elsif sen[0]==sen[2]
  sen[1],sen[3]=sen[3],sen[1] if sen[1]>sen[3]
 end
 return sen
end

def maibotu_sen?(sen1,sen2)
 # sen2が長い方
 sen1=[[sen1[0],sen1[1]],[sen1[2],sen1[3]]].
  sort.flatten.collect{|x| ika3(x)}
 sen2=[[sen2[0],sen2[1]],[sen2[2],sen2[3]]].
  sort.flatten.collect{|x| ika3(x)}
 #同じ線ならば0
 if sen1==sen2 then
  return 0
  #傾きが同じで線2の内側にあれば1
 elsif ika3((arg(sen1)-arg(sen2))%180)==0 and
   ika3((arg([sen1[0],sen1[1],sen2[0],sen2[1]]) -
      arg([sen1[2],sen1[3],sen2[0],sen2[1]]))%180) == 0 and
   sen2[0] <= sen1[0] and sen1[2] <= sen2[2] and
   sen2[1] <= sen1[1] and sen1[3] <= sen2[3] then
  return 1
 else
  #重なってなければ−1
  return -1
 end
end

def ika3(x)
 (x.to_f*1000).to_i/1000.to_f
end

sen,sen2,sen3=[],[],[]
while ARGF.gets
 xy=split
 if xy[0]=~/^\d|^-/
  xy.collect!{|item|item.to_f}
  sen_siten_convert(xy)
  sen< end
end

# 長さ順にソート
sen.sort!{|a,b| (a[2]-a[0])**2+(a[3]-a[1])**2 <=>
  (b[2]-b[0])**2+(b[3]-b[1])**2}
# sen2 は削除する線
# sen3 は重複線で1度出力
# 長い線を取り出して評価
while sen.size>0
 ln=sen.pop
 sln2=sen.find_all{|l| maibotu_sen?(l,ln)==1}
 sln3=sen.find_all{|l| maibotu_sen?(l,ln)==0}
 sen.delete_if{|x| sln2.member?(x) or sln3.member?(x)}
 sen2 += sln2
 sen3 += sln3
end

puts "hd"
n=0
open("temp.txt","r"){|f|
 while line=f.gets
  xy=line.split
  case xy[0]
  when /^hq/
  when /^\d|^-/
   xy.collect!{|item|item.to_f}
   if sen3.member?(sen_siten_convert(xy)) then
    print line
    sen3.delete_if{|x| x==sen_siten_convert(xy)}
    sen2<   elsif sen2.member?(sen_siten_convert(xy)) then
    n+=1
   else
    print line
   end
  else
   print line
  end
 end}
printf("h##{n}本減\n")
--- 埋没線整理.rb cut here ---

--
sugi


Indexへ
(5629)←【5633】→(5636)
------------------------
【タイトル】Re(3):線数制限したほうが効率的
【記事番号】 5633 (5629)
【 日時 】06/02/19 10:24
【 発言者 】コジマ

sugiさん、はじめまして
アドバイスありがとうございます。
おかげさまで、速度が20〜30%アップしました。

ただ、パソコンのメモリーにもよりますが、速度は線数の2乗近くに比例するようです。
検証結果をみると、線数制限したほうが効率的です。
以下は、自宅の低機能(メモリー 128 win98)パソコンでの所要時間です。

線数200本・・・10秒
線数400本・・・35秒

線数200本ずつ2回操作したほうが、断然速いです。(急がば回れ)

欲張って、1000本以上選択すると、無限ループに入ったような気がします。


Indexへ
(5633)←【5636】→(5642)
------------------------
【タイトル】Re(3):ネックは、属性の保持と実行速度
【記事番号】 5636 (5629)
【 日時 】06/02/19 13:19
【 発言者 】嵐 mitsu_km2002@ybb.ne.jp

▼sugiさん、コジマさん、こんにちは。
ハマグチさん、何度もすみません。

sugiさんの訂正されたコジマさんの外変で、コジマさんと同じデータで試したのですが、斜めに30度ふったものは、線が一本も消去されませんでした。水平垂直だけのものは綺麗に消去されてます。
もしよろしければ、私のデータで検証していただけないでしょうか?。私のアドレスあてにメールいただければデータを送らせていただきますが・・・。


Indexへ
(5636)←【5642】→(5643)
------------------------
【タイトル】Re(4):角度付線に対応
【記事番号】 5642 (5636)
【 日時 】06/02/19 15:13
【 発言者 】コジマ

▼嵐さん:

角度付線に対応させました。

>斜めに30度ふったものは、線が一本も消去されませんでした。水平垂直だけのものは綺麗に消去されてます。

include Math
#線の角度を返す(度)
def arg(zahyo)
include Math
zahyo.to_a
x=zahyo[2]-zahyo[0]
y=zahyo[3]-zahyo[1]
if x==0 or y==0 then
 return 0
else
 kakudo=atan2(y,x)
 return kakudo*360/(2*PI)
end
end

def sen_siten_convert(sen)
if sen[0]>sen[2]
 sen[0],sen[2],sen[1],sen[3]=sen[2],sen[0],sen[3],sen[1]
elsif sen[0]==sen[2]
 sen[1],sen[3]=sen[3],sen[1] if sen[1]>sen[3]
end
return sen
end

def maibotu_sen?(sen1,sen2)
# sen2が長い方
sen1=[[sen1[0],sen1[1]],[sen1[2],sen1[3]]].
 sort.flatten.collect{|x| ika3(x)}
sen2=[[sen2[0],sen2[1]],[sen2[2],sen2[3]]].
 sort.flatten.collect{|x| ika3(x)}

    x1=sen1[0]-sen2[0]
    y1=sen1[1]-sen2[1]
    l1=sqrt(y1**2+x1**2)

    x2=sen2[2]-sen2[0]
    y2=sen2[3]-sen2[1]
    l2=sqrt(y2**2+x2**2)

    x3=sen1[2]-sen2[0]
    y3=sen1[3]-sen2[1]
    l3=sqrt(y3**2+x3**2)

#同じ線ならば0
if sen1==sen2 then
 return 0
 #傾きが同じで線2の内側にあれば1
elsif     (ika3(arg([sen2[0],sen2[1],sen1[0],sen1[1]]))-ika3(arg(sen2))).abs<1 && l1

 return 1
else
 #重なってなければ−1
 return -1
end
end

def ika3(x)
(x.to_f*1000).to_i/1000.to_f
end

sen,sen2,sen3=[],[],[]
while ARGF.gets
xy=split
if xy[0]=~/^\d|^-/
 xy.collect!{|item|item.to_f}
 sen_siten_convert(xy)
 sen< end
end

# 長さ順にソート
sen.sort!{|a,b| (a[2]-a[0])**2+(a[3]-a[1])**2 <=>
 (b[2]-b[0])**2+(b[3]-b[1])**2}
# sen2 は削除する線
# sen3 は重複線で1度出力
# 長い線を取り出して評価
while sen.size>0
ln=sen.pop
sln2=sen.find_all{|l| maibotu_sen?(l,ln)==1}
sln3=sen.find_all{|l| maibotu_sen?(l,ln)==0}
sen.delete_if{|x| sln2.member?(x) or sln3.member?(x)}
sen2 += sln2
sen3 += sln3
end

puts "hd"
n=0
open("temp.txt","r"){|f|
while line=f.gets
 xy=line.split
 case xy[0]
 when /^hq/
 when /^\d|^-/
  xy.collect!{|item|item.to_f}
  if sen3.member?(sen_siten_convert(xy)) then
  print line
  sen3.delete_if{|x| x==sen_siten_convert(xy)}
  sen2<  elsif sen2.member?(sen_siten_convert(xy)) then
  n+=1
  else
  print line
  end
 else
  print line
 end
end}
printf("h##{n}本減\n")


Indexへ
(5642)←【5643】→(5645)
------------------------
【タイトル】Re(5):角度付線に対応
【記事番号】 5643 (5642)
【 日時 】06/02/19 15:33
【 発言者 】嵐 mitsu_km2002@ybb.ne.jp

▼コジマさん:
コジマさんなんども有難うございます。

>角度付線に対応させました。

重複した短線はきれいに消去されましたが、水平に近い方の線が、上から半分近く必要な線が消えました。


Indexへ
(5643)←【5645】→(5646)
------------------------
【タイトル】Re(6):条件設定ミス
【記事番号】 5645 (5643)
【 日時 】06/02/19 17:36
【 発言者 】コジマ

▼嵐さん:
>重複した短線はきれいに消去されましたが、水平に近い方の線が、上から半分近く必要な線が消えました。

条件設定ミスです。


include Math
#線の角度を返す(度)
def arg(zahyo)
include Math
zahyo.to_a
x=zahyo[2]-zahyo[0]
y=zahyo[3]-zahyo[1]
if x==0 or y==0 then
 return 0
else
 kakudo=atan2(y,x)
 return kakudo*360/(2*PI)
end
end

def sen_siten_convert(sen)
if sen[0]>sen[2]
 sen[0],sen[2],sen[1],sen[3]=sen[2],sen[0],sen[3],sen[1]
elsif sen[0]==sen[2]
 sen[1],sen[3]=sen[3],sen[1] if sen[1]>sen[3]
end
return sen
end

def maibotu_sen?(sen1,sen2)
# sen2が長い方
sen1=[[sen1[0],sen1[1]],[sen1[2],sen1[3]]].
 sort.flatten.collect{|x| ika3(x)}
sen2=[[sen2[0],sen2[1]],[sen2[2],sen2[3]]].
 sort.flatten.collect{|x| ika3(x)}

    x1=sen1[0]-sen2[0]
    y1=sen1[1]-sen2[1]
    l1=sqrt(y1**2+x1**2)

    x2=sen2[2]-sen2[0]
    y2=sen2[3]-sen2[1]
    l2=sqrt(y2**2+x2**2)

    x3=sen1[2]-sen2[0]
    y3=sen1[3]-sen2[1]
    l3=sqrt(y3**2+x3**2)

#同じ線ならば0
if sen1==sen2 then
 return 0
 #傾きが同じで線2の内側にあれば1
elsif     (ika3(atan2(y1,x1))==ika3(atan2(y2,x2)) && l1
 return 1
else
 #重なってなければ−1
 return -1
end
end

def ika3(x)
(x.to_f*1000).to_i/1000.to_f
end

sen,sen2,sen3=[],[],[]
while ARGF.gets
xy=split
if xy[0]=~/^\d|^-/
 xy.collect!{|item|item.to_f}
 sen_siten_convert(xy)
 sen< end
end

# 長さ順にソート
sen.sort!{|a,b| (a[2]-a[0])**2+(a[3]-a[1])**2 <=>
 (b[2]-b[0])**2+(b[3]-b[1])**2}
# sen2 は削除する線
# sen3 は重複線で1度出力
# 長い線を取り出して評価
while sen.size>0
ln=sen.pop
sln2=sen.find_all{|l| maibotu_sen?(l,ln)==1}
sln3=sen.find_all{|l| maibotu_sen?(l,ln)==0}
sen.delete_if{|x| sln2.member?(x) or sln3.member?(x)}
sen2 += sln2
sen3 += sln3
end

puts "hd"
n=0
open("temp.txt","r"){|f|
while line=f.gets
 xy=line.split
 case xy[0]
 when /^hq/
 when /^\d|^-/
  xy.collect!{|item|item.to_f}
  if sen3.member?(sen_siten_convert(xy)) then
  print line
  sen3.delete_if{|x| x==sen_siten_convert(xy)}
  sen2<  elsif sen2.member?(sen_siten_convert(xy)) then
  n+=1
  else
  print line
  end
 else
  print line
 end
end}
printf("h##{n}本減\n")


Indexへ
(5645)←【5646】→(5650)
------------------------
【タイトル】Re(7):条件設定ミス
【記事番号】 5646 (5645)
【 日時 】06/02/19 17:49
【 発言者 】嵐

▼コジマさん:せっかくのお休みを一日奪っちゃいましたね、すみませんです。

30度ふった図形は全く変わってません。水平のままの図形の水平線が下から半分ほど消えてしまいました。(実はスギさんがUPされたときにもこの水平の線が同じように消されてました。)


Indexへ
(5646)←【5650】→(5660)
------------------------
【タイトル】Re(8):条件設定ミス
【記事番号】 5650 (5646)
【 日時 】06/02/19 20:00
【 発言者 】sugi dze04102@nifty.ne.jp

sugiです。
皆さん、こんにちは。

埋没線の判定条件が理解できなくて、昔自分で書いたのも今となっ
ては意味不明で、適当にデッチあげたのですが、うまく働いてない
ですね。

こういう場合 matrix.rb でベクトルの内積を計算させれば見通し
が良くなるとアドバイスしてもらったことがあります。
当時は良く理解できなかったのですが、今回の場合ならこんな感じ
でしょうか。

--- 埋没線整理.rb (一部) cut here ---
require 'matrix'

def maibotu_sen?(sen1,sen2)
 # sen2が長い方
 sen1=[[sen1[0],sen1[1]],[sen1[2],sen1[3]]].
  sort.flatten
 sen2=[[sen2[0],sen2[1]],[sen2[2],sen2[3]]].
  sort.flatten
 p1=Vector[sen2[0],sen2[1]]
 p2=Vector[sen1[0],sen1[1]]
 p3=Vector[sen1[2],sen1[3]]
 p4=Vector[sen2[2],sen2[3]]
 p1p2=p2-p1
 p1p3=p3-p1
 p1p4=p4-p1
 p2p3=p3-p2

 #同じ線ならば0
 if sen1==sen2 then
  return 0
  #傾きが同じで線2の内側にあれば1
 elsif ika3(p1p4.inner_product(p2p3))==ika3(p1p4.r*p2p3.r) and
   (ika3(p1p4.inner_product(p1p2))==ika3(p1p4.r*p1p2.r) &&
    ika3(p1p2.r)<=ika3(p1p4.r)) and
   (ika3(p1p4.inner_product(p1p3))==ika3(p1p4.r*p1p3.r) &&
    ika3(p1p3.r)<=ika3(p1p4.r)) then
  return 1
 else
  #重なってなければ−1
  return -1
 end
end
--- 埋没線整理.rb (一部) cut here ---

まだおかしいようなら問題のデータをメールして下さい。> 嵐さん。

ハマグチさん wrote:
> これって3年ほど前につ作ってくださった外部変形コマンドですが 皆さん使用
> 方法がわかるかな?

作った本人は忘れてましたが、有効に活用してもらって、外部変形
も喜んでると思います。:-)

--
sugi


Indexへ
(5650)←【5660】→(5670)
------------------------
【タイトル】Re(8):条件設定ミス
【記事番号】 5660 (5646)
【 日時 】06/02/19 21:39
【 発言者 】コジマ

▼嵐さん:
>30度ふった図形は全く変わってません。水平のままの図形の水平線が下から半分ほど消えてしまいました。(実はスギさんがUPされたときにもこの水平の線が同じように消されてました。)


30度ふった図形?ですが、
30度の角度付線だと理解して、30度 150度 210度 330度 の線で検証して見ましたが
異常なく実行されました。
違う意味のようですね?

図形とありますがこの外変は、線にしか対応させていませんので、円弧や実点には反応しません。

水平の線が消える件ですが、
上下に長さの違う平行線あると、下側の短い線が消去されたのですが、
修正済みのスクリプト(前回送ったもの)では、消去されません。

作図の状況によって、あらわれるのかも?

私が検証した限りでは、異常ありません。

成果品の図面ではまだ検証していませんが。(コワイので)


Indexへ
(5660)←【5670】→(5616)
------------------------
【タイトル】Re(9):条件設定ミス
【記事番号】 5670 (5660)
【 日時 】06/02/20 01:11
【 発言者 】嵐 mitsu_km2002@ybb.ne.jp

▼コジマさん:

>
>30度ふった図形?ですが、
水平垂直の線だけだとマズイと思い、計算表を複写で30度回転させてみました。

>図形とありますがこの外変は、線にしか対応させていませんので、円弧や実点には反応しません。
すみません。言葉の使い方が間違っていました。表です。ブロック化はしてませんのでただの線の寄せ集めです。
>
最後にスギさんにUPしていただいたものでは、水平垂直の線もそれ以外の線も短線のみ消去できるようになりました。

ありがとうございました。もしよろしければ私の検証したデータを送らせていただきますのでメールください。


Indexへ
(5670)←【5616】→(5644)
------------------------
【タイトル】Re(1):データ整理
【記事番号】 5616 (5595)
【 日時 】06/02/18 17:42
【 発言者 】sugi

sugiです。
ハマグチさん、こんにちは。

・長い線に対して完全に乗っかってる短い線を書き出さない。
・同じ長さの線の場合、どちらが消えるかは天まかせ。
・円弧や楕円は無視。

ということにして作ってみました。

http://homepage2.nifty.com/igus/
Ruby 外部変形 スクリプト集 for jww ver 0.99a
「重複線処理.BAT」−「重複短線削除」

からどうぞ。
一応、簡単な形状で確認はしましたが、バグってたらゴメンなさい。

# 最近 VBScript や Lisp を触ってるんですが、やっぱり Ruby はいいなぁと
# 思いました。

--
sugi


Indexへ
(5616)←【5644】→(5658)
------------------------
【タイトル】Re(2):データ整理
【記事番号】 5644 (5616)
【 日時 】06/02/19 16:52
【 発言者 】ハマグチ

sugiさん、コジマさん、嵐さん、w2さん 今日は
私用を済ませて、覗いてみてびっくりしています。
こんなに早く私の希望に皆様が参加してくださるとは。

ツリーが枝分かれしていますので、ここにぶら下ります。

sugiさん
 99aありがとうございます 基本的には『重複単線削除』の様な使い勝手を希望していました。
前回の重複線処理(ver99)でも良かったのですが、昇順、降順では2度作業を
行う必要が有るようなデータでした。
基準となる3線色に対して、1線色と4線色とかが混在していた状態です。
それと一度線を切断してしまいますから当然切断した線を結合する必要もあり
結構作業が重なり、又必要な元データの内容をあまり変えたくも
ありませんでした。

これって3年ほど前につ作ってくださった外部変形コマンドですが 皆さん使用
方法がわかるかな?
私は下記の様な作図に使っております

『木造図面などを作成するときに先に通りに2線を描いて後から柱を作図し、このコマンドで壁と柱とが重複している壁の線を自動で削除してくれる優れものです』

前置きが少し長くなりましたが、ここからsugiさんにお願いです。
『重複単線削除』で角度にどうも対応していないようです。
昇順・降順のコマンドでは対応していますが 一度ご検討お願いします。
遅くなりましたが 久々のバージョンアップありがとうございました
線切断、重複線削除コマンドがパワーアップされ感謝しております。

コジマ様 ありがとうございます
いつもすばやい対応、惜しげもなく、公表していただき、頭が下がります。

 嵐さんが動作について色々確認されていますので、私ももう少し動かしてみて、ご報告させていただきたいと思います

コジマ様が作られたものは、前回公表いただいた『線消.BAT』に追加させていただく予定です

嵐 さん、ご苦労ですが動作確認や使いかってなどの希望があればご報告おねがいします。

皆さん よろしくお願いします。


Indexへ
(5644)←【5658】→(5662)
------------------------
【タイトル】Re(3):データ整理
【記事番号】 5658 (5644)
【 日時 】06/02/19 21:19
【 発言者 】嵐

▼ハマグチさん:
こんばんは。

みごと余分な短い線は消去できました。私のデータの中にはブロック図形とか寸法図形とかは含まれていませんので、その辺りがどう影響がでるかわかりませんが取り敢えずはこれでいいと思います。スギさん、先ほどのアドレス消しておいてください。一応データを送らせていただきました。

スギさん、コジマさん、ハマグチさん、それからJWWファンの皆さんや作者様、身体に気をつけて、頑張っていきまっしょい。(古いかナ)
有難うございました。

作者さまに提案、バージョンを「4.10a」と「5.00x」の二本立てという手もあるかと思います。


Indexへ
(5658)←【5662】→(5668)
------------------------
【タイトル】Re(4):データ整理
【記事番号】 5662 (5658)
【 日時 】06/02/19 23:19
【 発言者 】sugi

sugiです。
皆さん、こんにちは。

嵐さん wrote:
> みごと余分な短い線は消去できました。私のデータの中にはブロッ
> ク図形とか寸法図形とかは含まれていませんので、その辺りがどう
> 影響がでるかわかりませんが取り敢えずはこれでいいと思います。

データを送っていただき、ありがとうございます。
まだちゃんと確認していませんが、うまくいったようで良かったです。

ブロック図形や寸法図形は、もし問題があるようなら BAT ファイ
ルで書き出させないようにすることができます。
また BAT ファイルの「h1」を「h2」に変更すると選択範囲にまた
がるデータを選択できるようになります。
詳しくは JWW_SMPL.BAT をどうぞ。

--
sugi
# 実は私も岐阜の山猿。


Indexへ
(5662)←【5668】→(5669)
------------------------
【タイトル】Re(5):これからもヨロシク
【記事番号】 5668 (5662)
【 日時 】06/02/20 00:43
【 発言者 】嵐

▼sugiさん:

>sugi
># 実は私も岐阜の山猿。

私は年はとってますがパソコンについては若輩者です。これからもよろしくご指導ください。

もうひとりの岐阜の山猿より:これからはハンドルネームを「岐阜の山猿II」にしようかな。


Indexへ
(5668)←【5669】→(5672)
------------------------
【タイトル】Re(6):皆様に感謝・解決
【記事番号】 5669 (5668)
【 日時 】06/02/20 00:56
【 発言者 】ハマグチ

他のツリーでパニック状態になり遅くなりましたが
じっくり使い込んでみます
 皆様 ありがとうございました。
 私近隣の三重県です。
 末永くよろしくお願いします。


Indexへ
(5669)←【5672】→(5807)
------------------------
【タイトル】Re(7):皆様に感謝・解決
【記事番号】 5672 (5669)
【 日時 】06/02/20 01:19
【 発言者 】岐阜の山猿II

▼ハマグチさん:
こんばんは。

>他のツリーでパニック状態になり遅くなりましたが
ロボットの件ですね?お疲れ様でした。

>じっくり使い込んでみます
> 皆様 ありがとうございました。
> 私近隣の三重県です。
> 末永くよろしくお願いします。

こちらこそお願いします。

嵐 改め 岐阜の山猿IIより


Indexへ
(5672)←【5807】→(5823)
------------------------
【タイトル】Re(1):C言語に移植
【記事番号】 5807 (5595)
【 日時 】06/02/26 23:08
【 発言者 】コジマ

実行速度改善の為、C言語に移植してみました。
選択数2000本位までは、ストレスなく実行できました。
(ruby版での選択数200本と同程度の時間でした。)
多少バグが残っているようで、1回では消去出来ないときがあります。
http://forum.nifty.com/farchi/download/cad/jw/ln2_del.htm


Indexへ
(5807)←【5823】→(5879)
------------------------
【タイトル】Re(2):C言語に移植
【記事番号】 5823 (5807)
【 日時 】06/02/28 00:57
【 発言者 】ハマグチ

▼コジマさん:
>実行速度改善の為、C言語に移植してみました。
>選択数2000本位までは、ストレスなく実行できました。
>(ruby版での選択数200本と同程度の時間でした。)
>多少バグが残っているようで、1回では消去出来ないときがあります。
>http://forum.nifty.com/farchi/download/cad/jw/ln2_del.htm

C言語への移植ありがとうございます。
一般使用ではなんら問題なく旨く動いております。
意地悪なデータの場合(金網状のそれぞれ交点で分割されている線を複数重ねたデータ)一部、線が残るようですが こんな使用方法は
たぶん無いと思いますので ありがたいです
こんなに処理スピードが違うのかと驚いております。
要望になると思いますが バッチの中に 指定の線種・線色を選んで処理していただけるコマンドを加えていただけないでしょうか?
同じ長さの重複線を処理したい場合に処理する線の選別をしたいのです

お暇な時で結構ですのでよろしくお願いします。
   
 いつも迅速な対応に 感謝しております

  


Indexへ
(5823)←【5879】//(5596)
------------------------
【タイトル】Re(3):C言語に移植 機能アップ感謝!
【記事番号】 5879 (5823)
【 日時 】06/03/04 11:52
【 発言者 】ハマグチ

コジマ 様

バージョンアップ ありがとうございます。
使いかって、処理速度等 とてもありがたいです。
こんなに早く要望をかなえていただき驚いております。
ありがとうございます。 ペコ