32 from SFCViewer import * |
32 from SFCViewer import * |
33 from LDViewer import * |
33 from LDViewer import * |
34 from Viewer import * |
34 from Viewer import * |
35 from TextViewer import * |
35 from TextViewer import * |
36 from RessourceEditor import * |
36 from RessourceEditor import * |
|
37 from DataTypeEditor import * |
37 from PLCControler import * |
38 from PLCControler import * |
38 from plcopen import OpenPDFDoc |
39 from plcopen import OpenPDFDoc |
39 from plcopen.structures import LOCATIONDATATYPES |
40 from plcopen.structures import LOCATIONDATATYPES |
40 |
41 |
41 import os, re, platform, sys, time, traceback, getopt |
42 import os, re, platform, sys, time, traceback, getopt |
42 |
43 |
43 __version__ = "$Revision$" |
44 __version__ = "$Revision$" |
44 |
45 |
45 CWD = os.path.split(__file__)[0] |
46 CWD = os.path.split(os.path.realpath(__file__))[0] |
46 |
47 |
47 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, |
48 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, |
48 ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, |
49 ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, |
49 ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, |
50 ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, |
50 ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, |
51 ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, |
69 |
70 |
70 [ID_PLCOPENEDITORCONFIGMENUITEMS0, ID_PLCOPENEDITORCONFIGMENUITEMS1, |
71 [ID_PLCOPENEDITORCONFIGMENUITEMS0, ID_PLCOPENEDITORCONFIGMENUITEMS1, |
71 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(2)] |
72 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(2)] |
72 |
73 |
73 [ID_PLCOPENEDITOREDITMENUITEMS0, ID_PLCOPENEDITOREDITMENUITEMS1, |
74 [ID_PLCOPENEDITOREDITMENUITEMS0, ID_PLCOPENEDITOREDITMENUITEMS1, |
74 ID_PLCOPENEDITOREDITMENUITEMS11, ID_PLCOPENEDITOREDITMENUITEMS12, |
|
75 ID_PLCOPENEDITOREDITMENUITEMS2, ID_PLCOPENEDITOREDITMENUITEMS4, |
75 ID_PLCOPENEDITOREDITMENUITEMS2, ID_PLCOPENEDITOREDITMENUITEMS4, |
76 ID_PLCOPENEDITOREDITMENUITEMS5, ID_PLCOPENEDITOREDITMENUITEMS6, |
76 ID_PLCOPENEDITOREDITMENUITEMS5, ID_PLCOPENEDITOREDITMENUITEMS6, |
77 ID_PLCOPENEDITOREDITMENUITEMS8, ID_PLCOPENEDITOREDITMENUITEMS9, |
77 ID_PLCOPENEDITOREDITMENUITEMS8, ID_PLCOPENEDITOREDITMENUITEMS9, |
78 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)] |
78 ID_PLCOPENEDITOREDITMENUITEMS11, ID_PLCOPENEDITOREDITMENUITEMS12, |
|
79 ID_PLCOPENEDITOREDITMENUITEMS14, ID_PLCOPENEDITOREDITMENUITEMS15, |
|
80 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(12)] |
79 |
81 |
80 [ID_PLCOPENEDITORSFCMENUITEMS0, ID_PLCOPENEDITORSFCMENUITEMS1, |
82 [ID_PLCOPENEDITORSFCMENUITEMS0, ID_PLCOPENEDITORSFCMENUITEMS1, |
81 ID_PLCOPENEDITORSFCMENUITEMS2, ID_PLCOPENEDITORSFCMENUITEMS3, |
83 ID_PLCOPENEDITORSFCMENUITEMS2, ID_PLCOPENEDITORSFCMENUITEMS3, |
82 ] = [wx.NewId() for _init_coll_SFCMenu_Items in range(4)] |
84 ] = [wx.NewId() for _init_coll_SFCMenu_Items in range(4)] |
83 |
85 |
169 kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C') |
171 kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C') |
170 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS6, |
172 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS6, |
171 kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V') |
173 kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V') |
172 parent.AppendSeparator() |
174 parent.AppendSeparator() |
173 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS8, |
175 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS8, |
|
176 kind=wx.ITEM_NORMAL, text=u'Add Data Type') |
|
177 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9, |
|
178 kind=wx.ITEM_NORMAL, text=u'Remove Data Type') |
|
179 parent.AppendSeparator() |
|
180 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11, |
174 kind=wx.ITEM_NORMAL, text=u'Add POU') |
181 kind=wx.ITEM_NORMAL, text=u'Add POU') |
175 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9, |
182 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12, |
176 kind=wx.ITEM_NORMAL, text=u'Remove POU') |
183 kind=wx.ITEM_NORMAL, text=u'Remove POU') |
177 parent.AppendSeparator() |
184 parent.AppendSeparator() |
178 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11, |
185 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS14, |
179 kind=wx.ITEM_NORMAL, text=u'Add Configuration') |
186 kind=wx.ITEM_NORMAL, text=u'Add Configuration') |
180 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12, |
187 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS15, |
181 kind=wx.ITEM_NORMAL, text=u'Remove Configuration') |
188 kind=wx.ITEM_NORMAL, text=u'Remove Configuration') |
182 self.Bind(wx.EVT_MENU, self.OnRefreshMenu, |
189 self.Bind(wx.EVT_MENU, self.OnRefreshMenu, |
183 id=ID_PLCOPENEDITOREDITMENUITEMS0) |
190 id=ID_PLCOPENEDITOREDITMENUITEMS0) |
184 self.Bind(wx.EVT_MENU, self.OnUndoMenu, |
191 self.Bind(wx.EVT_MENU, self.OnUndoMenu, |
185 id=ID_PLCOPENEDITOREDITMENUITEMS1) |
192 id=ID_PLCOPENEDITOREDITMENUITEMS1) |
189 id=ID_PLCOPENEDITOREDITMENUITEMS4) |
196 id=ID_PLCOPENEDITOREDITMENUITEMS4) |
190 self.Bind(wx.EVT_MENU, self.OnCopyMenu, |
197 self.Bind(wx.EVT_MENU, self.OnCopyMenu, |
191 id=ID_PLCOPENEDITOREDITMENUITEMS5) |
198 id=ID_PLCOPENEDITOREDITMENUITEMS5) |
192 self.Bind(wx.EVT_MENU, self.OnPasteMenu, |
199 self.Bind(wx.EVT_MENU, self.OnPasteMenu, |
193 id=ID_PLCOPENEDITOREDITMENUITEMS6) |
200 id=ID_PLCOPENEDITOREDITMENUITEMS6) |
|
201 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, |
|
202 id=ID_PLCOPENEDITOREDITMENUITEMS8) |
|
203 self.Bind(wx.EVT_MENU, self.OnRemoveDataTypeMenu, |
|
204 id=ID_PLCOPENEDITOREDITMENUITEMS9) |
194 self.Bind(wx.EVT_MENU, self.OnAddPouMenu, |
205 self.Bind(wx.EVT_MENU, self.OnAddPouMenu, |
195 id=ID_PLCOPENEDITOREDITMENUITEMS8) |
206 id=ID_PLCOPENEDITOREDITMENUITEMS11) |
196 self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, |
207 self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, |
197 id=ID_PLCOPENEDITOREDITMENUITEMS9) |
208 id=ID_PLCOPENEDITOREDITMENUITEMS12) |
198 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, |
209 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, |
199 id=ID_PLCOPENEDITOREDITMENUITEMS11) |
210 id=ID_PLCOPENEDITOREDITMENUITEMS14) |
200 self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu, |
211 self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu, |
201 id=ID_PLCOPENEDITOREDITMENUITEMS12) |
212 id=ID_PLCOPENEDITOREDITMENUITEMS15) |
202 |
213 |
203 def _init_coll_menuBar1_Menus(self, parent): |
214 def _init_coll_menuBar1_Menus(self, parent): |
204 if self.ModeSolo: |
215 if self.ModeSolo: |
205 parent.Append(menu=self.FileMenu, title=u'File') |
216 parent.Append(menu=self.FileMenu, title=u'File') |
206 parent.Append(menu=self.EditMenu, title=u'Edit') |
217 parent.Append(menu=self.EditMenu, title=u'Edit') |
414 self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200) |
425 self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200) |
415 else: |
426 else: |
416 self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler) |
427 self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler) |
417 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False)) |
428 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False)) |
418 |
429 |
419 self.AUIManager.Update(); |
430 self.AUIManager.Update() |
420 |
431 |
421 def __init__(self, parent, controler = None, fileOpen = None): |
432 def __init__(self, parent, controler = None, fileOpen = None): |
422 self.ModeSolo = controler == None |
433 self.ModeSolo = controler == None |
423 if self.ModeSolo: |
434 if self.ModeSolo: |
424 self.Controler = PLCControler() |
435 self.Controler = PLCControler() |
592 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True) |
603 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True) |
593 else: |
604 else: |
594 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) |
605 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) |
595 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True) |
606 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True) |
596 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True) |
607 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True) |
|
608 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, True) |
|
609 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, True) |
|
610 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, True) |
|
611 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, True) |
597 else: |
612 else: |
598 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) |
613 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) |
599 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False) |
614 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False) |
600 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False) |
615 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False) |
|
616 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, False) |
|
617 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, False) |
|
618 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, False) |
|
619 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, False) |
601 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True) |
620 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True) |
602 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True) |
621 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True) |
603 if self.CopyBuffer is not None: |
622 if self.CopyBuffer is not None: |
604 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True) |
623 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True) |
605 else: |
624 else: |
1016 item = event.GetItem() |
1035 item = event.GetItem() |
1017 old_name = self.ProjectTree.GetItemText(item) |
1036 old_name = self.ProjectTree.GetItemText(item) |
1018 itemtype = self.ProjectTree.GetPyData(item) |
1037 itemtype = self.ProjectTree.GetPyData(item) |
1019 if itemtype == ITEM_PROJECT: |
1038 if itemtype == ITEM_PROJECT: |
1020 self.Controler.SetProjectProperties(name = new_name) |
1039 self.Controler.SetProjectProperties(name = new_name) |
|
1040 elif itemtype == ITEM_DATATYPE: |
|
1041 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]: |
|
1042 message = "\"%s\" data type already exists!"%new_name |
|
1043 abort = True |
|
1044 if not abort: |
|
1045 self.Controler.ChangeDataTypeName(old_name, new_name) |
|
1046 self.RefreshEditorNames(itemtype, old_name, new_name) |
|
1047 self.RefreshPageTitles() |
1021 elif itemtype == ITEM_POU: |
1048 elif itemtype == ITEM_POU: |
1022 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]: |
1049 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]: |
1023 message = "\"%s\" pou already exists!"%new_name |
1050 message = "\"%s\" pou already exists!"%new_name |
1024 abort = True |
1051 abort = True |
1025 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]: |
1052 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]: |
1133 self.ProjectTree.Expand(selected) |
1160 self.ProjectTree.Expand(selected) |
1134 name = self.ProjectTree.GetItemText(selected) |
1161 name = self.ProjectTree.GetItemText(selected) |
1135 data = self.ProjectTree.GetPyData(selected) |
1162 data = self.ProjectTree.GetPyData(selected) |
1136 if name == "Properties": |
1163 if name == "Properties": |
1137 self.ShowProperties() |
1164 self.ShowProperties() |
1138 if data == ITEM_POU: |
1165 if data == ITEM_DATATYPE: |
|
1166 self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name)) |
|
1167 elif data == ITEM_POU: |
1139 self.EditProjectElement(data, self.Controler.ComputePouName(name)) |
1168 self.EditProjectElement(data, self.Controler.ComputePouName(name)) |
1140 elif data == ITEM_CONFIGURATION: |
1169 elif data == ITEM_CONFIGURATION: |
1141 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name)) |
1170 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name)) |
1142 elif data == ITEM_RESOURCE: |
1171 elif data == ITEM_RESOURCE: |
1143 item = self.ProjectTree.GetItemParent(selected) |
1172 item = self.ProjectTree.GetItemParent(selected) |
1160 tagname = self.Controler.ComputePouActionName(pou_name, name) |
1189 tagname = self.Controler.ComputePouActionName(pou_name, name) |
1161 self.EditProjectElement(data, tagname) |
1190 self.EditProjectElement(data, tagname) |
1162 |
1191 |
1163 def OnProjectTreeLeftUp(self, event): |
1192 def OnProjectTreeLeftUp(self, event): |
1164 if self.SelectedItem is not None: |
1193 if self.SelectedItem is not None: |
1165 print "LeftUp", self.ProjectTree.GetItemText(self.SelectedItem) |
|
1166 self.ProjectTree.SelectItem(self.SelectedItem) |
1194 self.ProjectTree.SelectItem(self.SelectedItem) |
1167 name = self.ProjectTree.GetItemText(self.SelectedItem) |
1195 name = self.ProjectTree.GetItemText(self.SelectedItem) |
1168 data = self.ProjectTree.GetPyData(self.SelectedItem) |
1196 data = self.ProjectTree.GetPyData(self.SelectedItem) |
1169 if data == ITEM_POU: |
1197 if data == ITEM_DATATYPE: |
|
1198 self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True) |
|
1199 elif data == ITEM_POU: |
1170 self.EditProjectElement(data, self.Controler.ComputePouName(name), True) |
1200 self.EditProjectElement(data, self.Controler.ComputePouName(name), True) |
1171 elif data == ITEM_CONFIGURATION: |
1201 elif data == ITEM_CONFIGURATION: |
1172 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True) |
1202 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True) |
1173 elif data == ITEM_RESOURCE: |
1203 elif data == ITEM_RESOURCE: |
1174 item = self.ProjectTree.GetItemParent(self.SelectedItem) |
1204 item = self.ProjectTree.GetItemParent(self.SelectedItem) |
1189 tagname = self.Controler.ComputePouTransitionName(pou_name, name) |
1219 tagname = self.Controler.ComputePouTransitionName(pou_name, name) |
1190 elif data == ITEM_ACTION: |
1220 elif data == ITEM_ACTION: |
1191 tagname = self.Controler.ComputePouActionName(pou_name, name) |
1221 tagname = self.Controler.ComputePouActionName(pou_name, name) |
1192 self.EditProjectElement(data, tagname, True) |
1222 self.EditProjectElement(data, tagname, True) |
1193 wx.CallAfter(self.ResetSelectedItem) |
1223 wx.CallAfter(self.ResetSelectedItem) |
1194 else: |
|
1195 print "LeftUp", None |
|
1196 event.Skip() |
1224 event.Skip() |
1197 |
1225 |
1198 def OnProjectTreeItemChanging(self, event): |
1226 def OnProjectTreeItemChanging(self, event): |
1199 if self.SelectedItem is not None: |
|
1200 print "Changing", self.ProjectTree.GetItemText(event.GetItem()), self.ProjectTree.GetItemText(self.SelectedItem) |
|
1201 else: |
|
1202 print "Changing", None, self.ProjectTree.GetItemText(event.GetItem()) |
|
1203 if self.ProjectTree.GetPyData(event.GetItem()) != ITEM_UNEDITABLE and self.SelectedItem is None: |
1227 if self.ProjectTree.GetPyData(event.GetItem()) != ITEM_UNEDITABLE and self.SelectedItem is None: |
1204 self.SelectedItem = event.GetItem() |
1228 self.SelectedItem = event.GetItem() |
1205 event.Veto() |
1229 event.Veto() |
1206 else: |
1230 else: |
1207 event.Skip() |
1231 event.Skip() |
1228 self.RefreshToolBar() |
1252 self.RefreshToolBar() |
1229 elif not onlyopened: |
1253 elif not onlyopened: |
1230 if wx.VERSION >= (2, 8, 0): |
1254 if wx.VERSION >= (2, 8, 0): |
1231 if elementtype == ITEM_CONFIGURATION: |
1255 if elementtype == ITEM_CONFIGURATION: |
1232 new_window = MDIConfigurationEditor(self, tagname, self, self.Controler) |
1256 new_window = MDIConfigurationEditor(self, tagname, self, self.Controler) |
1233 self.VariablePanelIndexer.AddVariablePanel(tagname, "config") |
|
1234 elif elementtype == ITEM_RESOURCE: |
1257 elif elementtype == ITEM_RESOURCE: |
1235 new_window = MDIResourceEditor(self, tagname, self, self.Controler) |
1258 new_window = MDIResourceEditor(self, tagname, self, self.Controler) |
1236 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource") |
|
1237 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: |
1259 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: |
1238 bodytype = self.Controler.GetEditedElementBodyType(tagname) |
1260 bodytype = self.Controler.GetEditedElementBodyType(tagname) |
1239 if bodytype == "FBD": |
1261 if bodytype == "FBD": |
1240 new_window = MDIViewer(self, tagname, self, self.Controler) |
1262 new_window = MDIViewer(self, tagname, self, self.Controler) |
1241 elif bodytype == "LD": |
1263 elif bodytype == "LD": |
1248 viewer.SetTextSyntax(elementtype) |
1270 viewer.SetTextSyntax(elementtype) |
1249 if bodytype == "IL": |
1271 if bodytype == "IL": |
1250 viewer.SetKeywords(IL_KEYWORDS) |
1272 viewer.SetKeywords(IL_KEYWORDS) |
1251 else: |
1273 else: |
1252 viewer.SetKeywords(ST_KEYWORDS) |
1274 viewer.SetKeywords(ST_KEYWORDS) |
|
1275 elif elementtype == ITEM_DATATYPE: |
|
1276 new_window = MDIDataTypeEditor(self, tagname, self, self.Controler) |
1253 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged) |
1277 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged) |
1254 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose) |
1278 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose) |
|
1279 new_window.Layout() |
1255 else: |
1280 else: |
1256 if elementtype == ITEM_CONFIGURATION: |
1281 if elementtype == ITEM_CONFIGURATION: |
1257 new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler) |
1282 new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler) |
1258 self.TabsOpened.AddPage(new_window, "") |
1283 self.TabsOpened.AddPage(new_window, "") |
1259 self.VariablePanelIndexer.AddVariablePanel(tagname, "config") |
|
1260 elif elementtype == ITEM_RESOURCE: |
1284 elif elementtype == ITEM_RESOURCE: |
1261 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler) |
1285 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler) |
1262 self.TabsOpened.AddPage(new_window, "") |
1286 self.TabsOpened.AddPage(new_window, "") |
1263 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource") |
|
1264 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: |
1287 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: |
1265 bodytype = self.Controler.GetEditedElementBodyType(tagname) |
1288 bodytype = self.Controler.GetEditedElementBodyType(tagname) |
1266 if bodytype == "FBD": |
1289 if bodytype == "FBD": |
1267 new_window = Viewer(self.TabsOpened, tagname, self, self.Controler) |
1290 new_window = Viewer(self.TabsOpened, tagname, self, self.Controler) |
1268 elif bodytype == "LD": |
1291 elif bodytype == "LD": |
1275 if bodytype == "IL": |
1298 if bodytype == "IL": |
1276 new_window.SetKeywords(IL_KEYWORDS) |
1299 new_window.SetKeywords(IL_KEYWORDS) |
1277 else: |
1300 else: |
1278 new_window.SetKeywords(ST_KEYWORDS) |
1301 new_window.SetKeywords(ST_KEYWORDS) |
1279 self.TabsOpened.AddPage(new_window, "") |
1302 self.TabsOpened.AddPage(new_window, "") |
1280 if elementtype == ITEM_POU: |
1303 elif elementtype == ITEM_DATATYPE: |
|
1304 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler) |
|
1305 self.TabsOpened.AddPage(new_window, "") |
|
1306 if elementtype == ITEM_CONFIGURATION: |
|
1307 self.VariablePanelIndexer.AddVariablePanel(tagname, "config") |
|
1308 elif elementtype == ITEM_RESOURCE: |
|
1309 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource") |
|
1310 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: |
1281 words = tagname.split("::") |
1311 words = tagname.split("::") |
1282 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1])) |
1312 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1])) |
1283 elif elementtype == ITEM_TRANSITION: |
|
1284 self.VariablePanelIndexer.AddVariablePanel(tagname, "transition") |
|
1285 elif elementtype == ITEM_TRANSITION: |
|
1286 self.VariablePanelIndexer.AddVariablePanel(tagname, "action") |
|
1287 self.VariablePanelIndexer.ChangeVariablePanel(tagname) |
1313 self.VariablePanelIndexer.ChangeVariablePanel(tagname) |
1288 openedidx = self.IsOpened(tagname) |
1314 openedidx = self.IsOpened(tagname) |
1289 old_selected = self.GetPageSelection() |
1315 old_selected = self.GetPageSelection() |
1290 if old_selected != openedidx: |
1316 if old_selected != openedidx: |
1291 if old_selected >= 0: |
1317 if old_selected >= 0: |
1453 if selected != -1: |
1479 if selected != -1: |
1454 try: |
1480 try: |
1455 self.GetPage(selected).Paste() |
1481 self.GetPage(selected).Paste() |
1456 except: |
1482 except: |
1457 pass |
1483 pass |
|
1484 event.Skip() |
|
1485 |
|
1486 def OnAddDataTypeMenu(self, event): |
|
1487 dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL) |
|
1488 dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames()) |
|
1489 if dialog.ShowModal() == wx.ID_OK: |
|
1490 self.Controler.ProjectAddDataType(dialog.GetValue()) |
|
1491 self.RefreshTitle() |
|
1492 self.RefreshEditMenu() |
|
1493 self.RefreshProjectTree() |
|
1494 dialog.Destroy() |
|
1495 event.Skip() |
|
1496 |
|
1497 def OnRemoveDataTypeMenu(self, event): |
|
1498 datatypes = self.Controler.GetProjectDataTypeNames() |
|
1499 dialog = wx.SingleChoiceDialog(self, "Select Data Type to remove:", "Data Type Remove", datatypes, wx.OK|wx.CANCEL) |
|
1500 if dialog.ShowModal() == wx.ID_OK: |
|
1501 selected = dialog.GetStringSelection() |
|
1502 if not self.Controler.DataTypeIsUsed(selected): |
|
1503 self.Controler.ProjectRemoveDataType(selected) |
|
1504 tagname = self.Controler.ComputeDataTypeName(selected) |
|
1505 idx = self.IsOpened(tagname) |
|
1506 if idx is not None: |
|
1507 self.DeletePage(idx) |
|
1508 self.RefreshTitle() |
|
1509 self.RefreshEditMenu() |
|
1510 self.RefreshProjectTree() |
|
1511 self.RefreshToolBar() |
|
1512 else: |
|
1513 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) |
|
1514 message.ShowModal() |
|
1515 message.Destroy() |
1458 event.Skip() |
1516 event.Skip() |
1459 |
1517 |
1460 def OnAddPouMenu(self, event): |
1518 def OnAddPouMenu(self, event): |
1461 dialog = PouDialog(self) |
1519 dialog = PouDialog(self) |
1462 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
1520 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
1836 if self.ProductRelease.GetValue() != None: |
1894 if self.ProductRelease.GetValue() != None: |
1837 values["productRelease"] = self.ProductRelease.GetValue() |
1895 values["productRelease"] = self.ProductRelease.GetValue() |
1838 if self.ProductRelease.GetValue() != None: |
1896 if self.ProductRelease.GetValue() != None: |
1839 values["contentDescription"] = self.ContentDescription.GetValue() |
1897 values["contentDescription"] = self.ContentDescription.GetValue() |
1840 return values |
1898 return values |
|
1899 |
|
1900 #------------------------------------------------------------------------------- |
|
1901 # Edit Step Name Dialog |
|
1902 #------------------------------------------------------------------------------- |
|
1903 |
|
1904 class DataTypeDialog(wx.TextEntryDialog): |
|
1905 |
|
1906 if wx.VERSION < (2, 6, 0): |
|
1907 def Bind(self, event, function, id = None): |
|
1908 if id is not None: |
|
1909 event(self, id, function) |
|
1910 else: |
|
1911 event(self, function) |
|
1912 |
|
1913 |
|
1914 def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", |
|
1915 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
|
1916 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
|
1917 |
|
1918 self.DataTypeNames = [] |
|
1919 if wx.VERSION >= (2, 8, 0): |
|
1920 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId()) |
|
1921 elif wx.VERSION >= (2, 6, 0): |
|
1922 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId()) |
|
1923 else: |
|
1924 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
|
1925 |
|
1926 def OnOK(self, event): |
|
1927 datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
|
1928 if datatype_name == "": |
|
1929 message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR) |
|
1930 message.ShowModal() |
|
1931 message.Destroy() |
|
1932 elif not TestIdentifier(datatype_name): |
|
1933 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
|
1934 message.ShowModal() |
|
1935 message.Destroy() |
|
1936 elif datatype_name.upper() in IEC_KEYWORDS: |
|
1937 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
|
1938 message.ShowModal() |
|
1939 message.Destroy() |
|
1940 elif datatype_name.upper() in self.DataTypeNames: |
|
1941 message = wx.MessageDialog(self, "\"%s\" data type already exists!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
|
1942 message.ShowModal() |
|
1943 message.Destroy() |
|
1944 else: |
|
1945 self.EndModal(wx.ID_OK) |
|
1946 |
|
1947 def SetDataTypeNames(self, datatype_names): |
|
1948 self.DataTypeNames = [datatype_name.upper() for datatype_name in datatype_names] |
|
1949 |
|
1950 def GetValue(self): |
|
1951 return self.GetSizer().GetItem(1).GetWindow().GetValue() |
1841 |
1952 |
1842 #------------------------------------------------------------------------------- |
1953 #------------------------------------------------------------------------------- |
1843 # Create Pou Dialog |
1954 # Create Pou Dialog |
1844 #------------------------------------------------------------------------------- |
1955 #------------------------------------------------------------------------------- |
1845 |
1956 |
2460 self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname) |
2571 self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname) |
2461 if self.CurrentPanel == old_tagname: |
2572 if self.CurrentPanel == old_tagname: |
2462 self.CurrentPanel = new_tagname |
2573 self.CurrentPanel = new_tagname |
2463 |
2574 |
2464 def ChangeVariablePanel(self, tagname): |
2575 def ChangeVariablePanel(self, tagname): |
2465 if tagname in self.VariablePanelList and tagname != self.CurrentPanel: |
2576 if tagname in self.VariablePanelList: |
|
2577 if tagname != self.CurrentPanel: |
|
2578 if self.CurrentPanel is not None: |
|
2579 self.VariablePanelList[self.CurrentPanel].Hide() |
|
2580 self.CurrentPanel = tagname |
|
2581 self.VariablePanelList[self.CurrentPanel].RefreshView() |
|
2582 self.VariablePanelList[self.CurrentPanel].Show() |
|
2583 self.MainSizer.Layout() |
|
2584 else: |
2466 if self.CurrentPanel is not None: |
2585 if self.CurrentPanel is not None: |
2467 self.VariablePanelList[self.CurrentPanel].Hide() |
2586 self.VariablePanelList[self.CurrentPanel].Hide() |
2468 self.CurrentPanel = tagname |
2587 self.CurrentPanel = None |
2469 self.VariablePanelList[self.CurrentPanel].RefreshView() |
|
2470 self.VariablePanelList[self.CurrentPanel].Show() |
|
2471 self.MainSizer.Layout() |
2588 self.MainSizer.Layout() |
2472 |
2589 |
2473 def RefreshVariablePanel(self, tagname): |
2590 def RefreshVariablePanel(self, tagname): |
2474 if tagname in self.VariablePanelList: |
2591 if tagname in self.VariablePanelList: |
2475 self.VariablePanelList[self.CurrentPanel].RefreshView() |
2592 self.VariablePanelList[self.CurrentPanel].RefreshView() |
2872 reverse_transfer[choice] = filter |
2989 reverse_transfer[choice] = filter |
2873 self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter]) |
2990 self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter]) |
2874 self.RefreshTypeList() |
2991 self.RefreshTypeList() |
2875 |
2992 |
2876 self.OptionList = "Yes,No" |
2993 self.OptionList = "Yes,No" |
2877 self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")] |
|
2878 |
2994 |
2879 if element_type == "function": |
2995 if element_type == "function": |
2880 for value, parent in TypeHierarchy_list: |
2996 for base_type in self.Controler.GetBaseTypes(): |
2881 if not value.startswith("ANY"): |
2997 self.ReturnType.Append(base_type) |
2882 self.ReturnType.Append(value) |
|
2883 self.ReturnType.Enable(True) |
2998 self.ReturnType.Enable(True) |
2884 else: |
2999 else: |
2885 self.ReturnType.Enable(False) |
3000 self.ReturnType.Enable(False) |
2886 self.staticText1.Hide() |
3001 self.staticText1.Hide() |
2887 self.ReturnType.Hide() |
3002 self.ReturnType.Hide() |
3031 def OnVariablesGridEditorShown(self, event): |
3146 def OnVariablesGridEditorShown(self, event): |
3032 row, col = event.GetRow(), event.GetCol() |
3147 row, col = event.GetRow(), event.GetCol() |
3033 if self.Table.GetColLabelValue(col) == "Type": |
3148 if self.Table.GetColLabelValue(col) == "Type": |
3034 type_menu = wx.Menu(title='') |
3149 type_menu = wx.Menu(title='') |
3035 base_menu = wx.Menu(title='') |
3150 base_menu = wx.Menu(title='') |
3036 for base_type in self.TypeList: |
3151 for base_type in self.Controler.GetBaseTypes(): |
3037 new_id = wx.NewId() |
3152 new_id = wx.NewId() |
3038 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type) |
3153 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type) |
3039 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id) |
3154 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id) |
3040 type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu) |
3155 type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu) |
|
3156 datatype_menu = wx.Menu(title='') |
|
3157 for datatype in self.Controler.GetDataTypes(basetypes = False): |
|
3158 new_id = wx.NewId() |
|
3159 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype) |
|
3160 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id) |
|
3161 type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu) |
3041 functionblock_menu = wx.Menu(title='') |
3162 functionblock_menu = wx.Menu(title='') |
3042 for functionblock_type in self.Controler.GetFunctionBlockTypes(): |
3163 for functionblock_type in self.Controler.GetFunctionBlockTypes(): |
3043 new_id = wx.NewId() |
3164 new_id = wx.NewId() |
3044 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
3165 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
3045 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
3166 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
3070 var_class = self.Table.GetValueByName(row, "Class") |
3191 var_class = self.Table.GetValueByName(row, "Class") |
3071 var_type = self.Table.GetValueByName(row, "Type") |
3192 var_type = self.Table.GetValueByName(row, "Type") |
3072 data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName))) |
3193 data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName))) |
3073 dragSource = wx.DropSource(self.VariablesGrid) |
3194 dragSource = wx.DropSource(self.VariablesGrid) |
3074 dragSource.SetData(data) |
3195 dragSource.SetData(data) |
3075 dragSource.DoDragDrop() |
3196 print dragSource.DoDragDrop() |
3076 event.Skip() |
3197 event.Skip() |
3077 |
3198 |
3078 def OnVariablesGridSelectCell(self, event): |
3199 def OnVariablesGridSelectCell(self, event): |
3079 wx.CallAfter(self.RefreshButtons) |
3200 wx.CallAfter(self.RefreshButtons) |
3080 event.Skip() |
3201 event.Skip() |