--- a/BeremizIDE.py Fri Aug 18 12:36:31 2017 +0300
+++ b/BeremizIDE.py Fri Aug 18 20:14:38 2017 +0300
@@ -228,29 +228,29 @@
def _init_coll_FileMenu_Items(self, parent):
AppendMenu(parent, help='', id=wx.ID_NEW,
- kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
+ kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N') AppendMenu(parent, help='', id=wx.ID_OPEN,
- kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
+ kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O') parent.AppendMenu(ID_FILEMENURECENTPROJECTS, _("&Recent Projects"), self.RecentProjectsMenu)
AppendMenu(parent, help='', id=wx.ID_SAVE,
- kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
+ kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S') AppendMenu(parent, help='', id=wx.ID_SAVEAS,
- kind=wx.ITEM_NORMAL, text=_(u'Save as') + '\tCTRL+SHIFT+S')
+ kind=wx.ITEM_NORMAL, text=_(u'Save as') + '\tCTRL+SHIFT+S') AppendMenu(parent, help='', id=wx.ID_CLOSE,
- kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
+ kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W') AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
- kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
+ kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W') AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
- kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P') AppendMenu(parent, help='', id=wx.ID_PREVIEW,
- kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P') AppendMenu(parent, help='', id=wx.ID_PRINT,
- kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P') AppendMenu(parent, help='', id=wx.ID_EXIT,
- kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
+ kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q') self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
@@ -278,7 +278,7 @@
self._RecursiveAddMenuItems(new_menu, children)
AppendMenu(menu, help=help, id=new_id,
- kind=wx.ITEM_NORMAL, text=text)
+ kind=wx.ITEM_NORMAL, text=text) self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name),
@@ -298,7 +298,7 @@
self.Bind(wx.EVT_MENU, handler, id=id)
parent.Append(help='', id=wx.ID_ABOUT,
- kind=wx.ITEM_NORMAL, text=_(u'About'))
+ kind=wx.ITEM_NORMAL, text=_(u'About')) self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
def _init_coll_ConnectionStatusBar_Fields(self, parent):
@@ -375,14 +375,14 @@
#self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogViewer), wx.RIGHT)
StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
- wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+ wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) StatusToolBar.SetToolBitmapSize(wx.Size(25, 25))
self.Panes["StatusToolBar"] = StatusToolBar
self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo().
- Name("StatusToolBar").Caption(_("Status ToolBar")).
- ToolbarPane().Top().Position(1).
- LeftDockable(False).RightDockable(False))
+ Name("StatusToolBar").Caption(_("Status ToolBar")). + ToolbarPane().Top().Position(1). + LeftDockable(False).RightDockable(False)) @@ -485,7 +485,8 @@
# choose an arbitrary random port for runtime
self.runtime_port = int(random.random() * 1000) + 61131
- self.local_runtime = ProcessLogger(self.Log,
+ self.local_runtime = ProcessLogger( "\"%s\" \"%s\" -p %s -i localhost %s %s" % (
Bpath("Beremiz_service.py"),
@@ -735,8 +736,8 @@
for confnode_method in self.CTR.StatusMethods:
if "method" in confnode_method and confnode_method.get("shown", True):
- StatusToolBar.AddSimpleTool(id,
- GetBitmap(confnode_method.get("bitmap", "Unknown")),
+ StatusToolBar.AddSimpleTool( + id, GetBitmap(confnode_method.get("bitmap", "Unknown")), confnode_method["tooltip"])
self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id)
@@ -1033,8 +1034,9 @@
self.ProjectTree.SelectItem(root)
- return self.RecursiveProjectTreeItemSelection(root,
- [(word, ITEM_CONFNODE) for word in tagname.split(".")])
+ return self.RecursiveProjectTreeItemSelection( + [(word, ITEM_CONFNODE) for word in tagname.split(".")]) return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)])
elif not os.path.exists(words[0]):
@@ -1061,7 +1063,8 @@
def DeleteConfNode(self, confnode):
if self.CTR.CheckProjectPathPerm():
- dialog = wx.MessageDialog(self,
+ dialog = wx.MessageDialog( _("Really delete node '%s'?") % confnode.CTNName(),
_("Remove %s node") % confnode.CTNType,
wx.YES_NO | wx.NO_DEFAULT)
@@ -1112,7 +1115,8 @@
- dlg = wx.SingleChoiceDialog(None,
+ dlg = wx.SingleChoiceDialog( An unhandled exception (bug) occured. Bug report saved at :
--- a/IDEFrame.py Fri Aug 18 12:36:31 2017 +0300
+++ b/IDEFrame.py Fri Aug 18 20:14:38 2017 +0300
@@ -356,52 +356,52 @@
def _init_coll_AddMenu_Items(self, parent, add_config=True):
AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
- kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Data Type')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
- kind=wx.ITEM_NORMAL, text=_(u'&Function'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Function')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
- kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
+ kind=wx.ITEM_NORMAL, text=_(u'Function &Block')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
- kind=wx.ITEM_NORMAL, text=_(u'&Program'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Program')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDRESOURCE,
- kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Resource')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
- kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Configuration')) def _init_coll_EditMenu_Items(self, parent):
AppendMenu(parent, help='', id=wx.ID_UNDO,
- kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z')
+ kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z') AppendMenu(parent, help='', id=wx.ID_REDO,
- kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y')
+ kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y') #AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
# kind=wx.ITEM_CHECK, text=_(u'Enable Undo/Redo'))
enable_undo_redo = _(u'Enable Undo/Redo') # Keeping text in translations for possible menu reactivation
AppendMenu(parent, help='', id=wx.ID_CUT,
- kind=wx.ITEM_NORMAL, text=_(u'Cut') + '\tCTRL+X')
+ kind=wx.ITEM_NORMAL, text=_(u'Cut') + '\tCTRL+X') AppendMenu(parent, help='', id=wx.ID_COPY,
- kind=wx.ITEM_NORMAL, text=_(u'Copy') + '\tCTRL+C')
+ kind=wx.ITEM_NORMAL, text=_(u'Copy') + '\tCTRL+C') AppendMenu(parent, help='', id=wx.ID_PASTE,
- kind=wx.ITEM_NORMAL, text=_(u'Paste') + '\tCTRL+V')
+ kind=wx.ITEM_NORMAL, text=_(u'Paste') + '\tCTRL+V') AppendMenu(parent, help='', id=wx.ID_FIND,
- kind=wx.ITEM_NORMAL, text=_(u'Find') + '\tCTRL+F')
+ kind=wx.ITEM_NORMAL, text=_(u'Find') + '\tCTRL+F') AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUFINDNEXT,
- kind=wx.ITEM_NORMAL, text=_(u'Find Next') + '\tCTRL+K')
+ kind=wx.ITEM_NORMAL, text=_(u'Find Next') + '\tCTRL+K') AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
- kind=wx.ITEM_NORMAL, text=_(u'Find Previous') + '\tCTRL+SHIFT+K')
+ kind=wx.ITEM_NORMAL, text=_(u'Find Previous') + '\tCTRL+SHIFT+K') AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
- kind=wx.ITEM_NORMAL, text=_(u'Search in Project') + '\tCTRL+SHIFT+F')
+ kind=wx.ITEM_NORMAL, text=_(u'Search in Project') + '\tCTRL+SHIFT+F') add_menu = wx.Menu(title='')
self._init_coll_AddMenu_Items(add_menu)
parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), add_menu)
AppendMenu(parent, help='', id=wx.ID_SELECTALL,
- kind=wx.ITEM_NORMAL, text=_(u'Select All') + '\tCTRL+A')
+ kind=wx.ITEM_NORMAL, text=_(u'Select All') + '\tCTRL+A') AppendMenu(parent, help='', id=wx.ID_DELETE,
- kind=wx.ITEM_NORMAL, text=_(u'&Delete'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Delete')) self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
#self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
@@ -410,25 +410,25 @@
self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
self.Bind(wx.EVT_MENU, self.OnFindMenu, id=wx.ID_FIND)
self.Bind(wx.EVT_MENU, self.OnFindNextMenu,
- id=ID_PLCOPENEDITOREDITMENUFINDNEXT)
+ id=ID_PLCOPENEDITOREDITMENUFINDNEXT) self.Bind(wx.EVT_MENU, self.OnFindPreviousMenu,
- id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS)
+ id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS) self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
- id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
+ id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT) self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
- id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
+ id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT) self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
- id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
+ id=ID_PLCOPENEDITOREDITMENUADDDATATYPE) self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
- id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
+ id=ID_PLCOPENEDITOREDITMENUADDFUNCTION) self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
- id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
+ id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK) self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
- id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
+ id=ID_PLCOPENEDITOREDITMENUADDPROGRAM) self.Bind(wx.EVT_MENU, self.AddResourceMenu,
- id=ID_PLCOPENEDITOREDITMENUADDRESOURCE)
+ id=ID_PLCOPENEDITOREDITMENUADDRESOURCE) self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
- id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
+ id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION) self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
@@ -443,17 +443,17 @@
def _init_coll_DisplayMenu_Items(self, parent):
AppendMenu(parent, help='', id=wx.ID_REFRESH,
- kind=wx.ITEM_NORMAL, text=_(u'Refresh') + '\tCTRL+R')
+ kind=wx.ITEM_NORMAL, text=_(u'Refresh') + '\tCTRL+R') AppendMenu(parent, help='', id=wx.ID_CLEAR,
- kind=wx.ITEM_NORMAL, text=_(u'Clear Errors') + '\tCTRL+K')
+ kind=wx.ITEM_NORMAL, text=_(u'Clear Errors') + '\tCTRL+K') zoommenu = wx.Menu(title='')
parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
for idx, value in enumerate(ZOOM_FACTORS):
AppendMenu(zoommenu, help='', id=new_id,
- kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
+ kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%") self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
@@ -462,7 +462,7 @@
self.Bind(wx.EVT_MENU, self.SwitchFullScrMode, id=ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE)
AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
- kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
+ kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective')) self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
@@ -494,8 +494,8 @@
def _init_ctrls(self, prnt):
wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
- parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
- style=wx.DEFAULT_FRAME_STYLE)
+ parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), + style=wx.DEFAULT_FRAME_STYLE) self.SetClientSize(wx.Size(1000, 600))
self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
@@ -511,48 +511,62 @@
self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
- self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
- style=wx.aui.AUI_NB_TOP | wx.aui.AUI_NB_TAB_SPLIT | wx.aui.AUI_NB_TAB_MOVE |
- wx.aui.AUI_NB_SCROLL_BUTTONS | wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+ self.LeftNoteBook = wx.aui.AuiNotebook( + self, ID_PLCOPENEDITORLEFTNOTEBOOK, + style=(wx.aui.AUI_NB_TOP | + wx.aui.AUI_NB_TAB_SPLIT | + wx.aui.AUI_NB_TAB_MOVE | + wx.aui.AUI_NB_SCROLL_BUTTONS | + wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)) self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
- self.OnAllowNotebookDnD)
- self.AUIManager.AddPane(self.LeftNoteBook,
- wx.aui.AuiPaneInfo().Name("ProjectPane").
- BestSize(wx.Size(300, 500)).CloseButton(False))
+ self.OnAllowNotebookDnD) + self.AUIManager.AddPane( + wx.aui.AuiPaneInfo().Name("ProjectPane").Left().Layer(1). + BestSize(wx.Size(300, 500)).CloseButton(False)) - self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
- style=wx.aui.AUI_NB_TOP | wx.aui.AUI_NB_TAB_SPLIT | wx.aui.AUI_NB_TAB_MOVE |
- wx.aui.AUI_NB_SCROLL_BUTTONS | wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+ self.BottomNoteBook = wx.aui.AuiNotebook( + self, ID_PLCOPENEDITORBOTTOMNOTEBOOK, + style=(wx.aui.AUI_NB_TOP | + wx.aui.AUI_NB_TAB_SPLIT | + wx.aui.AUI_NB_TAB_MOVE | + wx.aui.AUI_NB_SCROLL_BUTTONS | + wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)) self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
- self.OnAllowNotebookDnD)
- self.AUIManager.AddPane(self.BottomNoteBook,
- wx.aui.AuiPaneInfo().Name("ResultPane").
- BestSize(wx.Size(800, 300)).CloseButton(False))
+ self.OnAllowNotebookDnD) + self.AUIManager.AddPane( + wx.aui.AuiPaneInfo().Name("ResultPane").Bottom().Layer(0). + BestSize(wx.Size(800, 300)).CloseButton(False)) - self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
- style=wx.aui.AUI_NB_TOP | wx.aui.AUI_NB_TAB_SPLIT | wx.aui.AUI_NB_TAB_MOVE |
- wx.aui.AUI_NB_SCROLL_BUTTONS | wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+ self.RightNoteBook = wx.aui.AuiNotebook( + self, ID_PLCOPENEDITORRIGHTNOTEBOOK, + style=(wx.aui.AUI_NB_TOP | + wx.aui.AUI_NB_TAB_SPLIT | + wx.aui.AUI_NB_TAB_MOVE | + wx.aui.AUI_NB_SCROLL_BUTTONS | + wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)) self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
- self.OnAllowNotebookDnD)
- self.AUIManager.AddPane(self.RightNoteBook,
- wx.aui.AuiPaneInfo().Name("LibraryPane").
- BestSize(wx.Size(250, 400)).CloseButton(False))
+ self.OnAllowNotebookDnD) + self.AUIManager.AddPane( + wx.aui.AuiPaneInfo().Name("LibraryPane").Right().Layer(0). + BestSize(wx.Size(250, 400)).CloseButton(False)) - self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED,
- style=wx.aui.AUI_NB_DEFAULT_STYLE | wx.aui.AUI_NB_WINDOWLIST_BUTTON)
+ self.TabsOpened = wx.aui.AuiNotebook( + self, ID_PLCOPENEDITORTABSOPENED, + style=(wx.aui.AUI_NB_DEFAULT_STYLE | + wx.aui.AUI_NB_WINDOWLIST_BUTTON)) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
- self.OnPouSelectedChanging)
+ self.OnPouSelectedChanging) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
- self.OnPouSelectedChanged)
+ self.OnPouSelectedChanged) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
self.AUIManager.AddPane(self.TabsOpened,
- wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
+ wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane")) #-----------------------------------------------------------------------
# Creating PLCopen Project Types Tree
@@ -560,33 +574,37 @@
- self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL,
- name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.SP_3D)
+ self.ProjectPanel = wx.SplitterWindow( + id=ID_PLCOPENEDITORPROJECTPANEL, + name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0), + size=wx.Size(0, 0), style=wx.SP_3D) self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
- name='ProjectTree', parent=self.ProjectPanel,
- pos=wx.Point(0, 0), size=wx.Size(0, 0),
- style=wx.SUNKEN_BORDER,
- agwStyle=wx.TR_HAS_BUTTONS | wx.TR_SINGLE | wx.TR_EDIT_LABELS)
+ parent=self.ProjectPanel, + pos=wx.Point(0, 0), size=wx.Size(0, 0), + style=wx.SUNKEN_BORDER, + agwStyle=(wx.TR_HAS_BUTTONS | self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
self._init_coll_AddMenu_Items(add_menu)
self.ProjectTree.SetAddMenu(add_menu)
self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
- id=ID_PLCOPENEDITORPROJECTTREE)
+ id=ID_PLCOPENEDITORPROJECTTREE) self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion)
#-----------------------------------------------------------------------
@@ -604,30 +622,34 @@
#-----------------------------------------------------------------------
- MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
- wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+ MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, + wx.DefaultPosition, wx.DefaultSize, + wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
self.Panes["MenuToolBar"] = MenuToolBar
self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
- Name("MenuToolBar").Caption(_("Menu ToolBar")).
- LeftDockable(False).RightDockable(False))
+ Name("MenuToolBar").Caption(_("Menu ToolBar")). + LeftDockable(False).RightDockable(False)) - EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
- wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+ EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, + wx.DefaultPosition, wx.DefaultSize, + wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION,
- GetBitmap("select"), wx.NullBitmap, _("Select an object"))
self.Panes["EditorToolBar"] = EditorToolBar
self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
- Name("EditorToolBar").Caption(_("Editor ToolBar")).
- ToolbarPane().Top().Position(1).
- LeftDockable(False).RightDockable(False))
+ Name("EditorToolBar").Caption(_("Editor ToolBar")). + ToolbarPane().Top().Position(1). + LeftDockable(False).RightDockable(False)) self.Bind(wx.EVT_MENU, self.OnSelectionTool,
- id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
+ id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION) #-----------------------------------------------------------------------
@@ -1141,9 +1163,9 @@
# self.Controler.IsProjectBufferEnabled())
self.EditMenu.Enable(wx.ID_FIND, selected > -1)
self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDNEXT,
- selected > -1 and self.SearchParams is not None)
+ selected > -1 and self.SearchParams is not None) self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
- selected > -1 and self.SearchParams is not None)
+ selected > -1 and self.SearchParams is not None) self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
self.EditMenu.Enable(wx.ID_ADD, True)
@@ -1510,8 +1532,8 @@
self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
self.ProjectTree.SetItemExtraImage(root, None)
if infos["type"] == ITEM_POU:
- self.ProjectTree.SetItemImage(root,
- self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
+ self.ProjectTree.SetItemImage( + root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
elif "icon" in infos and infos["icon"] is not None:
@@ -1550,8 +1572,8 @@
root = self.ProjectTree.GetRootItem()
if root is not None and root.IsOk():
words = tagname.split("::")
- result = self.RecursiveProjectTreeItemSelection(root,
- zip(words[1:], self.TagNamePartsItemTypes.get(words[0], [])))
+ result = self.RecursiveProjectTreeItemSelection( + root, zip(words[1:], self.TagNamePartsItemTypes.get(words[0], []))) def RecursiveProjectTreeItemSelection(self, root, items):
@@ -1718,8 +1740,8 @@
self.EditProjectSettings()
if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
- ITEM_CONFIGURATION, ITEM_RESOURCE,
- ITEM_TRANSITION, ITEM_ACTION]:
+ ITEM_CONFIGURATION, ITEM_RESOURCE, + ITEM_TRANSITION, ITEM_ACTION]: self.EditProjectElement(item_infos["type"], item_infos["tagname"])
@@ -1765,8 +1787,8 @@
self.LastToolTipItem = item
wx.CallAfter(self.ProjectTree.SetToolTipString,
- block_type, bodytype, item_infos["name"]))
+ block_type, bodytype, item_infos["name"])) elif self.LastToolTipItem is not None:
self.ProjectTree.SetToolTip(None)
self.LastToolTipItem = None
@@ -2417,7 +2439,8 @@
if not check_function(name):
- dialog = wx.MessageDialog(self,
+ dialog = wx.MessageDialog( _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name,
title, wx.YES_NO | wx.ICON_QUESTION)
answer = dialog.ShowModal()
--- a/PLCControler.py Fri Aug 18 12:36:31 2017 +0300
+++ b/PLCControler.py Fri Aug 18 20:14:38 2017 +0300
@@ -311,7 +311,8 @@
_Point = namedtuple("Point", ["x", "y"])
-_BlockInstanceInfos = namedtuple("BlockInstanceInfos",
+_BlockInstanceInfos = namedtuple( ["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"])
@@ -371,10 +372,12 @@
-_InstanceConnectionInfos = namedtuple("InstanceConnectionInfos",
+_InstanceConnectionInfos = namedtuple( + "InstanceConnectionInfos", ["name", "negated", "edge", "position", "links"])
-_ConnectionLinkInfos = namedtuple("ConnectionLinkInfos",
+_ConnectionLinkInfos = namedtuple( ["refLocalId", "formalParameter", "points"])
@@ -710,8 +713,11 @@
infos = {"name": project.getname(), "type": ITEM_PROJECT}
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values": []}
for datatype in project.getdataTypes():
- datatypes["values"].append({"name": datatype.getname(), "type": ITEM_DATATYPE,
- "tagname": self.ComputeDataTypeName(datatype.getname()), "values": []})
+ datatypes["values"].append({ + "name": datatype.getname(), + "tagname": self.ComputeDataTypeName(datatype.getname()), @@ -737,13 +743,17 @@
if pou.getbodyType() == "SFC":
for transition in pou.gettransitionList():
- transitions.append({"name": transition.getname(), "type": ITEM_TRANSITION,
+ "name": transition.getname(), + "type": ITEM_TRANSITION, "tagname": self.ComputePouTransitionName(pou.getname(), transition.getname()),
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions})
for action in pou.getactionList():
- actions.append({"name": action.getname(), "type": ITEM_ACTION,
+ "name": action.getname(), "tagname": self.ComputePouActionName(pou.getname(), action.getname()),
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions})
@@ -753,13 +763,17 @@
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []}
for config in project.getconfigurations():
config_name = config.getname()
- config_infos = {"name": config_name, "type": ITEM_CONFIGURATION,
+ "type": ITEM_CONFIGURATION, "tagname": self.ComputeConfigurationName(config.getname()),
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []}
for resource in config.getresource():
resource_name = resource.getname()
- resource_infos = {"name": resource_name, "type": ITEM_RESOURCE,
"tagname": self.ComputeConfigurationResourceName(config.getname(), resource.getname()),
resources["values"].append(resource_infos)
@@ -814,8 +828,8 @@
("instances_ns", "AddInstance"): factory.AddInstance})
- instances_path_xslt_tree(root,
- instance_type=etree.XSLT.strparam(name))
+ instances_path_xslt_tree( + root, instance_type=etree.XSLT.strparam(name)) @@ -853,8 +867,8 @@
- instance_tagname_xslt_tree(project,
- instance_path=etree.XSLT.strparam(instance_path))
+ instance_tagname_xslt_tree( + project, instance_path=etree.XSLT.strparam(instance_path)) return factory.GetTagName()
@@ -1386,10 +1400,10 @@
os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
extensions={("var_infos_ns", name): getattr(factory, name)
- for name in ["SetType", "AddDimension", "AddTree",
- "AddVarToTree", "AddVariable"]})
- variables_infos_xslt_tree(object_with_vars,
- tree=etree.XSLT.strparam(str(tree)))
+ for name in ["SetType", "AddDimension", "AddTree", + "AddVarToTree", "AddVariable"]}) + variables_infos_xslt_tree( + object_with_vars, tree=etree.XSLT.strparam(str(tree))) @@ -1437,7 +1451,8 @@
if config_name is None or config_name == configuration.getname():
[var.getname() for var in reduce(
- lambda x, y: x + y, [varlist.getvariable()
for varlist in configuration.globalVars],
@@ -1466,8 +1481,8 @@
# Return resource variable names
- def GetConfigurationResourceVariableNames(self,
- config_name=None, resource_name=None, debug=False):
+ def GetConfigurationResourceVariableNames( + self, config_name=None, resource_name=None, debug=False): project = self.GetProject(debug)
@@ -1477,7 +1492,8 @@
if resource_name is None or resource.getname() == resource_name:
[var.getname() for var in reduce(
- lambda x, y: x + y, [varlist.getvariable()
for varlist in resource.globalVars],
@@ -1553,8 +1569,8 @@
extensions={("var_infos_ns", name): getattr(factory, name)
for name in ["SetType", "AddDimension",
"AddTree", "AddVarToTree"]})
- return_type_infos_xslt_tree(return_type,
- tree=etree.XSLT.strparam(str(tree)))
+ return_type_infos_xslt_tree( + return_type, tree=etree.XSLT.strparam(str(tree))) return [factory.GetType(), factory.GetTree()]
@@ -1650,7 +1666,7 @@
if inputs == tuple([var_type
- for name, var_type, modifier in blocktype_infos["inputs"]]):
+ for name, var_type, modifier in blocktype_infos["inputs"]]): @@ -1674,11 +1690,13 @@
"list": [block for block in category["list"]
if block["type"] in filter]}
for category in self.TotalTypes]
- blocktypes.append({"name": USER_DEFINED_POUS,
+ "name": USER_DEFINED_POUS, "list": [pou.getblockInfos()
for pou in project.getpous(name, filter)
- len(self.GetInstanceList(pou, name, debug)) == 0)]})
+ len(self.GetInstanceList(pou, name, debug)) == 0)] @@ -1695,7 +1713,8 @@
if block["type"] == "functionBlock":
blocktypes.append(block["name"])
- blocktypes.extend([pou.getname()
for pou in project.getpous(name, ["functionBlock"])
len(self.GetInstanceList(pou, name, debug)) == 0)])
@@ -1996,8 +2015,8 @@
base_type = basetype_content.baseType.getcontent()
base_type_type = base_type.getLocalTag()
infos["base_type"] = (base_type.getname()
- if base_type_type == "derived"
+ if base_type_type == "derived" elif basetype_content_type == "enum":
infos["type"] = "Enumerated"
@@ -2011,8 +2030,8 @@
base_type = basetype_content.baseType.getcontent()
base_type_type = base_type.getLocalTag()
infos["base_type"] = (base_type.getname()
- if base_type_type == "derived"
- else base_type_type.upper())
+ if base_type_type == "derived" + else base_type_type.upper()) elif basetype_content_type == "struct":
infos["type"] = "Structure"
@@ -2028,9 +2047,10 @@
base_type = element_type.baseType.getcontent()
base_type_type = base_type.getLocalTag()
element_infos["Type"] = ("array",
- if base_type_type == "derived"
- else base_type_type.upper(), dimensions)
+ if base_type_type == "derived" + else base_type_type.upper(), elif element_type_type == "derived":
element_infos["Type"] = element_type.getname()
@@ -2043,8 +2063,8 @@
infos["type"] = "Directly"
infos["base_type"] = (basetype_content.getname()
- if basetype_content_type == "derived"
- else basetype_content_type.upper())
+ if basetype_content_type == "derived" + else basetype_content_type.upper()) if datatype.initialValue is not None:
infos["initial"] = datatype.initialValue.getvalue()
@@ -2334,10 +2354,11 @@
element = self.GetEditedElement(tagname, debug)
if element is not None and element.getbodyType() not in ["ST", "IL"]:
for instance in element.getinstances():
- if isinstance(instance,
- (PLCOpenParser.GetElementClass("step", "sfcObjects"),
- PLCOpenParser.GetElementClass("connector", "commonObjects"),
- PLCOpenParser.GetElementClass("continuation", "commonObjects"))):
+ (PLCOpenParser.GetElementClass("step", "sfcObjects"), + PLCOpenParser.GetElementClass("connector", "commonObjects"), + PLCOpenParser.GetElementClass("continuation", "commonObjects"))): names[instance.getname().upper()] = True
project = self.GetProject(debug)
--- a/PLCOpenEditor.py Fri Aug 18 12:36:31 2017 +0300
+++ b/PLCOpenEditor.py Fri Aug 18 20:14:38 2017 +0300
@@ -106,33 +106,33 @@
def _init_coll_FileMenu_Items(self, parent):
AppendMenu(parent, help='', id=wx.ID_NEW,
- kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
+ kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N') AppendMenu(parent, help='', id=wx.ID_OPEN,
- kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
+ kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O') AppendMenu(parent, help='', id=wx.ID_CLOSE,
- kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
+ kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W') AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
- kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
+ kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W') AppendMenu(parent, help='', id=wx.ID_SAVE,
- kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
+ kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S') AppendMenu(parent, help='', id=wx.ID_SAVEAS,
- kind=wx.ITEM_NORMAL, text=_(u'Save As...') + '\tCTRL+SHIFT+S')
+ kind=wx.ITEM_NORMAL, text=_(u'Save As...') + '\tCTRL+SHIFT+S') AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
- kind=wx.ITEM_NORMAL, text=_(u'Generate Program') + '\tCTRL+G')
+ kind=wx.ITEM_NORMAL, text=_(u'Generate Program') + '\tCTRL+G') AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
- kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P') AppendMenu(parent, help='', id=wx.ID_PREVIEW,
- kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P') AppendMenu(parent, help='', id=wx.ID_PRINT,
- kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
+ kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P') AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
- kind=wx.ITEM_NORMAL, text=_(u'&Properties'))
+ kind=wx.ITEM_NORMAL, text=_(u'&Properties')) AppendMenu(parent, help='', id=wx.ID_EXIT,
- kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
+ kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q') self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
@@ -141,7 +141,7 @@
self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
- id=ID_PLCOPENEDITORFILEMENUGENERATE)
+ id=ID_PLCOPENEDITORFILEMENUGENERATE) self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
@@ -156,7 +156,7 @@
def _init_coll_HelpMenu_Items(self, parent):
AppendMenu(parent, help='', id=wx.ID_HELP,
- kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor') + '\tF1')
+ kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor') + '\tF1') #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
# kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
#AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
@@ -173,7 +173,7 @@
self.Bind(wx.EVT_MENU, handler, id=id)
AppendMenu(parent, help='', id=wx.ID_ABOUT,
- kind=wx.ITEM_NORMAL, text=_(u'About'))
+ kind=wx.ITEM_NORMAL, text=_(u'About')) self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
#self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
@@ -424,7 +424,8 @@
- dlg = wx.SingleChoiceDialog(None,
+ dlg = wx.SingleChoiceDialog( An unhandled exception (bug) occured. Bug report saved at :
--- a/ProjectController.py Fri Aug 18 12:36:31 2017 +0300
+++ b/ProjectController.py Fri Aug 18 20:14:38 2017 +0300
@@ -145,7 +145,8 @@
# Invoke compiler. Output files are listed to stdout, errors to stderr
status, result, err_result = ProcessLogger(None, buildcmd,
- no_stdout=True, no_stderr=True).spin()
@@ -282,7 +283,8 @@
# Timer to pull PLC status
self.StatusTimer = wx.Timer(self.AppFrame, -1)
self.AppFrame.Bind(wx.EVT_TIMER,
- self.PullPLCStatusProc, self.StatusTimer)
+ self.PullPLCStatusProc, if self._connector is not None:
frame.LogViewer.SetLogSource(self._connector)
@@ -291,7 +293,8 @@
# Timer to dispatch debug values to consumers
self.DispatchDebugValuesTimer = wx.Timer(self.AppFrame, -1)
self.AppFrame.Bind(wx.EVT_TIMER,
- self.DispatchDebugValuesProc, self.DispatchDebugValuesTimer)
+ self.DispatchDebugValuesProc, + self.DispatchDebugValuesTimer) self.RefreshConfNodesBlockLists()
@@ -376,10 +379,11 @@
if CheckPathPerm(self.ProjectPath):
if self.AppFrame is not None:
- dialog = wx.MessageDialog(self.AppFrame,
- _('You must have permission to work on the project\nWork on a project copy ?'),
- wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+ dialog = wx.MessageDialog( + _('You must have permission to work on the project\nWork on a project copy ?'), + wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) answer = dialog.ShowModal()
@@ -750,7 +754,7 @@
# Invoke compiler. Output files are listed to stdout, errors to stderr
status, result, err_result = ProcessLogger(self.logger, buildcmd,
- no_stdout=True, no_stderr=True).spin()
+ no_stdout=True, no_stderr=True).spin() self.logger.write_error(buildcmd + "\n")
self.logger.write_error(repr(e) + "\n")
@@ -860,8 +864,8 @@
return ([(C_file_name, self.plcCFLAGS)
for C_file_name in self.PLCGeneratedCFiles],
- False) # do not expose retreive/publish calls
+ False) # do not expose retreive/publish calls def ResetIECProgramsAndVariables(self):
@@ -1005,7 +1009,8 @@
# filter location that are related to code that will be called
# in retreive, publish, init, cleanup
locstrs = map(lambda x: "_".join(map(str, x)),
- [loc for loc, Cfiles, DoCalls in self.LocationCFilesAndCFLAGS if loc and DoCalls])
+ [loc for loc, Cfiles, DoCalls in + self.LocationCFilesAndCFLAGS if loc and DoCalls]) # Generate main, based on template
if not self.BeremizRoot.getDisable_Extensions():
@@ -1269,9 +1274,12 @@
editor_name = editors.keys()[0]
- dialog = wx.SingleChoiceDialog(self.AppFrame,
- _("Select an editor:"), _("Editor selection"),
- names, wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ dialog = wx.SingleChoiceDialog( + _("Select an editor:"), + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) if dialog.ShowModal() == wx.ID_OK:
editor_name = names[dialog.GetSelection()]
@@ -1397,7 +1405,7 @@
def SnapshotAndResetDebugValuesBuffers(self):
buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
- [list() for n in xrange(len(self.TracedIECPath))])
+ [list() for n in xrange(len(self.TracedIECPath))]) ticks, self.DebugTicks = self.DebugTicks, []
--- a/controls/DebugVariablePanel/DebugVariablePanel.py Fri Aug 18 12:36:31 2017 +0300
+++ b/controls/DebugVariablePanel/DebugVariablePanel.py Fri Aug 18 20:14:38 2017 +0300
@@ -230,7 +230,8 @@
self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
graphics_button_sizer.AddWindow(self.CanvasRange, 1,
- border=5, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) @@ -243,26 +244,26 @@
for name, bitmap, help in [
("CurrentButton", "current", _("Go to current value")),
("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
- button = wx.lib.buttons.GenBitmapButton(self,
- bitmap=GetBitmap(bitmap),
- size=wx.Size(28, 28), style=wx.NO_BORDER)
+ button = wx.lib.buttons.GenBitmapButton( + self, bitmap=GetBitmap(bitmap), + size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help)
setattr(self, name, button)
self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
- self.CanvasPosition = wx.ScrollBar(self,
- size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
+ self.CanvasPosition = wx.ScrollBar( + self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL) self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK,
- self.OnPositionChanging, self.CanvasPosition)
+ self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP,
- self.OnPositionChanging, self.CanvasPosition)
+ self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN,
- self.OnPositionChanging, self.CanvasPosition)
+ self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP,
- self.OnPositionChanging, self.CanvasPosition)
+ self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN,
- self.OnPositionChanging, self.CanvasPosition)
+ self.OnPositionChanging, self.CanvasPosition) main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
self.TickSizer = wx.BoxSizer(wx.HORIZONTAL)
@@ -388,18 +389,17 @@
def MoveCursorTick(self, move):
if self.CursorTick is not None:
cursor_tick = max(self.Ticks[0],
- min(self.CursorTick + move,
+ min(self.CursorTick + move, self.Ticks[-1])) cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick))
if self.Ticks[cursor_tick_idx] == self.CursorTick:
- min(cursor_tick_idx + abs(move) / move,
+ min(cursor_tick_idx + abs(move) / move, self.CursorTick = self.Ticks[cursor_tick_idx]
- self.StartTick = max(self.Ticks[
- numpy.argmin(numpy.abs(self.Ticks -
- self.CursorTick + self.CurrentRange))],
- min(self.StartTick, self.CursorTick))
+ self.Ticks[numpy.argmin( + numpy.abs(self.Ticks - self.CursorTick + self.CurrentRange))], + min(self.StartTick, self.CursorTick)) self.RefreshCanvasPosition()
@@ -737,8 +737,8 @@
for panel in self.GraphicPanels:
items.extend(panel.GetItems())
- self.VariableNameMask = reduce(compute_mask,
- [item.GetVariable().split('.') for item in items])
+ self.VariableNameMask = reduce( + compute_mask, [item.GetVariable().split('.') for item in items]) self.VariableNameMask = items[0].GetVariable().split('.')[:-1] + ['*']
@@ -934,7 +934,8 @@
posy = max(0, min(ystart, (vheight - window_size[1]) / SCROLLBAR_UNIT))
self.GraphicsWindow.Scroll(posx, posy)
self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
- vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, posx, posy)
+ vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, def OnGraphicsWindowEraseBackground(self, event):
--- a/controls/ProjectPropertiesPanel.py Fri Aug 18 12:36:31 2017 +0300
+++ b/controls/ProjectPropertiesPanel.py Fri Aug 18 20:14:38 2017 +0300
@@ -52,7 +52,7 @@
st = wx.StaticText(parent, label=label)
sizer.AddWindow(st, border=10,
- flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
+ flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT) tc = wx.TextCtrl(parent, style=wx.TE_PROCESS_ENTER)
@@ -60,7 +60,7 @@
self.Bind(wx.EVT_TEXT_ENTER, callback, tc)
tc.Bind(wx.EVT_KILL_FOCUS, callback)
sizer.AddWindow(tc, border=10,
- flag=wx.GROW | border | wx.RIGHT)
+ flag=wx.GROW | border | wx.RIGHT) def __init__(self, parent, controller=None, window=None, enable_required=True):
wx.Notebook.__init__(self, parent)
@@ -77,11 +77,11 @@
self.ProjectPanel.SetSizer(projectpanel_sizer)
self.AddSizerParams(self.ProjectPanel, projectpanel_sizer,
- [("projectName", _('Project Name (required):')),
- ("projectVersion", _('Project Version (optional):')),
- ("productName", _('Product Name (required):')),
- ("productVersion", _('Product Version (required):')),
- ("productRelease", _('Product Release (optional):'))])
+ [("projectName", _('Project Name (required):')), + ("projectVersion", _('Project Version (optional):')), + ("productName", _('Product Name (required):')), + ("productVersion", _('Product Version (required):')), + ("productRelease", _('Product Release (optional):'))]) self.AddPage(self.ProjectPanel, _("Project"))
@@ -93,10 +93,10 @@
self.AuthorPanel.SetSizer(authorpanel_sizer)
self.AddSizerParams(self.AuthorPanel, authorpanel_sizer,
- [("companyName", _('Company Name (required):')),
- ("companyURL", _('Company URL (optional):')),
- ("authorName", _('Author Name (optional):')),
- ("organization", _('Organization (optional):'))])
+ [("companyName", _('Company Name (required):')), + ("companyURL", _('Company URL (optional):')), + ("authorName", _('Author Name (optional):')), + ("organization", _('Organization (optional):'))]) self.AddPage(self.AuthorPanel, _("Author"))
@@ -109,23 +109,24 @@
self.GraphicsPanel.SetSizer(graphicpanel_sizer)
pageSize_st = wx.StaticText(self.GraphicsPanel,
- label=_('Page Size (optional):'))
- graphicpanel_sizer.AddWindow(pageSize_st, border=10,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT | wx.RIGHT)
+ label=_('Page Size (optional):')) + graphicpanel_sizer.AddWindow( + pageSize_st, border=10, + flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT | wx.RIGHT) pageSize_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
pageSize_sizer.AddGrowableCol(1)
graphicpanel_sizer.AddSizer(pageSize_sizer, border=10,
- flag=wx.GROW | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.LEFT | wx.RIGHT) for name, label in [('PageWidth', _('Width:')),
('PageHeight', _('Height:'))]:
st = wx.StaticText(self.GraphicsPanel, label=label)
pageSize_sizer.AddWindow(st, border=12,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT) sp = wx.SpinCtrl(self.GraphicsPanel,
- min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
+ min=0, max=2**16, style=wx.TE_PROCESS_ENTER) callback = self.GetPageSizeChangedFunction(sp, name)
self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
@@ -133,13 +134,13 @@
pageSize_sizer.AddWindow(sp, flag=wx.GROW)
scaling_st = wx.StaticText(self.GraphicsPanel,
- label=_('Grid Resolution:'))
+ label=_('Grid Resolution:')) graphicpanel_sizer.AddWindow(scaling_st, border=10,
- flag=wx.GROW | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.LEFT | wx.RIGHT) scaling_nb = wx.Notebook(self.GraphicsPanel)
graphicpanel_sizer.AddWindow(scaling_nb, border=10,
- flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) for language, translation in [("FBD", _("FBD")), ("LD", _("LD")), ("SFC", _("SFC"))]:
@@ -157,17 +158,18 @@
st = wx.StaticText(scaling_panel, label=label)
- scalingpanel_sizer.AddWindow(st, border=10,
- flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
+ scalingpanel_sizer.AddWindow( + flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT) sp = wx.SpinCtrl(scaling_panel,
- min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
+ min=0, max=2**16, style=wx.TE_PROCESS_ENTER) scaling_controls.append(sp)
callback = self.GetScalingChangedFunction(sp, language, name)
self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
sp.Bind(wx.EVT_KILL_FOCUS, callback)
scalingpanel_sizer.AddWindow(sp, border=10,
- flag=wx.GROW | border | wx.RIGHT)
+ flag=wx.GROW | border | wx.RIGHT) self.Scalings[language] = scaling_controls
scaling_nb.AddPage(scaling_panel, translation)
@@ -176,38 +178,39 @@
# Miscellaneous Panel elements
- self.MiscellaneousPanel = wx.Panel(id=-1, parent=self,
- name='MiscellaneousPanel', pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+ self.MiscellaneousPanel = wx.Panel( + id=-1, parent=self, name='MiscellaneousPanel', pos=wx.Point(0, 0), + size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) miscellaneouspanel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15)
miscellaneouspanel_sizer.AddGrowableCol(1)
miscellaneouspanel_sizer.AddGrowableRow(1)
self.MiscellaneousPanel.SetSizer(miscellaneouspanel_sizer)
language_label = wx.StaticText(self.MiscellaneousPanel,
- label=_('Language (optional):'))
+ label=_('Language (optional):')) miscellaneouspanel_sizer.AddWindow(language_label, border=10,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT) self.Language = wx.ComboBox(self.MiscellaneousPanel,
self.Bind(wx.EVT_COMBOBOX, self.OnLanguageChanged, self.Language)
miscellaneouspanel_sizer.AddWindow(self.Language, border=10,
- flag=wx.GROW | wx.TOP | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.RIGHT) - description_label = wx.StaticText(self.MiscellaneousPanel,
- label=_('Content Description (optional):'))
+ description_label = wx.StaticText( + self.MiscellaneousPanel, label=_('Content Description (optional):')) miscellaneouspanel_sizer.AddWindow(description_label, border=10,
- flag=wx.BOTTOM | wx.LEFT)
+ flag=wx.BOTTOM | wx.LEFT) - self.ContentDescription = wx.TextCtrl(self.MiscellaneousPanel,
- size=wx.Size(240, 150), style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER)
+ self.ContentDescription = wx.TextCtrl( + self.MiscellaneousPanel, size=wx.Size(240, 150), + style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.OnContentDescriptionChanged,
- self.ContentDescription)
+ self.ContentDescription) self.ContentDescription.Bind(wx.EVT_KILL_FOCUS,
- self.OnContentDescriptionChanged)
+ self.OnContentDescriptionChanged) miscellaneouspanel_sizer.AddWindow(self.ContentDescription, border=10,
- flag=wx.GROW | wx.BOTTOM | wx.RIGHT)
+ flag=wx.GROW | wx.BOTTOM | wx.RIGHT) self.AddPage(self.MiscellaneousPanel, _("Miscellaneous"))
@@ -282,7 +285,7 @@
if old_value != new_value:
self.Controller.SetProjectProperties(properties={name: new_value})
self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
- PROJECTTREE, PAGETITLES)
+ PROJECTTREE, PAGETITLES) wx.CallAfter(self.RefreshView)
return TextCtrlChangedFunction
@@ -301,7 +304,7 @@
if old_value != new_value:
self.Controller.SetProjectProperties(properties={"pageSize": new_value})
self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
wx.CallAfter(self.RefreshView)
return PageSizeChangedFunction
@@ -321,7 +324,7 @@
if old_value != new_value:
self.Controller.SetProjectProperties(properties={"scaling": {language: new_value}})
self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
wx.CallAfter(self.RefreshView)
return ScalingChangedFunction
--- a/controls/VariablePanel.py Fri Aug 18 12:36:31 2017 +0300
+++ b/controls/VariablePanel.py Fri Aug 18 20:14:38 2017 +0300
@@ -295,10 +295,12 @@
message = _("Incompatible size of data between \"{a1}\" and \"{a2}\"").\
format(a1=location, a2=variable_type)
- dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow,
- _("Select a variable class:"), _("Variable class"),
- [_("Input"), _("Output"), _("Memory")],
- wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ dialog = wx.SingleChoiceDialog( + self.ParentWindow.ParentWindow.ParentWindow, + _("Select a variable class:"), + [_("Input"), _("Output"), _("Memory")], + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) if dialog.ShowModal() == wx.ID_OK:
selected = dialog.GetSelection()
@@ -341,12 +343,14 @@
- elif var_name.upper() in [name.upper()
- for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
+ elif var_name.upper() in [ + name.upper() for name in + self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: message = _("\"%s\" pou already exists!") % var_name
- elif not var_name.upper() in [name.upper()
+ elif not var_name.upper() in [ for name in self.ParentWindow.Controler.
- GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
+ GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: var_infos = self.ParentWindow.DefaultValue.copy()
var_infos.Name = var_name
var_infos.Type = values[2]
@@ -354,10 +358,12 @@
if values[1] == "location":
if not location.startswith("%"):
- dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow,
- _("Select a variable class:"), _("Variable class"),
- [_("Input"), _("Output"), _("Memory")],
- wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ dialog = wx.SingleChoiceDialog( + self.ParentWindow.ParentWindow.ParentWindow, + _("Select a variable class:"), + [_("Input"), _("Output"), _("Memory")], + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) if dialog.ShowModal() == wx.ID_OK:
selected = dialog.GetSelection()
@@ -376,8 +382,9 @@
- if not var_name.upper() in [name.upper()
- for name in self.ParentWindow.Controler.GetConfigurationVariableNames(configs[0])]:
+ if not var_name.upper() in [ + name.upper() for name in + self.ParentWindow.Controler.GetConfigurationVariableNames(configs[0])]: self.ParentWindow.Controler.AddConfigurationGlobalVar(
configs[0], values[2], var_name, location, "")
var_infos.Class = "External"
@@ -433,7 +440,7 @@
controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
self.ReturnType = wx.ComboBox(self,
- size=wx.Size(145, -1), style=wx.CB_READONLY)
+ size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType)
controls_sizer.AddWindow(self.ReturnType)
@@ -441,7 +448,7 @@
controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
self.Description = wx.TextCtrl(self,
- size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
+ size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description)
self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
controls_sizer.AddWindow(self.Description)
@@ -450,7 +457,7 @@
controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
self.ClassFilter = wx.ComboBox(self,
- size=wx.Size(145, -1), style=wx.CB_READONLY)
+ size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter)
controls_sizer.AddWindow(self.ClassFilter)
@@ -460,7 +467,7 @@
("UpButton", "up", _("Move variable up")),
("DownButton", "down", _("Move variable down"))]:
button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
- size=wx.Size(28, 28), style=wx.NO_BORDER)
+ size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help)
setattr(self, name, button)
controls_sizer.AddWindow(button)
@@ -468,11 +475,11 @@
self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL | wx.HSCROLL)
self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
- self.OnVariablesGridCellChange)
+ self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
- self.OnVariablesGridCellLeftClick)
+ self.OnVariablesGridCellLeftClick) self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
- self.OnVariablesGridEditorShown)
+ self.OnVariablesGridEditorShown) self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
self.SetSizer(self.MainSizer)
@@ -484,7 +491,7 @@
self.RefreshHighlightsTimer = wx.Timer(self, -1)
self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer,
- self.RefreshHighlightsTimer)
+ self.RefreshHighlightsTimer) --- a/dialogs/BrowseLocationsDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/BrowseLocationsDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -70,7 +70,7 @@
def __init__(self, parent, var_type, controller):
wx.Dialog.__init__(self, parent, title=_('Browse Locations'),
- style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+ style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
main_sizer.AddGrowableCol(0)
@@ -78,40 +78,44 @@
locations_label = wx.StaticText(self, label=_('Locations available:'))
main_sizer.AddWindow(locations_label, border=20,
- flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+ flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW) self.LocationsTree = wx.TreeCtrl(self,
- style=wx.TR_HAS_BUTTONS | wx.TR_SINGLE | wx.SUNKEN_BORDER | wx.TR_HIDE_ROOT | wx.TR_LINES_AT_ROOT)
+ style=(wx.TR_HAS_BUTTONS | self.LocationsTree.SetInitialSize(wx.Size(-1, 300))
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnLocationsTreeItemActivated,
main_sizer.AddWindow(self.LocationsTree, border=20,
- flag=wx.LEFT | wx.RIGHT | wx.GROW)
+ flag=wx.LEFT | wx.RIGHT | wx.GROW) button_gridsizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
button_gridsizer.AddGrowableCol(1)
button_gridsizer.AddGrowableCol(3)
button_gridsizer.AddGrowableRow(0)
main_sizer.AddSizer(button_gridsizer, border=20,
- flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.GROW)
+ flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.GROW) direction_label = wx.StaticText(self, label=_('Direction:'))
button_gridsizer.AddWindow(direction_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) self.DirFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.DirFilterChoice)
button_gridsizer.AddWindow(self.DirFilterChoice,
- flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL) filter_label = wx.StaticText(self, label=_('Type:'))
button_gridsizer.AddWindow(filter_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) self.TypeFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.TypeFilterChoice)
button_gridsizer.AddWindow(self.TypeFilterChoice,
- flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL) button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
--- a/dialogs/FBDBlockDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/FBDBlockDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -58,7 +58,7 @@
@param tagname: Tagname of project POU edited
BlockPreviewDialog.__init__(self, parent, controller, tagname,
- title=_('Block Properties'))
+ title=_('Block Properties')) self._init_sizers(2, 0, 1, 0, 3, 2)
@@ -74,9 +74,9 @@
# Set function to call when selection in Library panel changed
setattr(self.LibraryPanel, "_OnTreeItemSelected",
- self.OnLibraryTreeItemSelected)
+ self.OnLibraryTreeItemSelected) left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5,
# Create sizer for other block parameters
top_right_gridsizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=5)
@@ -86,7 +86,7 @@
# Create label for block name
name_label = wx.StaticText(self, label=_('Name:'))
top_right_gridsizer.AddWindow(name_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) # Create text control for defining block name
self.BlockName = wx.TextCtrl(self)
@@ -96,19 +96,19 @@
# Create label for extended block input number
inputs_label = wx.StaticText(self, label=_('Inputs:'))
top_right_gridsizer.AddWindow(inputs_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) # Create spin control for defining extended block input number
self.Inputs = wx.SpinCtrl(self, min=2, max=20,
- style=wx.SP_ARROW_KEYS)
+ style=wx.SP_ARROW_KEYS) self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, self.Inputs)
top_right_gridsizer.AddWindow(self.Inputs, flag=wx.GROW)
# Create label for block execution order
execution_order_label = wx.StaticText(self,
- label=_('Execution Order:'))
+ label=_('Execution Order:')) top_right_gridsizer.AddWindow(execution_order_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) # Create spin control for defining block execution order
self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
@@ -118,9 +118,9 @@
# Create label for block execution control
execution_control_label = wx.StaticText(self,
- label=_('Execution Control:'))
+ label=_('Execution Control:')) top_right_gridsizer.AddWindow(execution_control_label,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) # Create check box to enable block execution control
self.ExecutionControl = wx.CheckBox(self)
@@ -134,7 +134,7 @@
# Add buttons sizer to sizers
self.MainSizer.AddSizer(self.ButtonSizer, border=20,
- flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT) # Dictionary containing correspondence between parameter exchanged and
# control to fill with parameter value
@@ -340,14 +340,13 @@
# If a block type is selected in library panel
# Set graphic element displayed, creating a FBD block element
- self.Element = FBD_Block(self.Preview, values["type"],
- (self.BlockName.GetValue()
- if self.BlockName.IsEnabled()
- extension=self.Inputs.GetValue(),
- inputs=values["inputs"],
- executionControl=self.ExecutionControl.GetValue(),
- executionOrder=self.ExecutionOrder.GetValue())
+ self.Element = FBD_Block( + self.Preview, values["type"], + (self.BlockName.GetValue() if self.BlockName.IsEnabled() else ""), + extension=self.Inputs.GetValue(), + inputs=values["inputs"], + executionControl=self.ExecutionControl.GetValue(), + executionOrder=self.ExecutionOrder.GetValue()) # Reset graphic element displayed
--- a/dialogs/FBDVariableDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/FBDVariableDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -64,7 +64,7 @@
@param exclude_input: Exclude input from variable class selection
BlockPreviewDialog.__init__(self, parent, controller, tagname,
- title=_('Variable Properties'))
+ title=_('Variable Properties')) self._init_sizers(4, 2, 4, None, 3, 2)
@@ -80,7 +80,7 @@
# Create label for variable execution order
execution_order_label = wx.StaticText(self,
- label=_('Execution Order:'))
+ label=_('Execution Order:')) self.LeftGridSizer.AddWindow(execution_order_label, flag=wx.GROW)
# Create spin control for defining variable execution order
@@ -92,7 +92,7 @@
# Create label for variable expression
name_label = wx.StaticText(self, label=_('Expression:'))
self.RightGridSizer.AddWindow(name_label, border=5,
- flag=wx.GROW | wx.BOTTOM)
+ flag=wx.GROW | wx.BOTTOM) # Create text control for defining variable expression
self.Expression = wx.TextCtrl(self)
@@ -102,19 +102,20 @@
# Create a list box to selected variable expression in the list of
# variables defined in POU
self.VariableName = wx.ListBox(self, size=wx.Size(-1, 120),
- style=wx.LB_SINGLE | wx.LB_SORT)
+ style=wx.LB_SINGLE | wx.LB_SORT) self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
self.RightGridSizer.AddWindow(self.VariableName, border=4, flag=wx.GROW | wx.TOP)
# Add preview panel and associated label to sizers
self.MainSizer.AddWindow(self.PreviewLabel, border=20,
- flag=wx.GROW | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.LEFT | wx.RIGHT) self.MainSizer.AddWindow(self.Preview, border=20,
- flag=wx.GROW | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.LEFT | wx.RIGHT) # Add buttons sizer to sizers
- self.MainSizer.AddSizer(self.ButtonSizer, border=20,
- flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ self.MainSizer.AddSizer( + self.ButtonSizer, border=20, + flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT) # Set options that can be selected in class combo box
for var_class, choice in VARIABLE_CLASSES_DICT.iteritems():
@@ -284,12 +285,12 @@
name = self.Expression.GetValue()
# Set graphic element displayed, creating a FBD variable element
- self.Element = FBD_Variable(self.Preview,
- VARIABLE_CLASSES_DICT_REVERSE[
- self.Class.GetStringSelection()],
- self.VariableList.get(name, ("", ""))[1],
- executionOrder=self.ExecutionOrder.GetValue())
+ self.Element = FBD_Variable( + VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()], + self.VariableList.get(name, ("", ""))[1], + executionOrder=self.ExecutionOrder.GetValue()) # Call BlockPreviewDialog function
BlockPreviewDialog.RefreshPreview(self)
--- a/dialogs/FindInPouDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/FindInPouDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -34,8 +34,9 @@
self.SetIcon(parent.icon)
def __init__(self, parent):
- wx.Dialog.__init__(self, parent, title=_("Find"),
- style=wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.RESIZE_BORDER)
+ self, parent, title=_("Find"), + style=wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.RESIZE_BORDER) panel = wx.Panel(self, style=wx.TAB_TRAVERSAL)
@@ -46,7 +47,7 @@
controls_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.AddSizer(controls_sizer, border=20,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) patterns_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
patterns_sizer.AddGrowableCol(1)
@@ -67,16 +68,16 @@
direction_staticboxsizer = wx.StaticBoxSizer(
direction_staticbox, wx.VERTICAL)
params_sizer.AddSizer(direction_staticboxsizer, 1, border=5,
- flag=wx.GROW | wx.RIGHT)
+ flag=wx.GROW | wx.RIGHT) self.Forward = wx.RadioButton(panel, label=_("Forward"),
direction_staticboxsizer.AddWindow(self.Forward, border=5,
self.Backward = wx.RadioButton(panel, label=_("Backward"))
direction_staticboxsizer.AddWindow(self.Backward, border=5,
options_staticbox = wx.StaticBox(panel, label=_("Options"))
options_staticboxsizer = wx.StaticBoxSizer(
@@ -86,20 +87,20 @@
self.CaseSensitive = wx.CheckBox(panel, label=_("Case sensitive"))
self.CaseSensitive.SetValue(True)
options_staticboxsizer.AddWindow(self.CaseSensitive, border=5,
self.WrapSearch = wx.CheckBox(panel, label=_("Wrap search"))
self.WrapSearch.SetValue(True)
options_staticboxsizer.AddWindow(self.WrapSearch, border=5,
- flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+ flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW) self.RegularExpressions = wx.CheckBox(panel, label=_("Regular expressions"))
options_staticboxsizer.AddWindow(self.RegularExpressions, border=5,
- flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+ flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW) buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
main_sizer.AddSizer(buttons_sizer, border=20,
- flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
+ flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT) self.FindButton = wx.Button(panel, label=_("Find"))
self.FindButton.SetDefault()
@@ -177,6 +178,6 @@
self.SetStatusText(message)
if len(self.criteria) > 0:
wx.CallAfter(self.ParentWindow.FindInPou,
- {True: 1, False: -1}[self.Forward.GetValue()],
+ {True: 1, False: -1}[self.Forward.GetValue()], --- a/dialogs/LDElementDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/LDElementDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -51,18 +51,18 @@
@param type: Type of LD element ('contact or 'coil')
BlockPreviewDialog.__init__(self, parent, controller, tagname,
- title=(_("Edit Contact Values")
- else _("Edit Coil Values")))
+ title=(_("Edit Contact Values") + else _("Edit Coil Values"))) - self._init_sizers(2, 0,
- (7 if type == "contact" else 9), None, 2, 1)
+ self._init_sizers(2, 0, (7 if type == "contact" else 9), # Create label for LD element modifier
modifier_label = wx.StaticText(self, label=_('Modifier:'))
self.LeftGridSizer.AddWindow(modifier_label, border=5,
- flag=wx.GROW | wx.BOTTOM)
+ flag=wx.GROW | wx.BOTTOM) # Create radio buttons for selecting LD element modifier
self.ModifierRadioButtons = {}
@@ -79,7 +79,7 @@
for modifier, label in zip(element_modifiers, modifiers_label):
radio_button = wx.RadioButton(self, label=label,
- style=(wx.RB_GROUP if first else 0))
+ style=(wx.RB_GROUP if first else 0)) radio_button.SetValue(first)
self.Bind(wx.EVT_RADIOBUTTON, self.OnModifierChanged, radio_button)
self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
@@ -89,7 +89,7 @@
# Create label for LD element variable
element_variable_label = wx.StaticText(self, label=_('Variable:'))
self.LeftGridSizer.AddWindow(element_variable_label, border=5,
# Create a combo box for defining LD element variable
self.ElementVariable = wx.ComboBox(self, style=wx.CB_SORT)
@@ -98,7 +98,7 @@
self.Bind(wx.EVT_TEXT, self.OnVariableChanged,
self.LeftGridSizer.AddWindow(self.ElementVariable, border=5,
# Add preview panel and associated label to sizers
self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
@@ -106,7 +106,7 @@
# Add buttons sizer to sizers
self.MainSizer.AddSizer(self.ButtonSizer, border=20,
- flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT) self.ElementClass = (LD_Contact if type == "contact" else LD_Coil)
--- a/dialogs/PouDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/PouDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -49,8 +49,8 @@
def __init__(self, parent, pou_type=None, type_readonly=False):
wx.Dialog.__init__(self, id=-1, parent=parent,
- name='PouDialog', title=_('Create a new POU'),
- style=wx.DEFAULT_DIALOG_STYLE)
+ name='PouDialog', title=_('Create a new POU'), + style=wx.DEFAULT_DIALOG_STYLE) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
main_sizer.AddGrowableCol(0)
@@ -59,18 +59,18 @@
infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
infos_sizer.AddGrowableCol(1)
main_sizer.AddSizer(infos_sizer, border=20,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) pouname_label = wx.StaticText(self, label=_('POU Name:'))
infos_sizer.AddWindow(pouname_label, border=4,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP) self.PouName = wx.TextCtrl(self)
infos_sizer.AddWindow(self.PouName, flag=wx.GROW)
poutype_label = wx.StaticText(self, label=_('POU Type:'))
infos_sizer.AddWindow(poutype_label, border=4,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP) self.PouType = wx.ComboBox(self, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, self.PouType)
@@ -78,7 +78,7 @@
language_label = wx.StaticText(self, label=_('Language:'))
infos_sizer.AddWindow(language_label, border=4,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP) self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
infos_sizer.AddWindow(self.Language, flag=wx.GROW)
@@ -86,7 +86,7 @@
button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
main_sizer.AddSizer(button_sizer, border=20,
- flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT) self.SetSizer(main_sizer)
--- a/dialogs/SearchInProjectDialog.py Fri Aug 18 12:36:31 2017 +0300
+++ b/dialogs/SearchInProjectDialog.py Fri Aug 18 20:14:38 2017 +0300
@@ -54,7 +54,7 @@
pattern_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
pattern_sizer.AddGrowableCol(0)
main_sizer.AddSizer(pattern_sizer, border=20,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) pattern_label = wx.StaticText(self, label=_('Pattern to search:'))
pattern_sizer.AddWindow(pattern_label, flag=wx.ALIGN_BOTTOM)
@@ -72,17 +72,17 @@
scope_staticbox = wx.StaticBox(self, label=_('Scope'))
scope_sizer = wx.StaticBoxSizer(scope_staticbox, wx.HORIZONTAL)
main_sizer.AddSizer(scope_sizer, border=20,
- flag=wx.GROW | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.LEFT | wx.RIGHT) scope_selection_sizer = wx.BoxSizer(wx.VERTICAL)
scope_sizer.AddSizer(scope_selection_sizer, 1, border=5,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.BOTTOM)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.BOTTOM) self.WholeProject = wx.RadioButton(self, label=_('Whole Project'), style=wx.RB_GROUP)
self.WholeProject.SetValue(True)
self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.WholeProject)
scope_selection_sizer.AddWindow(self.WholeProject, border=5,
- flag=wx.GROW | wx.BOTTOM)
+ flag=wx.GROW | wx.BOTTOM) self.OnlyElements = wx.RadioButton(self, label=_('Only Elements'))
self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.OnlyElements)
@@ -92,7 +92,7 @@
self.ElementsList = wx.CheckListBox(self)
self.ElementsList.Enable(False)
scope_sizer.AddWindow(self.ElementsList, 1, border=5,
- flag=wx.GROW | wx.TOP | wx.RIGHT | wx.BOTTOM)
+ flag=wx.GROW | wx.TOP | wx.RIGHT | wx.BOTTOM) buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
main_sizer.AddSizer(buttons_sizer, border=20,
--- a/editors/ConfTreeNodeEditor.py Fri Aug 18 12:36:31 2017 +0300
+++ b/editors/ConfTreeNodeEditor.py Fri Aug 18 20:14:38 2017 +0300
@@ -122,10 +122,10 @@
bitmap = wx.EmptyBitmap(0, 0)
wx.StaticBitmap.__init__(self, parent, ID,
class ConfTreeNodeEditor(EditorPanel):
@@ -141,48 +141,54 @@
if tabs_num > 1 or self.SHOW_BASE_PARAMS:
self.Editor = wx.Panel(parent,
- style=wx.SUNKEN_BORDER | wx.SP_3D)
+ style=wx.SUNKEN_BORDER | wx.SP_3D) self.MainSizer = wx.BoxSizer(wx.VERTICAL)
if self.SHOW_BASE_PARAMS:
baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.MainSizer.AddSizer(baseparamseditor_sizer, border=5,
self.FullIECChannel = wx.StaticText(self.Editor, -1)
self.FullIECChannel.SetFont(
wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL,
wx.BOLD, faceName=faces["helv"]))
baseparamseditor_sizer.AddWindow(self.FullIECChannel,
- flag=wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.ALIGN_CENTER_VERTICAL) updownsizer = wx.BoxSizer(wx.VERTICAL)
baseparamseditor_sizer.AddSizer(updownsizer, border=5,
- flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
+ flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) - self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor,
- bitmap=GetBitmap('IECCDown'), size=wx.Size(16, 16), style=wx.NO_BORDER)
+ self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton( + bitmap=GetBitmap('IECCDown'), self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1),
updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT)
- self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor,
- bitmap=GetBitmap('IECCUp'), size=wx.Size(16, 16), style=wx.NO_BORDER)
+ self.IECCDownButton = wx.lib.buttons.GenBitmapButton( + self.Editor, bitmap=GetBitmap('IECCUp'), + size=wx.Size(16, 16), style=wx.NO_BORDER) self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1),
updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT)
self.ConfNodeName = wx.TextCtrl(self.Editor,
self.ConfNodeName.SetFont(
wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL,
wx.BOLD, faceName=faces["helv"]))
- self.ConfNodeName.Bind(wx.EVT_TEXT,
- self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True),
- baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5,
- flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
+ self.ConfNodeName.Bind( + self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), + baseparamseditor_sizer.AddWindow( + self.ConfNodeName, border=5, + flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL) buttons_sizer = self.GenerateMethodButtonSizer()
baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER)
@@ -215,7 +221,7 @@
if self.ConfNodeNoteBook is None and parent != self.Editor:
panel_style |= wx.SUNKEN_BORDER
self.ParamsEditor = wx.ScrolledWindow(parent,
self.ParamsEditor.Bind(wx.EVT_SIZE, self.OnParamsEditorResize)
self.ParamsEditor.Bind(wx.EVT_SCROLLWIN, self.OnParamsEditorScroll)
@@ -226,7 +232,7 @@
self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL)
self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5,
- flag=wx.LEFT | wx.RIGHT | wx.BOTTOM)
+ flag=wx.LEFT | wx.RIGHT | wx.BOTTOM) self.RefreshConfNodeParamsSizer()
@@ -306,8 +312,9 @@
for confnode_method in self.Controler.ConfNodeMethods:
if "method" in confnode_method and confnode_method.get("shown", True):
button = GenBitmapTextButton(self.Editor,
- bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")),
- label=confnode_method["name"], style=wx.NO_BORDER)
+ bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), + label=confnode_method["name"], button.SetFont(normal_bt_font)
button.SetToolTipString(confnode_method["tooltip"])
if confnode_method.get("push", False):
@@ -346,7 +353,7 @@
label += " - %s" % _(value)
staticbox = wx.StaticBox(self.ParamsEditor,
- label=_(label), size=wx.Size(10, 0))
+ label=_(label), size=wx.Size(10, 0)) staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
flags = (wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
@@ -362,15 +369,16 @@
sizer.AddSizer(boxsizer, border=5, flag=flags)
- staticbitmap = GenStaticBitmap(ID=-1, bitmapname=element_infos["name"],
+ staticbitmap = GenStaticBitmap( + ID=-1, bitmapname=element_infos["name"], name="%s_bitmap" % element_infos["name"], parent=self.ParamsEditor,
pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT)
statictext = wx.StaticText(self.ParamsEditor,
- label="%s:" % _(element_infos["name"]))
+ label="%s:" % _(element_infos["name"])) boxsizer.AddWindow(statictext, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT) if isinstance(element_infos["type"], types.ListType):
if isinstance(element_infos["value"], types.TupleType):
@@ -378,7 +386,7 @@
boxsizer.AddSizer(browse_boxsizer)
textctrl = wx.TextCtrl(self.ParamsEditor,
- size=wx.Size(275, -1), style=wx.TE_READONLY)
+ size=wx.Size(275, -1), style=wx.TE_READONLY) if element_infos["value"] is not None:
textctrl.SetValue(element_infos["value"][0])
value_infos = element_infos["value"][1]
@@ -394,7 +402,7 @@
combobox = wx.ComboBox(self.ParamsEditor,
- size=wx.Size(300, -1), style=wx.CB_READONLY)
+ size=wx.Size(300, -1), style=wx.CB_READONLY) boxsizer.AddWindow(combobox)
if element_infos["use"] == "optional":
@@ -406,7 +414,8 @@
value = element_infos["value"]
staticbox = wx.StaticBox(self.ParamsEditor,
- label="%s - %s" % (_(name), _(value)), size=wx.Size(10, 0))
+ label="%s - %s" % (_(name), _(value)), staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
self.GenerateSizerElements(staticboxsizer, element_infos["children"], element_path)
@@ -429,7 +438,8 @@
if "max" in element_infos["type"]:
scmax = element_infos["type"]["max"]
spinctrl = wx.SpinCtrl(self.ParamsEditor,
- size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
+ style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax)
boxsizer.AddWindow(spinctrl)
if element_infos["value"] is not None:
@@ -455,7 +465,8 @@
spinctrl = wx.SpinCtrl(self.ParamsEditor,
- size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
+ style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax)
boxsizer.AddWindow(spinctrl)
if element_infos["value"] is not None:
@@ -571,7 +582,8 @@
posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
self.ParamsEditor.Scroll(posx, posy)
self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
- maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
+ maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, def OnParamsEditorResize(self, event):
--- a/editors/DataTypeEditor.py Fri Aug 18 12:36:31 2017 +0300
+++ b/editors/DataTypeEditor.py Fri Aug 18 20:14:38 2017 +0300
@@ -156,21 +156,21 @@
top_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.MainSizer.AddSizer(top_sizer, border=5,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
top_sizer.AddWindow(derivation_type_label, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT) self.DerivationType = wx.ComboBox(self.Editor,
- size=wx.Size(200, -1), style=wx.CB_READONLY)
+ size=wx.Size(200, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT)
typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
self.MainSizer.AddSizer(typeinfos_sizer, border=5,
- flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) # Panel for Directly derived data types
@@ -180,25 +180,25 @@
directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
directly_basetype_label = wx.StaticText(self.DirectlyPanel,
directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
- label=_('Initial Value:'))
+ label=_('Initial Value:')) directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
- style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
+ style=wx.TE_PROCESS_ENTER | wx.TE_RICH) self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
self.DirectlyPanel.SetSizer(directly_panel_sizer)
@@ -210,49 +210,49 @@
subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
subrange_basetype_label = wx.StaticText(self.SubrangePanel,
subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
- label=_('Initial Value:'))
+ label=_('Initial Value:')) subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel,
- style=wx.TAB_TRAVERSAL)
+ style=wx.TAB_TRAVERSAL) self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
subrange_maximum_label = wx.StaticText(self.SubrangePanel,
subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
self.SubrangePanel.SetSizer(subrange_panel_sizer)
@@ -263,29 +263,32 @@
enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
- self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel,
- label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW |
- wx.gizmos.EL_ALLOW_EDIT |
- wx.gizmos.EL_ALLOW_DELETE)
+ self.EnumeratedValues = CustomEditableListBox( + style=(wx.gizmos.EL_ALLOW_NEW | + wx.gizmos.EL_ALLOW_EDIT | + wx.gizmos.EL_ALLOW_DELETE)) setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
- label=_('Initial Value:'))
+ label=_('Initial Value:')) enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
- border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
@@ -304,36 +307,38 @@
array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
array_initialvalue_label = wx.StaticText(self.ArrayPanel,
- label=_('Initial Value:'))
+ label=_('Initial Value:')) array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
- style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
+ style=wx.TE_PROCESS_ENTER | wx.TE_RICH) self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
- self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel,
- label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW |
- wx.gizmos.EL_ALLOW_EDIT |
- wx.gizmos.EL_ALLOW_DELETE)
+ self.ArrayDimensions = CustomEditableListBox( + label=_("Dimensions:"), + style=(wx.gizmos.EL_ALLOW_NEW | + wx.gizmos.EL_ALLOW_EDIT | + wx.gizmos.EL_ALLOW_DELETE)) for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
"_OnUpButton", "_OnDownButton"]:
setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
self.ArrayPanel.SetSizer(array_panel_sizer)
@@ -350,10 +355,10 @@
structure_button_sizer.AddGrowableCol(0)
structure_button_sizer.AddGrowableRow(0)
structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
structure_elements_label = wx.StaticText(self.StructurePanel,
structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
for name, bitmap, help in [
@@ -362,17 +367,19 @@
("StructureUpButton", "up", _("Move element up")),
("StructureDownButton", "down", _("Move element down"))]:
button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
- bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+ bitmap=GetBitmap(bitmap), button.SetToolTipString(help)
setattr(self, name, button)
structure_button_sizer.AddWindow(button)
self.StructureElementsGrid = CustomGrid(self.StructurePanel,
- size=wx.Size(0, 150), style=wx.VSCROLL)
+ size=wx.Size(0, 150), style=wx.VSCROLL) self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
- self.OnStructureElementsGridCellChange)
+ self.OnStructureElementsGridCellChange) self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
- self.OnStructureElementsGridEditorShown)
+ self.OnStructureElementsGridEditorShown) structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
self.StructurePanel.SetSizer(structure_panel_sizer)
--- a/editors/ResourceEditor.py Fri Aug 18 12:36:31 2017 +0300
+++ b/editors/ResourceEditor.py Fri Aug 18 20:14:38 2017 +0300
@@ -233,7 +233,7 @@
tasks_sizer.AddGrowableCol(0)
tasks_sizer.AddGrowableRow(1)
main_sizer.AddSizer(tasks_sizer, border=5,
- flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
tasks_buttons_sizer.AddGrowableCol(0)
@@ -249,7 +249,9 @@
("UpTaskButton", "up", _("Move task up")),
("DownTaskButton", "down", _("Move task down"))]:
button = wx.lib.buttons.GenBitmapButton(self.Editor,
- bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+ bitmap=GetBitmap(bitmap), button.SetToolTipString(help)
setattr(self, name, button)
tasks_buttons_sizer.AddWindow(button)
@@ -262,7 +264,7 @@
instances_sizer.AddGrowableCol(0)
instances_sizer.AddGrowableRow(1)
main_sizer.AddSizer(instances_sizer, border=5,
- flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+ flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
instances_buttons_sizer.AddGrowableCol(0)
@@ -277,15 +279,15 @@
("DeleteInstanceButton", "remove_element", _("Remove instance")),
("UpInstanceButton", "up", _("Move instance up")),
("DownInstanceButton", "down", _("Move instance down"))]:
- button = wx.lib.buttons.GenBitmapButton(self.Editor,
- bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+ button = wx.lib.buttons.GenBitmapButton( + self.Editor, bitmap=GetBitmap(bitmap), + size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help)
setattr(self, name, button)
instances_buttons_sizer.AddWindow(button)
self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
- self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
- self.OnInstancesGridCellChange)
+ self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange) instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
self.Editor.SetSizer(main_sizer)
@@ -370,9 +372,11 @@
rows = self.InstancesTable.GetNumberRows()
row = self.InstancesGrid.GetGridCursorRow()
self.DeleteInstanceButton.Enable(rows > 0)
- self.UpInstanceButton.Enable(row > 0 and
+ self.UpInstanceButton.Enable( self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task"))
- self.DownInstanceButton.Enable(0 <= row < rows - 1 and
+ self.DownInstanceButton.Enable( + 0 <= row < rows - 1 and self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task"))
setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons)
--- a/editors/Viewer.py Fri Aug 18 12:36:31 2017 +0300
+++ b/editors/Viewer.py Fri Aug 18 20:14:38 2017 +0300
@@ -321,10 +321,12 @@
if pou_type == "program":
if not location.startswith("%"):
- dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow,
- _("Select a variable class:"), _("Variable class"),
- [_("Input"), _("Output"), _("Memory")],
- wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ dialog = wx.SingleChoiceDialog( + self.ParentWindow.ParentWindow, + _("Select a variable class:"), + [_("Input"), _("Output"), _("Memory")], + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) if dialog.ShowModal() == wx.ID_OK:
selected = dialog.GetSelection()
@@ -697,8 +699,8 @@
def _init_Editor(self, prnt):
self.Editor = wx.ScrolledWindow(prnt, name="Viewer",
- pos=wx.Point(0, 0), size=wx.Size(0, 0),
- style=wx.HSCROLL | wx.VSCROLL)
+ pos=wx.Point(0, 0), size=wx.Size(0, 0), + style=wx.HSCROLL | wx.VSCROLL) self.Editor.ParentWindow = self
@@ -811,7 +813,7 @@
def GetScrolledRect(self, rect):
rect.x, rect.y = self.Editor.CalcScrolledPosition(int(rect.x * self.ViewScale[0]),
- int(rect.y * self.ViewScale[1]))
+ int(rect.y * self.ViewScale[1])) rect.width = int(rect.width * self.ViewScale[0]) + 2
rect.height = int(rect.height * self.ViewScale[1]) + 2
@@ -1335,7 +1337,8 @@
maxy = max(maxy, extent.y + extent.height)
maxx = int(maxx * self.ViewScale[0])
maxy = int(maxy * self.ViewScale[1])
- self.Editor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+ self.Editor.SetScrollbars( + SCROLLBAR_UNIT, SCROLLBAR_UNIT, round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr,
@@ -1417,10 +1420,11 @@
connectors["outputs"].pop(0)
block_name = specific_values.name if specific_values.name is not None else ""
- element = FBD_Block(self, instance.type, block_name,
- instance.id, len(connectors["inputs"]),
- connectors=connectors, executionControl=executionControl,
- executionOrder=specific_values.execution_order)
+ self, instance.type, block_name, + instance.id, len(connectors["inputs"]), + connectors=connectors, executionControl=executionControl, + executionOrder=specific_values.execution_order) if isinstance(element, Comment):
@@ -1432,7 +1436,7 @@
connector_pos = wx.Point(*output_connector.position)
if isinstance(element, FBD_Block):
connector = element.GetConnector(connector_pos,
- output_name=output_connector.name)
+ output_name=output_connector.name) elif i < len(connectors["outputs"]):
connector = connectors["outputs"][i]
@@ -1448,7 +1452,7 @@
connector_pos = wx.Point(*input_connector.position)
if isinstance(element, FBD_Block):
connector = element.GetConnector(connector_pos,
- input_name=input_connector.name)
+ input_name=input_connector.name) elif i < len(connectors["inputs"]):
connector = connectors["inputs"][i]
@@ -1494,11 +1498,10 @@
- [wx.Point(*start_connector.GetPosition()),
- start_connector.GetDirection()],
- [wx.Point(*end_connector.GetPosition()),
- end_connector.GetDirection()])
+ [wx.Point(*start_connector.GetPosition()), start_connector.GetDirection()], + [wx.Point(*end_connector.GetPosition()), end_connector.GetDirection()]) start_connector.Wires.append((wire, 0))
end_connector.Wires.append((wire, -1))
wire.StartConnected = start_connector
@@ -1696,7 +1699,8 @@
if self.SelectedElement.GetStartConnected() in connected
else self.SelectedElement.GetStartConnected())
- self.AddWireMenuItems(menu, delete,
start_connector.GetDirection() == EAST and
not isinstance(start_connector.GetParentBlock(), SFC_Step))
@@ -1876,8 +1880,8 @@
# Add Wire to Viewer and connect it to blocks
- [wx.Point(*start_point), connector.GetDirection()],
- [wx.Point(*end_point), end_connector.GetDirection()])
+ [wx.Point(*start_point), connector.GetDirection()], + [wx.Point(*end_point), end_connector.GetDirection()]) connector.Connect((new_wire, 0), False)
end_connector.Connect((new_wire, -1), False)
@@ -1967,7 +1971,7 @@
if event.Leaving() and self.ToolTipElement is not None:
self.ToolTipElement.DestroyToolTip()
elif (not event.Entering() and
- gettime() - self.LastToolTipCheckTime > REFRESH_PERIOD):
+ gettime() - self.LastToolTipCheckTime > REFRESH_PERIOD): self.LastToolTipCheckTime = gettime()
if not event.Leaving() and not event.LeftUp() and not event.LeftDClick():
@@ -2163,8 +2167,8 @@
- [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback)
- for text, callback in items])
+ [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback) + for text, callback in items]) self.SelectedElement.StartConnected.HighlightParentBlock(False)
@@ -2270,7 +2274,8 @@
"functionBlock": ITEM_FUNCTIONBLOCK,
}.get(self.Controler.GetPouType(instance_type))
if pou_type is not None and instance_type in self.Controler.GetProjectPouNames(self.Debug):
- self.ParentWindow.OpenDebugViewer(pou_type,
+ self.ParentWindow.OpenDebugViewer( "%s.%s" % (self.GetInstancePath(True), self.SelectedElement.GetName()),
self.Controler.ComputePouName(instance_type))
@@ -2278,8 +2283,9 @@
if isinstance(self.SelectedElement, Wire):
if self.SelectedElement.EndConnected is not None:
- self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path,
- self.SelectedElement.EndConnected.GetType())
+ self.ParentWindow.OpenDebugViewer( + ITEM_VAR_LOCAL, iec_path, + self.SelectedElement.EndConnected.GetType()) self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path, "BOOL")
elif event.ControlDown() and not event.ShiftDown():
@@ -2289,8 +2295,9 @@
if instance_type in self.Controler.GetProjectPouNames(self.Debug):
- self.ParentWindow.EditProjectElement(ITEM_POU,
- self.Controler.ComputePouName(instance_type))
+ self.ParentWindow.EditProjectElement( + self.Controler.ComputePouName(instance_type)) self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
elif event.ControlDown() and event.ShiftDown():
@@ -2603,10 +2610,11 @@
values = dialog.GetValues()
values.setdefault("name", "")
- block = FBD_Block(self, values["type"], values["name"], id,
- values["extension"], values["inputs"],
- executionControl=values["executionControl"],
- executionOrder=values["executionOrder"])
+ self, values["type"], values["name"], id, + values["extension"], values["inputs"], + executionControl=values["executionControl"], + executionOrder=values["executionOrder"]) self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
@@ -2786,8 +2794,10 @@
if isinstance(block, SFC_Step):
choices.append(block.GetName())
dialog = wx.SingleChoiceDialog(self.ParentWindow,
- _("Add a new jump"), _("Please choose a target"),
- choices, wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ _("Please choose a target"), + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) if dialog.ShowModal() == wx.ID_OK:
jump = SFC_Jump(self, dialog.GetStringSelection(), id)
@@ -3052,8 +3062,10 @@
if isinstance(block, SFC_Step):
choices.append(block.GetName())
dialog = wx.SingleChoiceDialog(self.ParentWindow,
- _("Edit jump target"), _("Please choose a target"),
- choices, wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+ _("Please choose a target"), + wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL) indx = choices.index(jump.GetTarget())
dialog.SetSelection(indx)
--- a/graphics/FBD_Objects.py Fri Aug 18 12:36:31 2017 +0300
+++ b/graphics/FBD_Objects.py Fri Aug 18 20:14:38 2017 +0300
@@ -488,7 +488,7 @@
if self.ExecutionOrder != 0:
# Draw block execution order
dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - executionorder_size[0],
- self.Pos.y + self.Size[1] + 2)
+ self.Pos.y + self.Size[1] + 2) if not getattr(dc, "printing", False):
DrawHighlightedText(dc, self.Name, self.Highlights.get("name", []), name_pos[0], name_pos[1])
@@ -727,8 +727,8 @@
types = [INPUT, OUTPUT, INOUT]
- self.Parent.ChangeVariableType(self,
- types[(types.index(self.Type) + 1) % len(types)])
+ self.Parent.ChangeVariableType( + self, types[(types.index(self.Type) + 1) % len(types)]) # Edit the variable properties
self.Parent.EditVariableContent(self)
@@ -787,7 +787,7 @@
if self.ExecutionOrder != 0:
# Draw variable execution order
dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - executionorder_size[0],
- self.Pos.y + self.Size[1] + 2)
+ self.Pos.y + self.Size[1] + 2) if not getattr(dc, "printing", False):
DrawHighlightedText(dc, self.Name, self.Highlights, text_pos[0], text_pos[1])
@@ -1014,13 +1014,13 @@
dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
arrowsize = min(self.Size[1] / 2, (self.Size[0] - name_size[0] - 10) / 2)
dc.DrawLine(self.Pos.x, self.Pos.y, self.Pos.x + arrowsize,
- self.Pos.y + self.Size[1] / 2)
+ self.Pos.y + self.Size[1] / 2) dc.DrawLine(self.Pos.x + arrowsize, self.Pos.y + self.Size[1] / 2,
- self.Pos.x, self.Pos.y + self.Size[1])
+ self.Pos.x, self.Pos.y + self.Size[1]) dc.DrawLine(self.Pos.x + self.Size[0] - arrowsize, self.Pos.y,
- self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2)
+ self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2) dc.DrawLine(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2,
- self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1])
+ self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1]) text_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2,
self.Pos.y + (self.Size[1] - name_size[1]) / 2)
--- a/graphics/GraphicCommons.py Fri Aug 18 12:36:31 2017 +0300
+++ b/graphics/GraphicCommons.py Fri Aug 18 20:14:38 2017 +0300
@@ -1105,7 +1105,7 @@
parent = self.ParentBlock
return Connector(parent, self.Name, self.Type, wx.Point(self.Pos[0], self.Pos[1]),
- self.Direction, self.Negated)
+ self.Direction, self.Negated) # Returns the connector parent block
def GetParentBlock(self):
@@ -1934,7 +1934,7 @@
x2, y2 = self.Points[i + 1].x, self.Points[i + 1].y
# Calculate a rectangle around the segment
rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
- abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
+ abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE) test |= rect.InsideXY(pt.x, pt.y)
@@ -1942,13 +1942,13 @@
# Test the wire start point
rect = wx.Rect(self.Points[0].x - ANCHOR_DISTANCE, self.Points[0].y - ANCHOR_DISTANCE,
- 2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
+ 2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE) if rect.InsideXY(pt.x, pt.y):
# Test the wire end point
rect = wx.Rect(self.Points[-1].x - ANCHOR_DISTANCE, self.Points[-1].y - ANCHOR_DISTANCE,
- 2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
+ 2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE) if rect.InsideXY(pt.x, pt.y):
@@ -1962,7 +1962,7 @@
x2, y2 = self.Points[i + 1].x, self.Points[i + 1].y
# Calculate a rectangle around the segment
rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
- abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
+ abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE) if rect.InsideXY(pt.x, pt.y):
return i, self.Segments[i]
@@ -1976,9 +1976,9 @@
self.EndPoint = [None, vector(self.Points[-1], self.Points[-2])]
# Calculate the start and end points
self.StartPoint[0] = wx.Point(self.Points[0].x + CONNECTOR_SIZE * self.StartPoint[1][0],
- self.Points[0].y + CONNECTOR_SIZE * self.StartPoint[1][1])
+ self.Points[0].y + CONNECTOR_SIZE * self.StartPoint[1][1]) self.EndPoint[0] = wx.Point(self.Points[-1].x + CONNECTOR_SIZE * self.EndPoint[1][0],
- self.Points[-1].y + CONNECTOR_SIZE * self.EndPoint[1][1])
+ self.Points[-1].y + CONNECTOR_SIZE * self.EndPoint[1][1]) self.Points[0] = self.StartPoint[0]
self.Points[-1] = self.EndPoint[0]
# Calculate the segments directions
@@ -2013,9 +2013,9 @@
def GetPoints(self, invert=False):
points = self.VerifyPoints()
points[0] = wx.Point(points[0].x - CONNECTOR_SIZE * self.StartPoint[1][0],
- points[0].y - CONNECTOR_SIZE * self.StartPoint[1][1])
+ points[0].y - CONNECTOR_SIZE * self.StartPoint[1][1]) points[-1] = wx.Point(points[-1].x - CONNECTOR_SIZE * self.EndPoint[1][0],
- points[-1].y - CONNECTOR_SIZE * self.EndPoint[1][1])
+ points[-1].y - CONNECTOR_SIZE * self.EndPoint[1][1]) # An inversion of the list is asked
@@ -2055,9 +2055,9 @@
# Calculate the start enad end points with the minimum segment size in the right direction
end = wx.Point(self.EndPoint[0].x + self.EndPoint[1][0] * MIN_SEGMENT_SIZE,
- self.EndPoint[0].y + self.EndPoint[1][1] * MIN_SEGMENT_SIZE)
+ self.EndPoint[0].y + self.EndPoint[1][1] * MIN_SEGMENT_SIZE) start = wx.Point(self.StartPoint[0].x + self.StartPoint[1][0] * MIN_SEGMENT_SIZE,
- self.StartPoint[0].y + self.StartPoint[1][1] * MIN_SEGMENT_SIZE)
+ self.StartPoint[0].y + self.StartPoint[1][1] * MIN_SEGMENT_SIZE) # Evaluate the point till it's the last
while i < len(self.Points) - 1:
# The next point is the last
@@ -2069,15 +2069,17 @@
# If the end point is not in the start direction, a point is added
if v_end != self.Segments[0] or v_end == self.EndPoint[1]:
self.Points.insert(1, wx.Point(start.x, start.y))
- self.Segments.insert(1, DirectionChoice((self.Segments[0][1],
- self.Segments[0][0]), v_end, self.EndPoint[1]))
+ self.Segments.insert(1, DirectionChoice( + self.Segments[0][0]), v_end, self.EndPoint[1])) # The current point is the second
# The previous direction and the target direction are mainly opposed, a point is added
if product(v_end, self.Segments[0]) < 0:
self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
- self.Segments.insert(2, DirectionChoice((self.Segments[1][1],
- self.Segments[1][0]), v_end, self.EndPoint[1]))
+ self.Segments.insert(2, DirectionChoice( + self.Segments[1][0]), v_end, self.EndPoint[1])) # The previous direction and the end direction are the same or they are
# perpendiculars and the end direction points towards current segment
elif product(self.Segments[0], self.EndPoint[1]) >= 0 and product(self.Segments[1], self.EndPoint[1]) <= 0:
@@ -2089,8 +2091,9 @@
# If the previous direction and the end direction are the same, a point is added
if product(self.Segments[0], self.EndPoint[1]) > 0:
self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
- self.Segments.insert(2, DirectionChoice((self.Segments[1][1],
- self.Segments[1][0]), v_end, self.EndPoint[1]))
+ self.Segments.insert(2, DirectionChoice( + self.Segments[1][0]), v_end, self.EndPoint[1])) # Current point is positioned in the middle of start point
# and end point on the current direction and a point is added
@@ -2099,8 +2102,9 @@
if self.Segments[0][1] != 0:
self.Points[1].y = (end.y + start.y) / 2
self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
- self.Segments.insert(2, DirectionChoice((self.Segments[1][1],
- self.Segments[1][0]), v_end, self.EndPoint[1]))
+ self.Segments.insert(2, DirectionChoice( + self.Segments[1][0]), v_end, self.EndPoint[1])) # The previous direction and the end direction are perpendiculars
if product(self.Segments[i - 1], self.EndPoint[1]) == 0:
@@ -2142,8 +2146,12 @@
if self.Segments[1][1] != 0:
self.Points[2].y = (self.Points[1].y + end.y) / 2
self.Points.insert(3, wx.Point(self.Points[2].x, self.Points[2].y))
- self.Segments.insert(3, DirectionChoice((self.Segments[2][1],
- self.Segments[2][0]), v_end, self.EndPoint[1]))
+ DirectionChoice((self.Segments[2][1], # Current point is aligned with end point
if self.Segments[i - 1][0] != 0:
@@ -2163,16 +2171,22 @@
self.Points[i].y = (end.y + self.Points[i - 1].y) / 2
self.Points.insert(i + 1, wx.Point(self.Points[i].x, self.Points[i].y))
- self.Segments.insert(i + 1, DirectionChoice((self.Segments[i][1],
- self.Segments[i][0]), v_end, self.EndPoint[1]))
+ DirectionChoice((self.Segments[i][1], + self.Segments[i][0]), v_end, self.EndPoint[1])) # Current point is the first, and second is not mainly in the first direction
if i == 0 and product(vector(start, self.Points[1]), self.Segments[0]) < 0:
# If first and second directions aren't perpendiculars, a point is added
if product(self.Segments[0], self.Segments[1]) != 0:
self.Points.insert(1, wx.Point(start.x, start.y))
- self.Segments.insert(1, DirectionChoice((self.Segments[0][1],
- self.Segments[0][0]), vector(start, self.Points[1]), self.Segments[1]))
+ DirectionChoice((self.Segments[0][1], + vector(start, self.Points[1]), self.Points[1].x, self.Points[1].y = start.x, start.y
@@ -2235,9 +2249,9 @@
pointx = max(-dir[0] * MIN_SEGMENT_SIZE, min(int(round(point[0] * width / float(max(lastwidth, 1)))),
- width - dir[0] * MIN_SEGMENT_SIZE))
+ width - dir[0] * MIN_SEGMENT_SIZE)) pointy = max(-dir[1] * MIN_SEGMENT_SIZE, min(int(round(point[1] * height / float(max(lastheight, 1)))),
- height - dir[1] * MIN_SEGMENT_SIZE))
+ height - dir[1] * MIN_SEGMENT_SIZE)) self.Points[i] = wx.Point(minx + x + pointx, miny + y + pointy)
self.StartPoint[0] = self.Points[0]
self.EndPoint[0] = self.Points[-1]
@@ -2269,10 +2283,12 @@
- realpointx = max(-dir[0] * MIN_SEGMENT_SIZE, min(int(round(point[0])),
- width - dir[0] * MIN_SEGMENT_SIZE))
- realpointy = max(-dir[1] * MIN_SEGMENT_SIZE, min(int(round(point[1])),
- height - dir[1] * MIN_SEGMENT_SIZE))
+ realpointx = max(-dir[0] * MIN_SEGMENT_SIZE, + min(int(round(point[0])), + width - dir[0] * MIN_SEGMENT_SIZE)) + realpointy = max(-dir[1] * MIN_SEGMENT_SIZE, + min(int(round(point[1])), + height - dir[1] * MIN_SEGMENT_SIZE)) self.Points[i] = wx.Point(minx + x + realpointx, miny + y + realpointy)
self.StartPoint[0] = self.Points[0]
self.EndPoint[0] = self.Points[-1]
--- a/graphics/SFC_Objects.py Fri Aug 18 12:36:31 2017 +0300
+++ b/graphics/SFC_Objects.py Fri Aug 18 20:14:38 2017 +0300
@@ -401,7 +401,7 @@
if isinstance(output_block, SFC_Step):
output_block.MoveActionBlock((diffx, diffy))
wires[0][0].SetPoints([wx.Point(current_pos.x, current_pos.y + wire_size),
- wx.Point(current_pos.x, current_pos.y)])
+ wx.Point(current_pos.x, current_pos.y)]) if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0:
output_block.Move(diffx, diffy, self.Parent.Wires)
output_block.RefreshOutputPosition((diffx, diffy))
@@ -1202,10 +1202,11 @@
# Refresh the divergence bounding box
def RefreshBoundingBox(self):
if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]:
- self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y,
- self.Size[0] + 1, self.Size[1] + 1)
+ self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, + self.Size[0] + 1, self.Size[1] + 1) elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]:
- self.BoundingBox = wx.Rect(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y,
+ self.BoundingBox = wx.Rect( + self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y, self.Size[0] + 2 * SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Size[1] + 1)
# Refresh the position of wires connected to divergence
@@ -1593,8 +1594,8 @@
text_width, text_height = self.Parent.GetTextExtent(self.Target)
# Calculate the bounding box size
bbx_width = self.Size[0] + 2 + text_width
- self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y - CONNECTOR_SIZE,
- bbx_width + 1, self.Size[1] + CONNECTOR_SIZE + 1)
+ self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y - CONNECTOR_SIZE, + bbx_width + 1, self.Size[1] + CONNECTOR_SIZE + 1) # Returns the connector connected to input
def GetPreviousConnector(self):
@@ -1917,13 +1918,14 @@
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
self.Size = wx.Size(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], max(min_height, SFC_ACTION_MIN_SIZE[1], self.Size[1]))
self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
- SFC_ACTION_MIN_SIZE[0]), max(SFC_ACTION_MIN_SIZE[1], min_height)
+ SFC_ACTION_MIN_SIZE[0]), max(SFC_ACTION_MIN_SIZE[1], min_height) self.RefreshBoundingBox()
self.Size = wx.Size(max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
- SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1])
+ SFC_ACTION_MIN_SIZE[0]), + len(self.Actions) * SFC_ACTION_MIN_SIZE[1]) self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
- SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1]
+ SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1] self.RefreshBoundingBox()
if self.Input is not None:
wires = self.Input.GetWires()
@@ -2018,14 +2020,14 @@
# Draw plain rectangle for representing the action block
dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
dc.DrawLine(self.Pos.x + colsize[0], self.Pos.y,
- self.Pos.x + colsize[0], self.Pos.y + self.Size[1])
+ self.Pos.x + colsize[0], self.Pos.y + self.Size[1]) dc.DrawLine(self.Pos.x + colsize[0] + colsize[1], self.Pos.y,
- self.Pos.x + colsize[0] + colsize[1], self.Pos.y + self.Size[1])
+ self.Pos.x + colsize[0] + colsize[1], self.Pos.y + self.Size[1]) line_size = self.GetLineSize()
for i, action in enumerate(self.Actions):
dc.DrawLine(self.Pos.x, self.Pos.y + i * line_size,
- self.Pos.x + self.Size[0], self.Pos.y + i * line_size)
+ self.Pos.x + self.Size[0], self.Pos.y + i * line_size) qualifier_size = dc.GetTextExtent(action.qualifier)
if action.duration != "":
qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2,
--- a/xmlclass/xsdschema.py Fri Aug 18 12:36:31 2017 +0300
+++ b/xmlclass/xsdschema.py Fri Aug 18 20:14:38 2017 +0300
@@ -75,8 +75,8 @@
STRING_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["length", "minLength", "maxLength"])
ALL_FACETS = ["pattern", "whiteSpace", "enumeration", "maxInclusive",
- "maxExclusive", "minInclusive", "minExclusive", "totalDigits",
- "fractionDigits", "length", "minLength", "maxLength"]
+ "maxExclusive", "minInclusive", "minExclusive", "totalDigits", + "fractionDigits", "length", "minLength", "maxLength"] #-------------------------------------------------------------------------------
@@ -1143,7 +1143,8 @@
# Syntax elements definition
#-------------------------------------------------------------------------------
@@ -1153,13 +1154,15 @@
- "default": GenerateElement("all", ["id", "maxOccurs", "minOccurs"],
+ "default": GenerateElement( + "all", ["id", "maxOccurs", "minOccurs"], re.compile("((?:annotation )?(?:element )*)"))
- "annotation": {"struct": """
{any attributes with non-schema namespace . . .}>
@@ -1167,13 +1170,15 @@
- "default": GenerateElement("annotation", ["id"],
+ "default": GenerateElement( re.compile("((?:app_info |documentation )*)"))
"reduce": ReduceAnnotation
maxOccurs = (nonNegativeInteger | unbounded) : 1
@@ -1185,14 +1190,16 @@
- "default": GenerateElement("any",
+ "default": GenerateElement( ["id", "maxOccurs", "minOccurs", "namespace", "processContents"],
re.compile("((?:annotation )?(?:simpleType )*)"))
- "anyAttribute": {"struct": """
namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) ) : ##any
@@ -1202,13 +1209,14 @@
- "default": GenerateElement("anyAttribute",
- ["id", "namespace", "processContents"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "anyAttribute", ["id", "namespace", "processContents"], ONLY_ANNOTATION) "reduce": ReduceAnyAttribute
- "appinfo": {"struct": """
{any attributes with non-schema namespace . . .}>
@@ -1221,7 +1229,8 @@
- "attribute": {"struct": """
@@ -1236,17 +1245,20 @@
- "default": GenerateElement("attribute",
+ "default": GenerateElement( ["default", "fixed", "form", "id", "name", "ref", "type", "use"],
re.compile("((?:annotation )?(?:simpleType )?)")),
- "schema": GenerateElement("attribute",
+ "schema": GenerateElement( ["default", "fixed", "form", "id", "name", "type"],
re.compile("((?:annotation )?(?:simpleType )?)"))
"reduce": ReduceAttribute
- "attributeGroup": {"struct": """
@@ -1256,16 +1268,19 @@
- "default": GenerateElement("attributeGroup",
+ "default": GenerateElement( ["id", "ref"], ONLY_ANNOTATION),
- "schema": GenerateElement("attributeGroup",
+ "schema": GenerateElement( re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
"reduce": ReduceAttributeGroup
- "choice": {"struct": """
maxOccurs = (nonNegativeInteger | unbounded) : 1
@@ -1275,13 +1290,16 @@
- "default": GenerateElement("choice", ["id", "maxOccurs", "minOccurs"],
+ "default": GenerateElement( + ["id", "maxOccurs", "minOccurs"], re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
- "complexContent": {"struct": """
@@ -1290,13 +1308,16 @@
- "default": GenerateElement("complexContent", ["id", "mixed"],
+ "default": GenerateElement( re.compile("((?:annotation )?(?:restriction |extension ))"))
"reduce": ReduceComplexContent
- "complexType": {"struct": """
abstract = boolean : false
block = (#all | List of (extension | restriction))
@@ -1309,14 +1330,16 @@
- "default": GenerateElement("complexType",
+ "default": GenerateElement( ["abstract", "block", "final", "id", "mixed", "name"],
re.compile("((?:annotation )?(?:simpleContent |complexContent |(?:(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))))"))
"reduce": ReduceComplexType
- "documentation": {"struct": """
@@ -1325,13 +1348,16 @@
- "default": GenerateElement("documentation",
- ["source", "lang"], re.compile("(.*)"), True)
+ "default": GenerateElement( + re.compile("(.*)"), True) "reduce": ReduceDocumentation
- "element": {"struct": """
abstract = boolean : false
block = (#all | List of (extension | restriction | substitution))
@@ -1352,17 +1378,20 @@
- "default": GenerateElement("element",
+ "default": GenerateElement( ["abstract", "block", "default", "final", "fixed", "form", "id", "maxOccurs", "minOccurs", "name", "nillable", "ref", "substitutionGroup", "type"],
re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)")),
- "schema": GenerateElement("element",
+ "schema": GenerateElement( ["abstract", "block", "default", "final", "fixed", "form", "id", "name", "nillable", "substitutionGroup", "type"],
re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)"))
- "enumeration": {"struct": """
@@ -1376,7 +1405,8 @@
"reduce": GenerateFacetReducing("enumeration", False)
- "extension": {"struct": """
@@ -1385,15 +1415,20 @@
- "default": GenerateElement("extension", ["base", "id"],
+ "default": GenerateElement( re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")),
- "complexContent": GenerateElement("extension", ["base", "id"],
+ "complexContent": GenerateElement( re.compile("((?:annotation )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
"reduce": ReduceExtension
- "field": {"struct": """
xpath = a subset of XPath expression, see below
@@ -1407,7 +1442,8 @@
- "fractionDigits": {"struct": """
@@ -1417,13 +1453,16 @@
- "default": GenerateElement("fractionDigits",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + ["fixed", "id", "value"], "reduce": GenerateFacetReducing("fractionDigits", True)
- "group": {"struct": """
maxOccurs = (nonNegativeInteger | unbounded) : 1
@@ -1435,17 +1474,20 @@
- "default": GenerateElement("group",
+ "default": GenerateElement( ["id", "maxOccurs", "minOccurs", "ref"],
re.compile("((?:annotation )?(?:all |choice |sequence )?)")),
- "schema": GenerateElement("group",
+ "schema": GenerateElement( re.compile("((?:annotation )?(?:all |choice |sequence )?)"))
- "import": {"struct": """
@@ -1455,13 +1497,16 @@
- "default": GenerateElement("import",
- ["id", "namespace", "schemaLocation"], ONLY_ANNOTATION)
+ "default": GenerateElement( + ["id", "namespace", "schemaLocation"], - "include": {"struct": """
@@ -1470,13 +1515,16 @@
- "default": GenerateElement("include",
- ["id", "schemaLocation"], ONLY_ANNOTATION)
+ "default": GenerateElement( + ["id", "schemaLocation"],
@@ -1485,13 +1533,15 @@
- "default": GenerateElement("key", ["id", "name"],
+ "default": GenerateElement( re.compile("((?:annotation )?(?:selector (?:field )+))"))
- "keyref": {"struct": """
@@ -1501,13 +1551,15 @@
- "default": GenerateElement("keyref", ["id", "name", "refer"],
+ "default": GenerateElement( + "keyref", ["id", "name", "refer"], re.compile("((?:annotation )?(?:selector (?:field )+))"))
- "length": {"struct": """
@@ -1517,13 +1569,14 @@
- "default": GenerateElement("length",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "length", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("length", True)
@@ -1532,13 +1585,15 @@
- "default": GenerateElement("list", ["id", "itemType"],
+ "default": GenerateElement( + "list", ["id", "itemType"], re.compile("((?:annotation )?(?:simpleType )?)$"))
- "maxExclusive": {"struct": """
@@ -1548,13 +1603,14 @@
- "default": GenerateElement("maxExclusive",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "maxExclusive", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("maxExclusive", True)
- "maxInclusive": {"struct": """
@@ -1564,13 +1620,14 @@
- "default": GenerateElement("maxInclusive",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "maxInclusive", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("maxInclusive", True)
- "maxLength": {"struct": """
@@ -1580,13 +1637,14 @@
- "default": GenerateElement("maxLength",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "maxLength", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("maxLength", True)
- "minExclusive": {"struct": """
@@ -1596,13 +1654,14 @@
- "default": GenerateElement("minExclusive",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "minExclusive", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("minExclusive", True)
- "minInclusive": {"struct": """
@@ -1612,13 +1671,14 @@
- "default": GenerateElement("minInclusive",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "minInclusive", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("minInclusive", True)
- "minLength": {"struct": """
@@ -1628,13 +1688,14 @@
- "default": GenerateElement("minLength",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "minLength", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("minLength", True)
- "pattern": {"struct": """
@@ -1648,7 +1709,8 @@
"reduce": GenerateFacetReducing("pattern", False)
- "redefine": {"struct": """
@@ -1657,13 +1719,15 @@
- "default": GenerateElement("refine", ["id", "schemaLocation"],
+ "default": GenerateElement( + "refine", ["id", "schemaLocation"], re.compile("((?:annotation |(?:simpleType |complexType |group |attributeGroup ))*)"))
- "restriction": {"struct": """
@@ -1672,17 +1736,24 @@
- "default": GenerateElement("restriction", ["base", "id"],
+ "default": GenerateElement( re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)))")),
- "simpleContent": GenerateElement("restriction", ["base", "id"],
+ "simpleContent": GenerateElement( re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
- "complexContent": GenerateElement("restriction", ["base", "id"],
+ "complexContent": GenerateElement( re.compile("((?:annotation )?(?:(?:simpleType )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
"reduce": ReduceRestriction
- "schema": {"struct": """
attributeFormDefault = (qualified | unqualified) : unqualified
blockDefault = (#all | List of (extension | restriction | substitution)) : ''
@@ -1697,13 +1768,22 @@
- "default": GenerateElement("schema",
- ["attributeFormDefault", "blockDefault", "elementFormDefault", "finalDefault", "id", "targetNamespace", "version", "lang"],
+ "default": GenerateElement( + ["attributeFormDefault", re.compile("((?:include |import |redefine |annotation )*(?:(?:(?:simpleType |complexType |group |attributeGroup )|element |attribute |annotation )(?:annotation )*)*)"))
- "selector": {"struct": """
xpath = a subset of XPath expression, see below
@@ -1717,7 +1797,8 @@
- "sequence": {"struct": """
maxOccurs = (nonNegativeInteger | unbounded) : 1
@@ -1727,13 +1808,15 @@
- "default": GenerateElement("sequence", ["id", "maxOccurs", "minOccurs"],
+ "default": GenerateElement( + "sequence", ["id", "maxOccurs", "minOccurs"], re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
- "simpleContent": {"struct": """
{any attributes with non-schema namespace . . .}>
@@ -1741,13 +1824,15 @@
- "default": GenerateElement("simpleContent", ["id"],
+ "default": GenerateElement( + "simpleContent", ["id"], re.compile("((?:annotation )?(?:restriction |extension ))"))
"reduce": ReduceSimpleContent
- "simpleType": {"struct": """
final = (#all | List of (list | union | restriction))
@@ -1757,13 +1842,15 @@
- "default": GenerateElement("simpleType", ["final", "id", "name"],
+ "default": GenerateElement( + "simpleType", ["final", "id", "name"], re.compile("((?:annotation )?(?:restriction |list |union ))"))
"reduce": ReduceSimpleType
- "totalDigits": {"struct": """
@@ -1773,13 +1860,14 @@
- "default": GenerateElement("totalDigits",
- ["fixed", "id", "value"], ONLY_ANNOTATION),
+ "default": GenerateElement( + "totalDigits", ["fixed", "id", "value"], ONLY_ANNOTATION), "reduce": GenerateFacetReducing("totalDigits", True)
- "union": {"struct": """
memberTypes = List of QName
@@ -1788,13 +1876,15 @@
- "default": GenerateElement("union", ["id", "memberTypes"],
+ "default": GenerateElement( + "union", ["id", "memberTypes"], re.compile("((?:annotation )?(?:simpleType )*)"))
- "unique": {"struct": """
@@ -1803,13 +1893,15 @@
- "default": GenerateElement("unique", ["id", "name"],
+ "default": GenerateElement( + "unique", ["id", "name"], re.compile("((?:annotation )?(?:selector |(?:field )+))"))
- "whiteSpace": {"struct": """
@@ -1819,8 +1911,8 @@
- "default": GenerateElement("whiteSpace",
- ["fixed", "id", "value"], ONLY_ANNOTATION)
+ "default": GenerateElement( + "whiteSpace", ["fixed", "id", "value"], ONLY_ANNOTATION) "reduce": GenerateFacetReducing("whiteSpace", True)
@@ -1842,7 +1934,8 @@
"attributeFormDefault": {
- "default": GenerateEnumeratedExtraction("member attributeFormDefault", ["qualified", "unqualified"])
+ "default": GenerateEnumeratedExtraction( + "member attributeFormDefault", ["qualified", "unqualified"])