问题描述
在Revit中,我选择了要与主视图(primaryCenter)对齐的视图(selvpsElements)。我的主视图中心如下所示:
primaryCenter = [<Autodesk.Revit.DB.XYZ object at 0x00000000000010D9 [(-1.785047418,0.064021364,0.000000000)]>]
这是通过将GetBoxCenter()方法应用于特定视口生成的
然后,与主视图对齐的所选视图在下面
selvpsElements = [<Autodesk.Revit.DB.Viewport object at 0x00000000000010D6 [Autodesk.Revit.DB.Viewport]>,<Autodesk.Revit.DB.Viewport object at 0x00000000000010D7 [Autodesk.Revit.DB.Viewport]>,<Autodesk.Revit.DB.Viewport object at 0x00000000000010D8 [Autodesk.Revit.DB.Viewport]>]
我尝试过
for t in selvpsElements:
t.SetBoxCenter(primaryCenter)
但是它不起作用。我是否需要使用.ToXyz()将primaryCenter转换为XYZ?任何帮助将不胜感激!
编辑:
此信息是通过以下方式生成的:
#Get all viewports in Document
viewPorts = list(DB.FilteredElementCollector(doc).OfClass(Viewport))
#Get all Views on sheets,their Name,Sheet Number and Box Outline
for vp in viewPorts:
sheet = doc.GetElement(vp.SheetId)
view = doc.GetElement(vp.ViewId)
viewPortList.append([sheet.SheetNumber,view.ViewName,vp])
#Sort the list
lbxViewsSorted = sorted(viewPortList,key=lambda x: x[0])
#create lists for WPF ListBox and comboBox
for vp in lbxViewsSorted:
colViews.append(vp[0] + "," + vp[1])
colPrimary.append(vp[0] + "," + vp[1])
然后使用pyrevit表单。WPFWindow具有用户选择的列表框(colViews)和组合框(colPrimary)(lbxViews和cmbPrimary),按钮上附加了一个函数(alignviews),以进行以下操作:
def alignviews(self,sender,args):
selvpviews = []
selvpsublist = []
selvpsElements = []
primaryElement = []
primaryOutline = []
primaryCenter = []
selectedOutline = []
selectedCenter = []
primaryXYZ = []
# get selected Views to be aligned
selviews = [vps for vps in self.lbxViews.SelectedItems]
for vs in selviews:
selvpviews.append(vs.split(","))
for vp in selvpviews:
selvpsublist.append(vp[1::])
# flatten selected Views
selvps = [item for sublist in selvpsublist for item in sublist]
# match selected Views with all Viewports,create new list
selvpsmatches = set([item[1] for item in lbxViewsSorted]).intersection(selvps)
selviewPorts = [view for view in lbxViewsSorted if view[1] in selvpsmatches]
for el in selviewPorts:
selvpsElements.append(el[2])
# get primary View to align with
primview = (self.cmbPrimary.SelectedItem.split(","))
primvpmatch = set([item[1] for item in lbxViewsSorted]).intersection(primview[1])
primviewPort = [view for view in lbxViewsSorted if view[1] in primview]
primaryElement = [i[2] for i in primviewPort]
# get primary viewport Center and Outline
for i in primaryElement:
vBox = i.GetBoxOutline()
vcenter = i.GetBoxCenter()
primaryOutline.append(vBox)
primaryCenter.append(vcenter)
# set Viewports centers to primary views center
for t in selvpsElements:
t.SetBoxCenter(primaryCenter[0])
# init ui
ui = script.load_ui(MyWindow(),'ui.xaml')
# show modal or nonmodal
ui.show_dialog()
该应用程序运行正常,只希望将选定的视口中心与主视口中心对齐。一旦这样做,我打算提供一个选择以使“左上”等与以下内容对齐。但这是另一天
cmbAlignType = ["Top Left","Top Right","Center","Bottom Left","Bottom Right"]
解决方法
乍看之下,primaryCenter
似乎是一个列表,因此您应该调用t.SetBoxCenter(primaryCenter[0])
-但是如果没有更多代码(或您得到的错误),调试起来会有些困难。
如果您希望我们仔细看看,请发布更多代码!