Indexへ
(13381)//【13382】→(13384)
------------------------
【タイトル】角度測定
【記事番号】 13382 (*)
【 日時 】08/07/10 18:25
【 発言者 】chikinnsoup

JWの場合右回りが マイナス表示され 左回りがプラスとなるが、実際光波などで測定するとき、右回りがプラスとなるし、一発でその表示形式をとりたいのですが、わかる方いませんか?


Indexへ
(13382)←【13384】→(13386)
------------------------
【タイトル】Re(1):角度測定
【記事番号】 13384 (13382)
【 日時 】08/07/11 02:03
【 発言者 】coolyoppe

▼chikinnsoupさん:
>JWの場合右回りが マイナス表示され 左回りがプラスとなるが、実際光波などで測定するとき、右回りがプラスとなるし、一発でその表示形式をとりたいのですが、わかる方いませんか?

こんにちは。

標準でやるなら、
寸法コマンドの「角度」で左回りに測定すれば右回りと同じ角度が
得られます。

測量の逆トラバース計算のようなことでしたら、
Cabaさんの作成されたAWK外部変形
「簡易逆トラバース easy_GT win ver2.0」があります。
(基準点(器械点)と方向点(後視点)を指示するだけで、
距離と内角を作図してくれたり、測点名として配置した文字や
実点を範囲選択した後に器械点と後視点を指示することで
一括で距離と内角を作図することも出来るようです。
簡易計算表を作図してくれる機能もあるようです。)
http://homepage1.nifty.com/caba/
「Software」から。


Indexへ
(13384)←【13386】//(13387)
------------------------
【タイトル】Re(1):角度測定---参考例
【記事番号】 13386 (13382)
【 日時 】08/07/11 12:39
【 発言者 】hayabusa

chikinnsoupさんこんにちは。

下記は方向点(任意角度)を指示して他の測点の方向角または夾角
および距離を作図する外部変形です。
測定方向は時計回り、反時計回りの選択ができます。

スクリプトが長くなりますから実点(点マーカ)、指示点のみ対象と
して作図設定のエラー処理は省いてありますので注意してください。

この外部変形はmswin32ruby1.6〜1.8系が前提です。
hikari様のJ_GARU Ver2.0というソフトで自動導入できます。
正常に導入された場合は|BAT 編集|項目をクリックしますと左上に
ruby 1.8.1が表示されます。

以下、Lite & Seen Lite のMiyakeさんの手法に基づくスクリプト兼用バッチファイルです。

※注意 2000,XPの場合jwwおよび外部変形のパスに空白がありますと動作不可のようです。
    導入例 C:\jww\方向角.bat

