dialogs/FBDVariableDialog.py
changeset 1730 64d8f52bc8c8
parent 1696 8043f32de7b8
child 1736 7e61baa047f0
equal deleted inserted replaced
1726:d51af006fa6b 1730:64d8f52bc8c8
    60         @param tagname: Tagname of project POU edited
    60         @param tagname: Tagname of project POU edited
    61         @param exclude_input: Exclude input from variable class selection
    61         @param exclude_input: Exclude input from variable class selection
    62         """
    62         """
    63         BlockPreviewDialog.__init__(self, parent, controller, tagname,
    63         BlockPreviewDialog.__init__(self, parent, controller, tagname,
    64               title=_('Variable Properties'))
    64               title=_('Variable Properties'))
    65         
    65 
    66         # Init common sizers
    66         # Init common sizers
    67         self._init_sizers(4, 2, 4, None, 3, 2)
    67         self._init_sizers(4, 2, 4, None, 3, 2)
    68         
    68 
    69         # Create label for variable class
    69         # Create label for variable class
    70         class_label = wx.StaticText(self, label=_('Class:'))
    70         class_label = wx.StaticText(self, label=_('Class:'))
    71         self.LeftGridSizer.AddWindow(class_label, flag=wx.GROW)
    71         self.LeftGridSizer.AddWindow(class_label, flag=wx.GROW)
    72         
    72 
    73         # Create a combo box for defining variable class
    73         # Create a combo box for defining variable class
    74         self.Class = wx.ComboBox(self, style=wx.CB_READONLY)
    74         self.Class = wx.ComboBox(self, style=wx.CB_READONLY)
    75         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, self.Class)
    75         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, self.Class)
    76         self.LeftGridSizer.AddWindow(self.Class, flag=wx.GROW)
    76         self.LeftGridSizer.AddWindow(self.Class, flag=wx.GROW)
    77         
    77 
    78         # Create label for variable execution order
    78         # Create label for variable execution order
    79         execution_order_label = wx.StaticText(self, 
    79         execution_order_label = wx.StaticText(self,
    80               label=_('Execution Order:'))
    80               label=_('Execution Order:'))
    81         self.LeftGridSizer.AddWindow(execution_order_label, flag=wx.GROW)
    81         self.LeftGridSizer.AddWindow(execution_order_label, flag=wx.GROW)
    82         
    82 
    83         # Create spin control for defining variable execution order
    83         # Create spin control for defining variable execution order
    84         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
    84         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
    85         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, 
    85         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged,
    86                   self.ExecutionOrder)
    86                   self.ExecutionOrder)
    87         self.LeftGridSizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
    87         self.LeftGridSizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
    88         
    88 
    89         # Create label for variable expression
    89         # Create label for variable expression
    90         name_label = wx.StaticText(self, label=_('Expression:'))
    90         name_label = wx.StaticText(self, label=_('Expression:'))
    91         self.RightGridSizer.AddWindow(name_label, border=5, 
    91         self.RightGridSizer.AddWindow(name_label, border=5,
    92               flag=wx.GROW|wx.BOTTOM)
    92               flag=wx.GROW|wx.BOTTOM)
    93         
    93 
    94         # Create text control for defining variable expression
    94         # Create text control for defining variable expression
    95         self.Expression = wx.TextCtrl(self)
    95         self.Expression = wx.TextCtrl(self)
    96         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, self.Expression)
    96         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, self.Expression)
    97         self.RightGridSizer.AddWindow(self.Expression, flag=wx.GROW)
    97         self.RightGridSizer.AddWindow(self.Expression, flag=wx.GROW)
    98         
    98 
    99         # Create a list box to selected variable expression in the list of
    99         # Create a list box to selected variable expression in the list of
   100         # variables defined in POU
   100         # variables defined in POU
   101         self.VariableName = wx.ListBox(self, size=wx.Size(-1,120),
   101         self.VariableName = wx.ListBox(self, size=wx.Size(-1,120),
   102               style=wx.LB_SINGLE|wx.LB_SORT)
   102               style=wx.LB_SINGLE|wx.LB_SORT)
   103         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
   103         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
   104         self.RightGridSizer.AddWindow(self.VariableName, border=4, flag=wx.GROW|wx.TOP)
   104         self.RightGridSizer.AddWindow(self.VariableName, border=4, flag=wx.GROW|wx.TOP)
   105         
   105 
   106         # Add preview panel and associated label to sizers
   106         # Add preview panel and associated label to sizers
   107         self.MainSizer.AddWindow(self.PreviewLabel, border=20,
   107         self.MainSizer.AddWindow(self.PreviewLabel, border=20,
   108               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   108               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   109         self.MainSizer.AddWindow(self.Preview, border=20,
   109         self.MainSizer.AddWindow(self.Preview, border=20,
   110               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   110               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   111         
   111 
   112         # Add buttons sizer to sizers
   112         # Add buttons sizer to sizers
   113         self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
   113         self.MainSizer.AddSizer(self.ButtonSizer, border=20,
   114               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   114               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   115         
   115 
   116         # Set options that can be selected in class combo box
   116         # Set options that can be selected in class combo box
   117         for var_class, choice in VARIABLE_CLASSES_DICT.iteritems():
   117         for var_class, choice in VARIABLE_CLASSES_DICT.iteritems():
   118             if not exclude_input or var_class != INPUT:
   118             if not exclude_input or var_class != INPUT:
   119                 self.Class.Append(choice)
   119                 self.Class.Append(choice)
   120         self.Class.SetSelection(0)
   120         self.Class.SetSelection(0)
   121         
   121 
   122         # Extract list of variables defined in POU
   122         # Extract list of variables defined in POU
   123         self.RefreshVariableList()
   123         self.RefreshVariableList()
   124         
   124 
   125         # Refresh values in name list box
   125         # Refresh values in name list box
   126         self.RefreshNameList()
   126         self.RefreshNameList()
   127         
   127 
   128         self.Preview.SetInitialSize(wx.Size(-1, 60))
   128         self.Preview.SetInitialSize(wx.Size(-1, 60))
   129         self.Fit()
   129         self.Fit()
   130 
   130 
   131         # Class combo box is default control having keyboard focus
   131         # Class combo box is default control having keyboard focus
   132         self.Class.SetFocus()
   132         self.Class.SetFocus()
   136         Called to refresh names in name list box
   136         Called to refresh names in name list box
   137         """
   137         """
   138         # Get variable class to select POU variable applicable
   138         # Get variable class to select POU variable applicable
   139         var_class = VARIABLE_CLASSES_DICT_REVERSE[
   139         var_class = VARIABLE_CLASSES_DICT_REVERSE[
   140                             self.Class.GetStringSelection()]
   140                             self.Class.GetStringSelection()]
   141         
   141 
   142         # Refresh names in name list box by selecting variables in POU variables
   142         # Refresh names in name list box by selecting variables in POU variables
   143         # list that can be applied to variable class
   143         # list that can be applied to variable class
   144         self.VariableName.Clear()
   144         self.VariableName.Clear()
   145         for name, (var_type, value_type) in self.VariableList.iteritems():
   145         for name, (var_type, value_type) in self.VariableList.iteritems():
   146             if var_type != "Input" or var_class == INPUT:
   146             if var_type != "Input" or var_class == INPUT:
   147                 self.VariableName.Append(name)
   147                 self.VariableName.Append(name)
   148         
   148 
   149         # Get variable expression and select corresponding value in name list
   149         # Get variable expression and select corresponding value in name list
   150         # box if it exists
   150         # box if it exists
   151         selected = self.Expression.GetValue()
   151         selected = self.Expression.GetValue()
   152         if (selected != "" and 
   152         if (selected != "" and
   153             self.VariableName.FindString(selected) != wx.NOT_FOUND):
   153             self.VariableName.FindString(selected) != wx.NOT_FOUND):
   154             self.VariableName.SetStringSelection(selected)
   154             self.VariableName.SetStringSelection(selected)
   155         else:
   155         else:
   156             self.VariableName.SetSelection(wx.NOT_FOUND)
   156             self.VariableName.SetSelection(wx.NOT_FOUND)
   157         
   157 
   158         # Disable name list box if no name present inside
   158         # Disable name list box if no name present inside
   159         self.VariableName.Enable(self.VariableName.GetCount() > 0)
   159         self.VariableName.Enable(self.VariableName.GetCount() > 0)
   160             
   160 
   161     def SetValues(self, values):
   161     def SetValues(self, values):
   162         """
   162         """
   163         Set default variable parameters
   163         Set default variable parameters
   164         @param values: Variable parameters values
   164         @param values: Variable parameters values
   165         """
   165         """
   166         
   166 
   167         # Get class parameter value
   167         # Get class parameter value
   168         var_class = values.get("class", None)
   168         var_class = values.get("class", None)
   169         if var_class is not None:
   169         if var_class is not None:
   170             # Set class selected in class combo box
   170             # Set class selected in class combo box
   171             self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[var_class])
   171             self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[var_class])
   172             # Refresh names in name list box according to var class
   172             # Refresh names in name list box according to var class
   173             self.RefreshNameList()
   173             self.RefreshNameList()
   174         
   174 
   175         # For each parameters defined, set corresponding control value
   175         # For each parameters defined, set corresponding control value
   176         for name, value in values.items():
   176         for name, value in values.items():
   177             
   177 
   178             # Parameter is variable expression
   178             # Parameter is variable expression
   179             if name == "expression":
   179             if name == "expression":
   180                 # Set expression text control value
   180                 # Set expression text control value
   181                 self.Expression.ChangeValue(value)
   181                 self.Expression.ChangeValue(value)
   182                 # Select corresponding text in name list box if it exists
   182                 # Select corresponding text in name list box if it exists
   183                 if self.VariableName.FindString(value) != wx.NOT_FOUND:
   183                 if self.VariableName.FindString(value) != wx.NOT_FOUND:
   184                     self.VariableName.SetStringSelection(value)
   184                     self.VariableName.SetStringSelection(value)
   185                 else:
   185                 else:
   186                     self.VariableName.SetSelection(wx.NOT_FOUND)
   186                     self.VariableName.SetSelection(wx.NOT_FOUND)
   187             
   187 
   188             # Parameter is variable execution order
   188             # Parameter is variable execution order
   189             elif name == "executionOrder":
   189             elif name == "executionOrder":
   190                 self.ExecutionOrder.SetValue(value)
   190                 self.ExecutionOrder.SetValue(value)
   191         
   191 
   192         # Refresh preview panel
   192         # Refresh preview panel
   193         self.RefreshPreview()
   193         self.RefreshPreview()
   194         self.Fit()
   194         self.Fit()
   195         
   195 
   196     def GetValues(self):
   196     def GetValues(self):
   197         """
   197         """
   198         Return block parameters defined in dialog
   198         Return block parameters defined in dialog
   199         @return: {parameter_name: parameter_value,...}
   199         @return: {parameter_name: parameter_value,...}
   200         """
   200         """
   213         Called when dialog OK button is pressed
   213         Called when dialog OK button is pressed
   214         Test if parameters defined are valid
   214         Test if parameters defined are valid
   215         @param event: wx.Event from OK button
   215         @param event: wx.Event from OK button
   216         """
   216         """
   217         message = None
   217         message = None
   218         
   218 
   219         # Test that an expression have been selected or typed by user
   219         # Test that an expression have been selected or typed by user
   220         value = self.Expression.GetValue()
   220         value = self.Expression.GetValue()
   221         if value == "":
   221         if value == "":
   222             message = _("At least a variable or an expression must be selected!")
   222             message = _("At least a variable or an expression must be selected!")
   223         
   223 
   224         # Show error message if an error is detected
   224         # Show error message if an error is detected
   225         if message is not None:
   225         if message is not None:
   226             self.ShowErrorMessage(message)
   226             self.ShowErrorMessage(message)
   227         
   227 
   228         else:
   228         else:
   229             # Call BlockPreviewDialog function
   229             # Call BlockPreviewDialog function
   230             BlockPreviewDialog.OnOK(self, event)
   230             BlockPreviewDialog.OnOK(self, event)
   231 
   231 
   232     def OnClassChanged(self, event):
   232     def OnClassChanged(self, event):
   234         Called when variable class value changed
   234         Called when variable class value changed
   235         @param event: wx.ComboBoxEvent
   235         @param event: wx.ComboBoxEvent
   236         """
   236         """
   237         # Refresh name list box values
   237         # Refresh name list box values
   238         self.RefreshNameList()
   238         self.RefreshNameList()
   239         
   239 
   240         self.RefreshPreview()
   240         self.RefreshPreview()
   241         event.Skip()
   241         event.Skip()
   242 
   242 
   243     def OnNameChanged(self, event):
   243     def OnNameChanged(self, event):
   244         """
   244         """
   247         """
   247         """
   248         # Change expression test control value to the value selected in name
   248         # Change expression test control value to the value selected in name
   249         # list box if value selected is valid
   249         # list box if value selected is valid
   250         if self.VariableName.GetSelection() != wx.NOT_FOUND:
   250         if self.VariableName.GetSelection() != wx.NOT_FOUND:
   251             self.Expression.ChangeValue(self.VariableName.GetStringSelection())
   251             self.Expression.ChangeValue(self.VariableName.GetStringSelection())
   252         
   252 
   253         self.RefreshPreview()
   253         self.RefreshPreview()
   254         event.Skip()
   254         event.Skip()
   255     
   255 
   256     def OnExpressionChanged(self, event):
   256     def OnExpressionChanged(self, event):
   257         """
   257         """
   258         Called when expression text control is changed by user
   258         Called when expression text control is changed by user
   259         @param event: wx.ListBoxEvent
   259         @param event: wx.ListBoxEvent
   260         """
   260         """
   261         # Select the corresponding value in name list box if it exists
   261         # Select the corresponding value in name list box if it exists
   262         self.VariableName.SetSelection(
   262         self.VariableName.SetSelection(
   263             self.VariableName.FindString(self.Expression.GetValue()))
   263             self.VariableName.FindString(self.Expression.GetValue()))
   264         
   264 
   265         self.RefreshPreview()
   265         self.RefreshPreview()
   266         event.Skip()
   266         event.Skip()
   267     
   267 
   268     def OnExecutionOrderChanged(self, event):
   268     def OnExecutionOrderChanged(self, event):
   269         """
   269         """
   270         Called when block execution control value changed
   270         Called when block execution control value changed
   271         @param event: wx.SpinEvent
   271         @param event: wx.SpinEvent
   272         """
   272         """
   273         self.RefreshPreview()
   273         self.RefreshPreview()
   274         event.Skip()
   274         event.Skip()
   275     
   275 
   276     def RefreshPreview(self):
   276     def RefreshPreview(self):
   277         """
   277         """
   278         Refresh preview panel of graphic element
   278         Refresh preview panel of graphic element
   279         Override BlockPreviewDialog function
   279         Override BlockPreviewDialog function
   280         """
   280         """
   281         # Get expression value to put in FBD variable element
   281         # Get expression value to put in FBD variable element
   282         name = self.Expression.GetValue()
   282         name = self.Expression.GetValue()
   283         
   283 
   284         # Set graphic element displayed, creating a FBD variable element
   284         # Set graphic element displayed, creating a FBD variable element
   285         self.Element = FBD_Variable(self.Preview, 
   285         self.Element = FBD_Variable(self.Preview,
   286                     VARIABLE_CLASSES_DICT_REVERSE[
   286                     VARIABLE_CLASSES_DICT_REVERSE[
   287                         self.Class.GetStringSelection()], 
   287                         self.Class.GetStringSelection()],
   288                     name, 
   288                     name,
   289                     self.VariableList.get(name, ("", ""))[1], 
   289                     self.VariableList.get(name, ("", ""))[1],
   290                     executionOrder = self.ExecutionOrder.GetValue())
   290                     executionOrder = self.ExecutionOrder.GetValue())
   291         
   291 
   292         # Call BlockPreviewDialog function
   292         # Call BlockPreviewDialog function
   293         BlockPreviewDialog.RefreshPreview(self)
   293         BlockPreviewDialog.RefreshPreview(self)
   294         
       
   295