Итак, я только начинаю погружаться в WPF в pyRevit. Я попытался реализовать класс pyrevit.forms.WPFWindow следующим образом:
# -*- coding: UTF-8 -*-
"""
Third-Party software credits:
pyRevit: repository at https://github.com/eirannejad/pyRevit
"""
import System, clr, json, sys
clr.AddReference("System.Windows.Forms")
clr.AddReference('IronPython.Wpf')
import wpf
from Autodesk.Revit.DB import *
from pyrevit import revit, script, forms
class FactorySettings(forms.WPFWindow):
def __init__(self):
forms.WPFWindow.__init__(self, script.get_bundle_file('settings.xaml'))
def something_click(self, A, B):
plantings = FilteredElementCollector(revit.doc) \
.WhereElementIsElementType() \
.OfCategory(BuiltInCategory.OST_Planting)
ui = FactorySettings()
ui.show()
Это мой xaml:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
ShowInTaskbar="False" ResizeMode="CanResize"
WindowStartupLocation="CenterScreen"
HorizontalContentAlignment="Center"
Title="Set worksets" Width="300" SizeToContent="Height"
>
<StackPanel Margin="0,0,0,0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Button Content="Do something" Name="something" Click="something_click"/>
</StackPanel>
</Window>
Это откроет немодальное окно из-за def show(self, modal=False):
class-function. Проблема для меня в том, что, хотя моя функция щелчка вызывает только объект FilteredElementCollector
, Revit аварийно завершает работу. Если я сделаю ui.show(modal=True)
, он будет работать, но тогда я ничего не смогу сделать в интерфейсе Revit UI. На самом деле я хотел сделать вот что:
def something_click(self, A, B):
if self.PHfamSymbol != None:
with forms.WarningBar(title='Place an instance of the placeholder object.'):
revit.uidoc.PromptForFamilyInstancePlacement(self.PHfamSymbol)
Это не сработает, потому что основное внимание по-прежнему уделяется пользовательскому интерфейсу. Я пробовал это:
def something_click(self, A, B):
if self.PHfamSymbol != None:
self.Close()
with forms.WarningBar(title='Place an instance of the placeholder object.'):
try:
revit.uidoc.PromptForFamilyInstancePlacement(self.PHfamSymbol)
except:
pass
Это работает, но мне нужно создать новый экземпляр пользовательского интерфейса после завершения. Возможно ли вообще иметь немодальный пользовательский интерфейс с pyRevit?