资料 --- 【范例】选取视窗中显示在最前面的物件(Python & RhinoCommon)

[复制链接]
跳转到指定楼层
33396 Jorin 发表于 2015-5-22 11:16:50 楼主
本帖最后由 Jorin 于 2015-5-22 11:27 编辑

这个问题是前段时间通过 E-Mail 为用户解答的问题,拿来给大家参考:

因为 Rhino 中组织管理物件是通过物件类型和物件 GUID,没有哪个现成的函数能够通过显示顺序来抓取物件,所以这就需要自己写这样的功能。

思路很简单,求取正在使用中工作视窗中所有显示的物件最近点和这个工作视窗摄影机位置点的距离,距离最近的物件必然就是显示在最前面的物件。

我用 Python 调用 RhinoCommon 的函数写了一个简化版的例子,只是求解了工作视窗中物件边框方块中心点和摄影机位置的距离,用最近点的话要区分物件类型分别对待

例子如下:

[mw_shl_code=python,true]import Rhino
import scriptcontext

viewport=scriptcontext.doc.Views.ActiveView.MainViewport
settings = Rhino.DocObjects.ObjectEnumeratorSettings()
settings.HiddenObjects = False
settings.DeletedObjects = False
settings.IncludeGrips = False
settings.IncludePhantoms = True
settings.IncludeLights = False
settings.ViewportFilter = scriptcontext.doc.Views.ActiveView.MainViewport
settings.VisibleFilter = True
settings.ReferenceObjects = True
objects = scriptcontext.doc.Objects.GetObjectList(settings)
object_ids = []
vlocation=scriptcontext.doc.Views.ActiveView.MainViewport.CameraLocation
i=0
for object in objects:
    i=i+1
    bbox = object.Geometry.GetBoundingBox(True)
    if viewport.IsVisible(bbox):
        bboxc=bbox.Center
        td=vlocation-bboxc
        if i==1:d=td.Length
        if td.Length<=d:
            scriptcontext.doc.Objects.UnselectAll()
            d=td.Length
            object.Select(True)
            object_ids.append(object.Id)
scriptcontext.doc.Views.Redraw()[/mw_shl_code]

评分

参与人数 1技术 +3 坛币 +4 收起 理由
筑梦NARUTO + 3 + 4 又学习到了。。。

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
关于大陆地区Rhino原厂培训中心
无聊小子 发表于 2015-5-22 11:35:51
2
不会PY,不过也要支持一个~
筑梦NARUTO 发表于 2015-5-22 12:00:57
3
感谢jorin大大分享
kietsuc 发表于 2015-5-25 06:05:03 来自手机
4
谢谢J大分享,顺便向J大求教一些学习RhinoCommon的方法,求J大指导
筑梦NARUTO 发表于 2015-5-25 18:38:32
5
kietsuc 发表于 2015-5-25 06:05
谢谢J大分享,顺便向J大求教一些学习RhinoCommon的方法,求J大指导

这个真的没啥好讲的,学好面向对象编程,查rhinocommonSDK帮助文件就行。。。。
kietsuc 发表于 2015-5-25 18:45:42
6
筑梦NARUTO 发表于 2015-5-25 18:38
这个真的没啥好讲的,学好面向对象编程,查rhinocommonSDK帮助文件就行。。。。

谢谢大神,我现在才知道要学好面向对象才行
筑梦NARUTO 发表于 2015-5-25 20:46:15
7
kietsuc 发表于 2015-5-25 18:45
谢谢大神,我现在才知道要学好面向对象才行

RhinocommandSDK是基于面向对象写的帮助文件,,所以你懂面向对象编程好帮助查询你需要的东西。。。。。
您需要登录后才可以回帖 登录 | 注册成为会员

本版积分规则