es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un cuadrado de paredes mediante WPF en Revit Python.

Empiezo a aprender pyRevit y aquí está el problema. Quiero crear un WPF donde pueda ingresar valores y luego Revit pueda construir automáticamente un edificio rectangular simple. Ya he creado un WPF, pero estoy atascado en la parte donde necesito conectar el valor de la longitud (interfaz) con el código de Python. Imagen

import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
from pyrevit.forms import WPFWindow
doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument

class ModalForm(WPFWindow):
    def __init__(self, xaml_file_name):
        WPFWindow.__init__(self, xaml_file_name)
        self.ShowDialog()

    def start_button(self, sender, e):
        levels = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType().ToElements()
        walls = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsElementType().ToElements()
        for level in levels:
            elevation = level.get_Parameter(BuiltInParameter.LEVEL_ELEV).AsDouble()
            if elevation == 1000/304.8:
                level_0 = level
        for wall in walls:
            name = wall.get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString()
            if name == 'C25/30 - 250mm':
                wall_type = wall
        p_1 = XYZ(0,0,level_0.Elevation)
        p_2 = XYZ(50,0,level_0.Elevation)
        line_1 = Line.CreateBound(p_1, p_2)

        t = Transaction(doc, 'column')
        t.Start()

        wall_1 = Wall.Create(doc, line, wall_type.Id, level_0.Id, 3000/304.8, 0, False, True)
        t.Commit()
        self.Close()        

    def cancel_button(self, sender, e):
        self.Close()

form = ModalForm('interface.xaml')
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para conectar el valor de longitud desde la interfaz al código de Python, es necesario utilizar la característica de Binding de WPF.

    Primero, agregue una propiedad Name al control TextBox en el archivo XAML:

    <textbox name="tbLength" text="{Binding LengthValue, Mode=TwoWay}"></textbox>
    

    Luego, cree una nueva propiedad LengthValue en la clase ModalForm, que será la fuente del enlace:

    class ModalForm(WPFWindow):
        def __init__(self, xaml_file_name):
            WPFWindow.__init__(self, xaml_file_name)
            self.LengthValue = None
            self.ShowDialog()
    
        def start_button(self, sender, e):
            length = float(self.LengthValue)  # use the LengthValue property here
            # ...
    

    Por último, establezca el DataContext de la Window como una instancia de la clase ModalForm y el enlace se manejará automáticamente:

    form = ModalForm('interface.xaml')
    form.DataContext = form  # set the DataContext to the current instance
    

    Ahora, cada vez que el usuario ingrese un valor en el TextBox, este se actualizará automáticamente en la propiedad LengthValue y podrás utilizar ese valor en tu código de Python.

Comments are closed.