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): |