diff -r 6787754b251b -r b6572d0336c3 doc/doxygen/html/networkedit_8py-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/networkedit_8py-source.html Mon Jun 04 17:59:50 2007 +0200 @@ -0,0 +1,977 @@ + +
+00001 #!/usr/bin/env python +00002 # -*- coding: utf-8 -*- +00003 +00004 #This file is part of CanFestival, a library implementing CanOpen Stack. +00005 # +00006 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD +00007 # +00008 #See COPYING file for copyrights details. +00009 # +00010 #This library is free software; you can redistribute it and/or +00011 #modify it under the terms of the GNU Lesser General Public +00012 #License as published by the Free Software Foundation; either +00013 #version 2.1 of the License, or (at your option) any later version. +00014 # +00015 #This library is distributed in the hope that it will be useful, +00016 #but WITHOUT ANY WARRANTY; without even the implied warranty of +00017 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +00018 #Lesser General Public License for more details. +00019 # +00020 #You should have received a copy of the GNU Lesser General Public +00021 #License along with this library; if not, write to the Free Software +00022 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +00023 +00024 from wxPython.wx import * +00025 from wxPython.grid import * +00026 import wx +00027 from wx.lib.anchors import LayoutAnchors +00028 import wx.grid +00029 +00030 from types import * +00031 import os, re, platform, sys, time, traceback, getopt +00032 +00033 __version__ = "$Revision$" +00034 +00035 from nodelist import * +00036 from nodemanager import * +00037 from subindextable import * +00038 from commondialogs import * +00039 from doc_index.DS301_index import * +00040 +00041 def create(parent): +00042 return networkedit(parent) +00043 +00044 def usage(): +00045 print "\nUsage of networkedit.py :" +00046 print "\n %s [Projectpath]\n"%sys.argv[0] +00047 +00048 try: +00049 opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) +00050 except getopt.GetoptError: +00051 # print help information and exit: +00052 usage() +00053 sys.exit(2) +00054 +00055 for o, a in opts: +00056 if o in ("-h", "--help"): +00057 usage() +00058 sys.exit() +00059 +00060 if len(args) == 0: +00061 projectOpen = None +00062 elif len(args) == 1: +00063 projectOpen = args[0] +00064 else: +00065 usage() +00066 sys.exit(2) +00067 +00068 ScriptDirectory = sys.path[0] +00069 +00070 try: +00071 from wxPython.html import * +00072 +00073 wxEVT_HTML_URL_CLICK = wxNewId() +00074 +00075 def EVT_HTML_URL_CLICK(win, func): +00076 win.Connect(-1, -1, wxEVT_HTML_URL_CLICK, func) +00077 +00078 class wxHtmlWindowUrlClick(wxPyEvent): +00079 def __init__(self, linkinfo): +00080 wxPyEvent.__init__(self) +00081 self.SetEventType(wxEVT_HTML_URL_CLICK) +00082 self.linkinfolinkinfo = (linkinfo.GetHref(), linkinfo.GetTarget()) +00083 +00084 class wxUrlClickHtmlWindow(wxHtmlWindow): +00085 """ HTML window that generates and OnLinkClicked event. +00086 +00087 Use this to avoid having to override HTMLWindow +00088 """ +00089 def OnLinkClicked(self, linkinfo): +00090 wxPostEvent(self, wxHtmlWindowUrlClick(linkinfo)) +00091 +00092 #------------------------------------------------------------------------------- +00093 # Html Frame +00094 #------------------------------------------------------------------------------- +00095 +00096 [wxID_HTMLFRAME, wxID_HTMLFRAMEHTMLCONTENT] = [wx.NewId() for _init_ctrls in range(2)] +00097 +00098 class HtmlFrame(wx.Frame): +00099 def _init_ctrls(self, prnt): +00100 # generated method, don't edit +00101 wx.Frame.__init__(self, id=wxID_HTMLFRAME, name='HtmlFrame', +00102 parent=prnt, pos=wx.Point(320, 231), size=wx.Size(853, 616), +00103 style=wx.DEFAULT_FRAME_STYLE, title='') +00104 self.Bind(wx.EVT_CLOSE, self.OnCloseFrameOnCloseFrame, id=wxID_HTMLFRAME) +00105 +00106 self.HtmlContent = wxUrlClickHtmlWindow(id=wxID_HTMLFRAMEHTMLCONTENT, +00107 name='HtmlContent', parent=self, pos=wx.Point(0, 0), +00108 size=wx.Size(-1, -1), style=wxHW_SCROLLBAR_AUTO|wxHW_NO_SELECTION) +00109 EVT_HTML_URL_CLICK(self.HtmlContent, self.OnLinkClickOnLinkClick) +00110 +00111 def __init__(self, parent, opened): +00112 self._init_ctrls_init_ctrls(parent) +00113 self.HtmlFrameOpenedHtmlFrameOpened = opened +00114 +00115 def SetHtmlCode(self, htmlcode): +00116 self.HtmlContent.SetPage(htmlcode) +00117 +00118 def SetHtmlPage(self, htmlpage): +00119 self.HtmlContent.LoadPage(htmlpage) +00120 +00121 def OnCloseFrame(self, event): +00122 self.HtmlFrameOpenedHtmlFrameOpened.remove(self.GetTitle()) +00123 event.Skip() +00124 +00125 def OnLinkClick(self, event): +00126 url = event.linkinfo[0] +00127 try: +00128 import webbrowser +00129 except ImportError: +00130 wxMessageBox('Please point your browser at: %s' % url) +00131 else: +00132 webbrowser.open(url) +00133 +00134 Html_Window = True +00135 except: +00136 Html_Window = False +00137 +00138 +00139 [wxID_NETWORKEDIT, wxID_NETWORKEDITNETWORKNODES, +00140 wxID_NETWORKEDITHELPBAR, +00141 ] = [wx.NewId() for _init_ctrls in range(3)] +00142 +00143 [wxID_NETWORKEDITADDMENUITEMS0, wxID_NETWORKEDITADDMENUITEMS1, +00144 wxID_NETWORKEDITADDMENUITEMS2, wxID_NETWORKEDITADDMENUITEMS3, +00145 wxID_NETWORKEDITADDMENUITEMS4, wxID_NETWORKEDITADDMENUITEMS5, +00146 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)] +00147 +00148 [wxID_NETWORKEDITFILEMENUITEMS0, wxID_NETWORKEDITFILEMENUITEMS1, +00149 wxID_NETWORKEDITFILEMENUITEMS2, wxID_NETWORKEDITFILEMENUITEMS4, +00150 wxID_NETWORKEDITFILEMENUITEMS5, wxID_NETWORKEDITFILEMENUITEMS6, +00151 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(6)] +00152 +00153 [wxID_NETWORKEDITNETWORKMENUITEMS0, wxID_NETWORKEDITNETWORKMENUITEMS1, +00154 wxID_NETWORKEDITNETWORKMENUITEMS3, +00155 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(3)] +00156 +00157 +00158 [wxID_NETWORKEDITEDITMENUITEMS0, wxID_NETWORKEDITEDITMENUITEMS1, +00159 wxID_NETWORKEDITEDITMENUITEMS2, wxID_NETWORKEDITEDITMENUITEMS4, +00160 wxID_NETWORKEDITEDITMENUITEMS6, wxID_NETWORKEDITEDITMENUITEMS7, +00161 wxID_NETWORKEDITEDITMENUITEMS8, +00162 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)] +00163 +00164 [wxID_NETWORKEDITHELPMENUITEMS0, wxID_NETWORKEDITHELPMENUITEMS1, +00165 wxID_NETWORKEDITHELPMENUITEMS2, +00166 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(3)] +00167 +00168 class networkedit(wx.Frame): +00169 def _init_coll_menuBar1_Menus(self, parent): +00170 # generated method, don't edit +00171 +00172 if self.Mode == "solo": +00173 parent.Append(menu=self.FileMenu, title='File') +00174 parent.Append(menu=self.NetworkMenu, title='Network') +00175 parent.Append(menu=self.EditMenu, title='Edit') +00176 parent.Append(menu=self.AddMenu, title='Add') +00177 parent.Append(menu=self.HelpMenu, title='Help') +00178 +00179 def _init_coll_EditMenu_Items(self, parent): +00180 # generated method, don't edit +00181 +00182 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS4, +00183 kind=wx.ITEM_NORMAL, text='Refresh\tCTRL+R') +00184 parent.AppendSeparator() +00185 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS1, +00186 kind=wx.ITEM_NORMAL, text='Undo\tCTRL+Z') +00187 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS0, +00188 kind=wx.ITEM_NORMAL, text='Redo\tCTRL+Y') +00189 parent.AppendSeparator() +00190 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS6, +00191 kind=wx.ITEM_NORMAL, text='Node infos') +00192 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS2, +00193 kind=wx.ITEM_NORMAL, text='DS-301 Profile') +00194 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS8, +00195 kind=wx.ITEM_NORMAL, text='DS-302 Profile') +00196 parent.Append(help='', id=wxID_NETWORKEDITEDITMENUITEMS7, +00197 kind=wx.ITEM_NORMAL, text='Other Profile') +00198 self.Bind(wx.EVT_MENU, self.OnUndoMenu, +00199 id=wxID_NETWORKEDITEDITMENUITEMS1) +00200 self.Bind(wx.EVT_MENU, self.OnRedoMenu, +00201 id=wxID_NETWORKEDITEDITMENUITEMS0) +00202 self.Bind(wx.EVT_MENU, self.OnCommunicationMenu, +00203 id=wxID_NETWORKEDITEDITMENUITEMS2) +00204 self.Bind(wx.EVT_MENU, self.OnRefreshMenu, +00205 id=wxID_NETWORKEDITEDITMENUITEMS4) +00206 self.Bind(wx.EVT_MENU, self.OnNodeInfosMenu, +00207 id=wxID_NETWORKEDITEDITMENUITEMS6) +00208 self.Bind(wx.EVT_MENU, self.OnEditProfileMenu, +00209 id=wxID_NETWORKEDITEDITMENUITEMS7) +00210 self.Bind(wx.EVT_MENU, self.OnOtherCommunicationMenu, +00211 id=wxID_NETWORKEDITEDITMENUITEMS8) +00212 +00213 def _init_coll_HelpMenu_Items(self, parent): +00214 # generated method, don't edit +00215 +00216 parent.Append(help='', id=wxID_NETWORKEDITHELPMENUITEMS0, +00217 kind=wx.ITEM_NORMAL, text='DS-301 Standard\tF1') +00218 self.Bind(wx.EVT_MENU, self.OnHelpDS301Menu, +00219 id=wxID_NETWORKEDITHELPMENUITEMS0) +00220 parent.Append(help='', id=wxID_NETWORKEDITHELPMENUITEMS1, +00221 kind=wx.ITEM_NORMAL, text='CAN Festival Docs\tF2') +00222 self.Bind(wx.EVT_MENU, self.OnHelpCANFestivalMenu, +00223 id=wxID_NETWORKEDITHELPMENUITEMS1) +00224 if Html_Window and self.Mode == "solo": +00225 parent.Append(help='', id=wxID_NETWORKEDITHELPMENUITEMS2, +00226 kind=wx.ITEM_NORMAL, text='About') +00227 self.Bind(wx.EVT_MENU, self.OnAboutMenu, +00228 id=wxID_NETWORKEDITHELPMENUITEMS2) +00229 +00230 def _init_coll_FileMenu_Items(self, parent): +00231 # generated method, don't edit +00232 +00233 parent.Append(help='', id=wxID_NETWORKEDITFILEMENUITEMS5, +00234 kind=wx.ITEM_NORMAL, text='New\tCTRL+N') +00235 parent.Append(help='', id=wxID_NETWORKEDITFILEMENUITEMS0, +00236 kind=wx.ITEM_NORMAL, text='Open\tCTRL+O') +00237 parent.Append(help='', id=wxID_NETWORKEDITFILEMENUITEMS1, +00238 kind=wx.ITEM_NORMAL, text='Save\tCTRL+S') +00239 parent.Append(help='', id=wxID_NETWORKEDITFILEMENUITEMS2, +00240 kind=wx.ITEM_NORMAL, text='Close\tCTRL+W') +00241 parent.AppendSeparator() +00242 parent.Append(help='', id=wxID_NETWORKEDITFILEMENUITEMS4, +00243 kind=wx.ITEM_NORMAL, text='Exit') +00244 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, +00245 id=wxID_NETWORKEDITFILEMENUITEMS0) +00246 self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, +00247 id=wxID_NETWORKEDITFILEMENUITEMS1) +00248 ## self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, +00249 ## id=wxID_NETWORKEDITFILEMENUITEMS2) +00250 self.Bind(wx.EVT_MENU, self.OnQuitMenu, +00251 id=wxID_NETWORKEDITFILEMENUITEMS4) +00252 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, +00253 id=wxID_NETWORKEDITFILEMENUITEMS5) +00254 +00255 def _init_coll_NetworkMenu_Items(self, parent): +00256 # generated method, don't edit +00257 +00258 parent.Append(help='', id=wxID_NETWORKEDITNETWORKMENUITEMS0, +00259 kind=wx.ITEM_NORMAL, text='Add Slave Node') +00260 parent.Append(help='', id=wxID_NETWORKEDITNETWORKMENUITEMS1, +00261 kind=wx.ITEM_NORMAL, text='Remove Slave Node') +00262 parent.AppendSeparator() +00263 parent.Append(help='', id=wxID_NETWORKEDITNETWORKMENUITEMS3, +00264 kind=wx.ITEM_NORMAL, text='Build Master Dictionary') +00265 self.Bind(wx.EVT_MENU, self.OnAddSlaveMenu, +00266 id=wxID_NETWORKEDITNETWORKMENUITEMS0) +00267 self.Bind(wx.EVT_MENU, self.OnRemoveSlaveMenu, +00268 id=wxID_NETWORKEDITNETWORKMENUITEMS1) +00269 ## self.Bind(wx.EVT_MENU, self.OnBuildMasterMenu, +00270 ## id=wxID_NETWORKEDITNETWORKMENUITEMS3) +00271 +00272 def _init_coll_AddMenu_Items(self, parent): +00273 # generated method, don't edit +00274 +00275 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS0, +00276 kind=wx.ITEM_NORMAL, text='SDO Server') +00277 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS1, +00278 kind=wx.ITEM_NORMAL, text='SDO Client') +00279 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS2, +00280 kind=wx.ITEM_NORMAL, text='PDO Transmit') +00281 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS3, +00282 kind=wx.ITEM_NORMAL, text='PDO Receive') +00283 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS4, +00284 kind=wx.ITEM_NORMAL, text='Map Variable') +00285 parent.Append(help='', id=wxID_NETWORKEDITADDMENUITEMS5, +00286 kind=wx.ITEM_NORMAL, text='User Type') +00287 self.Bind(wx.EVT_MENU, self.OnAddSDOServerMenu, +00288 id=wxID_NETWORKEDITADDMENUITEMS0) +00289 self.Bind(wx.EVT_MENU, self.OnAddSDOClientMenu, +00290 id=wxID_NETWORKEDITADDMENUITEMS1) +00291 self.Bind(wx.EVT_MENU, self.OnAddPDOTransmitMenu, +00292 id=wxID_NETWORKEDITADDMENUITEMS2) +00293 self.Bind(wx.EVT_MENU, self.OnAddPDOReceiveMenu, +00294 id=wxID_NETWORKEDITADDMENUITEMS3) +00295 self.Bind(wx.EVT_MENU, self.OnAddMapVariableMenu, +00296 id=wxID_NETWORKEDITADDMENUITEMS4) +00297 self.Bind(wx.EVT_MENU, self.OnAddUserTypeMenu, +00298 id=wxID_NETWORKEDITADDMENUITEMS5) +00299 +00300 def _init_coll_HelpBar_Fields(self, parent): +00301 # generated method, don't edit +00302 parent.SetFieldsCount(3) +00303 +00304 parent.SetStatusText(number=0, text='') +00305 parent.SetStatusText(number=1, text='') +00306 parent.SetStatusText(number=2, text='') +00307 +00308 parent.SetStatusWidths([100, 110, -1]) +00309 +00310 def _init_utils(self): +00311 # generated method, don't edit +00312 self.menuBar1 = wx.MenuBar() +00313 self.menuBar1.SetEvtHandlerEnabled(True) +00314 +00315 if self.Mode == "solo": +00316 self.FileMenu = wx.Menu(title='') +00317 +00318 self.NetworkMenu = wx.Menu(title='') +00319 +00320 self.EditMenu = wx.Menu(title='') +00321 +00322 self.AddMenu = wx.Menu(title='') +00323 +00324 self.HelpMenu = wx.Menu(title='') +00325 +00326 self._init_coll_menuBar1_Menus(self.menuBar1) +00327 if self.Mode == "solo": +00328 self._init_coll_FileMenu_Items(self.FileMenu) +00329 self._init_coll_NetworkMenu_Items(self.NetworkMenu) +00330 self._init_coll_EditMenu_Items(self.EditMenu) +00331 self._init_coll_AddMenu_Items(self.AddMenu) +00332 self._init_coll_HelpMenu_Items(self.HelpMenu) +00333 +00334 def _init_ctrls(self, prnt): +00335 # generated method, don't edit +00336 wx.Frame.__init__(self, id=wxID_NETWORKEDIT, name='networkedit', +00337 parent=prnt, pos=wx.Point(149, 178), size=wx.Size(1000, 700), +00338 style=wx.DEFAULT_FRAME_STYLE, title='Networkedit') +00339 self._init_utils() +00340 self.SetClientSize(wx.Size(1000, 700)) +00341 self.SetMenuBar(self.menuBar1) +00342 ## self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=wxID_NETWORKEDIT) +00343 +00344 self.NetworkNodes = wx.Notebook(id=wxID_NETWORKEDITNETWORKNODES, +00345 name='NetworkNodes', parent=self, pos=wx.Point(0, 0), +00346 size=wx.Size(0, 0), style=wxNB_LEFT) +00347 self.NetworkNodes.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, +00348 self.OnNodeSelectedChanged, id=wxID_NETWORKEDITNETWORKNODES) +00349 +00350 self.HelpBar = wx.StatusBar(id=wxID_NETWORKEDITHELPBAR, name='HelpBar', +00351 parent=self, style=wxST_SIZEGRIP) +00352 self._init_coll_HelpBar_Fields(self.HelpBar) +00353 self.SetStatusBar(self.HelpBar) +00354 +00355 def __init__(self, parent, mode = "solo", nodelist = None): +00356 self.Mode = mode +00357 self._init_ctrls(parent) +00358 self.HtmlFrameOpened = [] +00359 +00360 if self.Mode == "solo": +00361 self.Manager = NodeManager(ScriptDirectory) +00362 if projectOpen: +00363 self.NodeList = NodeList(self.Manager) +00364 result = self.NodeList.LoadProject(projectOpen) +00365 if not result: +00366 self.RefreshNetworkNodes() +00367 else: +00368 self.NodeList = None +00369 else: +00370 self.NodeList = nodelist +00371 self.Manager = self.NodeList.GetManager() +00372 +00373 self.RefreshBufferState() +00374 self.RefreshTitle() +00375 self.RefreshMainMenu() +00376 +00377 def GetNoteBook(self): +00378 return self.NetworkNodes +00379 +00380 def OnQuitMenu(self, event): +00381 self.Close() +00382 event.Skip() +00383 +00384 def OnAddSDOServerMenu(self, event): +00385 self.Manager.AddSDOServerToCurrent() +00386 self.RefreshBufferState() +00387 self.RefreshCurrentIndexList() +00388 event.Skip() +00389 +00390 def OnAddSDOClientMenu(self, event): +00391 self.Manager.AddSDOClientToCurrent() +00392 self.RefreshBufferState() +00393 self.RefreshCurrentIndexList() +00394 event.Skip() +00395 +00396 def OnAddPDOTransmitMenu(self, event): +00397 self.Manager.AddPDOTransmitToCurrent() +00398 self.RefreshBufferState() +00399 self.RefreshCurrentIndexList() +00400 event.Skip() +00401 +00402 def OnAddPDOReceiveMenu(self, event): +00403 self.Manager.AddPDOReceiveToCurrent() +00404 self.RefreshBufferState() +00405 self.RefreshCurrentIndexList() +00406 event.Skip() +00407 +00408 def OnAddMapVariableMenu(self, event): +00409 self.AddMapVariable() +00410 event.Skip() +00411 +00412 def OnAddUserTypeMenu(self, event): +00413 self.AddUserType() +00414 event.Skip() +00415 +00416 def OnNodeSelectedChanged(self, event): +00417 selected = event.GetSelection() +00418 # At init selected = -1 +00419 if selected > 0: +00420 window = self.NetworkNodes.GetPage(selected) +00421 self.NodeList.SetCurrentSelected(window.GetIndex()) +00422 self.RefreshMainMenu() +00423 self.RefreshStatusBar() +00424 event.Skip() +00425 +00426 #------------------------------------------------------------------------------- +00427 # Load and Save Funtions +00428 #------------------------------------------------------------------------------- +00429 +00430 def OnNewProjectMenu(self, event): +00431 if self.NodeList: +00432 defaultpath = os.path.dirname(self.NodeList.GetRoot()) +00433 else: +00434 defaultpath = os.getcwd() +00435 dialog = wxDirDialog(self , "Choose a project", defaultpath, wxDD_NEW_DIR_BUTTON) +00436 if dialog.ShowModal() == wxID_OK: +00437 projectpath = dialog.GetPath() +00438 if os.path.isdir(projectpath) and len(os.listdir(projectpath)) == 0: +00439 manager = NodeManager(ScriptDirectory) +00440 nodelist = NodeList(manager) +00441 result = nodelist.LoadProject(projectpath) +00442 if not result: +00443 self.Manager = manager +00444 self.NodeList = nodelist +00445 self.NodeList.SetCurrentSelected(0) +00446 +00447 self.RefreshNetworkNodes() +00448 self.RefreshBufferState() +00449 self.RefreshTitle() +00450 self.RefreshProfileMenu() +00451 self.RefreshMainMenu() +00452 else: +00453 message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR) +00454 message.ShowModal() +00455 message.Destroy() +00456 event.Skip() +00457 +00458 def OnOpenProjectMenu(self, event): +00459 if self.NodeList: +00460 defaultpath = os.path.dirname(self.NodeList.GetRoot()) +00461 else: +00462 defaultpath = os.getcwd() +00463 dialog = wxDirDialog(self , "Choose a project", defaultpath, 0) +00464 if dialog.ShowModal() == wxID_OK: +00465 projectpath = dialog.GetPath() +00466 if os.path.isdir(projectpath): +00467 manager = NodeManager(ScriptDirectory) +00468 nodelist = NodeList(manager) +00469 result = nodelist.LoadProject(projectpath) +00470 if not result: +00471 self.Manager = manager +00472 self.NodeList = nodelist +00473 self.NodeList.SetCurrentSelected(0) +00474 +00475 self.RefreshNetworkNodes() +00476 self.RefreshBufferState() +00477 self.RefreshTitle() +00478 self.RefreshProfileMenu() +00479 self.RefreshMainMenu() +00480 else: +00481 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00482 message.ShowModal() +00483 message.Destroy() +00484 dialog.Destroy() +00485 event.Skip() +00486 +00487 def OnSaveProjectMenu(self, event): +00488 result = self.NodeList.SaveProject() +00489 if result: +00490 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00491 message.ShowModal() +00492 message.Destroy() +00493 event.Skip() +00494 +00495 #------------------------------------------------------------------------------- +00496 # Slave Nodes Management +00497 #------------------------------------------------------------------------------- +00498 +00499 def OnAddSlaveMenu(self, event): +00500 dialog = AddSlaveDialog(self) +00501 dialog.SetNodeList(self.NodeList) +00502 if dialog.ShowModal() == wxID_OK: +00503 values = dialog.GetValues() +00504 result = self.NodeList.AddSlaveNode(values["slaveName"], values["slaveNodeID"], values["edsFile"]) +00505 if not result: +00506 new_editingpanel = EditingPanel(self, self.NodeList, False) +00507 new_editingpanel.SetIndex(values["slaveNodeID"]) +00508 idx = self.NodeList.GetOrderNumber(values["slaveNodeID"]) +00509 self.NetworkNodes.InsertPage(idx, new_editingpanel, "") +00510 self.NodeList.SetCurrentSelected(idx) +00511 self.NetworkNodes.SetSelection(idx) +00512 self.RefreshBufferState() +00513 else: +00514 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00515 message.ShowModal() +00516 message.Destroy() +00517 dialog.Destroy() +00518 event.Skip() +00519 +00520 def OnRemoveSlaveMenu(self, event): +00521 slavenames = self.NodeList.GetSlaveNames() +00522 slaveids = self.NodeList.GetSlaveIDs() +00523 dialog = wxSingleChoiceDialog(self, "Choose a slave to remove", "Remove slave", slavenames) +00524 if dialog.ShowModal() == wxID_OK: +00525 choice = dialog.GetSelection() +00526 result = self.NodeList.RemoveSlaveNode(slaveids[choice]) +00527 if not result: +00528 slaveids.pop(choice) +00529 current = self.NetworkNodes.GetSelection() +00530 self.NetworkNodes.DeletePage(choice + 1) +00531 if self.NetworkNodes.GetPageCount() > 0: +00532 new_selection = min(current, self.NetworkNodes.GetPageCount() - 1) +00533 self.NetworkNodes.SetSelection(new_selection) +00534 if new_selection > 0: +00535 self.NodeList.SetCurrentSelected(slaveids[new_selection - 1]) +00536 self.RefreshBufferState() +00537 else: +00538 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00539 message.ShowModal() +00540 message.Destroy() +00541 event.Skip() +00542 +00543 #------------------------------------------------------------------------------- +00544 # Refresh Functions +00545 #------------------------------------------------------------------------------- +00546 +00547 def RefreshTitle(self): +00548 if self.NodeList != None: +00549 self.SetTitle("Networkedit - %s"%self.NodeList.GetNetworkName()) +00550 else: +00551 self.SetTitle("Networkedit") +00552 +00553 def OnRefreshMenu(self, event): +00554 self.RefreshCurrentIndexList() +00555 event.Skip() +00556 +00557 def RefreshCurrentIndexList(self): +00558 selected = self.NetworkNodes.GetSelection() +00559 if selected == 0: +00560 window = self.NetworkNodes.GetPage(selected) +00561 window.RefreshIndexList() +00562 else: +00563 pass +00564 +00565 def RefreshNetworkNodes(self): +00566 if self.NetworkNodes.GetPageCount() > 0: +00567 self.NetworkNodes.DeleteAllPages() +00568 if self.NodeList: +00569 new_editingpanel = EditingPanel(self, self.Manager) +00570 new_editingpanel.SetIndex(0) +00571 self.NetworkNodes.AddPage(new_editingpanel, "") +00572 for idx in self.NodeList.GetSlaveIDs(): +00573 new_editingpanel = EditingPanel(self, self.NodeList, False) +00574 new_editingpanel.SetIndex(idx) +00575 self.NetworkNodes.AddPage(new_editingpanel, "") +00576 +00577 def RefreshStatusBar(self): +00578 if self.HelpBar: +00579 window = self.NetworkNodes.GetPage(self.NetworkNodes.GetSelection()) +00580 selection = window.GetSelection() +00581 if selection: +00582 index, subIndex = selection +00583 if self.NodeList.IsCurrentEntry(index): +00584 self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0) +00585 self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1) +00586 entryinfos = self.NodeList.GetEntryInfos(index) +00587 name = entryinfos["name"] +00588 category = "Optional" +00589 if entryinfos["need"]: +00590 category = "Mandatory" +00591 struct = "VAR" +00592 number = "" +00593 if entryinfos["struct"] & OD_IdenticalIndexes: +00594 number = " possibly defined %d times"%entryinfos["nbmax"] +00595 if entryinfos["struct"] & OD_IdenticalSubindexes: +00596 struct = "REC" +00597 elif entryinfos["struct"] & OD_MultipleSubindexes: +00598 struct = "ARRAY" +00599 text = "%s: %s entry of struct %s%s."%(name,category,struct,number) +00600 self.HelpBar.SetStatusText(text, 2) +00601 else: +00602 for i in xrange(3): +00603 self.HelpBar.SetStatusText("", i) +00604 else: +00605 for i in xrange(3): +00606 self.HelpBar.SetStatusText("", i) +00607 +00608 def RefreshMainMenu(self): +00609 if self.menuBar1: +00610 self.NetworkMenu.Enable(wxID_NETWORKEDITNETWORKMENUITEMS3, False) +00611 if self.NodeList == None: +00612 if self.Mode == "solo": +00613 self.menuBar1.EnableTop(1, False) +00614 self.menuBar1.EnableTop(2, False) +00615 self.menuBar1.EnableTop(3, False) +00616 if self.FileMenu: +00617 self.FileMenu.Enable(wxID_NETWORKEDITFILEMENUITEMS1, False) +00618 self.FileMenu.Enable(wxID_NETWORKEDITFILEMENUITEMS2, False) +00619 else: +00620 self.menuBar1.EnableTop(0, False) +00621 self.menuBar1.EnableTop(1, False) +00622 self.menuBar1.EnableTop(2, False) +00623 else: +00624 if self.Mode == "solo": +00625 self.menuBar1.EnableTop(1, True) +00626 if self.FileMenu: +00627 self.FileMenu.Enable(wxID_NETWORKEDITFILEMENUITEMS1, True) +00628 self.FileMenu.Enable(wxID_NETWORKEDITFILEMENUITEMS2, False) +00629 if self.NetworkNodes.GetSelection() == 0: +00630 self.menuBar1.EnableTop(2, True) +00631 self.menuBar1.EnableTop(3, True) +00632 else: +00633 self.menuBar1.EnableTop(2, False) +00634 self.menuBar1.EnableTop(3, False) +00635 else: +00636 self.menuBar1.EnableTop(0, True) +00637 if self.NetworkNodes.GetSelection() == 0: +00638 self.menuBar1.EnableTop(1, True) +00639 self.menuBar1.EnableTop(2, True) +00640 else: +00641 self.menuBar1.EnableTop(1, False) +00642 self.menuBar1.EnableTop(2, False) +00643 +00644 def RefreshProfileMenu(self): +00645 if self.EditMenu: +00646 profile = self.Manager.GetCurrentProfileName() +00647 edititem = self.EditMenu.FindItemById(wxID_NETWORKEDITEDITMENUITEMS7) +00648 if edititem: +00649 length = self.AddMenu.GetMenuItemCount() +00650 for i in xrange(length-6): +00651 additem = self.AddMenu.FindItemByPosition(6) +00652 self.AddMenu.Delete(additem.GetId()) +00653 if profile not in ("None", "DS-301"): +00654 edititem.SetText("%s Profile"%profile) +00655 edititem.Enable(True) +00656 self.AddMenu.AppendSeparator() +00657 for text, indexes in self.Manager.GetCurrentSpecificMenu(): +00658 new_id = wx.NewId() +00659 self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) +00660 self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) +00661 else: +00662 edititem.SetText("Other Profile") +00663 edititem.Enable(False) +00664 +00665 #------------------------------------------------------------------------------- +00666 # Buffer Functions +00667 #------------------------------------------------------------------------------- +00668 +00669 def RefreshBufferState(self): +00670 if self.NodeList: +00671 nodeID = self.Manager.GetCurrentNodeID() +00672 if nodeID != None: +00673 nodename = "0x%2.2X %s"%(nodeID, self.Manager.GetCurrentNodeName()) +00674 else: +00675 nodename = self.Manager.GetCurrentNodeName() +00676 self.NetworkNodes.SetPageText(0, nodename) +00677 for idx, name in enumerate(self.NodeList.GetSlaveNames()): +00678 self.NetworkNodes.SetPageText(idx + 1, name) +00679 self.RefreshTitle() +00680 +00681 def OnUndoMenu(self, event): +00682 self.Manager.LoadCurrentPrevious() +00683 self.RefreshCurrentIndexList() +00684 self.RefreshBufferState() +00685 event.Skip() +00686 +00687 def OnRedoMenu(self, event): +00688 self.Manager.LoadCurrentNext() +00689 self.RefreshCurrentIndexList() +00690 self.RefreshBufferState() +00691 event.Skip() +00692 +00693 #------------------------------------------------------------------------------- +00694 # Help Method +00695 #------------------------------------------------------------------------------- +00696 +00697 def OnHelpDS301Menu(self, event): +00698 find_index = False +00699 selected = self.NetworkNodes.GetSelection() +00700 if selected >= 0: +00701 window = self.NetworkNodes.GetPage(selected) +00702 result = window.GetSelection() +00703 if result: +00704 find_index = True +00705 index, subIndex = result +00706 result = OpenPDFDocIndex(index, ScriptDirectory) +00707 if type(result) == StringType: +00708 message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR) +00709 message.ShowModal() +00710 message.Destroy() +00711 if not find_index: +00712 result = OpenPDFDocIndex(None, ScriptDirectory) +00713 if type(result) == StringType: +00714 message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR) +00715 message.ShowModal() +00716 message.Destroy() +00717 event.Skip() +00718 +00719 def OnHelpCANFestivalMenu(self, event): +00720 #self.OpenHtmlFrame("CAN Festival Reference", os.path.join(ScriptDirectory, "doc/canfestival.html"), wx.Size(1000, 600)) +00721 os.system("xpdf -remote CANFESTIVAL %s %d &"%(os.path.join(ScriptDirectory, "doc/manual_en.pdf"),16)) +00722 event.Skip() +00723 +00724 def OnAboutMenu(self, event): +00725 self.OpenHtmlFrame("About CAN Festival", os.path.join(ScriptDirectory, "doc/about.html"), wx.Size(500, 450)) +00726 event.Skip() +00727 +00728 def OpenHtmlFrame(self, title, file, size): +00729 if title not in self.HtmlFrameOpened: +00730 self.HtmlFrameOpened.append(title) +00731 window = HtmlFrame(self, self.HtmlFrameOpened) +00732 window.SetTitle(title) +00733 window.SetHtmlPage(file) +00734 window.SetClientSize(size) +00735 window.Show() +00736 +00737 #------------------------------------------------------------------------------- +00738 # Editing Profiles functions +00739 #------------------------------------------------------------------------------- +00740 +00741 def OnCommunicationMenu(self, event): +00742 dictionary,current = self.Manager.GetCurrentCommunicationLists() +00743 self.EditProfile("Edit DS-301 Profile", dictionary, current) +00744 event.Skip() +00745 +00746 def OnOtherCommunicationMenu(self, event): +00747 dictionary,current = self.Manager.GetCurrentDS302Lists() +00748 self.EditProfile("Edit DS-301 Profile", dictionary, current) +00749 event.Skip() +00750 +00751 def OnEditProfileMenu(self, event): +00752 title = "Edit %s Profile"%self.Manager.GetCurrentProfileName() +00753 dictionary,current = self.Manager.GetCurrentProfileLists() +00754 self.EditProfile(title, dictionary, current) +00755 event.Skip() +00756 +00757 def EditProfile(self, title, dictionary, current): +00758 dialog = CommunicationDialog(self) +00759 dialog.SetTitle(title) +00760 dialog.SetIndexDictionary(dictionary) +00761 dialog.SetCurrentList(current) +00762 dialog.RefreshLists() +00763 if dialog.ShowModal() == wxID_OK: +00764 new_profile = dialog.GetCurrentList() +00765 addinglist = [] +00766 removinglist = [] +00767 for index in new_profile: +00768 if index not in current: +00769 addinglist.append(index) +00770 for index in current: +00771 if index not in new_profile: +00772 removinglist.append(index) +00773 self.Manager.ManageEntriesOfCurrent(addinglist, removinglist) +00774 self.Manager.GenerateMapList() +00775 self.Manager.BufferCurrentNode() +00776 self.RefreshBufferState() +00777 self.RefreshCurrentIndexList() +00778 dialog.Destroy() +00779 +00780 #------------------------------------------------------------------------------- +00781 # Edit Node informations function +00782 #------------------------------------------------------------------------------- +00783 +00784 def OnNodeInfosMenu(self, event): +00785 dialog = NodeInfosDialog(self) +00786 name, id, type, description = self.Manager.GetCurrentNodeInfos() +00787 dialog.SetValues(name, id, type, description) +00788 if dialog.ShowModal() == wxID_OK: +00789 name, id, type, description = dialog.GetValues() +00790 self.Manager.SetCurrentNodeInfos(name, id, type, description) +00791 self.RefreshBufferState() +00792 self.RefreshProfileMenu() +00793 selected = self.FileOpened.GetSelection() +00794 if selected >= 0: +00795 window = self.FileOpened.GetPage(selected) +00796 window.RefreshTable() +00797 event.Skip() +00798 +00799 +00800 #------------------------------------------------------------------------------- +00801 # Add User Types and Variables +00802 #------------------------------------------------------------------------------- +00803 +00804 def AddMapVariable(self): +00805 index = self.Manager.GetCurrentNextMapIndex() +00806 if index: +00807 dialog = MapVariableDialog(self) +00808 dialog.SetIndex(index) +00809 if dialog.ShowModal() == wxID_OK: +00810 index, name, struct, number = dialog.GetValues() +00811 result = self.Manager.AddMapVariableToCurrent(index, name, struct, number) +00812 if type(result) != StringType: +00813 self.RefreshBufferState() +00814 self.RefreshCurrentIndexList() +00815 else: +00816 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00817 message.ShowModal() +00818 message.Destroy() +00819 dialog.Destroy() +00820 else: +00821 message = wxMessageDialog(self, result, "No map variable index left!", wxOK|wxICON_ERROR) +00822 message.ShowModal() +00823 message.Destroy() +00824 +00825 def AddUserType(self): +00826 dialog = UserTypeDialog(self) +00827 dialog.SetTypeList(self.Manager.GetCustomisableTypes()) +00828 if dialog.ShowModal() == wxID_OK: +00829 type, min, max, length = dialog.GetValues() +00830 result = self.Manager.AddUserTypeToCurrent(type, min, max, length) +00831 if not IsOfType(result, StringType): +00832 self.RefreshBufferState() +00833 self.RefreshCurrentIndexList() +00834 else: +00835 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR) +00836 message.ShowModal() +00837 message.Destroy() +00838 dialog.Destroy() +00839 +00840 #------------------------------------------------------------------------------- +00841 # Exception Handler +00842 #------------------------------------------------------------------------------- +00843 +00844 Max_Traceback_List_Size = 20 +00845 +00846 def Display_Exception_Dialog(e_type,e_value,e_tb): +00847 trcbck_lst = [] +00848 for i,line in enumerate(traceback.extract_tb(e_tb)): +00849 trcbck = " " + str(i+1) + ". " +00850 if line[0].find(os.getcwd()) == -1: +00851 trcbck += "file : " + str(line[0]) + ", " +00852 else: +00853 trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ", " +00854 trcbck += "line : " + str(line[1]) + ", " + "function : " + str(line[2]) +00855 trcbck_lst.append(trcbck) +00856 +00857 # Allow clicking.... +00858 cap = wx.Window_GetCapture() +00859 if cap: +00860 cap.ReleaseMouse() +00861 +00862 dlg = wx.SingleChoiceDialog(None, +00863 """ +00864 An error happens. +00865 +00866 Click on OK for saving an error report. +00867 +00868 Please contact LOLITech at: +00869 +33 (0)3 29 52 95 67 +00870 bugs_networkedit@lolitech.fr +00871 +00872 +00873 Error: +00874 """ + +00875 str(e_type) + " : " + str(e_value), +00876 "Error", +00877 trcbck_lst) +00878 try: +00879 res = (dlg.ShowModal() == wx.ID_OK) +00880 finally: +00881 dlg.Destroy() +00882 +00883 return res +00884 +00885 def Display_Error_Dialog(e_value): +00886 message = wxMessageDialog(None, str(e_value), "Error", wxOK|wxICON_ERROR) +00887 message.ShowModal() +00888 message.Destroy() +00889 +00890 def get_last_traceback(tb): +00891 while tb.tb_next: +00892 tb = tb.tb_next +00893 return tb +00894 +00895 +00896 def format_namespace(d, indent=' '): +00897 return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()]) +00898 +00899 +00900 ignored_exceptions = [] # a problem with a line in a module is only reported once per session +00901 +00902 def wxAddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]): +00903 +00904 def handle_exception(e_type, e_value, e_traceback): +00905 traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func +00906 last_tb = get_last_traceback(e_traceback) +00907 ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno) +00908 if str(e_value).startswith("!!!"): +00909 Display_Error_Dialog(e_value) +00910 elif ex not in ignored_exceptions: +00911 ignored_exceptions.append(ex) +00912 result = Display_Exception_Dialog(e_type,e_value,e_traceback) +00913 if result: +00914 info = { +00915 'app-title' : wx.GetApp().GetAppName(), # app_title +00916 'app-version' : app_version, +00917 'wx-version' : wx.VERSION_STRING, +00918 'wx-platform' : wx.Platform, +00919 'python-version' : platform.python_version(), #sys.version.split()[0], +00920 'platform' : platform.platform(), +00921 'e-type' : e_type, +00922 'e-value' : e_value, +00923 'date' : time.ctime(), +00924 'cwd' : os.getcwd(), +00925 } +00926 if e_traceback: +00927 info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value) +00928 last_tb = get_last_traceback(e_traceback) +00929 exception_locals = last_tb.tb_frame.f_locals # the locals at the level of the stack trace where the exception actually occurred +00930 info['locals'] = format_namespace(exception_locals) +00931 if 'self' in exception_locals: +00932 info['self'] = format_namespace(exception_locals['self'].__dict__) +00933 +00934 output = open(path+os.sep+"bug_report_"+info['date'].replace(':','-').replace(' ','_')+".txt",'w') +00935 lst = info.keys() +00936 lst.sort() +00937 for a in lst: +00938 output.write(a+":\n"+str(info[a])+"\n\n") +00939 +00940 #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args) +00941 sys.excepthook = handle_exception +00942 +00943 if __name__ == '__main__': +00944 app = wxPySimpleApp() +00945 wxInitAllImageHandlers() +00946 +00947 # Install a exception handle for bug reports +00948 wxAddExceptHook(os.getcwd(),__version__) +00949 +00950 frame = networkedit(None) +00951 +00952 frame.Show() +00953 app.MainLoop() +