首页/技术分享

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

发布于:2021-06-15 14:28:40
7516人 分享

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

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

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

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

图片.png

然后我们点击

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

图片.png

详细的方法如下:

图片.png

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

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


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

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

图片.png

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

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

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

图片.png

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

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

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

图片.png

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

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

图片.png

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

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

图片.png


















































# Copyright(c) 2019, 九哥BIMerimport clrimport sysclr.AddReference('ProtoGeometry')from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitAPI')import Autodeskfrom Autodesk.Revit.DB import *
clr.AddReference("RevitNodes")import Revitclr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference('RevitServices')import RevitServicesfrom RevitServices.Persistence import DocumentManagerfrom RevitServices.Transactions import TransactionManager
clr.AddReference('RevitAPIUI')from Autodesk.Revit.UI import *
doc = DocumentManager.Instance.CurrentDBDocumentuidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocumentview = doc.ActiveView
pboxS = Autodesk.Revit.UI.Selection.PickBoxStyle.EnclosingpickedBox = uidoc.Selection.PickBox(pboxS, "框选范围框")minPoint = pickedBox.MinmaxPoint = pickedBox.Max
t = Transaction(doc, "剪裁视图")t.Start()
newbox = BoundingBoxXYZ()newbox.Min = minPointnewbox.Max = maxPointnewbox = newbox.ToProtoType()newbox = newbox.ToRevitType()
view.CropBoxActive = Trueview.CropBoxVisible = TrueshapeManager = view.GetCropRegionShapeManager()shapeManager.RemoveCropRegionShape()view.CropBox = newbox
t.Commit()
OUT= view

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

图片.png

# Copyright(c) 2019, 九哥BIMerdoc = DocumentManager.Instance.CurrentDBDocumentuidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocumentview = uidoc.ActiveView
pboxS=Autodesk.Revit.UI.Selection.PickBoxStyle.EnclosingpickedBox = uidoc.Selection.PickBox(pboxS, "框选范围框")
newbox = BoundingBoxXYZ()newbox.Min = pickedBox.Minnewbox.Max = pickedBox.Max
OUT= view,newbox.ToProtoType()

转载请注明来源本文地址:https://www.tuituisoft/blog/4521.html

上一篇:

Revit房间相关操作(七)

下一篇:

Revit房间相关操作(八)