事件处理程序示例

问题描述

我在Windows.Forms中编写了一个应用程序,想要切换到WPF以支持PickObject方法

您能指导我如何从外部事件中获取价值吗? 基本上,我想从选择中获取元素-PickObjects()并将其名称传递给文本框。 我尝试了@CyrilWaechter的一些代码来进行简单或自定义事件处理程序,但失败了。 我基本上如何将值从event.Raise()方法传递给另一个,因为它不执行任何操作。 下面的代码使revit崩溃:

class ModelessForm(WPFWindow):
    """
    Simple modeless form sample
    """

    def __init__(self,xaml_file_name):
        WPFWindow.__init__(self,xaml_file_name)
        self.simple_text.Text = "Hello World"
        self.Show()

    def delete_click(self,sender,e):
        reference = uidoc.Selection.PickObject(ObjectType.Element)
        element = [doc.GetElement(x) for x in reference]    
        elf.txb1.Text = element.Name
# Let's launch our beautiful and useful form !
modeless_form = ModelessForm("ModelessForm.xaml")

Xaml:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Delete things:" Height="262.5" Width="298.79" ShowInTaskbar="False" Topmost="True"
        WindowStartupLocation="CenterScreen" ScrollViewer.VerticalScrollBarVisibility="disabled" HorizontalContentAlignment="Center">
    <StackPanel Margin="20" HorizontalAlignment="Stretch">
        <TextBlock x:Name="simple_text" Text="" Grid.Column="0" HorizontalAlignment="Center" FontWeight="Bold"/>
        <Button Content="Delete selected elements" Height="30" Margin="10,10" Click="pick_elements"/>
        <TextBox x:Name="txb1" Height="23" textwrapping="Wrap" Text="TextBox"/>
    </StackPanel>
</Window> 

到目前为止,我在ModelessForm类之外尝试了以下方法

def pick_elements(): 
    reference = uidoc.Selection.PickObjects(ObjectType.Element)
    elements = [doc.GetElement(x) for x in reference]

并使用

class SimpleEventHandler(IExternalEventHandler):
    """
    Simple IExternalEventHandler sample
    """

    # __init__ is used to make function from outside of the class to be executed by the handler. \
    # Instructions Could be simply written under Execute method only
    def __init__(self,do_this):
        self.do_this = do_this

    # Execute method run in Revit API environment.
    def Execute(self,uiapp):
        try:
            self.do_this()
        except InvalidOperationException:
            # If you don't catch this exeption Revit may crash.
            print "InvalidOperationException catched"

    def GetName(self):
        return "simple function executed by an IExternalEventHandler in a Form"

simple_event_handler = SimpleEventHandler(pick_elements)
# We Now need to create the ExternalEvent
ext_event = ExternalEvent.Create(simple_event_handler)

所以基本上我正在尝试:

def pick_elements(): 
    reference = uidoc.Selection.PickObjects(ObjectType.Element)
    elements = [doc.GetElement(x) for x in reference]
    return elements

simple_event_handler = SimpleEventHandler(pick_elements)
# We Now need to create the ExternalEvent
ext_event = ExternalEvent.Create(simple_event_handler)

class ModelessForm(WPFWindow):
        """
        Simple modeless form sample
        """
    
        def __init__(self,xaml_file_name):
            WPFWindow.__init__(self,xaml_file_name)
            self.simple_text.Text = "Hello World"
            self.Show()
    
        def pick_elements(self,e):
            *self.txb1.Text = ext_event.Raise()*
# Let's launch our beautiful and useful form !
modeless_form = ModelessForm("ModelessForm.xaml")

    

一个简单的例子将不胜感激:) 来自以下代码

https://pythoncvc.net/?tag=externalevent-en
http://pythoncvc.net/?p=247

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)