前几天群里有小伙伴发了一张动态图,是通过鼠标拖拽框选范围,自动剪裁平面视图,觉得这个可以写篇文章,于是就和小伙伴商量了下,把源文件要过来了,整理成今天这篇文章,感谢群里的小伙伴——J.W
同时我会分享我写的另一种方法
由于我比较懒,所以呢,我就简单把小伙伴的代码逻辑给大家说下(详细讲,估计一篇文章下不来,小伙伴们见谅哈~):
首先,这里用到的是View下的GetCropRegionShapeManager方法,用来管理剪裁框的形状:
然后我们点击
ViewCropRegionShapeManager,就能跳转到对应的Class,进而找到其对应的方法:
详细的方法如下:
这里需要的是一个CurveLoop,那么就简单了,我们只需要给一组曲线就好了。
然后这里还有一个点,就是获取选择框的轮廓,用到了PickBox这个方法。而动态图中的第一步,是框选操作,这必然会用到UI.Selection下的方法:
之后就是通过一系列的自定义函数,将PickBox的最大和最小点,投影到平面上,在通过平面点,构造出一个矩形框,最后将整个举行框,应用给CropBox即可,这里我就不详述了,小伙伴们可以自己去测试哈~
这里需要选择一种PickBoxStyle,只有三个枚举,随便选一个理论上就可以,因为我们用到的只是box。
之后就是通过一系列的自定义函数,将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()
转载请注明来源本文地址:https://www.tuituisoft/blog/4521.html