下載app免費領(lǐng)取會員
前幾天群里有小伙伴發(fā)了一張動態(tài)圖,是通過鼠標(biāo)拖拽框選范圍,自動剪裁平面視圖,覺得這個可以寫篇文章,于是就和小伙伴商量了下,把源文件要過來了,整理成今天這篇文章,感謝群里的小伙伴——J.W
同時我會分享我寫的另一種方法
由于我比較懶,所以呢,我就簡單把小伙伴的代碼邏輯給大家說下(詳細(xì)講,估計一篇文章下不來,小伙伴們見諒哈~):
首先,這里用到的是View下的GetCropRegionShapeManager方法,用來管理剪裁框的形狀:
然后我們點擊
ViewCropRegionShapeManager,就能跳轉(zhuǎn)到對應(yīng)的Class,進(jìn)而找到其對應(yīng)的方法:
詳細(xì)的方法如下:
這里需要的是一個CurveLoop,那么就簡單了,我們只需要給一組曲線就好了。
然后這里還有一個點,就是獲取選擇框的輪廓,用到了PickBox這個方法。而動態(tài)圖中的第一步,是框選操作,這必然會用到UI.Selection下的方法:
之后就是通過一系列的自定義函數(shù),將PickBox的最大和最小點,投影到平面上,在通過平面點,構(gòu)造出一個矩形框,最后將整個舉行框,應(yīng)用給CropBox即可,這里我就不詳述了,小伙伴們可以自己去測試哈~
這里需要選擇一種PickBoxStyle,只有三個枚舉,隨便選一個理論上就可以,因為我們用到的只是box。
之后就是通過一系列的自定義函數(shù),將PickBox的最大和最小點,投影到平面上,在通過平面點,構(gòu)造出一個矩形框,最后將整個舉行框,應(yīng)用給CropBox即可,這里我就不詳述了,小伙伴們可以自己去測試哈~
接下來,講講我寫的這段代碼的邏輯:
在看小伙伴這個程序的時候,我看到View下的CrowBox屬性是可get可set的,這個在我們前面文章里是講過的,這種是可讀又可設(shè)置的屬性,如果通過這個來剪裁視圖,那應(yīng)該會很簡單,于是我就自己嘗試了下:
可以看出,get和set的,都是一個BoundingBoxXYZ,那么我們只需要根據(jù)PickBox重新構(gòu)造一個BoundingBoxXYZ應(yīng)該就是可以的。
接下來就開始整理我們的代碼:
首先,獲取選擇框的方法一樣,只是用法略有不同,我是直接獲取PickBox的最大和最小點,然后重新構(gòu)造一個BoundingBoxXYZ,方法如下:
然后將這個新的BoundingBoxXYZ更新給原來的CropBox即可,似乎到這里就完事兒。
但是實際操作下來,不知道為什么出了一個問題,總是提示Box為空,但是我獲取Box的屬性,確顯示不為空,沒搞明白為什么。
不過好在,在胡亂弄了幾次以后,發(fā)現(xiàn),先將新生成的BoundingBoxXYZ過繼給Dynamo,之后再重新過繼回給Revit,這個問題就解決了,可能是這個API有些問題吧,就先湊合用了~
然后在反復(fù)測試的時候,還發(fā)現(xiàn)一個問題,就是如果之前已經(jīng)剪裁過的視圖,會出現(xiàn)剪裁框位置錯誤的情況,又查了下,在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
當(dāng)然如果你用的是Revit2022和Dynamo2.10,那么就更簡單了,你只需要獲取PickBox并構(gòu)造一個BoundingBoxXYZ即可,其他的都有現(xiàn)成節(jié)點了,就不再詳細(xì)介紹了,直接附上截圖和代碼:
# 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()
本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。
推薦專題