Indexへ
(33406)//【33412】→(33413)
------------------------
【タイトル】2点間の距離or面積の一括表示方法
【記事番号】 33412 (*)
【 日時 】09/03/10 23:15
【 発言者 】kaeru

こんばんは。
2度目の投稿になります。

また一つ教えて欲しいのですが、
2点間の距離or線で囲まれた面積を
クリックしながら1つずつ表示していましたが、
一括で出来るプログラムはないでしょうか?

知っている方がいましたら、
教えて下さい。
宜しくお願いします。


Indexへ
(33412)←【33413】→(33414)
------------------------
【タイトル】Re(1):ZAHYOU..EXE連携編
【記事番号】 33413 (33412)
【 日時 】09/03/10 23:51
【 発言者 】hayabusa

こんにちは。

Jw_cadに装備されているZAHYOU.EXEを使用しますと辺長と面積表と同時に
測定できます。
昔と違って建築でも直角座標による面積計算の手法は認知されている
と思いますので提出資料としても充分通用すると思います。

対象は指示線の結合点、交点および延長交点です。

バッチファイル名は「座標面積計算.bat」として動作確認後必要の場合は
適当な名前に変更してください。
(start notepad.exe 座標面積計算.bat---修正必要)

バッチファイルはZAHYOU.EXEと同じディレクトリに置いてください。
通常はjwwフォルダ内にあります。

