Indexへ
(30949)//【30941】→(30942)
------------------------
【タイトル】R部分の日影図
【記事番号】 30941 (*)
【 日時 】08/09/12 12:04
【 発言者 】風呂好き

日影図の高さ入力なのですが
平面的にR部分の高さの入力はできなかったのでしたっけ?
過去ログでは、円を線に分解しての入力の方法がありましたが
その後R部分の入力ができるようになったのか
忘れてしまいました。
すみません。よろしくお願いします。

    風呂好き


Indexへ
(30941)←【30942】→(30971)
------------------------
【タイトル】Re(1):R部分の日影図
【記事番号】 30942 (30941)
【 日時 】08/09/12 14:25
【 発言者 】rj

▼風呂好きさん:
>平面的にR部分の高さの入力はできなかったのでしたっけ?

Jw_cadに添付されている Test3.jww のように R部分を線で包み込む というやり方に変更は無いと思います。
(Rの日影だと審査もやり難いでしょうし。)


Indexへ
(30942)←【30971】→(30943)
------------------------
【タイトル】Re(2):R部分の日影図
【記事番号】 30971 (30942)
【 日時 】08/09/13 17:29
【 発言者 】風呂好き

▼rjさん:こんにちは
>Jw_cadに添付されている Test3.jww のように R部分を線で包み込む というやり方に変更は無いと思います。
>(Rの日影だと審査もやり難いでしょうし。)
お返事遅くなりました。
了解しました。確かに、こ方法であれば間違いないですね。
ありがとうございました。

    風呂好き


Indexへ
(30971)←【30943】→(30972)
------------------------
【タイトル】Re(1):R部分の日影図
【記事番号】 30943 (30941)
【 日時 】08/09/12 14:33
【 発言者 】hayabusa

風呂好きさん、こんにちは。

円楕円(弧)に日影用建物高さデータを自動設定する事は
出来ないと思います。

たぶん、下記のような外部変形で可能だと思います。
この外部変形は任意形状の平面の結合点または線端部に
日影用高さデータを付加します。
日影図は2.5D機能でも確認できます。(逆は出来ません)

