このページについて
 
このページは、mura's homeAutoCAD掲示板 で、当方の発言(書込み)がある以下の掲示板の内容です。
http://www.mura.sh/bbs/wwwbbs.cgi?print+200711/07110166.txt
 
タイトルおよび質問内容は上記より引用しています。
 
引用した質問内容は、バックカラーが

   

となっています。
 
当方の発言は、バックカラーが

   

となっています。
 
その他の著作権者の掲載許可を得ていない発言内容は削除(リンクを除く)しています
 
また、当方では、削除部分の正当な著作権保持者を判断出来ませんので、
ご連絡を頂いても、復活させることは出来ません。ご了承下さい。
 
 
掲示板の著作権について
 
掲示板への匿名の書き込みであっても、著作権(著作権法)で保護されています。
また、判例(確定した判決)もあります。
 
裁判所 判例検索システム

ホテルジャンキーズ事件

知的財産裁判例
知的財産裁判例
平成13(ワ)22066  著作権 民事訴訟
平成14年04月15日 東京地方裁判所
全文 控訴
付帯控訴
知的財産裁判例
知的財産裁判例
平成14(ネ)2887  著作権 民事訴訟
平成14年10月29日 東京高等裁判所
全文 確定

ただし、あらかじめ取り決めがある場合は、その取り決めが優先します
 ※たとえば、OKWave の掲示板 (利用規約/第10条(投稿内容の利用権))

 
 
 

VBAのGetBoundingBoxメソッドについて

kamegai [HOMEPAGE] 2007/11/30(金) 12:34:40

円(弧)・楕円(弧)・円弧を含むポリライン・円(弧)を含むブロック等では、
正しい座標値を取得できません。
最小点は 0.00000001 小さく、最大点は逆に大きい値となります。
#ちなみに、円(弧)等を含まなければ問題ありません

解決策または対応策ありませんか?・・・どうしても・・・ならば、
オブジェクトを調べて補正する回避策を組み込むしか無いのでしょうか?
以下は、サンプルプログラムです。
Sub GetBoundingBox_Sample()
Dim circleObj           As AcadCircle
Dim radius              As Double
Dim centerPoint(0 To 2) As Double
Dim minExt              As Variant
Dim maxExt              As Variant
  '円の定義
  centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
  radius = 1#
  'モデル空間に円作成
  Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
  circleObj.Update
  '円を囲むボックスの2点を取得
  circleObj.GetBoundingBox minExt, maxExt
  'ズーム
  ThisDrawing.Application.ZoomWindow minExt, maxExt
  '座標値を標示
  MsgBox "円(中心0,0,0/半径1)の範囲                 " & vbCrLf & vbCrLf & _
         " 境界ボックスの最小点" & vbCrLf & _
         "   X = " & minExt(0) & vbCrLf & _
         "   Y = " & minExt(1) & vbCrLf & _
         "   Z = " & minExt(2) & vbCrLf & vbCrLf & _
         " 境界ボックスの最大点" & vbCrLf & _
         "   X = " & maxExt(0) & vbCrLf & _
         "   Y = " & maxExt(1) & vbCrLf & _
         "   Z = " & maxExt(2) & vbCrLf, _
         vbInformation, "GetBoundingBox Example"
End Sub
 

kamegai [HOMEPAGE] 2007/11/30(金) 12:46:56

ついでに・・・任意のオブジェクトを選択版
Sub GetBoundingBox_Sample2()
Dim returnObj As AcadObject
Dim minExt    As Variant
Dim maxExt    As Variant
Dim basePnt   As Variant
  Err.Clear
  On Error Resume Next
  'オブジェクト選択
  ActiveDocument.Utility.GetEntity returnObj, basePnt, vbCr & "オブジェクトを選択: "
  If Err Then Exit Sub
  'オブジェクトを囲むボックスの2点を取得
  returnObj.GetBoundingBox minExt, maxExt
  '座標値を標示
  MsgBox "オブジェクトの範囲            " & vbCrLf & vbCrLf & _
         " 境界ボックスの最小点" & vbCrLf & _
         "   X = " & minExt(0) & vbCrLf & _
         "   Y = " & minExt(1) & vbCrLf & _
         "   Z = " & minExt(2) & vbCrLf & vbCrLf & _
         " 境界ボックスの最大点" & vbCrLf & _
         "   X = " & maxExt(0) & vbCrLf & _
         "   Y = " & maxExt(1) & vbCrLf & _
         "   Z = " & maxExt(2) & vbCrLf, vbInformation, "GetBoundingBox Sample2"
End Sub
 

やまら 2007/11/30(金) 13:04:55

著作権者の許可を得ていないため削除
 
 
 
 

kamegai [HOMEPAGE] 2007/11/30(金) 14:35:33

>そもそもdoubleの限界に近いのではないでしょうか
う〜ん・・・Double(4.94065645841247E-324〜1.79769313486232E308)の限界ならば、
たとえば(上記円のサンプルでは)X=1のところ、
X=1.00000000000001(小数点以下14位)ならば理解できますが、当方の環境(2000i)では、
X=1.00000001(小数点以下8位)です。
上記円のサンプルでは、Z座標は0のハズなのに、
-0.00000001〜0.00000001となります。
また(当方の確認範囲では)、位置(座標値)に関係なく誤差は必ず±0.00000001。
#よって上記円のサンプルで、半径を0.00000001とするとボックスが2倍の大きさに
#曲線があるから手軽に範囲を取得したいのですが・・・直線だけなら、
#GetBoundingBoxがなくとも頂点の座標値を比較するだけなので、単純です。
#直線だけ対応版でも、作るのは大変でしょうが(笑)

やまら 2007/11/30(金) 15:19:56

著作権者の許可を得ていないため削除
 
 
 
 
 
 

kamegai [HOMEPAGE] 2007/11/30(金) 16:48:10

やまらさん、お忙しいところすいません。
>内部←→VBAでのデータ受け渡しの内部仕様が判らないと何ですが、
当方は知るよしもありませんが、ヘルプには、取得できる座標値は、
「バリアント型 (3 要素の倍精度浮動小数点数型配列)・・・」とあります。

#ちなみに、直線(0,0,0)-(1.23456789012345,1.23456789012345,1.23456789012345)では、
#境界ボックスの最小点=(0,0,0)
#境界ボックスの最大点=(1.23456789012345,1.23456789012345,1.23456789012345)
#と、期待する座標値を得ることが出来ます。

#さらに上記円のサンプルで、半径を0.00000000000001とすると・・・
#これほど誤差があると、オブジェクトの正確な位置決めには使用できない・・・
#1作図単位1mmの通常の使用範囲では問題ないのかもしれませんが。

オリバー君 2007/12/01(土) 21:29:12

著作権者の許可を得ていないため削除
 
http://ja.wikipedia.org/wiki/浮動小数点数
 
 
 
 
 

やまら 2007/12/02(日) 00:03:45

著作権者の許可を得ていないため削除
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

やまら 2007/12/02(日) 00:39:43

著作権者の許可を得ていないため削除
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

やまら 2007/12/02(日) 00:51:44

著作権者の許可を得ていないため削除