バッチファイル名は「方向角測定.bat」としてください。
######下記よりメモ帳にコピペして全角スペース→半角スペースの置換をしてください。
@REM 方向角測定
@echo off
goto do%1
rem ------------------------------------------------------------
rem ※このファイルを編集した場合は上書き保存してください。
rem ※ファイルを閉じなくても編集は反映されます。
rem ※作図設定はこのバッチファイルの58行目からです。
rem ------------------------------------------------------------
rem ※注意点
rem 1.この外部変形は方向点(任意角度)を指示して他の測点の方向角
rem  または夾角および距離を作図するものです。
rem 2.対象は書込みグループのみです。
rem  (念のため不必要なグループは非表示にして下さい。)
rem 3.図面軸角0で使用してください。
rem ------------------------------------------------------------
REM #jww
REM #cd
REM #hm|実点選択型 L|測点指示型 R|BAT 編集|
REM #:1
REM #k 方向角測定方向選択|時計回り L|反時計回り R|/_/t
REM #1- 基準点または器械点をマウス指示(R)
REM #2 方向点または後視点をマウス指示(R)
REM #h1
REM #hc 測定する実点または点マーカを範囲選択---左クリックで確定
REM #ht10 ブロック図形の書出しをしない
REM #ht20 曲線の書出しをしない
REM #ht30 寸法図形の書出しをしない
REM #ht40 ソリッドの書出しをしない
REM #hr
REM #e
REM #:2
REM #k 方向角測定方向選択|時計回り L|反時計回り R|/_/t
REM #h0
REM #1- 基準点または器械点をマウス指示(R)
REM #2 方向点または後視点をマウス指示(R)
REM #3%d 測点をマウス指示(R) ※異縮尺の測点に注意
REM #99#
REM #hr
REM #e
REM #:3
REM #h0
REM #hr
REM #e
:do1
:do2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2 %3 > jwc_temp.txt
del temp.txt
rem pause
exit
goto END
:do3
start notepad.exe 方向角測定.bat
ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
goto END
#!ruby -Ks
####### 設 定 #################################################
$unit1 = "d1" #角度単位( d1≡度分秒; d2≡度小数 )
$marume1= "r" #角度丸め方式(r≡四捨五入; d≡切捨て; u≡切上げ)
$keta1 = 1   #度分秒の小数桁(0〜2)
$keta2 = 4   #度の小数桁  (0〜6)
$add0 = "on"  #角度単位付加設定(on≡設定有; off≡設定無)
#---------------------------------------------------------------
$unit2 = "m"  #距離単位(mm≡ミリ; m≡メートル)
$marume2="r"  #距離丸め方式(r≡四捨五入; d≡切捨て; u≡切上げ)
$keta3 = 2   #ミリの小数桁(0〜6)
$keta4 = 4   #メートルの小数桁(0〜6)
$add = "on"  #単位付加(on≡設定有; off≡設定無)
$comma="on"  #三桁カンマ区切り(on≡設定有; off≡設定無)
#---------------------------------------------------------------
$dx = 0.5   #角度文字横ずれ(-100〜100 図寸mm)
$dy = 0    #角度文字縦ずれ(-100〜100 図寸mm)
$cn = "3"   #角度文字種(1〜10)    [無指定:書込み文字種]
$cy = " "   #角度文字作図レイヤ(0〜f) [無指定:書込みレイヤ]
#---------------------------------------------------------------
$ln = "on"   #方向線作図設定(on≡設定有; off≡設定無)
$lc = "1"   #方向線線色(1〜9)    [無指定:書込み線色]
$lt = "9"   #方向線線種(1〜9)    [無指定:書込み線種]
$ly = " "   #方向線作図レイヤ(0〜f) [無指定:書込みレイヤ]
#---------------------------------------------------------------
$pt = "on"   #指示点実点作図設定(on≡設定有; off≡設定無)
$pn = "2"   #実点点種(1〜9)     [無指定:書込み点種]
$py = " "   #実点作図レイヤ(0〜f)  [無指定:書込みレイヤ]
#---------------------------------------------------------------
def main
 include Math
 while ARGV.size > 1
  case argument = ARGV.pop
   when /^[1-4]/
    $koumoku = argument.to_s
   when /^\/t/
    $round = argument[2,1].to_s
  end
 end
 if $koumoku == "1"
  msg1 = "実点または点マーカ"
 elsif $koumoku == "2"
  msg1 = "指示点"
  if $pt == "on"
   msg2 = "&実点"
  end
 end
 if $round == "1"
  msg3 = "時計回り"
 elsif $round == "2"
  msg3 = "反時計回り"
 end
 puts "cn"+$cn; puts "pn"+$pn; puts "lc"+$lc; puts "lt"+$lt
 lgs,lys,pts = [],[],[]
 while ARGF.gets
  ele = split
  if ele[0] =~ /^hs/
   ele.collect!{ |item| item.to_f }; ele.shift; scales = ele
  elsif ele[0] =~ /^lg/
   lgs << ele[0]
  elsif ele[0] =~ /^ly/
   lys << ele[0]
  elsif ele[0] =~ /^hp|^pt/
   pts << [0,0,0,sprintf("%0.9f",ele[1]).to_f,sprintf("%0.9f",ele[2]).to_f]
  end
 end
 scale0 = scales[lgs[0][2,1].hex]; $dx,$dy = scale0*$dx,scale0*$dy
 if pts[0] == pts[1]
  puts "he 基準点と方向点が同じです。"; exit
 end
 if pts.size <= 2
  if $koumoku == "1"
   puts "he 実点または点マーカが選択されていません。"; exit
  elsif $koumoku == "2"
   puts "he 測点が指示されていません。"; exit
  end
 end
 p0 = pts.shift; p0x,p0y = p0[3],p0[4]
 p1 = pts.shift; p1x,p1y = p1[3],p1[4]
 l1x,l1y = p1x-p0x,p1y-p0y
 pts.delete([0,0,0,p0x,p0y]); pts.uniq!; datas = []
 for idx in 0..pts.size-1
  pix,piy = pts[idx][3],pts[idx][4]; l2x,l2y = pix-p0x,piy-p0y
  if $round == "1"
   det,dot = (l1y*l2x-l1x*l2y),(l1y*l2y+l1x*l2x)
  elsif $round == "2"
   det,dot = (l1x*l2y-l1y*l2x),(l1x*l2x+l1y*l2y)
  end
  det,dot = sprintf("%0.9f",det).to_f,sprintf("%0.9f",dot).to_f
  houkou = atan2(det,dot)*180.0/PI; houkou = sprintf("%0.9f",houkou).to_f
  if houkou < 0
   houkou = 360+houkou
  end
  if $unit1 == "d1"
   keta = $keta1; kaku = dms_keisan(houkou,keta)
  elsif $unit1 == "d2"
   keta = $keta2; kaku = marume1(houkou,keta)
  end
  xl,yl = l2x.abs,l2y.abs
  if (p0x>pix && p0ypiy)
   yl *= -1
  end
  dk = atan2(yl,xl); dx,dy = dxy_keisan(p0x,p0y,pix,piy,dk)
  nagasa = (xl**2+yl**2)**0.5
  if $unit2 == "mm"
   keta = $keta3; sunpou = sprintf("%0.8f",nagasa).to_f
  elsif $unit2 == "m"
   keta = $keta4; sunpou = sprintf("%0.8f",nagasa).to_f*0.001
  end
  sunpou = marume2(sunpou,keta)
  if $add == "on" && $unit2 == "mm"
   datas << [$cc,p0x,p0y,pix,piy,dx,dy,xl,yl,"#{sunpou}mm","#{kaku}"]
  elsif $add == "on" && $unit2 == "m"
   datas << [$cc,p0x,p0y,pix,piy,dx,dy,xl,yl,"#{sunpou}m","#{kaku}"]
  else
   datas << [$cc,p0x,p0y,pix,piy,dx,dy,xl,yl,"#{sunpou}","#{kaku}"]
  end
 end
 for data in datas
  houkou = "\"#{data[-2]} #{data[-1]}"
  puts data[0]
  if $cy =~ /^[0-9a-fA-F]/
   puts "ly"+$cy
  else
   puts lys[0]
  end
  puts ["ch",data[3]+data[5],data[4]+data[6],data[7],data[8],houkou].join("\s")
  if $ln == "on"
   if $ly =~ /^[0-9a-fA-F]/
    puts "ly"+$ly
   else
    puts lys[0]
   end
   puts [p0x,p0y,data[3],data[4]].join("\s")
  end
  if $koumoku != "1" && $pt == "on"
   if $py =~ /^[0-9a-fA-F]/
    puts "ly"+$py
   else
    puts lys[0]
   end
   puts ["pt",data[3],data[4]].join("\s")
  end
 end
 puts lgs[0]; puts lys[0]
 puts "h# #{datas.size}ヵ所の#{msg1}に距離#{msg2}+方向角(#{msg3})を作図しました。"
