Indexへ
(10694)//【10687】→(10689)
------------------------
【タイトル】外部変形について教えて下さい
【記事番号】 10687 (*)
【 日時 】07/10/21 10:54
【 発言者 】tom

いつもお世話になっております。
外部変形についてですが、バッチファイルにて線選択を行うと「temp.txt」に
hhp1ln
-100 50 100 50 (数値は適当です)
が書き出されますが、これをrubyのスクリプト内で座標数値として扱うためにはどのようにプログラムを書けばよいのでしょうか?
点のように行の頭に"hp"などが付き1行で終わる場合はわかるのですが・・・
ご指導のほど、宜しくお願い致します。


Indexへ
(10687)←【10689】→(10693)
------------------------
【タイトル】Re(1):外部変形について教えて下さい
【記事番号】 10689 (10687)
【 日時 】07/10/21 16:59
【 発言者 】sugi

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

tomさん wrote:
> 外部変形についてですが、バッチファイルにて線選択を行うと「temp.txt」に
> hhp1ln
> -100 50 100 50 (数値は適当です)
> が書き出されますが、これをrubyのスクリプト内で座標数値とし
> て扱うためにはどのようにプログラムを書けばよいのでしょうか?
> 点のように行の頭に"hp"などが付き1行で終わる場合はわかるのですが・・・

やり方はいろいろあると思うのですが、私がよく使う方法を2つほ
ど紹介します。スクリプト中の jwc_temp.bak は jwc_temp.txt を
複写したバックアップファイルです。

# hhp1ln が現れた場合、もう一行読み込む方法
open("jwc_temp.bak"){|temp|
 while temp.gets
  case $_
  when /^hhp1ln/
   ln1=temp.gets.split(" ").collect{|e| e.to_f}
   p ln1 #=> [-100.0,50.0,100.0,50.0]
  end
 end}

# 正規表現の複数行マッチオプション(m)を利用する方法
ln1=open("jwc_temp.bak").read.scan(/^hhp1ln. (.*)/m).
 to_s.split(" ").collect{|e| e.to_f}
p ln1 #=> [-100.0,50.0,100.0,50.0]

ruby の外部変形はほとんどの場合、ソースも公開されています。
皆さんいろいろ工夫されているので、どういう処理をしているのか
を気にしながら、他人のスクリプトを読むと色々な発見があり、勉
強になると思います。

--
sugi


Indexへ
(10689)←【10693】→(10698)
------------------------
【タイトル】Re(2):外部変形について教えて下さい
【記事番号】 10693 (10689)
【 日時 】07/10/21 21:17
【 発言者 】tom

▼sugiさん:

先日「寸法値除算」の外変でお世話になりましたtomです。
その節は大変お世話になりました。(大活躍しています^^)
今回もどうぞ宜しくお願い致します。

早速試してみました。
># hhp1ln が現れた場合、もう一行読み込む方法
>open("jwc_temp.bak"){|temp|
> while temp.gets
>  case $_
>  when /^hhp1ln/
>   ln1=temp.gets.split(" ").collect{|e| e.to_f}
>   p ln1 #=> [-100.0,50.0,100.0,50.0]
>  end
> end}
こちらは私の使い方が悪いようでうまく実行出来ませんでした。
x1,y1等の割り当て方が間違っているのか、座標として認識させることができません・・・

># 正規表現の複数行マッチオプション(m)を利用する方法
>ln1=open("jwc_temp.bak").read.scan(/^hhp1ln. (.*)/m).
> to_s.split(" ").collect{|e| e.to_f}
>p ln1 #=> [-100.0,50.0,100.0,50.0]
こちらは見事に反応してくれました。

書籍や他の方のスクリプトを見てもなかなかうまく出来ず、相談させてもらいました。(まだまだ勉強不足です)

申し訳有りませんが、もう一つご指導頂けませんか
やりたいことは、1つの寸法を指定の位置で分割して2つに分けるような外変を作りたいのです。(指定の位置に引出線、矢印も追加)
寸法線や文字の表示はできるのですが、文字の離れを縮尺に対応出来ないでいます。 上記のln1と合わせて、hs、lgをどのように設定すればよいのかご指導頂ければ助かります。
いつか時間が取れる時で結構です、どうぞ宜しくお願い致します。
長文、失礼致しました。


Indexへ
(10693)←【10698】→(10700)
------------------------
【タイトル】Re(3):外部変形について教えて下さい
【記事番号】 10698 (10693)
【 日時 】07/10/21 22:55
【 発言者 】コジマ

>寸法線や文字の表示はできるのですが、文字の離れを縮尺に対応出来ないでいます。 上記のln1と合わせて、hs、lgをどのように設定すればよいのかご指導頂ければ助かります。

