長さ勾配記入

作成理由

  • 以前、コジマさんが作られて jww掲示板で公開された勾配表示の外部変形が使えなくなったということでメンテナンスしていたのですが、いろいろと要望を盛り込んで進化中

動作環境

  • ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mingw32] にて動作確認しています

追記(2023-12-18)

  • jww掲示板で hide さんに指摘を受けた部分と引数の扱いなんかを修正しました
  • 外部変形の中身を理解してもらって自分で直してもらえると話が早くって非常に助かります
  • 結構恥ずかしい勘違いとかしてましたがホームページだと何事もなかったかのようにしれっと更新できるのです
  • 掲示板のスレッドは無事解決ということで、きれいに終わってるので修正報告のためだけに書き込むのは控えさせて頂きます
  • 気にされてる方はこのホームページをチェックしてもらってるでしょうし(多分)
  • banさん、R.Nさんフォローありがとうございました

追追記(2023-12-23)

  • ぐはっ、詰めが甘かった。banさんからの指摘を受け修正しました。banさん、ありがとうございます
  • バレてないだろうと思ってこそっと直したのに orz > R.Nさん
REM 長さ勾配記入.bat
REM 長さと勾配の%表示を記入
CHCP 932
echo off
REM #jww
REM #cd
goto %1
REM #hm【長さ勾配記入】 |長さ勾配一括|法勾配一括|線指示|
REM #:1
REM #h2
REM #hc 【長さ勾配一括】一括記入する範囲を選択
REM #h0
REM #c 【長さ勾配一括】線と文字の離れ(図寸) 無指定:1.0 /_a
REM #c 【長さ勾配一括】勾配有効桁数 無指定:3 /_b
REM #c 【長さ勾配一括】長さ有効桁数 無指定:3 /_c
REM #e
REM #:2
REM #h2
REM #hc 【法勾配一括】一括記入する範囲を選択
REM #h0
REM #c 【法勾配一括】線と文字の離れ(図寸) 無指定:1.0 /_a
REM #c 【法勾配一括】勾配有効桁数 無指定:3 /_b
REM #c 【法勾配一括】長さ有効桁数 無指定:3 /_c
REM #e
REM #:3
REM #h0
REM #c 【線指示】小数点以下有効桁数  無指定:3 /_b
REM #0 【線指示】測定値の記入位置を指示してください free(L)
REM #1ln 【線指示】ln線を指示してください free(L)
REM #e

:1
:2
copy jwc_temp.txt temp.txt
REM C:\ruby187b\bin\ruby -Ks -x %~f0 %1 %2 %3 %4
ruby -Ks -x %~f0 %1 %2 %3 %4
GOTO END
:3
copy jwc_temp.txt temp.txt
REM C:\ruby187b\bin\ruby -Ks -x %~f0 %1 %2 %3 %4
ruby -Ks -x %~f0 %1 %2 %3 %4
GOTO END

◎コメント
◎最終更新:2023-12-23
◎バッチファイル名は自由
◎以下 ruby スクリプト部分

#! ruby
# encoding: SJIS

$stdout=open("jwc_temp.txt","w")
$stderr=open("tmp_err.txt","w")

include Math
require "matrix"

class Array
  def to_v
    a=self.map{|e| e.to_f}
    return [Vector[a[0],a[1]],Vector[a[2],a[3]]].sort_by{|e| e.to_a}
  end
end

opt=ARGV[0].to_i  #1:長さ勾配一括 2:法勾配一括 3:線指示
han=1.0           #線と文字の離れ
kke=3             #勾配有効桁数
nke=3             #長さ有効桁数
ARGV.each{|e|
  if    %r|^a(.*)|=~e
    han=$1.to_f
  elsif %r|^b(.*)|=~e
    kke=$1.to_i
  elsif %r|^c(.*)|=~e
    nke=$1.to_i
  end}

if opt<=2 #長さ勾配一括
  hch,hs,by,zusun,takasa,l,mk,ml=[],[],[],0,0,0,"",""
  puts "cc4"
  open("temp.txt").readlines.each{|e|
    es=e.split(" ")
    puts e if /^h([kns]|^c[cdhnw])|^l[cgty]/=~e
    if /^hs/=~e
      es[1..-1].each{|item|by << item}
    elsif /^lg/=~e
      lg=es[0][2,1]
      zusun=by[lg.hex].to_f
    elsif /^hch/=~e
      hch=es
    elsif /^cn0/=~e
      takasa=es[2].to_f*0.5*zusun
    elsif /^cn\d/=~e
      takasa=hch[e.gsub("cn","").to_i].to_f*0.5*zusun
    elsif /^ [\d-]/=~e
      vl=e.split(" ").to_v
      vs,ve=vl[0],vl[1]
      v1=ve-vs
      v2=Matrix[[0,-1.0],[1.0,0]]*v1*(1.0/v1.r)*(han+takasa)
      p1=(vs+v1*0.5+v2)
      p2=(vs+v1*0.5-v2)
      l=0.001*v1.r
      if opt==2 #法勾配
        a=v1[0]/v1[1]
        if a==0
          mk="垂直"
        else
          a=0 unless a.finite?
          mk=%Q|1:#{sprintf("%.#{kke}f",a.abs)}|
        end
      else
        begin
          a=((v1[1]/v1[0]*100)*10.0**kke).round*0.1**kke
        rescue
          a="垂直"
        end
        if a=="垂直"
          mk="i=垂直"
        elsif a<0
          mk=%Q|i=#{sprintf("%.#{kke}f",a.abs)}%→|
        elsif a==0
          mk=%Q|i=#{sprintf("%.#{kke}f",a.abs)}%|
        else
          mk=%Q|←i=#{sprintf("%.#{kke}f",a.abs)}%|
        end
      end
      ml=sprintf("%.#{nke}f",(l*10.0**nke).round*0.1**nke)+"m"
      puts %Q|ch #{p1[0]} #{p1[1]} #{v1[0]} #{v1[1]} "#{mk}|
      puts %Q|ch #{p2[0]} #{p2[1]} #{v1[0]} #{v1[1]} "#{ml}|
    end
  }
