I’m implementing a UI using WPF to create grids in Revit. To allow users to switch between numeric values (‘1, 2, 3, …’) and alphabetic values (‘A, B, C, …’) for grid names, I used a ComboBox, as shown below.
However, I’m struggling to set up event handlers to manage the selection for each grid orientation (X and Y) and to prevent the user from selecting the same values for both X and Y.
Xaml code
<!-- Symbol Type for Lx -->
<DockPanel Margin="0,0,0,10">
<TextBlock Text="Type de symbole Lx:" Width="120"/>
<ComboBox x:Name="dropdown_symbol_x" Width="150" HorizontalAlignment="Right" >
<ComboBoxItem Content="1 2 3 ..." />
<ComboBoxItem Content="A B C ..." />
</ComboBox>
</DockPanel>
<!-- Symbol Type for Ly -->
<DockPanel Margin="0,0,0,10">
<TextBlock Text="Type de symbole Ly:" Width="120"/>
<ComboBox x:Name="dropdown_symbol_y" Width="150" HorizontalAlignment="Right" >
<ComboBoxItem Content="1 2 3 ..." />
<ComboBoxItem Content="A B C ..." />
</ComboBox>
</DockPanel>
python code
class Grids(Window):
def __init__(self):
# wpf.LoadComponent(self, StringReader(Grids.LAYOUT))
# # Symbol sets
self.all_symbols_numeric = ['1', '2', '3', '4', '5'] # Numeric
self.all_symbols_alpha = ['A', 'B', 'C', 'D', 'E'] # Alphabetic
self.selected_symbol_x = None
self.selected_symbol_y = None
self.data = {}
self.ShowDialog()
def _collect_input_data(self):
"""Collect and convert input data from the UI"""
# Identify which key has missing or invalid input and alert the user
if not self.input_Lx.Text:
forms.alert("Please enter a valid value for : Lx")
elif not self.input_Ly.Text:
forms.alert("Please enter a valid value for : Ly")
elif not self.input_extension.Text:
forms.alert("Please enter a valid value for : e")
elif not self.input_dx.Text:
forms.alert("Please enter a valid value for : dx")
elif not self.input_dy.Text:
forms.alert("Please enter a valid value for : dy")
elif self.select_symbol_x.ItemsSource is None:
forms.alert("Please select symbols for : Sx")
elif self.select_symbol_y.ItemsSource is None:
forms.alert("Please select symbols for : Sy")
if self.select_symbol_x.SelectedItem == self.select_symbol_y.SelectedItem:
forms.alert("Symbols for Lx and Ly must be different.")
else:
try:
self.data = {
"Lx": _input_to_meters(self.input_Lx.Text),
"Ly": _input_to_meters(self.input_Ly.Text),
"e": _input_to_meters(self.input_extension.Text),
"dx": _input_to_meters(self.input_dx.Text),
"dy": _input_to_meters(self.input_dy.Text),
"Sx": [self.select_symbol_x.SelectedItem],
"Sy": [self.select_symbol_y.SelectedItem]
}
except ValueError:
forms.alert(
"Invalid input detected. "
"Please ensure all inputs are numeric where required."
)
def OK_Clicked(self, sender, e):
self._collect_input_data()
# self.data
if not self.data:
return
self.Close()
def Cancel_Clicked(self, sender, e):
self.Close()