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
######以上です。