# HG changeset patch
# User lbessard
# Date 1184948883 -7200
# Node ID 2b2f8d88e6d382af8cf6694d805b9570292c1fbb
# Parent 4379e98a30aa28549b39fc2603b3d54e9cff804f
Interface changed to show pou interface at the bottom of the window
Adding Drag&Drop between ProjectTree and VariableGrid for adding block and variables into graphical Viewer
diff -r 4379e98a30aa -r 2b2f8d88e6d3 PLCControler.py
--- a/PLCControler.py Thu Jul 19 15:04:41 2007 +0200
+++ b/PLCControler.py Fri Jul 20 18:28:03 2007 +0200
@@ -261,24 +261,24 @@
for pou in self.Project.getPous():
pou_type = pou.getPouType().getValue()
pou_infos = {"name": pou.getName(), "type": ITEM_POU}
- var_types = {"Input": {"name": "Input", "type": ITEM_CLASS, "values": []},
- "Output": {"name": "Output", "type": ITEM_CLASS, "values": []},
- "InOut": {"name": "InOut", "type": ITEM_CLASS, "values": []},
- "External": {"name": "External", "type": ITEM_CLASS, "values": []},
- "Local": {"name": "Local", "type": ITEM_CLASS, "values": []},
- "Temp": {"name": "Temp", "type": ITEM_CLASS, "values": []},
- "Global": {"name": "Global", "type": ITEM_CLASS, "values": []}}
- for var in self.GetPouInterfaceVars(pou):
- var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
- if var["Class"] in var_types.keys():
- var_types[var["Class"]]["values"].append(var_values)
pou_values = []
- pou_values.append({"name": "Interface", "type": ITEM_CLASS,
- "values": [var_types["Input"], var_types["Output"], var_types["InOut"], var_types["External"]]})
- pou_values.append({"name": "Variables", "type": ITEM_CLASS,
- "values": [var_types["Local"], var_types["Temp"]]})
- if pou_type == "program":
- pou_values.append(var_types["Global"])
+## var_types = {"Input": {"name": "Input", "type": ITEM_CLASS, "values": []},
+## "Output": {"name": "Output", "type": ITEM_CLASS, "values": []},
+## "InOut": {"name": "InOut", "type": ITEM_CLASS, "values": []},
+## "External": {"name": "External", "type": ITEM_CLASS, "values": []},
+## "Local": {"name": "Local", "type": ITEM_CLASS, "values": []},
+## "Temp": {"name": "Temp", "type": ITEM_CLASS, "values": []},
+## "Global": {"name": "Global", "type": ITEM_CLASS, "values": []}}
+## for var in self.GetPouInterfaceVars(pou):
+## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
+## if var["Class"] in var_types.keys():
+## var_types[var["Class"]]["values"].append(var_values)
+## pou_values.append({"name": "Interface", "type": ITEM_CLASS,
+## "values": [var_types["Input"], var_types["Output"], var_types["InOut"], var_types["External"]]})
+## pou_values.append({"name": "Variables", "type": ITEM_CLASS,
+## "values": [var_types["Local"], var_types["Temp"]]})
+## if pou_type == "program":
+## pou_values.append(var_types["Global"])
if pou.getBodyType() == "SFC":
transitions = []
for transition in pou.getTransitionList():
@@ -295,21 +295,22 @@
for config in self.Project.getConfigurations():
config_name = config.getName()
config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, "values": []}
- config_vars = {"name": "Global", "type": ITEM_CLASS, "values": []}
- for var in self.GetConfigurationGlobalVars(config_name):
- var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
- config_vars["values"].append(var_values)
+## config_vars = {"name": "Global", "type": ITEM_CLASS, "values": []}
+## for var in self.GetConfigurationGlobalVars(config_name):
+## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
+## config_vars["values"].append(var_values)
resources = {"name": "Resources", "type": ITEM_UNEDITABLE, "values": []}
for resource in config.getResource():
resource_name = resource.getName()
resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, "values": []}
- resource_vars = {"name": "Global", "type": ITEM_CLASS, "values": []}
- for var in self.GetConfigurationResourceGlobalVars(config_name, resource_name):
- var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
- resource_vars["values"].append(var_values)
- resource_infos["values"].append(resource_vars)
+## resource_vars = {"name": "Global", "type": ITEM_CLASS, "values": []}
+## for var in self.GetConfigurationResourceGlobalVars(config_name, resource_name):
+## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []}
+## resource_vars["values"].append(var_values)
+## resource_infos["values"].append(resource_vars)
resources["values"].append(resource_infos)
- config_infos["values"] = [config_vars, resources]
+## config_infos["values"] = [config_vars, resources]
+ config_infos["values"] = [resources]
configurations["values"].append(config_infos)
infos["values"] = [{"name": "Properties", "type": ITEM_UNEDITABLE, "values": []},
pou_types["function"], pou_types["functionBlock"],
@@ -851,6 +852,8 @@
words = pou_name.split("::")
if len(words) == 1:
names.append(pou_name)
+ elif len(words) == 2:
+ names.append(words[1])
else:
names.append("%s-%s"%(words[1],words[2]))
return names
@@ -864,6 +867,10 @@
return "A::%s::%s" % (pou, action)
# Compute a pou name
+ def ComputeConfigurationName(self, config):
+ return "C::%s" % config
+
+ # Compute a pou name
def ComputeConfigurationResourceName(self, config, resource):
return "R::%s::%s" % (config, resource)
@@ -885,6 +892,10 @@
def OpenPouActionEditing(self, pou, action):
return self.OpenElementEditing(self.ComputePouActionName(pou, action))
+ # Open a configuration resource by giving configuration name
+ def OpenConfigurationEditing(self, config):
+ return self.OpenElementEditing(self.ComputeConfigurationName(config))
+
# Open a configuration resource by giving configuration and resource names
def OpenConfigurationResourceEditing(self, config, resource):
return self.OpenElementEditing(self.ComputeConfigurationResourceName(config, resource))
@@ -901,8 +912,12 @@
def IsPouActionEditing(self, pou, action):
return self.ComputePouActionName(pou, action) in self.ElementsOpened
- # Return if pou action given by pou and action names is opened
- def IsConfigurationResourceEditing(self, pou, action):
+ # Return if pou action given by configuration name is opened
+ def IsConfigurationEditing(self, pou):
+ return self.ComputeConfigurationName(config) in self.ElementsOpened
+
+ # Return if pou action given by configuration and resource names is opened
+ def IsConfigurationResourceEditing(self, pou, resource):
return self.ComputeConfigurationResourceName(config, resource) in self.ElementsOpened
# Close current pou editing
@@ -932,6 +947,10 @@
def ChangePouActionEditing(self, pou, action):
return self.ChangeElementEditing(self.ComputePouActionName(pou, action))
+ # Change current pou editing for action given by configuration name
+ def ChangeConfigurationEditing(self, config):
+ return self.ChangeElementEditing(self.ComputeConfigurationName(config))
+
# Change current pou editing for action given by configuration and resource names
def ChangeConfigurationResourceEditing(self, config, resource):
return self.ChangeElementEditing(self.ComputeConfigurationResourceName(config, resource))
@@ -955,6 +974,9 @@
return pou.getTransition(words[2])
elif words[0] == 'A':
return pou.getAction(words[2])
+ elif words[0] == 'C':
+ result = self.Project.getConfiguration(words[1])
+ return result
elif words[0] == 'R':
result = self.Project.getConfigurationResource(words[1], words[2])
return result
@@ -968,6 +990,8 @@
words = name.split("::")
if len(words) == 1:
return name
+ elif len(words) == 2:
+ return words[1]
else:
return words[2]
return None
@@ -983,7 +1007,9 @@
words = name.split("::")
if len(words) == 1:
return self.GetPouType(name)
- else:
+ elif len(words) == 2:
+ return None
+ elif words[0] != "R":
return self.GetPouType(words[1])
return None
diff -r 4379e98a30aa -r 2b2f8d88e6d3 PLCGenerator.py
--- a/PLCGenerator.py Thu Jul 19 15:04:41 2007 +0200
+++ b/PLCGenerator.py Fri Jul 20 18:28:03 2007 +0200
@@ -277,7 +277,6 @@
if step_name in self.SFCNetworks["Steps"].keys():
actions = actionBlock.getActions()
for action in actions:
- print action
action_infos = {"qualifier" : action["qualifier"], "content" : action["value"]}
if "duration" in action:
action_infos["duration"] = action["duration"]
diff -r 4379e98a30aa -r 2b2f8d88e6d3 PLCOpenEditor.py
--- a/PLCOpenEditor.py Thu Jul 19 15:04:41 2007 +0200
+++ b/PLCOpenEditor.py Fri Jul 20 18:28:03 2007 +0200
@@ -65,7 +65,10 @@
sys.exit()
elif len(args) == 1:
fileOpen = args[0]
-CWD = sys.path[0]
+CWD = ""
+for path in sys.path:
+ if os.path.isfile(os.path.join(path, "PLCOpenEditor.py")):
+ CWD = path
[wxID_PLCOPENEDITOR, wxID_PLCOPENEDITORPROJECTTREE,
wxID_PLCOPENEDITORSPLITTERWINDOW1, wxID_PLCOPENEDITOREDITORPANEL,
@@ -204,8 +207,9 @@
def _init_coll_menuBar1_Menus(self, parent):
# generated method, don't edit
-
- parent.Append(menu=self.FileMenu, title=u'File')
+
+ if self.ModeSolo:
+ parent.Append(menu=self.FileMenu, title=u'File')
parent.Append(menu=self.EditMenu, title=u'Edit')
parent.Append(menu=self.HelpMenu, title=u'Help')
@@ -230,8 +234,9 @@
kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS2,
kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
- parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS3,
- kind=wx.ITEM_NORMAL, text=u'About')
+ if self.ModeSolo:
+ parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS3,
+ kind=wx.ITEM_NORMAL, text=u'About')
self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu,
id=wxID_PLCOPENEDITORHELPMENUITEMS1)
@@ -302,7 +307,10 @@
# generated method, don't edit
self.menuBar1 = wx.MenuBar()
- self.FileMenu = wx.Menu(title=u'')
+ if self.ModeSolo:
+ self.FileMenu = wx.Menu(title=u'')
+ else:
+ self.FileMenu = None
self.EditMenu = wx.Menu(title=u'')
@@ -313,7 +321,8 @@
self.ConfigMenu = wx.Menu(title='')
self._init_coll_menuBar1_Menus(self.menuBar1)
- self._init_coll_FileMenu_Items(self.FileMenu)
+ if self.ModeSolo:
+ self._init_coll_FileMenu_Items(self.FileMenu)
self._init_coll_EditMenu_Items(self.EditMenu)
self._init_coll_HelpMenu_Items(self.HelpMenu)
self._init_coll_SFCMenu_Items(self.SFCMenu)
@@ -406,10 +415,11 @@
id=wxID_PLCOPENEDITORPROJECTTREE)
self.splitterWindow1.SplitVertically(self.ProjectTree, self.EditorPanel,
200)
-
+
self._init_sizers()
- def __init__(self, parent):
+ def __init__(self, parent, controler = None):
+ self.ModeSolo = controler == None
self._init_ctrls(parent)
self.TreeImageList = wxImageList(16, 16)
@@ -417,7 +427,10 @@
self.TreeImageList.Add(wxBitmap(os.path.join(CWD, 'Images/%s.png'%language)))
self.ProjectTree.SetImageList(self.TreeImageList)
- self.Controler = PLCControler()
+ if self.ModeSolo:
+ self.Controler = PLCControler()
+ else:
+ self.Controler = controler
if fileOpen:
self.Controler.OpenXMLFile(fileOpen)
@@ -612,8 +625,7 @@
selected = self.TabsOpened.GetSelection()
if selected != -1:
window = self.TabsOpened.GetPage(selected)
- if not isinstance(window, TextViewer):
- window.SetMode(MODE_SELECTION)
+ window.SetMode(MODE_SELECTION)
self.ToolBar.ToggleTool(wxID_PLCOPENEDITORTOOLBARSELECTION, True)
def ResetToolToggle(self, id):
@@ -670,7 +682,7 @@
def OnRungTool(self, event):
selected = self.TabsOpened.GetSelection()
if selected != -1:
- self.TabsOpened.GetPage(selected).AddLadderRung()
+ self.TabsOpened.GetPage(selected).Viewer.AddLadderRung()
event.Skip()
def OnCoilTool(self, event):
@@ -688,13 +700,13 @@
if self.DrawingMode == FREEDRAWING_MODE:
self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
else:
- self.TabsOpened.GetPage(selected).AddLadderContact()
+ self.TabsOpened.GetPage(selected).Viewer.AddLadderContact()
event.Skip()
def OnBranchTool(self, event):
selected = self.TabsOpened.GetSelection()
if selected != -1:
- self.TabsOpened.GetPage(selected).AddLadderBranch()
+ self.TabsOpened.GetPage(selected).Viewer.AddLadderBranch()
event.Skip()
def OnInitialStepTool(self, event):
@@ -712,7 +724,7 @@
if self.GetDrawingMode() == FREEDRAWING_MODE:
self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
else:
- self.TabsOpened.GetPage(selected).AddStep()
+ self.TabsOpened.GetPage(selected).Viewer.AddStep()
event.Skip()
def OnActionBlockTool(self, event):
@@ -723,7 +735,7 @@
if self.GetDrawingMode() == FREEDRAWING_MODE:
self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
else:
- self.TabsOpened.GetPage(selected).AddStepAction()
+ self.TabsOpened.GetPage(selected).Viewer.AddStepAction()
event.Skip()
def OnTransitionTool(self, event):
@@ -741,7 +753,7 @@
if self.GetDrawingMode() == FREEDRAWING_MODE:
self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
else:
- self.TabsOpened.GetPage(selected).AddDivergence()
+ self.TabsOpened.GetPage(selected).Viewer.AddDivergence()
event.Skip()
def OnJumpTool(self, event):
@@ -752,7 +764,7 @@
if self.GetDrawingMode() == FREEDRAWING_MODE:
self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
else:
- self.TabsOpened.GetPage(selected).AddJump()
+ self.TabsOpened.GetPage(selected).Viewer.AddJump()
event.Skip()
def OnPouSelectedChanged(self, event):
@@ -767,6 +779,7 @@
if self.ProjectTree.GetItemText(item) == name:
self.ProjectTree.SelectItem(item)
item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
+ self.TabsOpened.GetPage(selected).RefreshView()
self.RefreshFileMenu()
self.RefreshEditMenu()
self.RefreshToolBar()
@@ -774,12 +787,13 @@
def OnProjectTreeBeginDrag(self, event):
item = event.GetItem()
- if self.ProjectTree.GetPyData(item) == ITEM_VARIABLE:
- data = wxTextDataObject(self.ProjectTree.GetItemText(item))
+ if self.ProjectTree.GetPyData(item) == ITEM_POU:
+ block_name = self.ProjectTree.GetItemText(item)
+ block_type = self.Controler.GetPouType(block_name)
+ data = wxTextDataObject(str((block_name, block_type)))
dragSource = wxDropSource(self.ProjectTree)
dragSource.SetData(data)
dragSource.DoDragDrop()
- event.Skip()
def OnProjectTreeItemEndEdit(self, event):
message = None
@@ -875,75 +889,184 @@
data = self.ProjectTree.GetPyData(selected)
if name == "Properties":
self.ShowProperties()
- elif data == ITEM_CLASS:
- item = self.ProjectTree.GetItemParent(selected)
- item_type = self.ProjectTree.GetPyData(item)
- while item_type not in [ITEM_POU, ITEM_RESOURCE, ITEM_CONFIGURATION] and item.IsOk():
- item = self.ProjectTree.GetItemParent(item)
+## elif data == ITEM_CLASS:
+## item = self.ProjectTree.GetItemParent(selected)
+## item_type = self.ProjectTree.GetPyData(item)
+## while item_type not in [ITEM_POU, ITEM_RESOURCE, ITEM_CONFIGURATION] and item.IsOk():
+## item = self.ProjectTree.GetItemParent(item)
+## item_type = self.ProjectTree.GetPyData(item)
+## item_name = self.ProjectTree.GetItemText(item)
+## if item_type == ITEM_POU:
+## dialog = EditVariableDialog(self, item_name, self.Controler.GetPouType(item_name), self.Controler.PouIsUsed(item_name), name)
+## dialog.SetPouNames(self.Controler.GetProjectPouNames())
+## values = {}
+## values["returnType"] = self.Controler.GetPouInterfaceReturnTypeByName(item_name)
+## values["data"] = self.Controler.GetPouInterfaceVarsByName(item_name)
+## dialog.SetValues(values)
+## if dialog.ShowModal() == wxID_OK:
+## new_values = dialog.GetValues()
+## if "returnType" in new_values:
+## self.Controler.SetPouInterfaceReturnType(item_name, new_values["returnType"])
+## self.Controler.SetPouInterfaceVars(item_name, new_values["data"])
+## pou_names = self.Controler.GetElementsOpenedNames()
+## if item_name in pou_names:
+## window = self.TabsOpened.GetPage(pou_names.index(item_name))
+## if isinstance(window, TextViewer):
+## varlist = []
+## if "returnType" in new_values:
+## varlist.append(name)
+## for var in new_values["data"]:
+## varlist.append(var["Name"])
+## window.SetVariables(varlist)
+## dialog.Destroy()
+## self.RefreshProjectTree()
+## elif item_type == ITEM_CONFIGURATION:
+## dialog = EditVariableDialog(self, item_name, None, False, name)
+## dialog.SetPouNames(self.Controler.GetProjectPouNames())
+## values = {"data" : self.Controler.GetConfigurationGlobalVars(item_name)}
+## dialog.SetValues(values)
+## if dialog.ShowModal() == wxID_OK:
+## new_values = dialog.GetValues()
+## self.Controler.SetConfigurationGlobalVars(item_name, new_values["data"])
+## dialog.Destroy()
+## self.RefreshProjectTree()
+## elif item_type == ITEM_RESOURCE:
+## config = self.ProjectTree.GetItemParent(item)
+## config_type = self.ProjectTree.GetPyData(config)
+## while config_type != ITEM_CONFIGURATION and config.IsOk():
+## config = self.ProjectTree.GetItemParent(config)
+## config_type = self.ProjectTree.GetPyData(config)
+## if config.IsOk():
+## config_name = self.ProjectTree.GetItemText(config)
+## dialog = EditVariableDialog(self, item_name, None, False, name)
+## values = {"data" : self.Controler.GetConfigurationResourceGlobalVars(config_name, item_name)}
+## dialog.SetValues(values)
+## if dialog.ShowModal() == wxID_OK:
+## new_values = dialog.GetValues()
+## self.Controler.SetConfigurationResourceGlobalVars(config_name, item_name, new_values["data"])
+## dialog.Destroy()
+## self.RefreshProjectTree()
+## elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
+## if data == ITEM_POU:
+## idx = self.Controler.OpenElementEditing(name)
+## language = self.Controler.GetPouBodyType(name)
+## varlist = []
+## returnType = self.Controler.GetPouInterfaceReturnTypeByName(name)
+## if returnType:
+## varlist.append(name)
+## vars = self.Controler.GetPouInterfaceVarsByName(name)
+## if vars:
+## for var in vars:
+## varlist.append(var["Name"])
+## self.EditVariable.SetPou(self.Controler.GetPouType(name), self.Controler.PouIsUsed(name))
+## self.EditVariable.SetValues({"returnType":returnType,"data":vars})
+## else:
+## parent = self.ProjectTree.GetItemParent(selected)
+## parent_name = self.ProjectTree.GetItemText(parent)
+## grandparent = self.ProjectTree.GetItemParent(parent)
+## grandparent_name = self.ProjectTree.GetItemText(grandparent)
+## if data == ITEM_TRANSITION:
+## idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name)
+## language = self.Controler.GetTransitionBodyType(grandparent_name, name)
+## elif data == ITEM_ACTION:
+## idx = self.Controler.OpenPouActionEditing(grandparent_name, name)
+## language = self.Controler.GetActionBodyType(grandparent_name, name)
+## varlist = [name]
+## vars = self.Controler.GetPouInterfaceVarsByName(grandparent_name)
+## if vars:
+## for var in vars:
+## varlist.append(var["Name"])
+## self.EditVariable.SetPou(self.Controler.GetPouType(grandparent_name), self.Controler.PouIsUsed(grandparent_name))
+## self.EditVariable.SetValues({"returnType":returnType,"data":vars})
+## if idx != None:
+## if language == "FBD":
+## new_window = Viewer(self.TabsOpened, self, self.Controler)
+## elif language == "LD":
+## new_window = LD_Viewer(self.TabsOpened, self, self.Controler)
+## elif language == "SFC":
+## new_window = SFC_Viewer(self.TabsOpened, self, self.Controler)
+## elif language in ["IL", "ST"]:
+## new_window = TextViewer(self.TabsOpened, self, self.Controler)
+## new_window.SetTextSyntax(language)
+## if language == "IL":
+## new_window.SetKeywords(IL_KEYWORDS)
+## else:
+## new_window.SetKeywords(ST_KEYWORDS)
+## new_window.SetVariables(varlist)
+## new_window.SetFunctions(self.Controler.GetBlockTypes())
+## else:
+## return
+## new_window.RefreshView()
+## self.TabsOpened.AddPage(new_window, "")
+## self.TabsOpened.SetSelection(idx)
+## self.RefreshTabsOpenedTitles()
+## self.RefreshFileMenu()
+## self.RefreshEditMenu()
+## self.RefreshToolBar()
+## else:
+## if data == ITEM_POU:
+## idx = self.Controler.ChangeElementEditing(name)
+## elif data == ITEM_TRANSITION:
+## idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
+## elif data == ITEM_ACTION:
+## idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
+## if idx != None:
+## self.TabsOpened.SetSelection(idx)
+## self.RefreshFileMenu()
+## self.RefreshEditMenu()
+## self.RefreshToolBar()
+## elif data == ITEM_RESOURCE:
+## item = self.ProjectTree.GetItemParent(selected)
+## item_type = self.ProjectTree.GetPyData(item)
+## while item_type != ITEM_CONFIGURATION:
+## item = self.ProjectTree.GetItemParent(item)
+## item_type = self.ProjectTree.GetPyData(item)
+## config_name = self.ProjectTree.GetItemText(item)
+## idx = self.Controler.OpenConfigurationResourceEditing(config_name, name)
+## if idx != None:
+## new_window = ResourceEditor(self.TabsOpened, self, self.Controler)
+## new_window.RefreshView()
+## self.TabsOpened.AddPage(new_window, "")
+## self.TabsOpened.SetSelection(idx)
+## self.RefreshTabsOpenedTitles()
+## self.RefreshFileMenu()
+## self.RefreshEditMenu()
+## self.RefreshToolBar()
+## else:
+## idx = self.Controler.ChangeConfigurationResourceEditing(parent_name, name)
+## if idx != None:
+## self.TabsOpened.SetSelection(idx)
+## self.RefreshFileMenu()
+## self.RefreshEditMenu()
+## self.RefreshToolBar()
+ elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
+ if data == ITEM_CONFIGURATION:
+ idx = self.Controler.OpenConfigurationEditing(name)
+ if idx != None:
+ new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = name)
+ self.TabsOpened.AddPage(new_window, "")
+ else:
+ idx = self.Controler.ChangeConfigurationEditing(name)
+ elif data == ITEM_RESOURCE:
+ item = self.ProjectTree.GetItemParent(selected)
item_type = self.ProjectTree.GetPyData(item)
- item_name = self.ProjectTree.GetItemText(item)
- if item_type == ITEM_POU:
- dialog = EditVariableDialog(self, item_name, self.Controler.GetPouType(item_name), self.Controler.PouIsUsed(item_name), name)
- dialog.SetPouNames(self.Controler.GetProjectPouNames())
- values = {}
- values["returnType"] = self.Controler.GetPouInterfaceReturnTypeByName(item_name)
- values["data"] = self.Controler.GetPouInterfaceVarsByName(item_name)
- dialog.SetValues(values)
- if dialog.ShowModal() == wxID_OK:
- new_values = dialog.GetValues()
- if "returnType" in new_values:
- self.Controler.SetPouInterfaceReturnType(item_name, new_values["returnType"])
- self.Controler.SetPouInterfaceVars(item_name, new_values["data"])
- pou_names = self.Controler.GetElementsOpenedNames()
- if item_name in pou_names:
- window = self.TabsOpened.GetPage(pou_names.index(item_name))
- if isinstance(window, TextViewer):
- varlist = []
- if "returnType" in new_values:
- varlist.append(name)
- for var in new_values["data"]:
- varlist.append(var["Name"])
- window.SetVariables(varlist)
- dialog.Destroy()
- self.RefreshProjectTree()
- elif item_type == ITEM_CONFIGURATION:
- dialog = EditVariableDialog(self, item_name, None, False, name)
- dialog.SetPouNames(self.Controler.GetProjectPouNames())
- values = {"data" : self.Controler.GetConfigurationGlobalVars(item_name)}
- dialog.SetValues(values)
- if dialog.ShowModal() == wxID_OK:
- new_values = dialog.GetValues()
- self.Controler.SetConfigurationGlobalVars(item_name, new_values["data"])
- dialog.Destroy()
- self.RefreshProjectTree()
- elif item_type == ITEM_RESOURCE:
- config = self.ProjectTree.GetItemParent(item)
- config_type = self.ProjectTree.GetPyData(config)
- while config_type != ITEM_CONFIGURATION and config.IsOk():
- config = self.ProjectTree.GetItemParent(config)
- config_type = self.ProjectTree.GetPyData(config)
- if config.IsOk():
- config_name = self.ProjectTree.GetItemText(config)
- dialog = EditVariableDialog(self, item_name, None, False, name)
- values = {"data" : self.Controler.GetConfigurationResourceGlobalVars(config_name, item_name)}
- dialog.SetValues(values)
- if dialog.ShowModal() == wxID_OK:
- new_values = dialog.GetValues()
- self.Controler.SetConfigurationResourceGlobalVars(config_name, item_name, new_values["data"])
- dialog.Destroy()
- self.RefreshProjectTree()
- elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
- if data == ITEM_POU:
+ while item_type != ITEM_CONFIGURATION:
+ item = self.ProjectTree.GetItemParent(item)
+ item_type = self.ProjectTree.GetPyData(item)
+ config_name = self.ProjectTree.GetItemText(item)
+ idx = self.Controler.OpenConfigurationResourceEditing(config_name, name)
+ if idx != None:
+ new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "resource", config_name = config_name, resource_name = name)
+ self.TabsOpened.AddPage(new_window, "")
+ else:
+ idx = self.Controler.ChangeConfigurationResourceEditing(config_name, name)
+ elif data == ITEM_POU:
idx = self.Controler.OpenElementEditing(name)
- language = self.Controler.GetPouBodyType(name)
- varlist = []
- returnType = self.Controler.GetPouInterfaceReturnTypeByName(name)
- if returnType:
- varlist.append(name)
- vars = self.Controler.GetPouInterfaceVarsByName(name)
- if vars:
- for var in vars:
- varlist.append(var["Name"])
+ if idx != None:
+ new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, self.Controler.GetPouType(name), pou_name = name)
+ self.TabsOpened.AddPage(new_window, "")
+ else:
+ idx = self.Controler.ChangeElementEditing(name)
else:
parent = self.ProjectTree.GetItemParent(selected)
parent_name = self.ProjectTree.GetItemText(parent)
@@ -951,76 +1074,26 @@
grandparent_name = self.ProjectTree.GetItemText(grandparent)
if data == ITEM_TRANSITION:
idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name)
- language = self.Controler.GetTransitionBodyType(grandparent_name, name)
+ if idx != None:
+ new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "transition", pou_name = grandparent_name, transition_name = name)
+ self.TabsOpened.AddPage(new_window, "")
+ else:
+ idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
elif data == ITEM_ACTION:
idx = self.Controler.OpenPouActionEditing(grandparent_name, name)
- language = self.Controler.GetActionBodyType(grandparent_name, name)
- varlist = [name]
- vars = self.Controler.GetPouInterfaceVarsByName(grandparent_name)
- if vars:
- for var in vars:
- varlist.append(var["Name"])
+ if idx != None:
+ new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "action", pou_name = grandparent_name, action_name = name)
+ self.TabsOpened.AddPage(new_window, "")
+ else:
+ idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
if idx != None:
- if language == "FBD":
- new_window = Viewer(self.TabsOpened, self, self.Controler)
- elif language == "LD":
- new_window = LD_Viewer(self.TabsOpened, self, self.Controler)
- elif language == "SFC":
- new_window = SFC_Viewer(self.TabsOpened, self, self.Controler)
- elif language in ["IL", "ST"]:
- new_window = TextViewer(self.TabsOpened, self, self.Controler)
- new_window.SetTextSyntax(language)
- if language == "IL":
- new_window.SetKeywords(IL_KEYWORDS)
- else:
- new_window.SetKeywords(ST_KEYWORDS)
- new_window.SetVariables(varlist)
- new_window.SetFunctions(self.Controler.GetBlockTypes())
- else:
- return
- new_window.RefreshView()
- self.TabsOpened.AddPage(new_window, "")
self.TabsOpened.SetSelection(idx)
+ window = self.TabsOpened.GetPage(idx)
+ window.RefreshView()
self.RefreshTabsOpenedTitles()
self.RefreshFileMenu()
self.RefreshEditMenu()
self.RefreshToolBar()
- else:
- if data == ITEM_POU:
- idx = self.Controler.ChangeElementEditing(name)
- elif data == ITEM_TRANSITION:
- idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
- elif data == ITEM_ACTION:
- idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
- if idx != None:
- self.TabsOpened.SetSelection(idx)
- self.RefreshFileMenu()
- self.RefreshEditMenu()
- self.RefreshToolBar()
- elif data == ITEM_RESOURCE:
- item = self.ProjectTree.GetItemParent(selected)
- item_type = self.ProjectTree.GetPyData(item)
- while item_type != ITEM_CONFIGURATION:
- item = self.ProjectTree.GetItemParent(item)
- item_type = self.ProjectTree.GetPyData(item)
- config_name = self.ProjectTree.GetItemText(item)
- idx = self.Controler.OpenConfigurationResourceEditing(config_name, name)
- if idx != None:
- new_window = ResourceEditor(self.TabsOpened, self, self.Controler)
- new_window.RefreshView()
- self.TabsOpened.AddPage(new_window, "")
- self.TabsOpened.SetSelection(idx)
- self.RefreshTabsOpenedTitles()
- self.RefreshFileMenu()
- self.RefreshEditMenu()
- self.RefreshToolBar()
- else:
- idx = self.Controler.ChangeConfigurationResourceEditing(parent_name, name)
- if idx != None:
- self.TabsOpened.SetSelection(idx)
- self.RefreshFileMenu()
- self.RefreshEditMenu()
- self.RefreshToolBar()
def OnProjectTreeRightUp(self, event):
selected = self.ProjectTree.GetSelection()
@@ -1826,6 +1899,8 @@
def GetValue(self, row, col):
if row < self.GetNumberRows():
+ if col == 0:
+ return "d"
name = str(self.data[row].get(self.GetColLabelValue(col), ""))
return name
@@ -1892,13 +1967,15 @@
renderer = None
colname = self.GetColLabelValue(col)
grid.SetReadOnly(row, col, False)
- if colname == "Name":
+ if colname == "Drag":
+ grid.SetReadOnly(row, col, True)
+ elif colname == "Name":
if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
grid.SetReadOnly(row, col, True)
else:
editor = wxGridCellTextEditor()
renderer = wxGridCellStringRenderer()
- if colname in ["Initial Value","Location"]:
+ elif colname in ["Initial Value","Location"]:
editor = wxGridCellTextEditor()
renderer = wxGridCellStringRenderer()
elif colname == "Class":
@@ -1950,127 +2027,228 @@
self.data = []
self.editors = []
-[wxID_EDITVARIABLEDIALOG, wxID_EDITVARIABLEDIALOGMAINPANEL,
- wxID_EDITVARIABLEDIALOGVARIABLESGRID, wxID_EDITVARIABLEDIALOGRETURNTYPE,
- wxID_EDITVARIABLEDIALOGCLASSFILTER, wxID_EDITVARIABLEDIALOGADDBUTTON,
- wxID_EDITVARIABLEDIALOGDELETEBUTTON, wxID_EDITVARIABLEDIALOGUPBUTTON,
- wxID_EDITVARIABLEDIALOGDOWNBUTTON, wxID_EDITVARIABLEDIALOGSTATICTEXT1,
- wxID_EDITVARIABLEDIALOGSTATICTEXT2, wxID_EDITVARIABLEDIALOGSTATICTEXT3,
+[wxID_POUEDITORPANEL, wxID_POUEDITORPANELVIEWER,
+ wxID_POUEDITORPANELVARIABLESGRID, wxID_POUEDITORPANELRETURNTYPE,
+ wxID_POUEDITORPANELCLASSFILTER, wxID_POUEDITORPANELADDBUTTON,
+ wxID_POUEDITORPANELDELETEBUTTON, wxID_POUEDITORPANELUPBUTTON,
+ wxID_POUEDITORPANELDOWNBUTTON, wxID_POUEDITORPANELSTATICTEXT1,
+ wxID_POUEDITORPANELSTATICTEXT2, wxID_POUEDITORPANELSTATICTEXT3,
] = [wx.NewId() for _init_ctrls in range(12)]
-class EditVariableDialog(wx.Dialog):
- def _init_coll_flexGridSizer1_Items(self, parent):
- # generated method, don't edit
-
- parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
+class PouEditorPanel(wx.Panel):
+ def _init_coll_MainPanelSizer_Items(self, parent):
+ # generated method, don't edit
+
+ parent.AddWindow(self.Viewer, 0, border=0, flag=wxGROW)
+ parent.AddSizer(self.VariablePanelSizer, 0, border=0, flag=wxGROW)
+
+ def _init_coll_MainPanelSizer_Growables(self, parent):
+ # generated method, don't edit
+
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_VariablePanelSizer_Items(self, parent):
+ # generated method, don't edit
+
+ parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wxGROW)
+ parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wxGROW)
+
+ def _init_coll_VariablePanelSizer_Growables(self, parent):
+ # generated method, don't edit
+
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_ControlPanelSizer_Items(self, parent):
+ # generated method, don't edit
+
+ parent.AddSizer(self.ChoicePanelSizer, 0, border=0, flag=wxGROW)
+ parent.AddSizer(self.ButtonPanelSizer, 0, border=0, flag=wxALIGN_CENTER)
+
+ def _init_coll_ControlPanelSizer_Growables(self, parent):
+ # generated method, don't edit
+
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+ parent.AddGrowableRow(1)
+
+ def _init_coll_ChoicePanelSizer_Items(self, parent):
+ # generated method, don't edit
+
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wxALIGN_BOTTOM)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wxALIGN_BOTTOM)
+ parent.AddWindow(self.ReturnType, 0, border=0, flag=0)
+ parent.AddWindow(self.ClassFilter, 0, border=0, flag=0)
+
+ def _init_coll_ButtonPanelSizer_Items(self, parent):
+ # generated method, don't edit
+
+ parent.AddWindow(self.AddButton, 0, border=0, flag=0)
+ parent.AddWindow(self.DeleteButton, 0, border=0, flag=0)
+ parent.AddWindow(self.UpButton, 0, border=0, flag=0)
+ parent.AddWindow(self.DownButton, 0, border=0, flag=0)
+
+ def _init_coll_ButtonPanelSizer_Growables(self, parent):
+ # generated method, don't edit
+
+ parent.AddGrowableCol(0)
+ parent.AddGrowableCol(1)
+ parent.AddGrowableCol(2)
+ parent.AddGrowableCol(3)
+ parent.AddGrowableRow(0)
def _init_sizers(self):
# generated method, don't edit
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, name):
- # generated method, don't edit
- wx.Dialog.__init__(self, id=wxID_EDITVARIABLEDIALOG,
- name='EditVariableDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(600, 440), style=wx.DEFAULT_DIALOG_STYLE,
- title='Edit variables of %s'%name)
- self.SetClientSize(wx.Size(600, 440))
-
- self.MainPanel = wx.Panel(id=wxID_EDITVARIABLEDIALOGMAINPANEL,
- name='MainPanel', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(600, 440), style=wx.TAB_TRAVERSAL)
- self.MainPanel.SetAutoLayout(True)
-
- self.staticText1 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT1,
- label='Return Type:', name='staticText1', parent=self.MainPanel,
- pos=wx.Point(24, 29), size=wx.Size(95, 17), style=0)
-
- self.ReturnType = wx.Choice(id=wxID_EDITVARIABLEDIALOGRETURNTYPE,
- name='ReturnType', parent=self.MainPanel, pos=wx.Point(124, 24),
+ self.MainPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+
+ self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
+
+ self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+
+ self.ChoicePanelSizer = wx.GridSizer(cols=2, hgap=5, rows=2, vgap=5)
+
+ self.ButtonPanelSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=1, vgap=0)
+
+ self._init_coll_MainPanelSizer_Items(self.MainPanelSizer)
+ self._init_coll_MainPanelSizer_Growables(self.MainPanelSizer)
+ self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer)
+ self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer)
+ self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
+ self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
+ self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
+ self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
+ self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
+
+ self.SetSizer(self.MainPanelSizer)
+
+ def _init_ctrls(self, prnt, element_type):
+ # generated method, don't edit
+ wx.Panel.__init__(self, id=wxID_POUEDITORPANEL,
+ name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0),
+ size=wx.Size(-1, -1), style=0)
+
+ if element_type == "config":
+ self.Viewer = wx.Panel(id=wxID_POUEDITORPANELVIEWER,
+ name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
+ elif element_type == "resource":
+ self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
+ elif element_type == "FBD":
+ self.Viewer = Viewer(self, self.Parent, self.Controler)
+ elif element_type == "LD":
+ self.Viewer = LD_Viewer(self, self.Parent, self.Controler)
+ elif element_type == "SFC":
+ self.Viewer = SFC_Viewer(self, self.Parent, self.Controler)
+ else:
+ self.Viewer = TextViewer(self, self.Parent, self.Controler)
+ self.Viewer.SetTextSyntax(element_type)
+ if element_type == "IL":
+ self.Viewer.SetKeywords(IL_KEYWORDS)
+ else:
+ self.Viewer.SetKeywords(ST_KEYWORDS)
+
+ self.staticText1 = wx.StaticText(id=wxID_POUEDITORPANELSTATICTEXT1,
+ label='Return Type:', name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
+
+ self.ReturnType = wx.Choice(id=wxID_POUEDITORPANELRETURNTYPE,
+ name='ReturnType', parent=self, pos=wx.Point(0, 0),
size=wx.Size(145, 24), style=0)
- self.staticText2 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT2,
- label='Class Filter:', name='staticText2', parent=self.MainPanel,
- pos=wx.Point(324, 29), size=wx.Size(95, 17), style=0)
-
- self.ClassFilter = wx.Choice(id=wxID_EDITVARIABLEDIALOGCLASSFILTER,
- name='ClassFilter', parent=self.MainPanel, pos=wx.Point(424, 24),
+ self.staticText2 = wx.StaticText(id=wxID_POUEDITORPANELSTATICTEXT2,
+ label='Class Filter:', name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
+
+ self.ClassFilter = wx.Choice(id=wxID_POUEDITORPANELCLASSFILTER,
+ name='ClassFilter', parent=self, pos=wx.Point(0, 0),
size=wx.Size(145, 24), style=0)
- EVT_CHOICE(self, wxID_EDITVARIABLEDIALOGCLASSFILTER, self.OnClassFilter)
-
- self.staticText3 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT3,
- label='Variables:', name='staticText3', parent=self.MainPanel,
- pos=wx.Point(24, 60), size=wx.Size(95, 17), style=0)
-
- self.VariablesGrid = wx.grid.Grid(id=wxID_EDITVARIABLEDIALOGVARIABLESGRID,
- name='VariablesGrid', parent=self.MainPanel, pos=wx.Point(24, 80),
- size=wx.Size(550, 250), style=wxVSCROLL)
+ EVT_CHOICE(self, wxID_POUEDITORPANELCLASSFILTER, self.OnClassFilter)
+
+ self.VariablesGrid = wx.grid.Grid(id=wxID_POUEDITORPANELVARIABLESGRID,
+ name='VariablesGrid', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(-1, 150), style=wxVSCROLL)
self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
'Sans'))
self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
False, 'Sans'))
- self.VariablesGrid.DisableDragGridSize()
- self.VariablesGrid.EnableScrolling(False, True)
self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
-
- self.AddButton = wx.Button(id=wxID_EDITVARIABLEDIALOGADDBUTTON, label='Add',
- name='AddButton', parent=self.MainPanel, pos=wx.Point(345, 340),
+ self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
+
+ self.AddButton = wx.Button(id=wxID_POUEDITORPANELADDBUTTON, label='Add',
+ name='AddButton', parent=self, pos=wx.Point(345, 340),
size=wx.Size(72, 32), style=0)
- EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGADDBUTTON, self.OnAddButton)
-
- self.DeleteButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDELETEBUTTON, label='Delete',
- name='DeleteButton', parent=self.MainPanel, pos=wx.Point(425, 340),
+ EVT_BUTTON(self, wxID_POUEDITORPANELADDBUTTON, self.OnAddButton)
+
+ self.DeleteButton = wx.Button(id=wxID_POUEDITORPANELDELETEBUTTON, label='Delete',
+ name='DeleteButton', parent=self, pos=wx.Point(425, 340),
size=wx.Size(72, 32), style=0)
- EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDELETEBUTTON, self.OnDeleteButton)
-
- self.UpButton = wx.Button(id=wxID_EDITVARIABLEDIALOGUPBUTTON, label='^',
- name='UpButton', parent=self.MainPanel, pos=wx.Point(505, 340),
+ EVT_BUTTON(self, wxID_POUEDITORPANELDELETEBUTTON, self.OnDeleteButton)
+
+ self.UpButton = wx.Button(id=wxID_POUEDITORPANELUPBUTTON, label='^',
+ name='UpButton', parent=self, pos=wx.Point(505, 340),
size=wx.Size(32, 32), style=0)
- EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGUPBUTTON, self.OnUpButton)
-
- self.DownButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDOWNBUTTON, label='v',
- name='DownButton', parent=self.MainPanel, pos=wx.Point(545, 340),
+ EVT_BUTTON(self, wxID_POUEDITORPANELUPBUTTON, self.OnUpButton)
+
+ self.DownButton = wx.Button(id=wxID_POUEDITORPANELDOWNBUTTON, label='v',
+ name='DownButton', parent=self, pos=wx.Point(545, 340),
size=wx.Size(32, 32), style=0)
- EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDOWNBUTTON, self.OnDownButton)
+ EVT_BUTTON(self, wxID_POUEDITORPANELDOWNBUTTON, self.OnDownButton)
self._init_sizers()
- def __init__(self, parent, name, pou_type, pou_is_used, filter = "All"):
- self._init_ctrls(parent, name)
- self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
- self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT)
- self.Filter = filter
- self.PouIsUsed = pou_is_used
+ def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
+ self.Parent = window
+ self.Controler = controler
+ self.ElementType = element_type
+ self.PouName = pou_name
+ self.TransitionName = transition_name
+ self.ActionName = action_name
+ self.ConfigName = config_name
+ self.ResourceName = resource_name
+
+ if element_type == "config":
+ self._init_ctrls(parent, "config")
+ pou_type = "config"
+ elif element_type == "resource":
+ self._init_ctrls(parent, "resource")
+ pou_type = "resource"
+ else:
+ if element_type == "transition":
+ self._init_ctrls(parent, self.Controler.GetTransitionBodyType(pou_name, transition_name))
+ elif element_type == "action":
+ self._init_ctrls(parent, self.Controler.GetActionBodyType(pou_name, action_name))
+ else:
+ self._init_ctrls(parent, self.Controler.GetPouBodyType(pou_name))
+ pou_type = self.Controler.GetPouType(pou_name)
+
+ self.Filter = "All"
self.FilterChoices = []
self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface",
" Input" : "Input", " Output" : "Output", " InOut" : "InOut",
" External" : "External", "Variables" : "Variables", " Local" : "Local",
" Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
- if pou_type:
+ if pou_type in ["config", "resource"]:
+ self.DefaultTypes = {"All" : "Global"}
+ self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
+ else:
self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
- else:
- self.DefaultTypes = {"All" : "Global"}
- self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
- if not pou_type or pou_type == "program":
- self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
- if pou_type:
+ if pou_type in ["config", "resource"] or pou_type == "program":
+ self.Table = VariableTable(self, [], ["Drag", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
+ if pou_type not in ["config", "resource"]:
self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"]
else:
self.FilterChoices = ["All","Global","Access"]
- self.ColSizes = [80, 70, 80, 80, 80, 60, 70]
- self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
+ self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
+ self.ColAlignements = [wxALIGN_CENTER, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
else:
- self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
+ self.Table = VariableTable(self, [], ["Drag", "Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"]
- self.ColSizes = [120, 70, 80, 120, 60, 70]
- self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
+ self.ColSizes = [40, 120, 70, 80, 120, 60, 70]
+ self.ColAlignements = [wxALIGN_CENTER, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
for choice in self.FilterChoices:
self.ClassFilter.Append(choice)
reverse_transfer = {}
@@ -2078,7 +2256,6 @@
reverse_transfer[choice] = filter
self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
self.RefreshTypeList()
- self.RefreshButtons()
self.OptionList = "Yes,No"
self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")])
@@ -2090,46 +2267,62 @@
self.ReturnType.Enable(True)
else:
self.ReturnType.Enable(False)
- self.staticText2.Hide()
+ self.staticText1.Hide()
self.ReturnType.Hide()
self.VariablesGrid.SetTable(self.Table)
self.VariablesGrid.SetRowLabelSize(0)
-
- self.Table.ResetView(self.VariablesGrid)
-
- self.PouNames = []
-
+
+ def SetMode(self, mode):
+ if self.ElementType not in ["resource", "config"]:
+ if self.ElementType == "transition":
+ language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
+ elif self.ElementType == "action":
+ language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
+ else:
+ language = self.Controler.GetPouBodyType(self.PouName)
+ if language not in ["IL", "ST"]:
+ self.Viewer.SetMode(mode)
+
+ def RefreshView(self):
+ self.PouNames = self.Controler.GetProjectPouNames()
+
+ if self.ElementType == "config":
+ self.PouIsUsed = False
+ returnType = None
+ self.Values = self.Controler.GetConfigurationGlobalVars(self.ConfigName)
+ elif self.ElementType == "resource":
+ self.PouIsUsed = False
+ returnType = None
+ self.Values = self.Controler.GetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName)
+ else:
+ self.PouIsUsed = self.Controler.PouIsUsed(self.PouName)
+ returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType()
+ self.Values = self.Controler.GetCurrentElementEditingInterfaceVars()
+ varlist = [var["Name"] for var in self.Values]
+ if self.ElementType == "transtion":
+ language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
+ varlist.append(self.ActionName)
+ elif self.ElementType == "action":
+ language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
+ varlist.append(self.ActionName)
+ else:
+ language = self.Controler.GetPouBodyType(self.PouName)
+ varlist.append(self.PouName)
+ if language in ["IL", "ST"]:
+ self.Viewer.SetVariables(varlist)
+ self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
+
+ if returnType and self.ReturnType.IsEnabled():
+ self.ReturnType.SetStringSelection(returnType)
+ self.RefreshValues()
+ self.RefreshButtons()
+ if self.ElementType != "config":
+ self.Viewer.RefreshView()
+
if self.PouIsUsed:
wxCallAfter(self.WarningMessage, name)
-
- EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
-
- def WarningMessage(self, name):
- message = wxMessageDialog(self, "\"%s\" is used by one or more POUs. Its interface can't be changed!"%name, "WARNING", wxOK|wxICON_EXCLAMATION)
- message.ShowModal()
- message.Destroy()
-
- def OnOK(self, event):
- self.VariablesGrid.SetGridCursor(0, 0)
- error = []
- if self.ReturnType.IsEnabled() and self.ReturnType.GetStringSelection() == "":
- error.append("Return Type")
- if len(error) > 0:
- text = ""
- for i, item in enumerate(error):
- if i == 0:
- text += item
- elif i == len(error) - 1:
- text += " and %s"%item
- else:
- text += ", %s"%item
- message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wxID_OK)
-
+
def OnClassFilter(self, event):
self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
self.RefreshTypeList()
@@ -2157,7 +2350,7 @@
self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"])
self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
-
+
def OnAddButton(self, event):
new_row = self.DefaultValue.copy()
if self.Filter in self.DefaultTypes:
@@ -2212,25 +2405,28 @@
message.Destroy()
event.Veto()
else:
+ self.SaveValues()
event.Skip()
else:
+ self.SaveValues()
event.Skip()
+ def OnVariablesGridCellLeftClick(self, event):
+ if event.GetCol() == 0:
+ row = event.GetRow()
+ var_name = self.Table.GetValueByName(row, "Name")
+ var_class = self.Table.GetValueByName(row, "Class")
+ var_type = self.Table.GetValueByName(row, "Type")
+ data = wxTextDataObject(str((var_name, var_class, var_type)))
+ dragSource = wxDropSource(self.VariablesGrid)
+ dragSource.SetData(data)
+ dragSource.DoDragDrop()
+ event.Skip()
+
def OnVariablesGridSelectCell(self, event):
wxCallAfter(self.RefreshButtons)
event.Skip()
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def SetValues(self, values):
- for item, value in values.items():
- if item == "returnType" and value and self.ReturnType.IsEnabled():
- self.ReturnType.SetStringSelection(value)
- if item == "data":
- self.Values = value
- self.RefreshValues()
-
def MoveValue(self, value_index, move):
new_index = max(0, min(value_index + move, len(self.Values) - 1))
if new_index != value_index:
@@ -2239,23 +2435,334 @@
self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
else:
self.RefreshValues()
-
+ self.SaveValues()
+
def RefreshValues(self):
if len(self.Table.data) > 0:
- self.VariablesGrid.SetGridCursor(0, 0)
+ self.VariablesGrid.SetGridCursor(0, 1)
data = []
for variable in self.Values:
if variable["Class"] in self.ClassList:
data.append(variable)
self.Table.SetData(data)
self.Table.ResetView(self.VariablesGrid)
-
- def GetValues(self):
- values = {}
- if self.ReturnType.IsEnabled():
- values["returnType"] = self.ReturnType.GetStringSelection()
- values["data"] = self.Values
- return values
+
+ def SaveValues(self):
+ if self.ElementType == "config":
+ self.Controler.SetConfigurationGlobalVars(self.ConfigName, self.Values)
+ elif self.ElementType == "resource":
+ self.Controler.SetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName, self.Values)
+ else:
+ if self.ReturnType.IsEnabled():
+ self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
+ self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
+
+##[wxID_EDITVARIABLEDIALOG, wxID_EDITVARIABLEDIALOGMAINPANEL,
+## wxID_EDITVARIABLEDIALOGVARIABLESGRID, wxID_EDITVARIABLEDIALOGRETURNTYPE,
+## wxID_EDITVARIABLEDIALOGCLASSFILTER, wxID_EDITVARIABLEDIALOGADDBUTTON,
+## wxID_EDITVARIABLEDIALOGDELETEBUTTON, wxID_EDITVARIABLEDIALOGUPBUTTON,
+## wxID_EDITVARIABLEDIALOGDOWNBUTTON, wxID_EDITVARIABLEDIALOGSTATICTEXT1,
+## wxID_EDITVARIABLEDIALOGSTATICTEXT2, wxID_EDITVARIABLEDIALOGSTATICTEXT3,
+##] = [wx.NewId() for _init_ctrls in range(12)]
+##
+##class EditVariableDialog(wx.Dialog):
+## def _init_coll_flexGridSizer1_Items(self, parent):
+## # generated method, don't edit
+##
+## parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
+##
+## def _init_sizers(self):
+## # generated method, don't edit
+## self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+##
+## self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+##
+## self.SetSizer(self.flexGridSizer1)
+##
+## def _init_ctrls(self, prnt, name):
+## # generated method, don't edit
+## wx.Dialog.__init__(self, id=wxID_EDITVARIABLEDIALOG,
+## name='EditVariableDialog', parent=prnt, pos=wx.Point(376, 223),
+## size=wx.Size(600, 440), style=wx.DEFAULT_DIALOG_STYLE,
+## title='Edit variables of %s'%name)
+## self.SetClientSize(wx.Size(600, 440))
+##
+## self.MainPanel = wx.Panel(id=wxID_EDITVARIABLEDIALOGMAINPANEL,
+## name='MainPanel', parent=self, pos=wx.Point(0, 0),
+## size=wx.Size(600, 440), style=wx.TAB_TRAVERSAL)
+## self.MainPanel.SetAutoLayout(True)
+##
+## self.staticText1 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT1,
+## label='Return Type:', name='staticText1', parent=self.MainPanel,
+## pos=wx.Point(24, 29), size=wx.Size(95, 17), style=0)
+##
+## self.ReturnType = wx.Choice(id=wxID_EDITVARIABLEDIALOGRETURNTYPE,
+## name='ReturnType', parent=self.MainPanel, pos=wx.Point(124, 24),
+## size=wx.Size(145, 24), style=0)
+##
+## self.staticText2 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT2,
+## label='Class Filter:', name='staticText2', parent=self.MainPanel,
+## pos=wx.Point(324, 29), size=wx.Size(95, 17), style=0)
+##
+## self.ClassFilter = wx.Choice(id=wxID_EDITVARIABLEDIALOGCLASSFILTER,
+## name='ClassFilter', parent=self.MainPanel, pos=wx.Point(424, 24),
+## size=wx.Size(145, 24), style=0)
+## EVT_CHOICE(self, wxID_EDITVARIABLEDIALOGCLASSFILTER, self.OnClassFilter)
+##
+## self.staticText3 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT3,
+## label='Variables:', name='staticText3', parent=self.MainPanel,
+## pos=wx.Point(24, 60), size=wx.Size(95, 17), style=0)
+##
+## self.VariablesGrid = wx.grid.Grid(id=wxID_EDITVARIABLEDIALOGVARIABLESGRID,
+## name='VariablesGrid', parent=self.MainPanel, pos=wx.Point(24, 80),
+## size=wx.Size(550, 250), style=wxVSCROLL)
+## self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
+## 'Sans'))
+## self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
+## False, 'Sans'))
+## self.VariablesGrid.DisableDragGridSize()
+## self.VariablesGrid.EnableScrolling(False, True)
+## self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
+## self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
+##
+## self.AddButton = wx.Button(id=wxID_EDITVARIABLEDIALOGADDBUTTON, label='Add',
+## name='AddButton', parent=self.MainPanel, pos=wx.Point(345, 340),
+## size=wx.Size(72, 32), style=0)
+## EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGADDBUTTON, self.OnAddButton)
+##
+## self.DeleteButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDELETEBUTTON, label='Delete',
+## name='DeleteButton', parent=self.MainPanel, pos=wx.Point(425, 340),
+## size=wx.Size(72, 32), style=0)
+## EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDELETEBUTTON, self.OnDeleteButton)
+##
+## self.UpButton = wx.Button(id=wxID_EDITVARIABLEDIALOGUPBUTTON, label='^',
+## name='UpButton', parent=self.MainPanel, pos=wx.Point(505, 340),
+## size=wx.Size(32, 32), style=0)
+## EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGUPBUTTON, self.OnUpButton)
+##
+## self.DownButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDOWNBUTTON, label='v',
+## name='DownButton', parent=self.MainPanel, pos=wx.Point(545, 340),
+## size=wx.Size(32, 32), style=0)
+## EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDOWNBUTTON, self.OnDownButton)
+##
+## self._init_sizers()
+##
+## def __init__(self, parent, name, pou_type, pou_is_used, filter = "All"):
+## self._init_ctrls(parent, name)
+## self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
+## self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT)
+## self.Filter = filter
+## self.PouIsUsed = pou_is_used
+## self.FilterChoices = []
+## self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface",
+## " Input" : "Input", " Output" : "Output", " InOut" : "InOut",
+## " External" : "External", "Variables" : "Variables", " Local" : "Local",
+## " Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
+##
+## if pou_type:
+## self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
+## self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
+## else:
+## self.DefaultTypes = {"All" : "Global"}
+## self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
+## if not pou_type or pou_type == "program":
+## self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
+## if pou_type:
+## self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"]
+## else:
+## self.FilterChoices = ["All","Global","Access"]
+## self.ColSizes = [80, 70, 80, 80, 80, 60, 70]
+## self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
+## else:
+## self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
+## self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"]
+## self.ColSizes = [120, 70, 80, 120, 60, 70]
+## self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER]
+## for choice in self.FilterChoices:
+## self.ClassFilter.Append(choice)
+## reverse_transfer = {}
+## for filter, choice in self.FilterChoiceTransfer.items():
+## reverse_transfer[choice] = filter
+## self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
+## self.RefreshTypeList()
+## self.RefreshButtons()
+##
+## self.OptionList = "Yes,No"
+## self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")])
+##
+## if pou_type == "function":
+## for value, parent in TypeHierarchy_list:
+## if not value.startswith("ANY"):
+## self.ReturnType.Append(value)
+## self.ReturnType.Enable(True)
+## else:
+## self.ReturnType.Enable(False)
+## self.staticText2.Hide()
+## self.ReturnType.Hide()
+##
+## self.VariablesGrid.SetTable(self.Table)
+## self.VariablesGrid.SetRowLabelSize(0)
+##
+## self.Table.ResetView(self.VariablesGrid)
+##
+## self.PouNames = []
+##
+## if self.PouIsUsed:
+## wxCallAfter(self.WarningMessage, name)
+##
+## EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
+##
+## def WarningMessage(self, name):
+## message = wxMessageDialog(self, "\"%s\" is used by one or more POUs. Its interface can't be changed!"%name, "WARNING", wxOK|wxICON_EXCLAMATION)
+## message.ShowModal()
+## message.Destroy()
+##
+## def OnOK(self, event):
+## self.VariablesGrid.SetGridCursor(0, 0)
+## error = []
+## if self.ReturnType.IsEnabled() and self.ReturnType.GetStringSelection() == "":
+## error.append("Return Type")
+## if len(error) > 0:
+## text = ""
+## for i, item in enumerate(error):
+## if i == 0:
+## text += item
+## elif i == len(error) - 1:
+## text += " and %s"%item
+## else:
+## text += ", %s"%item
+## message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR)
+## message.ShowModal()
+## message.Destroy()
+## else:
+## self.EndModal(wxID_OK)
+##
+## def OnClassFilter(self, event):
+## self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
+## self.RefreshTypeList()
+## self.RefreshValues()
+## self.RefreshButtons()
+## event.Skip()
+##
+## def RefreshTypeList(self):
+## if self.Filter == "All":
+## self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
+## elif self.Filter == "Interface":
+## self.ClassList = ["Input","Output","InOut","External"]
+## elif self.Filter == "Variables":
+## self.ClassList = ["Local","Temp"]
+## else:
+## self.ClassList = [self.Filter]
+##
+## def RefreshButtons(self):
+## table_length = len(self.Table.data)
+## row_class = None
+## if table_length and self.PouIsUsed:
+## row = self.VariablesGrid.GetGridCursorRow()
+## row_class = self.Table.GetValueByName(row, "Class")
+## self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
+## self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"])
+## self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
+## self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
+##
+## def OnAddButton(self, event):
+## new_row = self.DefaultValue.copy()
+## if self.Filter in self.DefaultTypes:
+## new_row["Class"] = self.DefaultTypes[self.Filter]
+## else:
+## new_row["Class"] = self.Filter
+## self.Values.append(new_row)
+## self.RefreshValues()
+## self.RefreshButtons()
+## event.Skip()
+##
+## def OnDeleteButton(self, event):
+## row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
+## self.Values.remove(row)
+## self.RefreshValues()
+## self.RefreshButtons()
+## event.Skip()
+##
+## def OnUpButton(self, event):
+## self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
+## self.RefreshButtons()
+## event.Skip()
+##
+## def OnDownButton(self, event):
+## self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
+## self.RefreshButtons()
+## event.Skip()
+##
+## def OnVariablesGridCellChange(self, event):
+## row, col = event.GetRow(), event.GetCol()
+## colname = self.Table.GetColLabelValue(col)
+## value = self.Table.GetValue(row, col)
+## if colname == "Name":
+## if not TestIdentifier(value):
+## message = wxMessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wxOK|wxICON_ERROR)
+## message.ShowModal()
+## message.Destroy()
+## event.Veto()
+## elif value.upper() in IEC_KEYWORDS:
+## message = wxMessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wxOK|wxICON_ERROR)
+## message.ShowModal()
+## message.Destroy()
+## event.Veto()
+## elif value.upper() in self.PouNames:
+## message = wxMessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wxOK|wxICON_ERROR)
+## message.ShowModal()
+## message.Destroy()
+## event.Veto()
+## elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
+## message = wxMessageDialog(self, "A variable with \"%s\" as name exists in this pou!"%value, "Error", wxOK|wxICON_ERROR)
+## message.ShowModal()
+## message.Destroy()
+## event.Veto()
+## else:
+## event.Skip()
+## else:
+## event.Skip()
+##
+## def OnVariablesGridSelectCell(self, event):
+## wxCallAfter(self.RefreshButtons)
+## event.Skip()
+##
+## def SetPouNames(self, pou_names):
+## self.PouNames = [pou_name.upper() for pou_name in pou_names]
+##
+## def SetValues(self, values):
+## for item, value in values.items():
+## if item == "returnType" and value and self.ReturnType.IsEnabled():
+## self.ReturnType.SetStringSelection(value)
+## if item == "data":
+## self.Values = value
+## self.RefreshValues()
+##
+## def MoveValue(self, value_index, move):
+## new_index = max(0, min(value_index + move, len(self.Values) - 1))
+## if new_index != value_index:
+## self.Values.insert(new_index, self.Values.pop(value_index))
+## self.RefreshValues()
+## self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
+## else:
+## self.RefreshValues()
+##
+## def RefreshValues(self):
+## if len(self.Table.data) > 0:
+## self.VariablesGrid.SetGridCursor(0, 0)
+## data = []
+## for variable in self.Values:
+## if variable["Class"] in self.ClassList:
+## data.append(variable)
+## self.Table.SetData(data)
+## self.Table.ResetView(self.VariablesGrid)
+##
+## def GetValues(self):
+## values = {}
+## if self.ReturnType.IsEnabled():
+## values["returnType"] = self.ReturnType.GetStringSelection()
+## values["data"] = self.Values
+## return values
#-------------------------------------------------------------------------------
# Exception Handler
diff -r 4379e98a30aa -r 2b2f8d88e6d3 TextViewer.py
--- a/TextViewer.py Thu Jul 19 15:04:41 2007 +0200
+++ b/TextViewer.py Fri Jul 20 18:28:03 2007 +0200
@@ -118,8 +118,18 @@
EVT_KEY_DOWN(self, self.OnKeyDown)
EVT_STC_STYLENEEDED(self, wxID_TEXTVIEWER, self.OnStyleNeeded)
+ EVT_STC_DO_DROP(self, wxID_TEXTVIEWER, self.OnDoDrop)
EVT_KILL_FOCUS(self, self.OnKillFocus)
+ def OnDoDrop(self, event):
+ values = eval(event.GetDragText())
+ if isinstance(values, tuple):
+ if values[1] in ["functionBlock", "program"]:
+ event.SetDragText("")
+ else:
+ event.SetDragText(values[0])
+ event.Skip()
+
def SetTextSyntax(self, syntax):
self.TextSyntax = syntax
diff -r 4379e98a30aa -r 2b2f8d88e6d3 Viewer.py
--- a/Viewer.py Thu Jul 19 15:04:41 2007 +0200
+++ b/Viewer.py Fri Jul 20 18:28:03 2007 +0200
@@ -46,6 +46,44 @@
] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(9)]
+class ViewerDropTarget(wx.TextDropTarget):
+
+ def __init__(self, parent):
+ wx.TextDropTarget.__init__(self)
+ self.Parent = parent
+
+ def OnDropText(self, x, y, data):
+ values = eval(data)
+ if values[1] in ["function", "functionBlock", "program"]:
+ id = self.Parent.GetNewId()
+ block = FBD_Block(self.Parent, values[0], "", id)
+ block.SetPosition(x, y)
+ width, height = block.GetMinSize()
+ block.SetSize(width, height)
+ self.Parent.AddBlock(block)
+ self.Parent.Controler.AddCurrentElementEditingBlock(id)
+ self.Parent.RefreshBlockModel(block)
+ self.Parent.RefreshScrollBars()
+ self.Parent.Refresh()
+ else:
+ id = self.Parent.GetNewId()
+ if values[1] == "Output":
+ var_type = OUTPUT
+ elif values[1] == "InOut":
+ var_type = INPUT
+ else:
+ var_type = INPUT
+ variable = FBD_Variable(self.Parent, var_type, values[0], values[2], id)
+ variable.SetPosition(x, y)
+ width, height = variable.GetMinSize()
+ variable.SetSize(width, height)
+ self.Parent.AddBlock(variable)
+ self.Parent.Controler.AddCurrentElementEditingVariable(id, var_type)
+ self.Parent.RefreshVariableModel(variable)
+ self.Parent.RefreshScrollBars()
+ self.Parent.Refresh()
+
+
"""
Class that implements a Viewer based on a wxScrolledWindow for drawing and
manipulating graphic elements
@@ -126,6 +164,8 @@
self.Parent = window
self.Controler = controler
+ self.SetDropTarget(ViewerDropTarget(self))
+
# Link Viewer event to corresponding methods
EVT_PAINT(self, self.OnPaint)
EVT_LEFT_DOWN(self, self.OnViewerLeftDown)
@@ -208,6 +248,12 @@
self.Comments = {}
self.SelectedElement = None
+ # Remove all elements
+ def CleanView(self):
+ for block in self.Blocks.keys():
+ block.Clean()
+ self.ResetView()
+
# Changes Viewer mode
def SetMode(self, mode):
if self.Mode != mode or mode == MODE_SELECTION:
diff -r 4379e98a30aa -r 2b2f8d88e6d3 __init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/__init__.py Fri Jul 20 18:28:03 2007 +0200
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#Lesser General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Package initialisation
+
diff -r 4379e98a30aa -r 2b2f8d88e6d3 examples/example.xml
--- a/examples/example.xml Thu Jul 19 15:04:41 2007 +0200
+++ b/examples/example.xml Fri Jul 20 18:28:03 2007 +0200
@@ -354,7 +354,7 @@
-
+
diff -r 4379e98a30aa -r 2b2f8d88e6d3 plcopen/plcopen.py
--- a/plcopen/plcopen.py Thu Jul 19 15:04:41 2007 +0200
+++ b/plcopen/plcopen.py Fri Jul 20 18:28:03 2007 +0200
@@ -45,7 +45,11 @@
PLCOpenClasses = {}
PLCOpenTypes = {}
-GenerateClassesFromXSD(os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"))
+base_folder = ""
+for path in sys.path:
+ if os.path.isfile(os.path.join(path, "plcopen/TC6_XML_V10_B.xsd")):
+ base_folder = path
+GenerateClassesFromXSD(os.path.join(base_folder, "plcopen/TC6_XML_V10_B.xsd"))
CreateClasses(PLCOpenClasses, PLCOpenTypes)
if "dataType" in PLCOpenClasses:
diff -r 4379e98a30aa -r 2b2f8d88e6d3 plcopen/structures.py
--- a/plcopen/structures.py Thu Jul 19 15:04:41 2007 +0200
+++ b/plcopen/structures.py Fri Jul 20 18:28:03 2007 +0200
@@ -263,13 +263,13 @@
# Keywords for Instruction List
-IL_KEYWORDS = ["LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
+IL_KEYWORDS = ["TRUE", "FALSE", "LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
"XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
"LE", "LT", "JMP", "JMPC", "JMPNC", "CAL", "CALC", "CALNC", "RET", "RETC", "RETNC"]
# Keywords for Instruction List and Structured Text
-ST_KEYWORDS = ["IF", "THEN", "ELSIF", "ELSE", "END_IF", "CASE", "OF", "END_CASE",
+ST_KEYWORDS = ["TRUE", "FALSE", "IF", "THEN", "ELSIF", "ELSE", "END_IF", "CASE", "OF", "END_CASE",
"FOR", "TO", "BY", "DO", "END_FOR", "WHILE", "DO", "END_WHILE", "REPEAT", "UNTIL",
"END_REPEAT", "EXIT", "RETURN", "NOT", "MOD", "AND", "XOR", "OR"]