controls/VariablePanel.py
branch1.1 Korean release
changeset 1384 02fe382c4511
parent 1361 7158aa054226
child 1380 10ac2b18437b
equal deleted inserted replaced
1280:72a826dfcfbb 1384:02fe382c4511
    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):
   171                             renderer = wx.grid.GridCellStringRenderer()
   184                             renderer = wx.grid.GridCellStringRenderer()
   172                         elif colname == "Initial Value":
   185                         elif colname == "Initial Value":
   173                             if var_class not in ["External", "InOut"]:
   186                             if var_class not in ["External", "InOut"]:
   174                                 if self.Parent.Controler.IsEnumeratedType(var_type):
   187                                 if self.Parent.Controler.IsEnumeratedType(var_type):
   175                                     editor = wx.grid.GridCellChoiceEditor()
   188                                     editor = wx.grid.GridCellChoiceEditor()
   176                                     editor.SetParameters(",".join(self.Parent.Controler.GetEnumeratedDataValues(var_type)))
   189                                     editor.SetParameters(",".join([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type)))
   177                                 else:
   190                                 else:
   178                                     editor = wx.grid.GridCellTextEditor()
   191                                     editor = wx.grid.GridCellTextEditor()
   179                                 renderer = wx.grid.GridCellStringRenderer()
   192                                 renderer = wx.grid.GridCellStringRenderer()
   180                             else:
   193                             else:
   181                                 grid.SetReadOnly(row, col, True)
   194                                 grid.SetReadOnly(row, col, True)
   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" : "", 
   464         
   452              "Class" : "", 
       
   453              "Type" : "INT", 
       
   454              "Location" : "",
       
   455              "Initial Value" : "", 
       
   456              "Option" : "",
       
   457              "Documentation" : "", 
       
   458              "Edit" : True
       
   459         }
       
   460 
       
   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"}
   465 
   469 
   501             c = wx.ALIGN_CENTER 
   505             c = wx.ALIGN_CENTER 
   502 
   506 
   503             #                      Num  Name    Class   Type    Init    Option   Doc
   507             #                      Num  Name    Class   Type    Init    Option   Doc
   504             self.ColSizes       = [40,  80,     70,     80,     80,     100,     160]
   508             self.ColSizes       = [40,  80,     70,     80,     80,     100,     160]
   505             self.ColAlignements = [c,   l,      l,      l,      l,      l,       l]
   509             self.ColAlignements = [c,   l,      l,      l,      l,      l,       l]
   506 
   510             
       
   511         self.ElementType = element_type
       
   512         self.BodyType = None
       
   513         
   507         for choice in self.FilterChoices:
   514         for choice in self.FilterChoices:
   508             self.ClassFilter.Append(_(choice))
   515             self.ClassFilter.Append(_(choice))
   509 
   516 
   510         reverse_transfer = {}
   517         reverse_transfer = {}
   511         for filter, choice in self.FilterChoiceTransfer.items():
   518         for filter, choice in self.FilterChoiceTransfer.items():
   522         
   529         
   523         def _AddVariable(new_row):
   530         def _AddVariable(new_row):
   524             if new_row > 0:
   531             if new_row > 0:
   525                 row_content = self.Values[new_row - 1].copy()
   532                 row_content = self.Values[new_row - 1].copy()
   526                 
   533                 
   527                 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"])
   534                 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content.Name)
   528                 if result is not None:
   535                 if result is not None:
   529                     name = row_content["Name"][:result.start(1)]
   536                     name = row_content.Name[:result.start(1)]
   530                     suffix = result.group(1)
   537                     suffix = result.group(1)
   531                     if suffix != "":
   538                     if suffix != "":
   532                         start_idx = int(suffix)
   539                         start_idx = int(suffix)
   533                     else:
   540                     else:
   534                         start_idx = 0
   541                         start_idx = 0
   535                 else:
   542                 else:
   536                     name = row_content["Name"]
   543                     name = row_content.Name
   537                     start_idx = 0
   544                     start_idx = 0
   538             else:
   545             else:
   539                 row_content = None
   546                 row_content = None
   540                 start_idx = 0
   547                 start_idx = 0
   541                 name = "LocalVar"
   548                 name = "LocalVar"
   542                 
   549                 
   543             if row_content is not None and row_content["Edit"]: 
   550             if row_content is not None and row_content.Edit: 
   544                 row_content = self.Values[new_row - 1].copy()
   551                 row_content = self.Values[new_row - 1].copy()
   545             else:
   552             else:
   546                 row_content = self.DefaultValue.copy()
   553                 row_content = self.DefaultValue.copy()
   547                 if self.Filter in self.DefaultTypes:
   554                 if self.Filter in self.DefaultTypes:
   548                     row_content["Class"] = self.DefaultTypes[self.Filter]
   555                     row_content.Class = self.DefaultTypes[self.Filter]
   549                 else:
   556                 else:
   550                     row_content["Class"] = self.Filter
   557                     row_content.Class = self.Filter
   551             
   558             
   552             row_content["Name"] = self.Controler.GenerateNewName(
   559             row_content.Name = self.Controler.GenerateNewName(
   553                     self.TagName, None, name + "%d", start_idx)
   560                     self.TagName, None, name + "%d", start_idx)
   554             
   561             
   555             if self.Filter == "All" and len(self.Values) > 0:
   562             if self.Filter == "All" and len(self.Values) > 0:
   556                 self.Values.insert(new_row, row_content)
   563                 self.Values.insert(new_row, row_content)
   557             else:
   564             else:
   564         
   571         
   565         def _DeleteVariable(row):
   572         def _DeleteVariable(row):
   566             if self.Table.GetValueByName(row, "Edit"):
   573             if self.Table.GetValueByName(row, "Edit"):
   567                 self.Values.remove(self.Table.GetRow(row))
   574                 self.Values.remove(self.Table.GetRow(row))
   568                 self.SaveValues()
   575                 self.SaveValues()
       
   576                 if self.ElementType == "resource":
       
   577                     self.ParentWindow.RefreshView(variablepanel = False)
   569                 self.RefreshValues()
   578                 self.RefreshValues()
   570         setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
   579         setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
   571             
   580             
   572         def _MoveVariable(row, move):
   581         def _MoveVariable(row, move):
   573             if self.Filter == "All":
   582             if self.Filter == "All":
   606     def __del__(self):
   615     def __del__(self):
   607         self.RefreshHighlightsTimer.Stop()
   616         self.RefreshHighlightsTimer.Stop()
   608     
   617     
   609     def SetTagName(self, tagname):
   618     def SetTagName(self, tagname):
   610         self.TagName = tagname
   619         self.TagName = tagname
       
   620         self.BodyType = self.Controler.GetEditedElementBodyType(self.TagName)
   611     
   621     
   612     def GetTagName(self):
   622     def GetTagName(self):
   613         return self.TagName
   623         return self.TagName
   614     
   624     
   615     def IsFunctionBlockType(self, name):
   625     def IsFunctionBlockType(self, name):
   616         bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   626         if self.ElementType != "function" and self.BodyType in ["ST", "IL"]:
   617         pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
       
   618         if poutype != "function" and bodytype in ["ST", "IL"]:
       
   619             return False
   627             return False
   620         else:
   628         else:
   621             return name in self.Controler.GetFunctionBlockTypes(self.TagName)
   629             return self.Controler.GetBlockType(name, debug=self.Debug) is not None
   622     
   630     
   623     def RefreshView(self):
   631     def RefreshView(self):
   624         self.PouNames = self.Controler.GetProjectPouNames(self.Debug)
   632         self.PouNames = self.Controler.GetProjectPouNames(self.Debug)
   625         returnType = None
   633         returnType = None
   626         description = None
   634         description = None
   633         else:
   641         else:
   634             if self.ElementType == "function":
   642             if self.ElementType == "function":
   635                 self.ReturnType.Clear()
   643                 self.ReturnType.Clear()
   636                 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
   644                 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
   637                     self.ReturnType.Append(data_type)
   645                     self.ReturnType.Append(data_type)
   638                 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
   646                 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug)
   639             description = self.Controler.GetPouDescription(words[1])
   647             description = self.Controler.GetPouDescription(words[1])
   640             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
   648             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
   641         
   649         
   642         if returnType is not None:
   650         if returnType is not None:
   643             self.ReturnType.SetStringSelection(returnType)
   651             self.ReturnType.SetStringSelection(returnType)
   644             self.ReturnType.Enable(not self.Debug)
   652             self.ReturnType.Enable(not self.Debug)
   645             self.ReturnTypeLabel.Show()
   653             self.ReturnTypeLabel.Show()
   708                 message = _("\"%s\" is not a valid identifier!") % value
   716                 message = _("\"%s\" is not a valid identifier!") % value
   709             elif value.upper() in IEC_KEYWORDS:
   717             elif value.upper() in IEC_KEYWORDS:
   710                 message = _("\"%s\" is a keyword. It can't be used!") % value
   718                 message = _("\"%s\" is a keyword. It can't be used!") % value
   711             elif value.upper() in self.PouNames:
   719             elif value.upper() in self.PouNames:
   712                 message = _("A POU named \"%s\" already exists!") % value
   720                 message = _("A POU named \"%s\" already exists!") % value
   713             elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
   721             elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]:
   714                 message = _("A variable with \"%s\" as name already exists in this pou!") % value
   722                 message = _("A variable with \"%s\" as name already exists in this pou!") % value
   715             else:
   723             else:
   716                 self.SaveValues(False)
   724                 self.SaveValues(False)
   717                 old_value = self.Table.GetOldValue()
   725                 old_value = self.Table.GetOldValue()
   718                 if old_value != "":
   726                 if old_value != "":
   842         event.Skip()
   850         event.Skip()
   843     
   851     
   844     def RefreshValues(self):
   852     def RefreshValues(self):
   845         data = []
   853         data = []
   846         for num, variable in enumerate(self.Values):
   854         for num, variable in enumerate(self.Values):
   847             if variable["Class"] in self.ClassList:
   855             if variable.Class in self.ClassList:
   848                 variable["Number"] = num + 1
   856                 variable.Number = num + 1
   849                 data.append(variable)
   857                 data.append(variable)
   850         self.Table.SetData(data)
   858         self.Table.SetData(data)
   851         self.Table.ResetView(self.VariablesGrid)
   859         self.Table.ResetView(self.VariablesGrid)
   852             
   860             
   853     def SaveValues(self, buffer = True):
   861     def SaveValues(self, buffer = True):