controls/VariablePanel.py
changeset 1347 533741e5075c
parent 1342 c17507a10807
child 1361 7158aa054226
equal deleted inserted replaced
1346:92efd8fe3120 1347:533741e5075c
    35 from dialogs.ArrayTypeDialog import ArrayTypeDialog
    35 from dialogs.ArrayTypeDialog import ArrayTypeDialog
    36 from CustomGrid import CustomGrid
    36 from CustomGrid import CustomGrid
    37 from CustomTable import CustomTable
    37 from CustomTable import CustomTable
    38 from LocationCellEditor import LocationCellEditor
    38 from LocationCellEditor import LocationCellEditor
    39 from util.BitmapLibrary import GetBitmap
    39 from util.BitmapLibrary import GetBitmap
       
    40 from PLCControler import _VariableInfos
    40 
    41 
    41 #-------------------------------------------------------------------------------
    42 #-------------------------------------------------------------------------------
    42 #                                 Helpers
    43 #                                 Helpers
    43 #-------------------------------------------------------------------------------
    44 #-------------------------------------------------------------------------------
    44 
    45 
   103     def __init__(self, parent, data, colnames):
   104     def __init__(self, parent, data, colnames):
   104         # The base class must be initialized *first*
   105         # The base class must be initialized *first*
   105         CustomTable.__init__(self, parent, data, colnames)
   106         CustomTable.__init__(self, parent, data, colnames)
   106         self.old_value = None
   107         self.old_value = None
   107     
   108     
       
   109     def GetValueByName(self, row, colname):
       
   110         if row < self.GetNumberRows():
       
   111             return getattr(self.data[row], colname)
       
   112 
       
   113     def SetValueByName(self, row, colname, value):
       
   114         if row < self.GetNumberRows():
       
   115             setattr(self.data[row], colname, value)
       
   116     
   108     def GetValue(self, row, col):
   117     def GetValue(self, row, col):
   109         if row < self.GetNumberRows():
   118         if row < self.GetNumberRows():
   110             if col == 0:
   119             if col == 0:
   111                 return self.data[row]["Number"]
   120                 return self.data[row].Number
   112             colname = self.GetColLabelValue(col, False)
   121             colname = self.GetColLabelValue(col, False)
   113             value = self.data[row].get(colname, "")
   122             if colname == "Initial Value":
       
   123                 colname = "InitialValue"
       
   124             value = getattr(self.data[row], colname, "")
   114             if colname == "Type" and isinstance(value, TupleType):
   125             if colname == "Type" and isinstance(value, TupleType):
   115                 if value[0] == "array":
   126                 if value[0] == "array":
   116                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
   127                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
   117             if not isinstance(value, (StringType, UnicodeType)):
   128             if not isinstance(value, (StringType, UnicodeType)):
   118                 value = str(value)
   129                 value = str(value)
   122     
   133     
   123     def SetValue(self, row, col, value):
   134     def SetValue(self, row, col, value):
   124         if col < len(self.colnames):
   135         if col < len(self.colnames):
   125             colname = self.GetColLabelValue(col, False)
   136             colname = self.GetColLabelValue(col, False)
   126             if colname == "Name":
   137             if colname == "Name":
   127                 self.old_value = self.data[row][colname]
   138                 self.old_value = getattr(self.data[row], colname)
   128             elif colname == "Class":
   139             elif colname == "Class":
   129                 value = VARIABLE_CLASSES_DICT[value]
   140                 value = VARIABLE_CLASSES_DICT[value]
   130                 self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option")))
   141                 self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option")))
   131                 if value == "External":
   142                 if value == "External":
   132                     self.SetValueByName(row, "Initial Value", "")
   143                     self.SetValueByName(row, "InitialValue", "")
   133             elif colname == "Option":
   144             elif colname == "Option":
   134                 value = OPTIONS_DICT[value]
   145                 value = OPTIONS_DICT[value]
   135             self.data[row][colname] = value
   146             elif colname == "Initial Value":
       
   147                 colname = "InitialValue"
       
   148             setattr(self.data[row], colname, value)
   136 
   149 
   137     def GetOldValue(self):
   150     def GetOldValue(self):
   138         return self.old_value
   151         return self.old_value
   139 
   152 
   140     def _updateColAttrs(self, grid):
   153     def _updateColAttrs(self, grid):
   312                     message = _("\"%s\" pou already exists!")%var_name
   325                     message = _("\"%s\" pou already exists!")%var_name
   313                 elif not var_name.upper() in [name.upper() 
   326                 elif not var_name.upper() in [name.upper() 
   314                         for name in self.ParentWindow.Controler.\
   327                         for name in self.ParentWindow.Controler.\
   315                             GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
   328                             GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
   316                     var_infos = self.ParentWindow.DefaultValue.copy()
   329                     var_infos = self.ParentWindow.DefaultValue.copy()
   317                     var_infos["Name"] = var_name
   330                     var_infos.Name = var_name
   318                     var_infos["Type"] = values[2]
   331                     var_infos.Type = values[2]
   319                     if values[1] == "location":
   332                     if values[1] == "location":
   320                         location = values[0]
   333                         location = values[0]
   321                         if not location.startswith("%"):
   334                         if not location.startswith("%"):
   322                             dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow, 
   335                             dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow, 
   323                                   _("Select a variable class:"), _("Variable class"), 
   336                                   _("Select a variable class:"), _("Variable class"), 
   344                             if not var_name.upper() in [name.upper() 
   357                             if not var_name.upper() in [name.upper() 
   345                                 for name in self.ParentWindow.Controler.\
   358                                 for name in self.ParentWindow.Controler.\
   346                                     GetConfigurationVariableNames(configs[0])]:
   359                                     GetConfigurationVariableNames(configs[0])]:
   347                                 self.ParentWindow.Controler.AddConfigurationGlobalVar(
   360                                 self.ParentWindow.Controler.AddConfigurationGlobalVar(
   348                                     configs[0], values[2], var_name, location, "")
   361                                     configs[0], values[2], var_name, location, "")
   349                             var_infos["Class"] = "External"
   362                             var_infos.Class = "External"
   350                         else:
   363                         else:
   351                             if element_type == "program":
   364                             if element_type == "program":
   352                                 var_infos["Class"] = "Local"
   365                                 var_infos.Class = "Local"
   353                             else:
   366                             else:
   354                                 var_infos["Class"] = "Global"
   367                                 var_infos.Class = "Global"
   355                             var_infos["Location"] = location
   368                             var_infos.Location = location
   356                     else:
   369                     else:
   357                         var_infos["Class"] = "External"
   370                         var_infos.Class = "External"
   358                     var_infos["Number"] = len(self.ParentWindow.Values)
   371                     var_infos.Number = len(self.ParentWindow.Values)
   359                     self.ParentWindow.Values.append(var_infos)
   372                     self.ParentWindow.Values.append(var_infos)
   360                     self.ParentWindow.SaveValues()
   373                     self.ParentWindow.SaveValues()
   361                     self.ParentWindow.RefreshValues()
   374                     self.ParentWindow.RefreshValues()
   362         
   375         
   363         if message is not None:
   376         if message is not None:
   445         
   458         
   446         self.Filter = "All"
   459         self.Filter = "All"
   447         self.FilterChoices = []
   460         self.FilterChoices = []
   448         self.FilterChoiceTransfer = GetFilterChoiceTransfer()
   461         self.FilterChoiceTransfer = GetFilterChoiceTransfer()
   449         
   462         
   450         self.DefaultValue = {
   463         self.DefaultValue = _VariableInfos("", "", "", "", "", True, "", "INT", ([], []), 0)
   451              "Name" : "", 
       
   452              "Class" : "", 
       
   453              "Type" : "INT", 
       
   454              "Location" : "",
       
   455              "Initial Value" : "", 
       
   456              "Option" : "",
       
   457              "Documentation" : "", 
       
   458              "Edit" : True
       
   459         }
       
   460         
   464         
   461         if element_type in ["config", "resource"]:
   465         if element_type in ["config", "resource"]:
   462             self.DefaultTypes = {"All" : "Global"}
   466             self.DefaultTypes = {"All" : "Global"}
   463         else:
   467         else:
   464             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
   468             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
   525         
   529         
   526         def _AddVariable(new_row):
   530         def _AddVariable(new_row):
   527             if new_row > 0:
   531             if new_row > 0:
   528                 row_content = self.Values[new_row - 1].copy()
   532                 row_content = self.Values[new_row - 1].copy()
   529                 
   533                 
   530                 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"])
   534                 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content.Name)
   531                 if result is not None:
   535                 if result is not None:
   532                     name = row_content["Name"][:result.start(1)]
   536                     name = row_content.Name[:result.start(1)]
   533                     suffix = result.group(1)
   537                     suffix = result.group(1)
   534                     if suffix != "":
   538                     if suffix != "":
   535                         start_idx = int(suffix)
   539                         start_idx = int(suffix)
   536                     else:
   540                     else:
   537                         start_idx = 0
   541                         start_idx = 0
   538                 else:
   542                 else:
   539                     name = row_content["Name"]
   543                     name = row_content.Name
   540                     start_idx = 0
   544                     start_idx = 0
   541             else:
   545             else:
   542                 row_content = None
   546                 row_content = None
   543                 start_idx = 0
   547                 start_idx = 0
   544                 name = "LocalVar"
   548                 name = "LocalVar"
   545                 
   549                 
   546             if row_content is not None and row_content["Edit"]: 
   550             if row_content is not None and row_content.Edit: 
   547                 row_content = self.Values[new_row - 1].copy()
   551                 row_content = self.Values[new_row - 1].copy()
   548             else:
   552             else:
   549                 row_content = self.DefaultValue.copy()
   553                 row_content = self.DefaultValue.copy()
   550                 if self.Filter in self.DefaultTypes:
   554                 if self.Filter in self.DefaultTypes:
   551                     row_content["Class"] = self.DefaultTypes[self.Filter]
   555                     row_content.Class = self.DefaultTypes[self.Filter]
   552                 else:
   556                 else:
   553                     row_content["Class"] = self.Filter
   557                     row_content.Class = self.Filter
   554             
   558             
   555             row_content["Name"] = self.Controler.GenerateNewName(
   559             row_content.Name = self.Controler.GenerateNewName(
   556                     self.TagName, None, name + "%d", start_idx)
   560                     self.TagName, None, name + "%d", start_idx)
   557             
   561             
   558             if self.Filter == "All" and len(self.Values) > 0:
   562             if self.Filter == "All" and len(self.Values) > 0:
   559                 self.Values.insert(new_row, row_content)
   563                 self.Values.insert(new_row, row_content)
   560             else:
   564             else:
   635         else:
   639         else:
   636             if self.ElementType == "function":
   640             if self.ElementType == "function":
   637                 self.ReturnType.Clear()
   641                 self.ReturnType.Clear()
   638                 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
   642                 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
   639                     self.ReturnType.Append(data_type)
   643                     self.ReturnType.Append(data_type)
   640                 returnType, (var_tree, dimensions) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)
   644                 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug)
   641             description = self.Controler.GetPouDescription(words[1])
   645             description = self.Controler.GetPouDescription(words[1])
   642             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
   646             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
   643         
   647         
   644         if returnType is not None:
   648         if returnType is not None:
   645             self.ReturnType.SetStringSelection(returnType)
   649             self.ReturnType.SetStringSelection(returnType)
   646             self.ReturnType.Enable(not self.Debug)
   650             self.ReturnType.Enable(not self.Debug)
   647             self.ReturnTypeLabel.Show()
   651             self.ReturnTypeLabel.Show()
   710                 message = _("\"%s\" is not a valid identifier!") % value
   714                 message = _("\"%s\" is not a valid identifier!") % value
   711             elif value.upper() in IEC_KEYWORDS:
   715             elif value.upper() in IEC_KEYWORDS:
   712                 message = _("\"%s\" is a keyword. It can't be used!") % value
   716                 message = _("\"%s\" is a keyword. It can't be used!") % value
   713             elif value.upper() in self.PouNames:
   717             elif value.upper() in self.PouNames:
   714                 message = _("A POU named \"%s\" already exists!") % value
   718                 message = _("A POU named \"%s\" already exists!") % value
   715             elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
   719             elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]:
   716                 message = _("A variable with \"%s\" as name already exists in this pou!") % value
   720                 message = _("A variable with \"%s\" as name already exists in this pou!") % value
   717             else:
   721             else:
   718                 self.SaveValues(False)
   722                 self.SaveValues(False)
   719                 old_value = self.Table.GetOldValue()
   723                 old_value = self.Table.GetOldValue()
   720                 if old_value != "":
   724                 if old_value != "":
   844         event.Skip()
   848         event.Skip()
   845     
   849     
   846     def RefreshValues(self):
   850     def RefreshValues(self):
   847         data = []
   851         data = []
   848         for num, variable in enumerate(self.Values):
   852         for num, variable in enumerate(self.Values):
   849             if variable["Class"] in self.ClassList:
   853             if variable.Class in self.ClassList:
   850                 variable["Number"] = num + 1
   854                 variable.Number = num + 1
   851                 data.append(variable)
   855                 data.append(variable)
   852         self.Table.SetData(data)
   856         self.Table.SetData(data)
   853         self.Table.ResetView(self.VariablesGrid)
   857         self.Table.ResetView(self.VariablesGrid)
   854             
   858             
   855     def SaveValues(self, buffer = True):
   859     def SaveValues(self, buffer = True):