変数by(配列)を用意する。

by=[]
while ARGF.gets
  xy=split
  if xy[0]=~/^hs/
    xy[1..-1].each{|item|by<  end
  if xy[0]=~/^lg/
     zusun=by[xy[0][2,1].hex]
   end
end

変数zusun縮尺の逆数

図寸1mmならば、1*zusun


Indexへ
(10698)←【10700】→(10711)
------------------------
【タイトル】Re(3):外部変形について教えて下さい
【記事番号】 10700 (10693)
【 日時 】07/10/22 08:23
【 発言者 】sugi

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

> こちらは私の使い方が悪いようでうまく実行出来ませんでした。
> x1,y1等の割り当て方が間違っているのか、座標として認識させ
> ることができません・・・

「ln1」はローカル変数なので、ブロックの外からアクセスする場
合はブロックの外で初期化しておかないといけないという話だと思
います。多分。

詳しくは「ruby ローカル変数 有効範囲」あたりをキーワードにし
て google とかで検索してみて下さい。

試してもらうにはこちらの方が良かったかも。

# hhp1ln が現れた場合、もう一行読み込む方法
ln1=[]
open("jwc_temp.bak"){|temp|
 while temp.gets
  case $_
  when /^hhp1ln/
   ln1=temp.gets.split(" ").collect{|e| e.to_f}
  end
 end}
p ln1 #=> [-100.0,50.0,100.0,50.0]

--
sugi


Indexへ
(10700)←【10711】→(10692)
------------------------
【タイトル】Re(4):外部変形について教えて下さい
【記事番号】 10711 (10700)
【 日時 】07/10/22 20:58
【 発言者 】tom

sugiさん、こんばんは。

今回も大変お世話になりました、有り難う御座いました。
sugiさんとコジマさんにご指導頂き、なんとか外変が完成しました。
希望通りの結果が得られ大変満足しています。(スクリプト内はメチャクチャですが・・・)
最後に教えて頂いた分も後日試してみようと思っています。
本当に有り難う御座いました。


Indexへ
(10711)←【10692】→(10699)
------------------------
【タイトル】Re(1):外部変形について教えて下さい
【記事番号】 10692 (10687)
【 日時 】07/10/21 18:44
【 発言者 】コジマ

▼tomさん:
>いつもお世話になっております。
>外部変形についてですが、バッチファイルにて線選択を行うと「temp.txt」に
>hhp1ln
> -100 50 100 50 (数値は適当です)
>が書き出されますが、これをrubyのスクリプト内で座標数値として扱うためにはどのようにプログラムを書けばよいのでしょうか?
>点のように行の頭に"hp"などが付き1行で終わる場合はわかるのですが・・・
>ご指導のほど、宜しくお願い致します。

lineno メソッド(読込ファイルの行位置を返す)
を使うのも一案です。

下の例では、変数hhp1 に "hhp1ln" の行位置を代入しています。
線の行位置が hhp1+1 ならば、該当する線です。

while ARGF.gets
    xy=split
    if xy[0] == "hhp1ln"
        hhp1=ARGF.lineno.to_i
    end
    if xy[0] =~ /^\d|^-/
        if ARGF.lineno.to_i == hhp1+1
            sen_zahyo=xy.collect{|item|item.to_f}
        end
    end
end


Indexへ
(10692)←【10699】//(10696)
------------------------
【タイトル】Re(2):外部変形について教えて下さい
【記事番号】 10699 (10692)
【 日時 】07/10/21 23:19
【 発言者 】tom

▼コジマさん:

お世話になります。ご指導有り難う御座います。

>lineno メソッド(読込ファイルの行位置を返す)
>を使うのも一案です。
>
>下の例では、変数hhp1 に "hhp1ln" の行位置を代入しています。
>線の行位置が hhp1+1 ならば、該当する線です。
>
>while ARGF.gets
>    xy=split
>    if xy[0] == "hhp1ln"
>        hhp1=ARGF.lineno.to_i
>    end
>    if xy[0] =~ /^\d|^-/
>        if ARGF.lineno.to_i == hhp1+1
>            sen_zahyo=xy.collect{|item|item.to_f}
>        end
>    end
>end
こちらを使ってみたところバッチリでした。
コジマさんの他の外変スクリプト内にあった縮尺関連のコードをコピーして実行しましたら文字離れ、矢印サイズ、引出線離れ等、縮尺にうまく対応することが出来ました。 後は軸角に対応させれば完成です。
上に縮尺についてご指導頂いているようなので、そちらもじっくり拝見させて頂きます。
本当に有り難う御座いました。