Revit Python Shell - итерация по каждому элементу, поиск имени вида и группировка по номеру листа

Я хочу создать список всех видовых экранов по соответствующему номеру листа, имени вида и центру расположения. Вот так:

vPorts = [('A0.01, View Name 01',[Center of ViewPort location]),('A0.02, View Name 01',[Centre of ViewPort location]),('A0.02, View Name 02',[Center of ViewPort location]),('A0.04, View Name 01',[Centre of ViewPort location]), etc.]

Это позволяет пользователю выровнять несколько окон просмотра относительно друг друга в списке (здесь не показано) в WPF. У меня есть ниже:

import clr
clr.AddReferenceByPartialName('PresentationCore')
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName('System')
clr.AddReferenceByPartialName('System.Windows.Forms')

from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import *
from Autodesk.Revit.DB.Analysis import *
from Autodesk.Revit.UI import *

doc = __revit__.ActiveUIDocument.Document

#List of ViewPort Elements
vPorts = []

#List for ViewPorts by sheet number, view name and location
vPortsloc = []

col_sheets = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).WhereElementIsNotElementType().ToElements()
for sheet in col_sheets:
    
    vPorts.append(sheet.GetAllViewports())

for vp in vPorts:
    print(vp)

Это дает мне все области просмотра на всех листах как объекты списка. Но теперь я хочу отформатировать этот список, как указано выше. Я пробовал следующее:

for vp in vPorts:
    v = doc.GetElement(vp.ViewId)
    vPortsloc.append(v.SheetNumber + v.Name + (v.GetBoxCenter().ToPoint()))

Я считаю, что не перебираю весь список списков. Не говоря уже о том, что я новичок в Python .. Любая помощь будет очень признательна. Спасибо!


person Simon Palmer    schedule 07.07.2020    source источник


Ответы (2)


Спасибо, Каллум, что очень помог! Мне просто нужно было исправить одну или две опечатки, использовать append () вместо add и получить имя представления вместо имени листа. Как показано ниже

viewPorts = list(FilteredElementCollector(doc).OfClass(Viewport))
viewPortTriples = []

for vp in viewPorts:
    sheet = doc.GetElement(vp.SheetId)
    view = doc.GetElement(vp.ViewId)
    viewPortTriples.append([sheet.SheetNumber, view.ViewName, vp.GetBoxCenter()])

print(viewPortTriples)
person Simon Palmer    schedule 10.07.2020

Это может помочь визуализировать многомерные Lists следующим образом:

vPortTriples  = [
    [Sheet Number, Sheet Name, ViewPort Center], 
    [Sheet Number, Sheet Name, ViewPort Center], 
    [Sheet Number, Sheet Name, ViewPort Center]
]

Похоже, у вас appending три отдельных элемента в List. Должны ли они быть добавлены как новый список, как это?

vPortTriples.append([v.SheetNumber, v.Name, v.GetBoxCenter().ToPoint()])

Если вы действительно хотите поймать каждый Viewport в проекте, вы можете получить все ViewPorts по классу, поэтому в вашем коде это будет выглядеть так:

# I find it easiest to convert FilteredElementCollector to a list
viewPorts = list(FilteredElementCollector(doc).OfClass(Viewport))
viewPortTriples = []

for vp in viewPorts:

    # need to fetch the ViewPorts Sheet 
    sheet = doc.GetElement(vp.SheetId)
    
    # add a new List to the 'viewPortTriples' List
    viewPorts.Add([sheet.SheetNumber, sheet.Name, vp.GetBoxCenter()]

Это довольно дорогой способ сделать это, лучше получать их только для соответствующего листа - скажем, по определенному номеру листа (что, возможно, было тем, что вы в любом случае пытались сделать в своем примере!):

def getViewPorts (document, sheetNumber): # returns [[viewPort, bboxCenter], ... ]
    
    sheets = list(FilteredElementCollector(document).OfClass(ViewSheet))
    try:
        targetSheet = [i for i in sheets if i.Sheetnumber == sheetNumber][0]
    except:
        print 'failed to find sheet',sheetNumber
        return []
    
    viewPortLocations = [] # a list of [[viewPort, bboxCenter], ... ]
    for vpId in targetSheet.GetAllViewports():
        vp = document.GetElement(vpId)
        viewPortLocations.Add([vp, vp.GetBoxCenter()])
    
    return viewPortLocations
person Callum    schedule 08.07.2020