else #勾配記入線指示
  koubai_moji=""
  open("temp.txt").readlines.each{|e|
    es=e.split(" ")
    if es[0]=~/^\d|^-/
      vl=e.split(" ").to_v
      vs,ve=vl[0],vl[1]
      v1=ve-vs
      begin
        a=((v1[1]/v1[0]*100)*10.0**kke).round*0.1**kke
      rescue
        a="垂直"
      end
      l=0.001*v1.r
      if a=="垂直"
        mk="i=垂直"
      elsif a<0
        mk=%Q|i=#{sprintf("%.#{kke}f",a.abs)}% 右下り|
      elsif a==0
        mk=%Q|i=#{sprintf("%.#{kke}f",a.abs)}%|
      else
        mk=%Q|i=#{sprintf("%.#{kke}f",a.abs)}% 右上り|
      end
      printf("ch %.10f %.10f %.10f %.10f \"%s\n",0,0,1,0,mk)
    elsif /^hq/!~e
      puts e
    end
  }
end
__END__
:END


コメント

  1. R.N より:

    こんにちは、
    batオプションの設定でスキップした場合、
    パラメータ数が変わり、スクリプトの「三項演算子」で拾えない場合が—
    と思いましたが、どうでしょうか?

  2. R.N より:

    たびたび、すみません。
    前Resの続きで、

    batオプションを追加したりする場合、

    while ~
     case ~
      when ~
     end
    end

    の方が、やってみて、使いやすいように思いましたが—

  3. ban より:

    banです。

    2行目に、
    REM 長さと勾配の‰表示を記入
    と記述されていますが、実際は%表示になっています。
    数値自体は千分率となっているので、単位を‰(千分率)に変更すれば良いのでは?
    %を正とする場合、数値は10で割る必要があると思われます。

    線の長さの単位がmと表示されています。
    数値自体はmmのようです。
    mを正とする場合、表示される数値は1000で割る必要があると思われます。

  4. R.N より:

    こんにちは、
    文字種が現在値なので、確認するのが面倒なので、
    batオプションで選択できるようにしてみました。
    (文字種№から、hchを取得)

  5. R.N より:

    すみません

    jww掲示板のResは、見逃していませんよ !!
    状況で、削除したりすることはありますが—
    今後とも、よろしく願います。

  6. R.N より:

    ある程度、自分の思いどうりに動作するようになりましたので、
    後は、任意文字の選択・設定に挑戦してみようかと
    sugiさんのおかげで、少しづつ理解が深まっているように—
    感謝です。

  7. R.N より:

    >後は、任意文字の選択・設定に挑戦してみようかと

    と書きましたが、標準文字種の色を変えたい—

  8. R.N より:

    こんばんは、

    更新(23/12/18)ありがとうございます。
    公開(23/12/13)の、データを利用させて頂いて、やっと自分なりにできました。

    書き出しデータの、[hcw・hch・hcd] を取得し、
    任意文字の場合、標準文字の№を、オプション選択、
    これに、[hcc] 文字色を選択・付加するようにしてみました。
    (現在の文字種に関係なく、標準文字・任意文字をメニュー選択・出力)

    初期値設定の要不要の確認に、手間取りましたが —

  9. R.N より:

    こんばんは、
    気にしてませんので、わざわざ修正されなくても—(記述ミスは、誰しも)
    sugiさんの指摘で、グローバル変数がありましたが、
    なるべく、ローカル変数で記述できるのなら、
    そのようにしたいと、思っています。
    改変もそのようにしてみました。
    ありがとう、ございました。

  10. ban より:

    改良有難うございます。

    勾配記入線指示 部分の勾配数値が
    a=((v1[1]/v1[0]*1000)*10.0**kke).round*0.1**kke
    となっています。
    単位が%表記優先の場合は
    a=((v1[1]/v1[0]*100)*10.0**kke).round*0.1**kke
    にしないと合いません。

    長さ勾配一括 部分のほうは変更されていますので、
    直し忘れと思います。

  11. R.N より:

    12/19の
    >気にしてませんので、わざわざ修正されなくても—(記述ミスは、誰しも)

    は、12/18 Upの敬称のみを修正して、12/19 upされていたように思いましたので —
    口足らずで、すみませんでした。