####下記より[メモ帳]にコピペして全角空白→半角空白の置換をしてください。
@REM 座標面積計算CB出力
@echo off
goto do%1
rem
rem ----------------------------------------------------------------
rem ※このファイルを編集した場合は上書き保存して閉じてください。
rem ※ファイルを閉じなくても編集は反映されます。
rem ----------------------------------------------------------------
rem ※概要
rem 1.この外部変形はZAHYOU.EXEと連携して座標面積データをクリップボ
rem  ードにコピーするものです。
rem  タブ区切りですのでエクセル側に於いて右クリックからセル単位で
rem  貼付できます。(他の表計算ソフトでも可能)
rem  項目1.は数学座標(XY)、項目2.は測量座標(YX)で書込みます。
rem 2.平行線を連続して指示しますとエラーとなります。
rem  始点は最初の指示線と二番目の指示線の交点です。
rem  測定方向は外形線指示の方向と同じです。
rem 3.対象は書込みグループと同一縮尺の線分です。
rem  念の為不必要なグループは非表示にしてください。
rem 4.オプションをコマンドラインに設定してありますので環境に応じて
rem  適宜修正して下さい。
rem  ◆重要 /Fオプション設定不可 /Pオプションは削除不可
rem ----------------------------------------------------------------
REM #jww
REM #cd
REM #hm |数学座標 L|測量座標 R|Excel 起動|BAT 編集|
REM #:1
REM #:2
REM #h0
REM #3 □ 面積表の書込位置(表左上)を指示 (L)free (R)Read
REM #f 敷 地 名 称 : /_$1"
REM #c 座標点番号の前に追加する文字 : /_$2"
REM #0 ◎ 座標原点を指示 (L)free (R)Read
REM #4ln 最初の外形線をマウス指示(L) ※異縮尺に注意
REM #5ln 計算する《方向》の外形線をマウス指示(L) ※異縮尺に注意
REM #6ln 次の外形線を順番にマウス指示(L) ※異縮尺に注意
REM #99#
REM #hr
REM #e
REM #:3
REM #:4
REM #h0
REM #hr
REM #e
rem ---------------------------------------------------------------------------
rem ※ZAHYOU.EXEオプション(ZAHYOU.BATより抜粋)※ /F /Rオプション除外
rem
rem  ◎座標面積計算の場合の追加オプション
rem   /M*  :文字種類を指定     「*」 は文字種類 No (無指定:2)
rem   /N*  :初期番号指定      「*」 は指定番号  ( 1〜1001  無指定:1 )
rem   /L*  :レイヤ指定       「*」 は指定レイヤ ( 0〜F 無指定:書込レイヤ )
rem   /H*  :辺を作図指定      「*」 は 線色  No (無指定:1)
rem   /T*  :座標点作図指定     「*」 は 点種類 No (無指定:1)
rem   /K*  :小数点以下有効桁数   「*」 は桁数  (0〜4 無指定:3)
rem   /C  :指定小数点以下桁数未満を切捨で寸法値作図 (無指定:四捨五入)
rem   /S  :辺長の寸法値作図
rem   /Y  :YX座標系の読込、書込
rem   /P  :座標点に座標番号を作図
rem   $1"**":敷地名称文字指定(**が文字)
rem   $2"**":座標点番号の前に追加する文字指定(**が文字)
rem      (「"」を使用するには「\"」を入力する)
rem ----------------------------------------------------------------------------
:do1
:do2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt /1 > jwc_temp.txt
IF %1==1 ZAHYOU.EXE /M3 /N1 /LF /H3 /T2 /K4 /C /S /P %2 %3 %4
IF %1==2 ZAHYOU.EXE /M3 /N1 /LF /H3 /T2 /K4 /C /S /Y /P %2 %3 %4
ruby -x %~f0 jwc_temp.txt /2 > temp2.txt
copy jwc_temp.txt+temp2.txt jwc_temp.txt > nul
del temp.txt
del temp2.txt
rem pause
goto END
:do3
start excel.exe > jwc_temp.txt
rem ※コマンドラインにファイルを設定する場合
rem  ---カレントの場合---
rem  start excel.exe sample.xls > jwc_temp.txt
rem  ---絶対パスの場合(パスに空白がある場合は""で囲む)---
rem  start excel.exe "C:\my excel\sample.xls" > jwc_temp.txt
goto END
:do4
start notepad.exe 座標面積計算.BAT
ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
goto END
#!ruby -Ks
def main
 script = ARGV.pop.to_s
 if script == "/1"
  lgs,datas,lns,pts = [],[],[],[]
  while ARGF.gets
   ele = split
   if ele[0] =~ /^hq|^hp[4-9]ln|^hp[1-9][0-9]ln/
   elsif ele[0] =~ /^hs/
    datas << $_; ele.shift
    scales = ele.collect!{ |item| item.to_f }
   elsif ele[0] =~ /^lg/
    datas << $_; lgs << ele[0]
    scale0 = scales[lgs[0][2,1].hex]
   elsif ele[0] =~ /^[0-9-]/ && ele.size == 4
    scale = scales[lgs[-1][2,1].hex]
    if scale == scale0
     lns << ele.collect!{|item| item.to_f}
    end
   else
    datas << $_
   end
  end
  lns.push(lns[0])
  for idx in 0..lns.size-2
   x0,y0 = kouten(lns[idx],lns[idx+1])
   if x0 != nil && y0 != nil
    pts << [x0,y0]
   end
  end
  pts.uniq!
  if pts.size <= 2
   exit
  end
  x0,y0,x1,y1=pts[0][0],pts[0][1],pts[1][0],pts[1][1]
  datas.each{|data|
   if data =~ /hn/
    puts data
    puts ["hp1",x0,y0].join("\s")
    puts ["hp2",x1,y1].join("\s")
   else
    print data
   end
  }
  puts [x0,y0,x1,y1].join("\s")
  for count in 2.. pts.length-1
   x1,y1,x2,y2=pts[count-1][0],pts[count-1][1],pts[count][0],pts[count][1]
   puts [x1,y1,x2,y2].join("\s")
  end
  x3,y3=pts[-1][0],pts[-1][1]
  puts [x3,y3,x0,y0].join("\s")
 elsif script == "/2"
  lines = []
  while ARGF.gets
   if $_ =~ /^he/
    exit
   else
    lines << $_
   end
  end
  zz0,zz1,zz2,zz3 = [],[],[],[]
  ii,ll = 0,lines.size-1
  for idx in ii .. ll
   if lines[idx] =~ /^\s[0-9-]/
    iidx = idx + 1
    ele = []
    while lines[iidx] =~ /^ch/
     ele << lines[iidx][lines[iidx].index(/\"/)+1..-1].strip
     iidx += 1
    end
    if ele.size == 4
     zz0 << ["座標点","Xn(m)","Yn(m)","(Xn+1 - Xn-1)・Yn"].join("\t")
    elsif ele.size == 5
     ele.shift
     zz1 << ele.join("\t")
    elsif ele.size == 2
     zz2 << "\t\t"+ele.join("\t")
    elsif ele.size == 3
     ele.shift
     zz3 << "\t\t"+ele.join("\t")
    end
    ii = iidx
   end
  end
  setValue([zz0,zz1,zz2,zz3].join("\n"))
  puts "h# #{zz1.size} 点の座標面積データをクリップボードにコピーしました。"
 end
end
def kouten(axy,bxy)
 x1,y1,x2,y2 = axy[0],axy[1],axy[2],axy[3]
 x3,y3,x4,y4 = bxy[0],bxy[1],bxy[2],bxy[3]
 f1,g1 = x2-x1,y2-y1
 f2,g2 = x4-x3,y4-y3
 det = f2*g1-f1*g2
 if det.abs > 10**(-4)
  dx,dy = x3-x1,y3-y1
  t1,t2 = (f2*dy-g2*dx)/det,(f1*dy-g1*dx)/det
  x0,y0 = x1+f1*t1,y1+g1*t1
  x0,y0 = sprintf("%0.9f",x0).to_f,sprintf("%0.9f",y0).to_f
  return x0,y0
 else
   exit
 end
end
def setValue(string)
 require 'Win32API'
 openClipboard = Win32API.new('user32','OpenClipboard',['I'],'I')
 emptyClipboard = Win32API.new('user32','EmptyClipboard',[],'I')
 setClipboardData = Win32API.new('user32','SetClipboardData',['I','I'],'I')
 closeClipboard = Win32API.new('user32','CloseClipboard',[],'I')
 globalAlloc = Win32API.new('kernel32','GlobalAlloc',['I','I'],'I')
 globalLock = Win32API.new('kernel32','GlobalLock',['I'],'I')
 globalUnlock = Win32API.new('kernel32','GlobalUnlock',['I'],'I')
 lstrlen = Win32API.new('kernel32','lstrlenA',['P'],'I')
 lstrcpy = Win32API.new('kernel32','lstrcpyA',['I','P'],'P')
 if openClipboard.Call(0) != 0
  emptyClipboard.Call()
  ll = lstrlen.Call(string)
  gMEM = globalAlloc.Call(0x2000, ll+1)
  pMEM = globalLock.Call(gMEM)
  lstrcpy.Call(pMEM, string)
  setClipboardData.Call(1, gMEM)
  globalUnlock.Call(gMEM)
  closeClipboard.Call
 end
end
main()
__END__
:END
#######以上です。


Indexへ
(33413)←【33414】//(33417)
------------------------
【タイトル】Re(2):ZAHYOU..EXE連携編
【記事番号】 33414 (33413)
【 日時 】09/03/11 01:15
【 発言者 】kaeru

こんばんは。

早速のご回答、ありがとうございます。
ちょっとtryしてみます。

結果をご報告致します。
ありがとうございます。


▼hayabusaさん:
>こんにちは。
>
>Jw_cadに装備されているZAHYOU.EXEを使用しますと辺長と面積表と同時に
>測定できます。
>昔と違って建築でも直角座標による面積計算の手法は認知されている
>と思いますので提出資料としても充分通用すると思います。
>
>対象は指示線の結合点、交点および延長交点です。
>
>バッチファイル名は「座標面積計算.bat」として動作確認後必要の場合は
>適当な名前に変更してください。
>(start notepad.exe 座標面積計算.bat---修正必要)
>
>バッチファイルはZAHYOU.EXEと同じディレクトリに置いてください。
>通常はjwwフォルダ内にあります。
>
>####下記より[メモ帳]にコピペして全角空白→半角空白の置換をしてください。
>@REM 座標面積計算CB出力
>@echo off
>goto do%1
>rem
>rem ----------------------------------------------------------------
>rem ※このファイルを編集した場合は上書き保存して閉じてください。
>rem ※ファイルを閉じなくても編集は反映されます。
>rem ----------------------------------------------------------------
>rem ※概要
>rem 1.この外部変形はZAHYOU.EXEと連携して座標面積データをクリップボ
>rem  ードにコピーするものです。
>rem  タブ区切りですのでエクセル側に於いて右クリックからセル単位で
>rem  貼付できます。(他の表計算ソフトでも可能)
>rem  項目1.は数学座標(XY)、項目2.は測量座標(YX)で書込みます。
>rem 2.平行線を連続して指示しますとエラーとなります。
>rem  始点は最初の指示線と二番目の指示線の交点です。
>rem  測定方向は外形線指示の方向と同じです。
>rem 3.対象は書込みグループと同一縮尺の線分です。
>rem  念の為不必要なグループは非表示にしてください。
>rem 4.オプションをコマンドラインに設定してありますので環境に応じて
>rem  適宜修正して下さい。
>rem  ◆重要 /Fオプション設定不可 /Pオプションは削除不可
>rem ----------------------------------------------------------------
>REM #jww
>REM #cd
>REM #hm |数学座標 L|測量座標 R|Excel 起動|BAT 編集|
>REM #:1
>REM #:2
>REM #h0
>REM #3 □ 面積表の書込位置(表左上)を指示 (L)free (R)Read
>REM #f 敷 地 名 称 : /_$1"
>REM #c 座標点番号の前に追加する文字 : /_$2"
>REM #0 ◎ 座標原点を指示 (L)free (R)Read
>REM #4ln 最初の外形線をマウス指示(L) ※異縮尺に注意
>REM #5ln 計算する《方向》の外形線をマウス指示(L) ※異縮尺に注意
>REM #6ln 次の外形線を順番にマウス指示(L) ※異縮尺に注意
>REM #99#
>REM #hr
>REM #e
>REM #:3
>REM #:4
>REM #h0
>REM #hr
>REM #e
>rem ---------------------------------------------------------------------------
>rem ※ZAHYOU.EXEオプション(ZAHYOU.BATより抜粋)※ /F /Rオプション除外
>rem
>rem  ◎座標面積計算の場合の追加オプション
>rem   /M*  :文字種類を指定     「*」 は文字種類 No (無指定:2)
>rem   /N*  :初期番号指定      「*」 は指定番号  ( 1〜1001  無指定:1 )
>rem   /L*  :レイヤ指定       「*」 は指定レイヤ ( 0〜F 無指定:書込レイヤ )
>rem   /H*  :辺を作図指定      「*」 は 線色  No (無指定:1)
>rem   /T*  :座標点作図指定     「*」 は 点種類 No (無指定:1)
>rem   /K*  :小数点以下有効桁数   「*」 は桁数  (0〜4 無指定:3)
>rem   /C  :指定小数点以下桁数未満を切捨で寸法値作図 (無指定:四捨五入)
>rem   /S  :辺長の寸法値作図
>rem   /Y  :YX座標系の読込、書込
>rem   /P  :座標点に座標番号を作図
>rem   $1"**":敷地名称文字指定(**が文字)
>rem   $2"**":座標点番号の前に追加する文字指定(**が文字)
>rem      (「"」を使用するには「\"」を入力する)
>rem ----------------------------------------------------------------------------
>:do1
>:do2
>copy jwc_temp.txt temp.txt > nul
>ruby -x %~f0 temp.txt /1 > jwc_temp.txt
>IF %1==1 ZAHYOU.EXE /M3 /N1 /LF /H3 /T2 /K4 /C /S /P %2 %3 %4
>IF %1==2 ZAHYOU.EXE /M3 /N1 /LF /H3 /T2 /K4 /C /S /Y /P %2 %3 %4
>ruby -x %~f0 jwc_temp.txt /2 > temp2.txt
>copy jwc_temp.txt+temp2.txt jwc_temp.txt > nul
>del temp.txt
>del temp2.txt
>rem pause
>goto END
>:do3
>start excel.exe > jwc_temp.txt
>rem ※コマンドラインにファイルを設定する場合
>rem  ---カレントの場合---
>rem  start excel.exe sample.xls > jwc_temp.txt
>rem  ---絶対パスの場合(パスに空白がある場合は""で囲む)---
>rem  start excel.exe "C:\my excel\sample.xls" > jwc_temp.txt
>goto END
>:do4
>start notepad.exe 座標面積計算.BAT
>ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
>goto END
>#!ruby -Ks
>def main
> script = ARGV.pop.to_s
> if script == "/1"
>  lgs,datas,lns,pts = [],[],[],[]
>  while ARGF.gets
>   ele = split
>   if ele[0] =~ /^hq|^hp[4-9]ln|^hp[1-9][0-9]ln/
>   elsif ele[0] =~ /^hs/
>    datas << $_; ele.shift
>    scales = ele.collect!{ |item| item.to_f }
>   elsif ele[0] =~ /^lg/
>    datas << $_; lgs << ele[0]
>    scale0 = scales[lgs[0][2,1].hex]
>   elsif ele[0] =~ /^[0-9-]/ && ele.size == 4
>    scale = scales[lgs[-1][2,1].hex]
>    if scale == scale0
>     lns << ele.collect!{|item| item.to_f}
>    end
>   else
>    datas << $_
>   end
>  end
>  lns.push(lns[0])
>  for idx in 0..lns.size-2
>   x0,y0 = kouten(lns[idx],lns[idx+1])
>   if x0 != nil && y0 != nil
>    pts << [x0,y0]
>   end
>  end
>  pts.uniq!
>  if pts.size <= 2
>   exit
>  end
>  x0,y0,x1,y1=pts[0][0],pts[0][1],pts[1][0],pts[1][1]
>  datas.each{|data|
>   if data =~ /hn/
>    puts data
>    puts ["hp1",x0,y0].join("\s")
>    puts ["hp2",x1,y1].join("\s")
>   else
>    print data
>   end
>  }
>  puts [x0,y0,x1,y1].join("\s")
>  for count in 2.. pts.length-1
>   x1,y1,x2,y2=pts[count-1][0],pts[count-1][1],pts[count][0],pts[count][1]
>   puts [x1,y1,x2,y2].join("\s")
>  end
>  x3,y3=pts[-1][0],pts[-1][1]
>  puts [x3,y3,x0,y0].join("\s")
> elsif script == "/2"
>  lines = []
>  while ARGF.gets
>   if $_ =~ /^he/
>    exit
>   else
>    lines << $_
>   end
>  end
>  zz0,zz1,zz2,zz3 = [],[],[],[]
>  ii,ll = 0,lines.size-1
>  for idx in ii .. ll
>   if lines[idx] =~ /^\s[0-9-]/
>    iidx = idx + 1
>    ele = []
>    while lines[iidx] =~ /^ch/
>     ele << lines[iidx][lines[iidx].index(/\"/)+1..-1].strip
>     iidx += 1
>    end
>    if ele.size == 4
>     zz0 << ["座標点","Xn(m)","Yn(m)","(Xn+1 - Xn-1)・Yn"].join("\t")
>    elsif ele.size == 5
>     ele.shift
>     zz1 << ele.join("\t")
>    elsif ele.size == 2
>     zz2 << "\t\t"+ele.join("\t")
>    elsif ele.size == 3
>     ele.shift
>     zz3 << "\t\t"+ele.join("\t")
>    end
>    ii = iidx
>   end
>  end
>  setValue([zz0,zz1,zz2,zz3].join("\n"))
>  puts "h# #{zz1.size} 点の座標面積データをクリップボードにコピーしました。"
> end
>end
>def kouten(axy,bxy)
> x1,y1,x2,y2 = axy[0],axy[1],axy[2],axy[3]
> x3,y3,x4,y4 = bxy[0],bxy[1],bxy[2],bxy[3]
> f1,g1 = x2-x1,y2-y1
> f2,g2 = x4-x3,y4-y3
> det = f2*g1-f1*g2
> if det.abs > 10**(-4)
>  dx,dy = x3-x1,y3-y1
>  t1,t2 = (f2*dy-g2*dx)/det,(f1*dy-g1*dx)/det
>  x0,y0 = x1+f1*t1,y1+g1*t1
>  x0,y0 = sprintf("%0.9f",x0).to_f,sprintf("%0.9f",y0).to_f
>  return x0,y0
> else
>   exit
> end
>end
>def setValue(string)
> require 'Win32API'
> openClipboard = Win32API.new('user32','OpenClipboard',['I'],'I')
> emptyClipboard = Win32API.new('user32','EmptyClipboard',[],'I')
> setClipboardData = Win32API.new('user32','SetClipboardData',['I','I'],'I')
> closeClipboard = Win32API.new('user32','CloseClipboard',[],'I')
> globalAlloc = Win32API.new('kernel32','GlobalAlloc',['I','I'],'I')
> globalLock = Win32API.new('kernel32','GlobalLock',['I'],'I')
> globalUnlock = Win32API.new('kernel32','GlobalUnlock',['I'],'I')
> lstrlen = Win32API.new('kernel32','lstrlenA',['P'],'I')
> lstrcpy = Win32API.new('kernel32','lstrcpyA',['I','P'],'P')
> if openClipboard.Call(0) != 0
>  emptyClipboard.Call()
>  ll = lstrlen.Call(string)
>  gMEM = globalAlloc.Call(0x2000, ll+1)
>  pMEM = globalLock.Call(gMEM)
>  lstrcpy.Call(pMEM, string)
>  setClipboardData.Call(1, gMEM)
>  globalUnlock.Call(gMEM)
>  closeClipboard.Call
> end
>end
>main()
>__END__
>:END
>#######以上です。