无法使用 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-locationlowerCornerupperCorner 的值上述模型的上述代码。

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}"
}