无法使用 Sketchup 获取 Sketchup 模型的位置边界 Ruby API
Unable to get the location bound of Sketchup model using Sketchup Ruby API
我有一个地理定位的 Sketchup 3d 模型。我可以获得模型的地理位置,如下所示:-
latitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Latitude"]
longitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Longitude"]
现在我想在 3D 地球上渲染这个模型。所以我需要 3d 模型的位置边界。
基本上我需要模型在二维地图上的边界框。
现在我正在从模型的角(8 个角)中提取相同的内容。
// This will return left-front-bottom corner.
lowerCorner = Sketchup.active_model.bounds.corner(0)
// This will return right-back-top corner.
upperCorner = Skectup.active_model.bounds.corner(6)
但它 returns 简单的几何点,以米为单位,以英寸为单位,具体取决于模型。
例如,我在 sketchup 中上传了 this 模型。以下是我通过使用获得的 geo-location、lowerCorner 和 upperCorner 的值上述模型的上述代码。
geoLocation : 25.141407985864, 55.18563969191 //lat,long
lowerCorner : (-9483.01089", -6412.376053", -162.609524") // In inches
upperCorner : (-9483.01089", 6479.387909", 12882.651999") // In inches
所以我的第一个问题是我所做的是否正确?
第二个问题是如果 yes 对于第一个问题,我如何以经纬度格式获取 lowerCorner 和 upperCorner 的值。
But it returns simple geometrical points in meters, inches depending upon the model.
Geom::BoundingBox.corner
returns a Geom::Point3d
. The x, y and z members of that is a Length
。那总是返回 SketchUp 的内部值,即英寸。
但是,当您使用 Length.to_s
时,它将使用当前模型的单位设置并将值格式化为该值。当您调用 Geom::Point3d.to_s
时,它将使用 Length.to_s
。另一方面,如果您调用 Geom::Point3d.inspect
它将打印内部单位(英寸)而不格式化。
不要像那样直接利用模型的属性,我建议您使用 API 地理定位方法:Sketchup::Model.georeferenced?
听上去您可能会发现 Sketchup::Model.point_to_latlong
很有用。
示例 - 我将 SketchUp 模型定位到 Trondheim, Norway (Geolocation: 63°25′47″N 10°23′36″E 的城镇广场):
model = Sketchup.active_model
bounds = model.bounds
# Get the base of the boundingbox. No need to get the top - as the
# result doesn't contain altiture information.
(0..3).each { |i|
pt = bounds.corner(i)
latlong = model.point_to_latlong(pt)
latitude = latlong.x.to_f
longitude = latlong.y.to_f
puts "#{pt.inspect} => #{longitude}, #{latitude}"
}
我有一个地理定位的 Sketchup 3d 模型。我可以获得模型的地理位置,如下所示:-
latitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Latitude"]
longitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Longitude"]
现在我想在 3D 地球上渲染这个模型。所以我需要 3d 模型的位置边界。
基本上我需要模型在二维地图上的边界框。
现在我正在从模型的角(8 个角)中提取相同的内容。
// This will return left-front-bottom corner.
lowerCorner = Sketchup.active_model.bounds.corner(0)
// This will return right-back-top corner.
upperCorner = Skectup.active_model.bounds.corner(6)
但它 returns 简单的几何点,以米为单位,以英寸为单位,具体取决于模型。
例如,我在 sketchup 中上传了 this 模型。以下是我通过使用获得的 geo-location、lowerCorner 和 upperCorner 的值上述模型的上述代码。
geoLocation : 25.141407985864, 55.18563969191 //lat,long
lowerCorner : (-9483.01089", -6412.376053", -162.609524") // In inches
upperCorner : (-9483.01089", 6479.387909", 12882.651999") // In inches
所以我的第一个问题是我所做的是否正确? 第二个问题是如果 yes 对于第一个问题,我如何以经纬度格式获取 lowerCorner 和 upperCorner 的值。
But it returns simple geometrical points in meters, inches depending upon the model.
Geom::BoundingBox.corner
returns a Geom::Point3d
. The x, y and z members of that is a Length
。那总是返回 SketchUp 的内部值,即英寸。
但是,当您使用 Length.to_s
时,它将使用当前模型的单位设置并将值格式化为该值。当您调用 Geom::Point3d.to_s
时,它将使用 Length.to_s
。另一方面,如果您调用 Geom::Point3d.inspect
它将打印内部单位(英寸)而不格式化。
不要像那样直接利用模型的属性,我建议您使用 API 地理定位方法:Sketchup::Model.georeferenced?
听上去您可能会发现 Sketchup::Model.point_to_latlong
很有用。
示例 - 我将 SketchUp 模型定位到 Trondheim, Norway (Geolocation: 63°25′47″N 10°23′36″E 的城镇广场):
model = Sketchup.active_model
bounds = model.bounds
# Get the base of the boundingbox. No need to get the top - as the
# result doesn't contain altiture information.
(0..3).each { |i|
pt = bounds.corner(i)
latlong = model.point_to_latlong(pt)
latitude = latlong.x.to_f
longitude = latlong.y.to_f
puts "#{pt.inspect} => #{longitude}, #{latitude}"
}