バッチファイル名は「czDraw.bat」にしてください。
##下記よりメモ帳にコピペして全角スペース→半角スペースの置換をしてください
@REM 日影(天空図)用建物高さデータ作図
@echo off
goto do%1
rem ---------------------------------------------------------
rem ※このファイルを編集した場合は上書き保存してください。
rem ※ファイルを閉じなくても編集は反映されます。
rem ※作図設定はこのバッチファイルの45行目からです。
rem ---------------------------------------------------------
REM #jww
REM #cd
REM #hm|[h1,h2] 入力 L|BAT 編集 R|
REM #:1
REM #h1
REM #g1 全グループ対象(書込みグループのみ場合はg0)
REM #hc 範囲選択または連続線を直接指示(R)※連続線に於いて異レイヤのデータに注意
REM #c 高さ h1 入力( 単位 m ) [ 無指定 10 ] :/_/a
REM #c 高さ h2 入力( 単位 m ) [ 無指定 0 ] :/_/b
REM #ht10
REM #ht30
REM #ht40
REM #zz
REM #zw
REM #zc
REM #hr
REM #e
REM #:2
REM #h0
REM #hr
REM #e
:do1
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
:do2
start notepad.exe czDraw.bat
ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
goto END
#!ruby -Ks
#------------------------------------------------------------
#   日影用文字種設定
#
$cn = "2"  #文字種(1〜10) [無指定 書込み文字種]
#------------------------------------------------------------
#   円楕円(弧)線変換設定
#
$pl = "on"  #曲線属性化設定( on≡設定有; off≡設定無 )
$div = 10  #線変換分割角度初期設定(0.1〜30) [単位 度]
#------------------------------------------------------------
def main
 include Math
 $h1,$h2 = "10","0"
 while ARGV.size > 1
  case argument = ARGV.pop
   when /^\/a/
    $h1 = argument[2..-1].to_s
   when /^\/b/
    $h2 = argument[2..-1].to_s
  end
 end
 $h1.delete!("+±,"); $h2.delete!("+±,")
 if $cn.to_i < 0 or $cn.to_i > 10
  puts "he 日影用文字種設定エラー。"; exit
 end
 if $pl != "on" && $pl != "off"
  puts "he 曲線属性設定エラー。"; exit
 end
 if $div < 0.1 or $div > 30
  puts "he 円楕円(弧)分割角度設定エラー。"; exit
 end
 $hdata=$h1+","+$h2
 lines1,lines2,lgs,lys = [],[],[],[]
 while ARGF.gets
  if $_ =~ /^hq/
   puts "hd"
  elsif $_ =~ /^lg/
   print
   lgs << $_
  elsif $_ =~ /^ly/
   print
   lys << $_
  elsif $_ =~ /^\s[0-9-]/
   xy = split
   xy.collect!{ |item| sprintf("%0.10f",item).to_f }
   puts xy.join("\s")
   lines1 << [lgs[-1],lys[-1],xy]
   lines2 << [lgs[-1],lys[-1],xy]
  elsif $_ =~ /^ci/
   ci = split
   ci.collect!{ |item| item.to_f }
   if ci.size == 4
    ci += [0,360,1,0]
   elsif ci.size == 8 && ci[6] != 1.0 && ci[4] == ci[5]
    ci[4],ci[5]=0,360
   end
   ci_lines=ci_keisan(ci)
   if $pl == "on"
    puts "pl"
   end
   for xy in ci_lines
    puts xy.join("\s")
    lines1 << [lgs[-1],lys[-1],xy]
    lines2 << [lgs[-1],lys[-1],xy]
   end
   puts "#"
  else
   print
  end
 end
 lines1.uniq!; lines2.uniq!
 if lines1.size <= 1
  puts "he 作図データが不足しています。"; exit
 end
 lines1.push(lines1[0]); lines2.push(lines2[0])
 puts "cc0"; puts "cn"+$cn
 points = []
 for l1 in lines1
  xy = l1[2]
  xx1,yy1,xx2,yy2 = xy[0],xy[1],xy[2],xy[3]
  lines2.shift
  for l2 in lines2
   ab = l2[2]
   xx3,yy3,xx4,yy4 = ab[0],ab[1],ab[2],ab[3]
   if l1[0] == l2[0] && l1[1] == l2[1]
    if (xx1-xx3).abs <= 10**(-7) && (yy1-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx1-xx4).abs <= 10**(-7) && (yy1-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx3).abs <= 10**(-7) && (yy2-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx4).abs <= 10**(-7) && (yy2-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    else
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    end
   end
  end
 end
 points.uniq!
 points.each{|item|
  puts item[0]; puts item[1]; puts item[2]
 }
 puts lgs[0]; puts lys[0]
 if points.size == 0
  puts "he 結合点がありません。"; exit
 else
  puts "h# 結合点または線端部に #{points.size} 個の日影用高さデータを書出しました。"
 end
end
def ci_keisan(ci)
 ci_lines,points = [],[]
 ox,oy,cr,he = ci[1],ci[2],ci[3],ci[6]
 k1,k2,zk = ci[4],ci[5],ci[7]*PI/180.0
 div=$div*PI/180.0
 if k1 < k2
  k1 = k1*PI/180.0
  k2 = k2*PI/180.0
 elsif k1 > k2
  k1 = k1*PI/180.0
  k2 = (k2+360)*PI/180.0
 end
 px,py = cr*cos(k1),cr*he*sin(k1)
 jpx,jpy = henkan(zk,px,py)
 points << [ox+jpx,oy+jpy]
 ki = k1+div
 while ki < k2
  px,py = cr*cos(ki),cr*he*sin(ki)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
  ki += div
 end
 px,py = cr*cos(k2),cr*he*sin(k2)
 jpx,jpy=henkan(zk,px,py)
 points << [ox+jpx,oy+jpy]
 ii=1; ll=points.length-1
 for idx in ii..ll
  x1=sprintf("%0.10f",points[idx-1][0]).to_f
  y1=sprintf("%0.10f",points[idx-1][1]).to_f
  x2=sprintf("%0.10f",points[idx][0]).to_f
  y2=sprintf("%0.10f",points[idx][1]).to_f
  ci_lines << [x1,y1,x2,y2]
 end
 return ci_lines
end
def henkan(zk,px,py)
 jpx=px*cos(zk)-py*sin(zk)
 jpy=px*sin(zk)+py*cos(zk)
 return jpx,jpy
end
main()
:END
#####以上です。


Indexへ
(30943)←【30972】→(30980)
------------------------
【タイトル】Re(2):R部分の日影図
【記事番号】 30972 (30943)
【 日時 】08/09/13 17:34
【 発言者 】風呂好き

▼hayabusaさん:こんにちは
お返事遅くなりました。
早速、外部変形使ってみました。
素晴らしい。

円の部分が自動で線分に分解されて、その部分の高さデーターが
一気に入りますね。
大変に助かります。
ありがとうございました。
2.5Dデーター作成にも活用できますし
ありがたいです。

       風呂好き


Indexへ
(30972)←【30980】→(30981)
------------------------
【タイトル】Re(2):R部分の日影図
【記事番号】 30980 (30943)
【 日時 】08/09/14 11:09
【 発言者 】寅

▼hayabusaさん:

お世話になります

内接→外接にできませんでしょうか


Indexへ
(30980)←【30981】→(30984)
------------------------
【タイトル】Re(3):R部分の日影図
【記事番号】 30981 (30980)
【 日時 】08/09/14 11:46
【 発言者 】hayabusa

こんにちは。

大事な事を言い忘れました。

円楕円(弧)の分割角度が1度以下程度でしたら誤差は少ないと
思いますが分割角度大きい場合建物配置状況によっては危険
側になる恐れがありますので建物外周線はオフセットして
計算したほうが安全だと思います。

▼寅さん:
>
>内接→外接にできませんでしょうか


外接の場合、単独円楕円の場合は問題ありませんが、その他の
場合、結合点取得の問題がありますので現時点では未対応です。
時間が取れたら検討してみたいと思います。


Indexへ
(30981)←【30984】→(30987)
------------------------
【タイトル】Re(4):R部分の日影図
【記事番号】 30984 (30981)
【 日時 】08/09/14 13:40
【 発言者 】寅

▼hayabusaさん:

>時間が取れたら検討してみたいと思います。

 外接なら安全側かと・・・
質問させていただきました。

早速のご回答ありがとうございました。


Indexへ
(30984)←【30987】→(30995)
------------------------
【タイトル】Re(5):R部分の日影図
【記事番号】 30987 (30984)
【 日時 】08/09/14 20:49
【 発言者 】hayabusa

こんにちは。

作図設定の中で内接、外接を選択出来るようにしました。
内接の場合は円(楕円)弧との結合点が滑らかに接続できます。
外接の場合は強引に結合してありますので滑らかでない場合があります。
分割角度を1度〜30度に変更しました。

分割角度を1度にして内接と外接を比べますと意外と差がないようです。

###下記をBAT編集項目から直接コピペしてください。
@REM 日影(天空図)用建物高さデータ作図
@echo off
goto do%1
rem ---------------------------------------------------------
rem ※このファイルを編集した場合は上書き保存してください。
rem ※ファイルを閉じなくても編集は反映されます。
rem ※作図設定はこのバッチファイルの45行目からです。
rem ---------------------------------------------------------
REM #jww
REM #cd
REM #hm|[h1,h2] 入力 L|BAT 編集 R|
REM #:1
REM #h1
REM #g1 全グループ対象(書込みグループのみ場合はg0)
REM #hc 範囲選択または連続線を直接指示(R)※連続線に於いて異レイヤのデータに注意
REM #c 高さ h1 入力( 単位 m ) [ 無指定 10 ] :/_/a
REM #c 高さ h2 入力( 単位 m ) [ 無指定 0 ] :/_/b
REM #ht10
REM #ht30
REM #ht40
REM #zz
REM #zw
REM #zc
REM #hr
REM #e
REM #:2
REM #h0
REM #hr
REM #e
:do1
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
:do2
start notepad.exe czDraw.bat
ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
goto END
#!ruby -Ks
#------------------------------------------------------------
#   日影用文字種設定
#
$cn = "2"  #文字種(1〜10) [無指定 書込み文字種]
#------------------------------------------------------------
#   円楕円(弧)線変換設定
#
$ty = "in"  #線変換種類( in≡内接; out≡外接 )
$pl = "on"  #曲線属性化設定( on≡設定有; off≡設定無 )
$div = 5   #線変換分割角度初期設定(1〜30) [単位 度]
#------------------------------------------------------------
def main
 include Math
 $h1,$h2 = "10","0"
 while ARGV.size > 1
  case argument = ARGV.pop
   when /^\/a/
    $h1 = argument[2..-1].to_s
   when /^\/b/
    $h2 = argument[2..-1].to_s
  end
 end
 $h1.delete!("+±,"); $h2.delete!("+±,")
 if $cn.to_i < 0 or $cn.to_i > 10
  puts "he 日影用文字種設定エラー。"; exit
 end
 if $ty != "in" && $ty != "out"
  puts "he 線変換種類設定エラー。"; exit
 end
 if $pl != "on" && $pl != "off"
  puts "he 曲線属性設定エラー。"; exit
 end
 if $div < 1 or $div > 30
  puts "he 円楕円(弧)分割角度設定エラー。"; exit
 end
 $hdata=$h1+","+$h2
 lines1,lines2,lgs,lys = [],[],[],[]
 while ARGF.gets
  if $_ =~ /^hq/
   puts "hd"
  elsif $_ =~ /^lg/
   print
   lgs << $_
  elsif $_ =~ /^ly/
   print
   lys << $_
  elsif $_ =~ /^\s[0-9-]/
   xy = split
   xy.collect!{ |item| sprintf("%0.10f",item).to_f }
   puts xy.join("\s")
   lines1 << [lgs[-1],lys[-1],xy]
   lines2 << [lgs[-1],lys[-1],xy]
  elsif $_ =~ /^ci/
   ci = split
   ci.collect!{ |item| item.to_f }
   if ci.size == 4
    ci += [0,360,1,0]
   elsif ci.size == 8 && ci[6] != 1.0 && ci[4] == ci[5]
    ci[4],ci[5]=0,360
   end
   ci_lines=ci_keisan(ci)
   if $pl == "on"
    puts "pl"
   end
   for xy in ci_lines
    puts xy.join("\s")
    lines1 << [lgs[-1],lys[-1],xy]
    lines2 << [lgs[-1],lys[-1],xy]
   end
   puts "#"
  else
   print
  end
 end
 lines1.uniq!; lines2.uniq!
 if lines1.size <= 1
  puts "he 作図データが不足しています。"; exit
 end
 lines1.push(lines1[0]); lines2.push(lines2[0])
 puts "cc0"; puts "cn"+$cn
 points = []
 for l1 in lines1
  xy = l1[2]
  xx1,yy1,xx2,yy2 = xy[0],xy[1],xy[2],xy[3]
  lines2.shift
  for l2 in lines2
   ab = l2[2]
   xx3,yy3,xx4,yy4 = ab[0],ab[1],ab[2],ab[3]
   if l1[0] == l2[0] && l1[1] == l2[1]
    if (xx1-xx3).abs <= 10**(-7) && (yy1-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx1-xx4).abs <= 10**(-7) && (yy1-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx3).abs <= 10**(-7) && (yy2-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx4).abs <= 10**(-7) && (yy2-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    else
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    end
   end
  end
 end
 points.uniq!
 points.each{|item|
  puts item[0]; puts item[1]; puts item[2]
 }
 puts lgs[0]; puts lys[0]
 if points.size == 0
  puts "he 結合点がありません。"; exit
 else
  puts "h# 結合点または線端部に #{points.size} 個の日影用高さデータを書出しました。"
 end
end
def ci_keisan(ci)
 ci_lines,points = [],[]
 ox,oy,cr,he = ci[1],ci[2],ci[3],ci[6]
 k1,k2,zk = ci[4],ci[5],ci[7]*PI/180.0
 div=$div*PI/180.0
 if k1 < k2
  k1 = k1*PI/180.0
  k2 = k2*PI/180.0
 elsif k1 > k2
  k1 = k1*PI/180.0
  k2 = (k2+360)*PI/180.0
 end
 px,py = cr*cos(k1),cr*he*sin(k1)
 jpx,jpy = henkan(zk,px,py)
 points << [ox+jpx,oy+jpy]
 if $ty == "out"
  cr2 = cr*(1+(1-cos(div/2.0)))
  px,py = cr2*cos(k1),cr2*he*sin(k1)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
 end
 ki = k1+div
 while ki < k2
  if $ty == "in"
   px,py = cr*cos(ki),cr*he*sin(ki)
  elsif $ty == "out"
   px,py = cr2*cos(ki),cr2*he*sin(ki)
  end
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
  ki += div
 end
 px,py = cr*cos(k2),cr*he*sin(k2)
 jpx,jpy=henkan(zk,px,py)
 points << [ox+jpx,oy+jpy]
 ii=1; ll=points.length-1
 for idx in ii..ll
  x1=sprintf("%0.10f",points[idx-1][0]).to_f
  y1=sprintf("%0.10f",points[idx-1][1]).to_f
  x2=sprintf("%0.10f",points[idx][0]).to_f
  y2=sprintf("%0.10f",points[idx][1]).to_f
  ci_lines << [x1,y1,x2,y2]
 end
 return ci_lines
end
def henkan(zk,px,py)
 jpx=px*cos(zk)-py*sin(zk)
 jpy=px*sin(zk)+py*cos(zk)
 return jpx,jpy
end
main()
:END
######以上です。


Indexへ
(30987)←【30995】→(31009)
------------------------
【タイトル】Re(6):R部分の日影図
【記事番号】 30995 (30987)
【 日時 】08/09/15 04:53
【 発言者 】寅

▼hayabusaさん:

>作図設定の中で内接、外接を選択出来るようにしました。


早々にご配慮誠にありがとうございました。


Indexへ
(30995)←【31009】→(31013)
------------------------
【タイトル】Re(7):R部分の日影図
【記事番号】 31009 (30995)
【 日時 】08/09/15 16:27
【 発言者 】hayabusa

寅さん、こんにちは。

度々すいません。m(_ _)m

外接設定においての単独円楕円の線変換処理に不具合がありましたので
修正しました。
※外接の場合は分割角度は大きめでも良いと思います。(10〜)

###下記をBAT編集項目から直接コピペしてください。
@REM 日影(天空図)用建物高さデータ作図
@echo off
goto do%1
rem ---------------------------------------------------------
rem ※このファイルを編集した場合は上書き保存してください。
rem ※ファイルを閉じなくても編集は反映されます。
rem ※作図設定はこのバッチファイルの45行目からです。
rem ---------------------------------------------------------
REM #jww
REM #cd
REM #hm|[h1,h2] 入力 L|BAT 編集 R|
REM #:1
REM #h1
REM #g1 全グループ対象(書込みグループのみ場合はg0)
REM #hc 範囲選択または連続線を直接指示(R)※連続線に於いて異レイヤのデータに注意
REM #c 高さ h1 入力( 単位 m ) [ 無指定 10 ] :/_/a
REM #c 高さ h2 入力( 単位 m ) [ 無指定 0 ] :/_/b
REM #ht10
REM #ht30
REM #ht40
REM #zz
REM #zw
REM #zc
REM #hr
REM #e
REM #:2
REM #h0
REM #hr
REM #e
:do1
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
:do2
start notepad.exe czDraw.bat
ruby -e 'puts "h# ruby #{RUBY_VERSION} "' > jwc_temp.txt
goto END
#!ruby -Ks
#------------------------------------------------------------
#   日影用文字種設定
#
$cn = "2"  #文字種(1〜10) [無指定 書込み文字種]
#------------------------------------------------------------
#   円楕円(弧)線変換設定
#
$ty = "out" #線変換種類( in≡内接; out≡外接 )
$pl = "on"  #曲線属性化設定( on≡設定有; off≡設定無 )
$div = 10  #線変換分割角度初期設定(1〜30) [単位 度]
#------------------------------------------------------------
def main
 include Math
 $h1,$h2 = "10","0"
 while ARGV.size > 1
  case argument = ARGV.pop
   when /^\/a/
    $h1 = argument[2..-1].to_s
   when /^\/b/
    $h2 = argument[2..-1].to_s
  end
 end
 $h1.delete!("+±,"); $h2.delete!("+±,")
 if $cn.to_i < 0 or $cn.to_i > 10
  puts "he 日影用文字種設定エラー。"; exit
 end
 if $ty != "in" && $ty != "out"
  puts "he 線変換種類設定エラー。"; exit
 end
 if $pl != "on" && $pl != "off"
  puts "he 曲線属性設定エラー。"; exit
 end
 if $div < 1 or $div > 30
  puts "he 円楕円(弧)分割角度設定エラー。"; exit
 end
 $hdata=$h1+","+$h2
 lines1,lines2,lgs,lys = [],[],[],[]
 while ARGF.gets
  if $_ =~ /^hq/
   puts "hd"
  elsif $_ =~ /^lg/
   print
   lgs << $_
  elsif $_ =~ /^ly/
   print
   lys << $_
  elsif $_ =~ /^\s[0-9-]/
   xy = split
   xy.collect!{ |item| sprintf("%0.10f",item).to_f }
   puts xy.join("\s")
   lines1 << [lgs[-1],lys[-1],xy]
   lines2 << [lgs[-1],lys[-1],xy]
  elsif $_ =~ /^ci/
   ci = split
   ci.collect!{ |item| item.to_f }
   flag = 0
   if ci.size == 4
    ci += [0,360,1,0]; flag = 1
   elsif ci.size == 8 && ci[6] != 1.0 && ci[4] == ci[5]
    ci[4],ci[5]=0,360; flag = 1
   end
   ci_lines=ci_keisan(flag,ci)
   if $pl == "on"
    puts "pl"
   end
   for xy in ci_lines
    puts xy.join("\s")
    lines1 << [lgs[-1],lys[-1],xy]
    lines2 << [lgs[-1],lys[-1],xy]
   end
   puts "#"
  else
   print
  end
 end
 lines1.uniq!; lines2.uniq!
 if lines1.size <= 1
  puts "he 作図データが不足しています。"; exit
 end
 lines1.push(lines1[0]); lines2.push(lines2[0])
 puts "cc0"; puts "cn"+$cn
 points = []
 for l1 in lines1
  xy = l1[2]
  xx1,yy1,xx2,yy2 = xy[0],xy[1],xy[2],xy[3]
  lines2.shift
  for l2 in lines2
   ab = l2[2]
   xx3,yy3,xx4,yy4 = ab[0],ab[1],ab[2],ab[3]
   if l1[0] == l2[0] && l1[1] == l2[1]
    if (xx1-xx3).abs <= 10**(-7) && (yy1-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx1-xx4).abs <= 10**(-7) && (yy1-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx3).abs <= 10**(-7) && (yy2-yy3).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    elsif (xx2-xx4).abs <= 10**(-7) && (yy2-yy4).abs <= 10**(-7)
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
    else
     points << [l1[0],l1[1],["cz",xx1,yy1,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx2,yy2,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx3,yy3,1,0,"\""+$hdata].join("\s")]
     points << [l1[0],l1[1],["cz",xx4,yy4,1,0,"\""+$hdata].join("\s")]
    end
   end
  end
 end
 points.uniq!
 points.each{|item|
  puts item[0]; puts item[1]; puts item[2]
 }
 puts lgs[0]; puts lys[0]
 if points.size == 0
  puts "he 結合点がありません。"; exit
 else
  puts "h# 結合点または線端部に #{points.size} 個の日影用高さデータを書出しました。"
 end
end
def ci_keisan(flag,ci)
 ci_lines,points = [],[]
 ox,oy,cr,he = ci[1],ci[2],ci[3],ci[6]
 k1,k2,zk = ci[4],ci[5],ci[7]*PI/180.0
 div=$div*PI/180.0
 if k1 < k2
  k1 = k1*PI/180.0
  k2 = k2*PI/180.0
 elsif k1 > k2
  k1 = k1*PI/180.0
  k2 = (k2+360)*PI/180.0
 end
 cr2 = cr*(1+(1-cos(div/2.0)))
 if $ty == "in"
  px,py = cr*cos(k1),cr*he*sin(k1)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
 elsif $ty == "out"
  if flag == 0
   px,py = cr*cos(k1),cr*he*sin(k1)
   jpx,jpy = henkan(zk,px,py)
   points << [ox+jpx,oy+jpy]
  end
  px,py = cr2*cos(k1),cr2*he*sin(k1)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
 end
 ki = k1+div
 while ki < k2
  if $ty == "in"
   px,py = cr*cos(ki),cr*he*sin(ki)
  elsif $ty == "out"
   px,py = cr2*cos(ki),cr2*he*sin(ki)
  end
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
  ki += div
 end
 if $ty == "in"
  px,py = cr*cos(k2),cr*he*sin(k2)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
 elsif $ty == "out"
  px,py = cr2*cos(k2),cr2*he*sin(k2)
  jpx,jpy = henkan(zk,px,py)
  points << [ox+jpx,oy+jpy]
  if flag == 0
   px,py = cr*cos(k2),cr*he*sin(k2)
   jpx,jpy=henkan(zk,px,py)
   points << [ox+jpx,oy+jpy]
  end
 end
 ii=1; ll=points.length-1
 for idx in ii..ll
  x1=sprintf("%0.10f",points[idx-1][0]).to_f
  y1=sprintf("%0.10f",points[idx-1][1]).to_f
  x2=sprintf("%0.10f",points[idx][0]).to_f
  y2=sprintf("%0.10f",points[idx][1]).to_f
  ci_lines << [x1,y1,x2,y2]
 end
 return ci_lines
end
def henkan(zk,px,py)
 jpx=px*cos(zk)-py*sin(zk)
 jpy=px*sin(zk)+py*cos(zk)
 return jpx,jpy
end
main()
:END
###以上です。


Indexへ
(31009)←【31013】→(31014)
------------------------
【タイトル】Re(8):R部分の日影図
【記事番号】 31013 (31009)
【 日時 】08/09/16 03:51
【 発言者 】寅

▼hayabusaさん:

>度々すいません。m(_ _)m

滅相もないデス


Indexへ
(31013)←【31014】→(31015)
------------------------
【タイトル】Re(8):R部分の日影図
【記事番号】 31014 (31009)
【 日時 】08/09/16 08:41
【 発言者 】風呂好き

▼hayabusaさん:こんにちは
修正版ありがとうございます。

   風呂好き


Indexへ
(31014)←【31015】→(31032)
------------------------
【タイトル】Re(8):再々修正
【記事番号】 31015 (31009)
【 日時 】08/09/16 11:08
【 発言者 】hayabusa1/2ボケ

だいぶボケてきたようです。f(^^;)

180行目の下記を修正してください。
修正前
cr2 = cr*(1+(1-cos(div/2.0)))
修正後
cr2 = cr/cos(div/2.0)


Indexへ
(31015)←【31032】//(30945)
------------------------
【タイトル】Re(9):再々修正
【記事番号】 31032 (31015)
【 日時 】08/09/17 08:27
【 発言者 】風呂好き

▼hayabusaさん:こんにちは
早速、修正しておきました。
ありがとうございました。

    風呂好き