【问题标题】:Revit API Python SetBoxCenter() applied to multiple ViewportsRevit API Python SetBoxCenter() 应用于多个视口
【发布时间】:2020-12-06 01:54:34
【问题描述】:

在 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])

然后使用带有列表框 (colViews) 和组合框 (colPrimary) 选择的 pyrevit forms.WPFWindow (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 是一个列表对象。你需要在primaryCenter[0]列表中抓取DB.XYZ对象
  • @EhsanIran-Nejad 我已经从 pyrevit import revit, DB 和从 Autodesk.Revit.DB import * 导入,但是你如何在 python 中实际获得 DB.XYZ?特别是这个用例在发电机之外?顺便说一句,感谢您为 pyRevit 所做的所有努力 - 全球 AEC 行业的宝贵平台

标签: python-2.7 revit-api revitpythonshell pyrevit


【解决方案1】:

乍一看,primaryCenter 似乎是一个列表,因此您应该调用t.SetBoxCenter(primaryCenter[0]) - 但如果没有更多代码(或您遇到的错误),调试起来有点困难。

如果您希望我们仔细查看,请发布更多代码!

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2014-08-03
    • 2020-08-21
    • 1970-01-01
    • 2020-04-20
    • 2020-07-27
    • 2020-09-23
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多