このページについて | ||||||||||||||||||||||||||
このページは、mura's home の AutoCAD掲示板 で、当方の発言(書込み)がある以下の掲示板の内容です。
タイトルおよび質問内容は上記より引用しています。 引用した質問内容は、バックカラーが となっています。 当方の発言は、バックカラーが となっています。 その他の著作権者の掲載許可を得ていない発言内容は削除(リンクを除く)しています。 また、当方では、削除部分の正当な著作権保持者を判断出来ませんので、 ご連絡を頂いても、復活させることは出来ません。ご了承下さい。
|
円(弧)・楕円(弧)・円弧を含むポリライン・円(弧)を含むブロック等では、
正しい座標値を取得できません。
最小点は
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 |
ついでに・・・任意のオブジェクトを選択版
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 |
著作権者の許可を得ていないため削除
>そもそも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がなくとも頂点の座標値を比較するだけなので、単純です。
#直線だけ対応版でも、作るのは大変でしょうが(笑)
著作権者の許可を得ていないため削除
やまらさん、お忙しいところすいません。
>内部←→VBAでのデータ受け渡しの内部仕様が判らないと何ですが、
当方は知るよしもありませんが、ヘルプには、取得できる座標値は、
「バリアント型
(3 要素の倍精度浮動小数点数型配列)・・・」とあります。
#ちなみに、直線(0,0,0)-(1.23456789012345,1.23456789012345,1.23456789012345)では、
#境界ボックスの最小点=(0,0,0)
#境界ボックスの最大点=(1.23456789012345,1.23456789012345,1.23456789012345)
#と、期待する座標値を得ることが出来ます。
#
#さらに上記円のサンプルで、半径を0.00000000000001とすると・・・
#これほど誤差があると、オブジェクトの正確な位置決めには使用できない・・・
#1作図単位1mmの通常の使用範囲では問題ないのかもしれませんが。
著作権者の許可を得ていないため削除
http://ja.wikipedia.org/wiki/æµ®åå°æ°ç¹æ°
著作権者の許可を得ていないため削除
著作権者の許可を得ていないため削除
著作権者の許可を得ていないため削除