end
def dms_keisan(kaku,keta)
 d = round_down_n(kaku,0)
 m = round_down_n((kaku-d)*60,0)
 s = marume1(((kaku-d)*60.0-m)*60.0,keta)
 if s.to_i == 60
  m += 1; s = "00"
  if m == 60
   d += 1; m = 0
   if d == 360
    d = 0
   end
  end
 end
 #s = s.gsub(/\.00*\Z/,"")
 m = sprintf("%02d",m)
 if kaku == 0
  if $add0 == "on"
   kaku = "0°"
  elsif $add0 == "off"
   kaku = "0"
  end
 else
  if $add0 == "on"
   kaku = "#{d}゚#{m}'#{s}″"
  elsif $add0 == "off"
   kaku = "#{d}-#{m}-#{s}"
  end
 end
 return kaku
end
def marume1(kaku,keta)
 if $marume1 == "r"
  kaku = round_n(kaku,keta)
 elsif $marume1 == "d"
  kaku = round_down_n(kaku,keta)
 elsif $marume1 == "u"
  kaku = round_up_n(kaku,keta)
 end
 if $unit1 == "d1"
  if keta == 0
   kaku = sprintf("%02.#{keta}f",kaku)
  elsif keta == 1
   kaku = sprintf("%04.#{keta}f",kaku)
  elsif keta == 2
   kaku = sprintf("%05.#{keta}f",kaku)
  end
 elsif $unit1 == "d2"
  if $add0 == "on"
   kaku = sprintf("%0.#{keta}f",kaku)+"°"
  elsif $add0 == "off"
   kaku = sprintf("%0.#{keta}f",kaku)
  end
 end
 return kaku
end
def dxy_keisan(x0,y0,xx6,yy6,dk)
 if (x0>xx6 && y0=xx6 && y0>=yy6)
  dx,dy = -$dx*cos(dk)-$dy*sin(dk),-$dx*sin(dk)+$dy*cos(dk); $cc = "cc2"
 else
  dx,dy = $dx*cos(dk)-$dy*sin(dk),$dx*sin(dk)+$dy*cos(dk); $cc = "cc0"
 end
 return dx,dy
end
def marume2(sunpou,keta)
 if $marume2 == "r"
  sunpou = round_n(sunpou, keta)
 elsif $marume2 == "d"
  sunpou = round_down_n(sunpou, keta)
 elsif $marume2 == "u"
  sunpou = round_up_n(sunpou, keta)
 end
 sunpou = sprintf("%0.#{keta}f",sunpou)
 if $comma=="on"
  if keta == 0
   sunpou = sunpou.gsub(/(\d{1,3})(?=(\d\d\d))/, '\1,')
  else
   sunpou = sunpou.gsub(/(\d{1,3})(?=(\d\d\d)+($`|\.))/, '\1,')
  end
 end
 return sunpou
end
def round_n(num, nth)
 num = num.to_f; nth = nth.to_i; num = num*(10**nth)
 return num.round()*(10**(-nth))
end
def round_down_n(num, nth)
 num = num.to_f; nth = nth.to_i; num = num*(10**nth)
 return num.floor()*(10**(-nth))
end
def round_up_n(num, nth)
 num = num.to_f; nth = nth.to_i; num = num*(10**nth)
 return num.ceil()*(10**(-nth))
end
main()
:END
######以上です。