Dynamo读取选择框PickBox剪裁Revit视图

前几天群里有小伙伴发了一张动态图,是通过鼠标拖拽框选范围,自动剪裁平面视图,觉得这个可以写篇文章,于是就和小伙伴商量了下,把源文件要过来了,整理成今天这篇文章,感谢群里的小伙伴——J.W
 

同时我会分享我写的另一种方法

由于我比较懒,所以呢,我就简单把小伙伴的代码逻辑给大家说下(详细讲,估计一篇文章下不来,小伙伴们见谅哈~):
 

首先,这里用到的是View下的GetCropRegionShapeManager方法,用来管理剪裁框的形状:

然后我们点击

ViewCropRegionShapeManager,就能跳转到对应的Class,进而找到其对应的方法:

详细的方法如下:

这里需要的是一个CurveLoop,那么就简单了,我们只需要给一组曲线就好了。

然后这里还有一个点,就是获取选择框的轮廓,用到了PickBox这个方法。而动态图中的第一步,是框选操作,这必然会用到UI.Selection下的方法:

点进去以后,就有参照语法:
 

这里需要选择一种PickBoxStyle,只有三个枚举,随便选一个理论上就可以,因为我们用到的只是box。

于是就有个获取PickBox的代码,然后在获取对应的属性即可:

pboxS=Autodesk.Revit.UI.Selection.PickBoxStyle.Enclosing
pickedBox = uidoc.Selection.PickBox(pboxS, "框选范围框")


 

之后就是通过一系列的自定义函数,将PickBox的最大和最小点,投影到平面上,在通过平面点,构造出一个矩形框,最后将整个举行框,应用给CropBox即可,这里我就不详述了,小伙伴们可以自己去测试哈~


 

************华丽分割线**************


 

接下来,讲讲我写的这段代码的逻辑:

在看小伙伴这个程序的时候,我看到View下的CrowBox属性是可get可set的,这个在我们前面文章里是讲过的,这种是可读又可设置的属性,如果通过这个来剪裁视图,那应该会很简单,于是我就自己尝试了下:

可以看出,get和set的,都是一个BoundingBoxXYZ,那么我们只需要根据PickBox重新构造一个BoundingBoxXYZ应该就是可以的。

接下来就开始整理我们的代码:

首先,获取选择框的方法一样,只是用法略有不同,我是直接获取PickBox的最大和最小点,然后重新构造一个BoundingBoxXYZ,方法如下:

然后将这个新的BoundingBoxXYZ更新给原来的CropBox即可,似乎到这里就完事儿。

但是实际操作下来,不知道为什么出了一个问题,总是提示Box为空,但是我获取Box的属性,确显示不为空,没搞明白为什么。

不过好在,在胡乱弄了几次以后,发现,先将新生成的BoundingBoxXYZ过继给Dynamo,之后再重新过继回给Revit,这个问题就解决了,可能是这个API有些问题吧,就先凑合用了~

然后在反复测试的时候,还发现一个问题,就是如果之前已经剪裁过的视图,会出现剪裁框位置错误的情况,又查了下,在ViewCropRegionShapeManager方法下,有一个删除剪裁框的方法,那么我就在程序里添加了两行代码,保证程序不会出错。

同时将剪裁视图和剪裁区域可见打开:
 

最后附上完整代码:

# Copyright(c) 2019, 九哥BIMer
import clr
import sys
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
view = doc.ActiveView

pboxS = Autodesk.Revit.UI.Selection.PickBoxStyle.Enclosing
pickedBox = uidoc.Selection.PickBox(pboxS, "框选范围框")
minPoint = pickedBox.Min
maxPoint = pickedBox.Max

t = Transaction(doc, "剪裁视图")
t.Start()

newbox = BoundingBoxXYZ()
newbox.Min = minPoint
newbox.Max = maxPoint
newbox = newbox.ToProtoType()
newbox = newbox.ToRevitType() 

view.CropBoxActive = True
view.CropBoxVisible = True
shapeManager = view.GetCropRegionShapeManager()
shapeManager.RemoveCropRegionShape()
view.CropBox = newbox

t.Commit()

OUT= view

************华丽分割线**************


 

当然如果你用的是Revit2022和Dynamo2.10,那么就更简单了,你只需要获取PickBox并构造一个BoundingBoxXYZ即可,其他的都有现成节点了,就不再详细介绍了,直接附上截图和代码:


# Copyright(c) 2019, 九哥BIMer
doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
view = uidoc.ActiveView

pboxS=Autodesk.Revit.UI.Selection.PickBoxStyle.Enclosing
pickedBox = uidoc.Selection.PickBox(pboxS, "框选范围框")

newbox = BoundingBoxXYZ()
newbox.Min = pickedBox.Min
newbox.Max = pickedBox.Max

OUT= view,newbox.ToProtoType()

最后,再此感谢小伙伴——J.W的奉献~

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九哥BIMer

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值