plugins/svgui/svgui.py
changeset 37 625f52bba682
parent 20 d3cb5020997b
child 38 8cb20bc13a91
equal deleted inserted replaced
36:42e391e7c455 37:625f52bba682
     1 import os, sys
     1 import os, sys
     2 base_folder = os.path.split(sys.path[0])[0]
     2 base_folder = os.path.split(sys.path[0])[0]
     3 sys.path.append(os.path.join(base_folder, "wxsvg", "defeditor"))
     3 sys.path.append(os.path.join(base_folder, "wxsvg", "defeditor"))
     4 
     4 
     5 from DEFControler import DEFControler
     5 from DEFControler import *
     6 from defeditor import EditorFrame
     6 from defeditor import *
       
     7 from FBD_Objects import *
     7 
     8 
     8 class _EditorFramePlug(EditorFrame):
     9 class _EditorFramePlug(EditorFrame):
       
    10     """
       
    11     This Class add IEC specific features to the SVGUI DEFEditor :
       
    12         - FDB preview
       
    13         - FBD begin drag 
       
    14     """
       
    15     def __init__(self,controller):
       
    16         EditorFrame.__init__(self,controller)
       
    17         self.FbdWindow = wx.Panel(name='fbdwindow',parent=self.EditorPanel,
       
    18                                        pos=wx.Point(300, 355),size=wx.Size(240, 240),
       
    19                                        style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
    20         self.FbdWindow.SetBackgroundColour(wxColour(255,255,255))
       
    21         self.FbdWindow.Bind(wx.EVT_LEFT_DOWN, self.OnFbdClick)
       
    22         wx.EVT_PAINT(self.FbdWindow,self.OnPaintFBD)
       
    23         
       
    24         self.FbdData = None
       
    25         self.RefreshProjectTree()
       
    26         if (controller.SvgFilepath):
       
    27             self.OpenSVGFile(controller.filepath)
       
    28             self.mySVGctrl.Refresh()
       
    29         self.OnNewFile()
       
    30         self.RefreshFBD()
       
    31         
       
    32     def SetFbdDragData(self,selected_type):
       
    33         self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='')
       
    34         name = self.Controler.GetSelectedElementName()
       
    35         self.FbdData = str((selected_type,"functionBlock", name))
       
    36         
       
    37     def RefreshFBD(self):
       
    38         dc = wx.ClientDC(self.FbdWindow)
       
    39         dc.Clear()
       
    40         if self.Controler.HasOpenedProject():
       
    41             selected_type = self.Controler.GetSelectedElementType()
       
    42             if selected_type:
       
    43                 self.SetFbdDragData(selected_type)
       
    44                 self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='')
       
    45                 width,height = self.FbdBlock.GetMinSize()
       
    46                 self.FbdBlock.SetSize(width,height)
       
    47                 clientsize = self.FbdWindow.GetClientSize()
       
    48                 x = (clientsize.width - width) / 2
       
    49                 y = (clientsize.height - height) / 2
       
    50                 self.FbdBlock.SetPosition(x, y)
       
    51                 self.FbdBlock.Draw(dc)
       
    52                 
       
    53     def OnPaintFBD(self,event):
       
    54         self.RefreshFBD()
       
    55         event.Skip()
       
    56         
       
    57     def OnFbdClick(self,event):
       
    58         if self.FbdData:
       
    59             data = wx.TextDataObject(self.FbdData)
       
    60             DropSrc = wx.DropSource(self.FbdWindow)
       
    61             DropSrc.SetData(data)
       
    62             DropSrc.DoDragDrop()
       
    63             
       
    64     def OnProjectTreeItemSelected(self,event):
       
    65         EditorFrame.OnProjectTreeItemSelected(self,event)
       
    66         self.RefreshFBD()
       
    67         
       
    68     def OnNew(self,event):
       
    69         EditorFrame.OnNew(self,event)
       
    70         self.RefreshFBD()
       
    71         
       
    72     def OnOpen(self,event):
       
    73         EditorFrame.OnOpen(self,event)
       
    74         self.RefreshFBD()
       
    75         
       
    76     def OnGenerate(self,event):
       
    77         self.SaveProject()
       
    78         self.Controler.PlugGenerate_C(sys.path[0],(0,0,4,5),None)
       
    79         event.Skip()    
       
    80     
     9     def OnClose(self, event):
    81     def OnClose(self, event):
    10         self.OnPlugClose()
    82         self.OnPlugClose()
    11         event.Skip()
    83         event.Skip()
    12 
    84     
    13 class _DEFControlerPlug(DEFControler):
    85 """
    14 
    86 TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
    15     ViewClass = _EditorFramePlug
    87     "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
    16     
    88     "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"}
       
    89 """
       
    90 TYPECONVERSION = {"BOOL" : "X", "UINT" : "W","REAL" : "D","STRING" : "B"}
       
    91 CTYPECONVERSION = {"BOOL" : "bool", "UINT" : "unsigned int", "STRING" : "char*", "REAL" : "float"}
       
    92 CPRINTTYPECONVERSION = {"BOOL" : "d", "UINT" : "d", "STRING" : "s", "REAL" : "f"}
       
    93 class RootClass(DEFControler):
       
    94 
    17     def __init__(self, buspath):
    95     def __init__(self, buspath):
    18         filepath = os.path.join(buspath, "gui.def")
    96         DEFControler.__init__(self)
       
    97         filepath = os.path.join(self.PlugPath(), "gui.def")
       
    98         
    19         if os.path.isfile(filepath):
    99         if os.path.isfile(filepath):
       
   100             svgfile = os.path.join(self.PlugPath(), "gui.svg")
       
   101             if os.path.isfile(svgfile):
       
   102                 self.SvgFilepath = svgfile
    20             self.OpenXMLFile(filepath)
   103             self.OpenXMLFile(filepath)
    21         else:
   104         else:
    22             self.CreateRootElement()
   105             self.CreateRootElement()
    23             self.SetFilePath(filepath)
   106             self.SetFilePath(filepath)
    24 
   107 
    25     def ReqSave(self):
   108     def OnPlugSave(self):
    26         self.SaveXMLFile()
   109         self.SaveXMLFile()
    27         return True
   110         return True
    28 
   111     
    29     def Generate_C(self, dirpath, locations):
   112     def GenerateProgramHeadersPublicVars(self):
    30         self.GenerateProgram(filepath)
   113         fct = ""
    31         return {"headers":["program.h"],"sources":["program.cpp"]}
   114         fct += "    void OnPlcOutEvent(wxEvent& event);\n\n"
    32     
   115         fct += "    void IN_"+self.BusNumber+"();\n"
    33 TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
   116         fct += "    void OUT_"+self.BusNumber+"();\n"
    34     "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
   117         fct += "    void Initialize();\n"
    35     "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"}
   118         fct += "    void SetNoChanges();\n"
    36 
   119         fct += "    void Print();\n"
    37 class RootClass:
   120         return fct
    38     
   121     
    39     ChildsType = _DEFControlerPlug
   122     def GenerateProgramHeadersPrivateVars(self):
       
   123         text = ""
       
   124         elementsTab = self.GetElementsTab()
       
   125         for element in elementsTab:
       
   126             infos = element.getElementAttributes()
       
   127             for info in infos:
       
   128                 if info["name"] == "id":
       
   129                     element_id = str(info["value"])
       
   130             text += "    bool flag_"+element_id+";\n"
       
   131             text += "    volatile int step_"+element_id+";\n"
       
   132         text +="\n"
       
   133         #Declaration des variables
       
   134         for element in elementsTab:
       
   135             infos = element.getElementAttributes()
       
   136             for info in infos:
       
   137                 if info["name"] == "id":
       
   138                     element_id = str(info["value"])
       
   139             type = element.GetElementInfos()["type"]
       
   140             FbdBlock = self.GetBlockType(type)
       
   141             element_num_patte = 1
       
   142             for input in FbdBlock["inputs"]:
       
   143                 element_type = TYPECONVERSION[input[1]]
       
   144                 element_c_type = CTYPECONVERSION[input[1]]
       
   145                 line = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
       
   146                 text += "    "+element_c_type+" "+line
       
   147                 text += "    "+element_c_type+" _copy"+line
       
   148                 element_num_patte +=1
       
   149             element_num_patte = 1
       
   150             for output in FbdBlock["outputs"]:
       
   151                 element_type = TYPECONVERSION[output[1]]
       
   152                 element_c_type = CTYPECONVERSION[output[1]]
       
   153                     
       
   154                 line = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
       
   155                 text += "    "+element_c_type+" "+line
       
   156                 text += "    "+element_c_type+" _copy"+line
       
   157                 element_num_patte +=1
       
   158             text +="\n"
       
   159         return text
       
   160     
       
   161     def GenerateGlobalVarsAndFuncs(self):
       
   162         text = ""
       
   163         text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
       
   164         text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
       
   165         text += "SVGViewApp *myapp;\n"
       
   166         text += "pthread_t wxMainLoop,automate;\n"
       
   167         text += "int myargc;\n"
       
   168         text += "char** myargv;\n\n"
       
   169         
       
   170         text += "#define FREE_AND_NO_CHANGES 1 \n"
       
   171         text += "#define PLC_BUSY 2 \n"
       
   172         text += "#define FREE_AND_CHANGES 3 \n"
       
   173         text += "#define PLC_OUT_BUSY 4 \n\n"
       
   174         
       
   175         
       
   176         text += "void* InitWxEntry(void* args)\n{\n"
       
   177         text += "  wxEntry(myargc,myargv);\n"
       
   178         text += "  return args;\n"
       
   179         text += "}\n\n"
       
   180         
       
   181         text += "void* SimulAutomate(void* args)\n{\n"
       
   182         text += "  while(1){\n"
       
   183         text += "    myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"();\n"
       
   184         text += "    //printf(\"AUTOMATE\\n\");\n"
       
   185         text += "    myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"();\n"
       
   186         text += "    sleep(1);\n"
       
   187         text += "  }\n"
       
   188         text += "  return args;\n"
       
   189         text += "}\n\n"
       
   190         
       
   191         if (self.SVGUIRootElement):
       
   192             width = self.SVGUIRootElement.GetBBox().GetWidth()
       
   193             height = self.SVGUIRootElement.GetBBox().GetHeight()
       
   194         else :
       
   195             width = 250
       
   196             height = 350
       
   197         text += "bool SVGViewApp::OnInit()\n{\n"
       
   198         text += "  #ifndef __WXMSW__\n"
       
   199         text += "    setlocale(LC_NUMERIC, \"C\");\n"
       
   200         text += "  #endif\n"
       
   201         text += "  frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize((int)"+str(width)+", (int)"+str(height)+"));\n"
       
   202         text += "  myapp = this;\n"
       
   203         text += "  pthread_create(&automate, NULL, SimulAutomate, NULL);\n"
       
   204         text += "  return true;\n"
       
   205         text += "}\n\n"
       
   206         
       
   207         text += "int main(int argc, char** argv)\n{\n"
       
   208         text += "  myargc = argc;\n"
       
   209         text += "  myargv = argv;\n"
       
   210         text += "  pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL);\n"
       
   211         text += "  pause();\n"
       
   212         text += "}\n\n"
       
   213         
       
   214         return text
       
   215     
       
   216     def GenerateProgramEventTable(self):
       
   217         evt = ""        
       
   218         elementsTab = self.GetElementsTab()
       
   219         #evt += "wxEVT_PLCOUT = wxNewEventType();\n\n";
       
   220         evt += "BEGIN_DECLARE_EVENT_TYPES()\n"
       
   221         evt += "DECLARE_LOCAL_EVENT_TYPE( EVT_PLC, wxNewEventType() )\n"
       
   222         evt += "END_DECLARE_EVENT_TYPES()\n\n"
       
   223          
       
   224         evt += "DEFINE_LOCAL_EVENT_TYPE( EVT_PLC )\n\n"
       
   225         #Event Table Declaration
       
   226         evt += "BEGIN_EVENT_TABLE(Program, SVGUIWindow)\n"
       
   227         for element in elementsTab:
       
   228             infos = element.getElementAttributes()
       
   229             for info in infos:
       
   230                 if info["name"] == "id":
       
   231                     element_id = str(info["value"])
       
   232                 if info["name"] == "name":
       
   233                     element_name = str(info["value"])
       
   234             type = element.GetElementInfos()["type"]
       
   235             if type == "Button":
       
   236                 evt += "  EVT_BUTTON (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Click)\n"
       
   237             elif type == "ScrollBar":
       
   238                 pass
       
   239                 #evt += "  EVT_LEFT_UP (Program::OnClick)\n"
       
   240                 #evt += "  EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n"
       
   241             elif type == "RotatingCtrl":
       
   242                 evt += "  EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n"
       
   243             elif type == "NoteBook":
       
   244                 evt += "  EVT_NOTEBOOK_PAGE_CHANGED (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"TabChanged)\n"
       
   245             elif type == "Container" or type == "Transform":
       
   246                 evt += "  EVT_PAINT(Program::On"+element_name+"Paint)\n"
       
   247         evt += "  EVT_LEFT_UP (Program::OnClick)\n"
       
   248         evt += "  EVT_CUSTOM( EVT_PLC, wxID_ANY, Program::OnPlcOutEvent )\n"
       
   249         evt += "END_EVENT_TABLE()\n\n"
       
   250         return evt
       
   251     
       
   252     def GenerateProgramInitFrame(self):
       
   253         text = "MainFrame::MainFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,const wxSize& size, long style): wxFrame(parent, wxID_ANY, title, pos, size, style)\n{\n"
       
   254         text += "  m_svgCtrl = new Program(this);\n"
       
   255         text += "  if (m_svgCtrl->LoadFiles(wxT(\""+self.SvgFilepath+"\"), wxT(\""+self.filepath+"\")))\n"
       
   256         text += "  {\n"
       
   257         text += "    Show(true);\n"
       
   258         text += "    m_svgCtrl->SetFocus();\n"
       
   259         text += "    m_svgCtrl->SetFitToFrame(true);\n"
       
   260         text += "    m_svgCtrl->RefreshScale();\n"
       
   261         text += "    m_svgCtrl->InitScrollBars();\n"
       
   262         text += "    m_svgCtrl->Initialize();\n"
       
   263         text += "    m_svgCtrl->Update();\n"
       
   264         text += "    //m_svgCtrl->Print();\n"
       
   265         text += "  }\n"
       
   266         text += "  else\n"
       
   267         text += "  {\n"
       
   268         text += "    printf(\"Error while opening files\\n\");\n"
       
   269         text += "    exit(0);\n"
       
   270         text += "  }\n"
       
   271         text += "}\n\n\n"
       
   272         return text
       
   273     
       
   274     def GenerateProgramInitProgram(self):
       
   275         elementsTab = self.GetElementsTab()
       
   276         text = "Program::Program(wxWindow* parent):SVGUIWindow(parent)\n{\n"
       
   277         for element in elementsTab:
       
   278             infos = element.getElementAttributes()
       
   279             for info in infos:
       
   280                 if info["name"] == "id":
       
   281                     element_id = str(info["value"])
       
   282             text += "    flag_"+element_id+" = true;\n"
       
   283             text += "    step_"+element_id+" = FREE_AND_NO_CHANGES;\n"
       
   284         text += "}\n\n"
       
   285         return text
       
   286     
       
   287     def GenerateProgramEventFunctions(self):
       
   288         fct=""
       
   289         elementsTab = self.GetElementsTab()
       
   290         for element in elementsTab:
       
   291             infos = element.getElementAttributes()
       
   292             for info in infos:
       
   293                 if info["name"] == "id":
       
   294                     element_id = str(info["value"])
       
   295                 if info["name"] == "name":
       
   296                     element_name = str(info["value"])
       
   297             type = element.GetElementInfos()["type"]
       
   298             FbdBlock = self.GetBlockType(type)
       
   299             if type == "Button":
       
   300                 fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n"
       
   301                 fct += "  if (flag_"+element_id+")\n  {\n"
       
   302                 fct += "    flag_"+element_id+" = false;\n"
       
   303                 element_num_patte = 1
       
   304                 for output in FbdBlock["outputs"]:
       
   305                     element_type = TYPECONVERSION[output[1]]
       
   306                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
       
   307                     element_num_patte +=1
       
   308                 fct += "    flag_"+element_id+" = true;\n"
       
   309                 fct += "  }\n"
       
   310                 fct += "  event.Skip();\n"
       
   311                 fct += "}\n\n"               
       
   312                 
       
   313             elif type == "RotatingCtrl":
       
   314                 fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n"
       
   315                 fct += "  SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   316                 fct += "  rotating->SendScrollEvent(event);\n"
       
   317                 fct += "  double angle = rotating->GetAngle();\n"
       
   318                 fct += "  if (flag_"+element_id+")\n  {\n"
       
   319                 fct += "    flag_"+element_id+" = false;\n"
       
   320                 element_num_patte = 1
       
   321                 for output in FbdBlock["outputs"]:
       
   322                     element_type = TYPECONVERSION[output[1]]
       
   323                     
       
   324                     if element_num_patte == 1:
       
   325                         value = "angle"
       
   326                     elif element_num_patte == 2:
       
   327                         value = "true"
       
   328                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
       
   329                     element_num_patte +=1
       
   330                 fct += "    flag_"+element_id+" = true;\n"
       
   331                 fct += "  }\n"
       
   332                 fct += "}\n\n"
       
   333             elif type == "NoteBook":
       
   334                 fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n"
       
   335                 fct += "  SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   336                 fct += "  notebook->SendNotebookEvent(event);\n"
       
   337                 fct += "  unsigned int selected = notebook->GetCurrentPage();\n"
       
   338                 fct += "  if (flag_"+element_id+")\n  {\n"
       
   339                 fct += "    flag_"+element_id+" = false;\n"
       
   340                 element_num_patte = 1
       
   341                 for output in FbdBlock["outputs"]:
       
   342                     element_type = TYPECONVERSION[output[1]]
       
   343                     
       
   344                     if element_num_patte == 1:
       
   345                         value = "selected"
       
   346                     elif element_num_patte == 2:
       
   347                         value = "true"
       
   348                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
       
   349                     element_num_patte +=1
       
   350                 fct += "    flag_"+element_id+" = true;\n"
       
   351                 fct += "  }\n"
       
   352                 fct += "}\n\n"
       
   353             elif type == "Transform":
       
   354                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
       
   355                 fct += "  SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   356                 fct += "  if (flag_"+element_id+")\n  {\n"
       
   357                 fct += "    flag_"+element_id+" = false;\n"
       
   358                 element_num_patte = 1
       
   359                 for output in FbdBlock["outputs"]:                    
       
   360                     if element_num_patte == 1:
       
   361                         fct += "    if (transform->GetX() != _copy__QD"+self.BusNumber+"_"+element_id+"_1)\n"
       
   362                         fct += "    {\n"
       
   363                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
       
   364                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
       
   365                         fct += "    }\n"
       
   366                     elif element_num_patte == 2:
       
   367                         fct += "    if (transform->GetY() != _copy__QD"+self.BusNumber+"_"+element_id+"_2)\n"
       
   368                         fct += "    {\n"
       
   369                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
       
   370                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
       
   371                         fct += "    }\n"
       
   372                     elif element_num_patte == 3:
       
   373                         fct += "    if (transform->GetXScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_3)\n"
       
   374                         fct += "    {\n"
       
   375                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
       
   376                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
       
   377                         fct += "    }\n"
       
   378                     elif element_num_patte == 4:
       
   379                         fct += "    if (transform->GetYScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_4)\n"
       
   380                         fct += "    {\n"
       
   381                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
       
   382                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
       
   383                         fct += "    }\n"
       
   384                     elif element_num_patte == 5:
       
   385                         fct += "    if (transform->GetAngle() != _copy__QD"+self.BusNumber+"_"+element_id+"_5)\n"
       
   386                         fct += "    {\n"
       
   387                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
       
   388                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
       
   389                         fct += "    }\n"
       
   390                     element_num_patte +=1
       
   391                 fct += "    flag_"+element_id+" = true;\n"
       
   392                 fct += "  }\n"
       
   393                 fct += "  event.Skip();\n"
       
   394                 fct += "}\n\n"
       
   395             elif type == "Container":
       
   396                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
       
   397                 fct += "  SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   398                 fct += "  if (container->IsVisible() != _copy__QX"+self.BusNumber+"_"+element_id+"_1  && flag_"+element_id+")\n"
       
   399                 fct += "  {\n"
       
   400                 fct += "    flag_"+element_id+" = false;\n"
       
   401                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
       
   402                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
       
   403                 fct += "    flag_"+element_id+" = true;\n"
       
   404                 fct += "  }\n"
       
   405                 fct += "  event.Skip();\n"
       
   406                 fct += "}\n\n"
       
   407         
       
   408         fct += "void Program::OnChar(wxKeyEvent& event)\n{\n"
       
   409         fct += "  SVGUIContainer* container = GetSVGUIRootElement();\n"
       
   410         fct += "  if (container->GetFocusedElementName() == wxT(\"TextCtrl\"))\n"
       
   411         fct += "  {\n"
       
   412         fct += "    wxString focusedId = container->GetFocusedElement();\n"
       
   413         fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(container->GetFocusedElement());\n"
       
   414         fct += "    text->SendKeyEvent(event);\n"
       
   415         for element in elementsTab:
       
   416             infos = element.getElementAttributes()
       
   417             for info in infos:
       
   418                 if info["name"] == "id":
       
   419                     element_id = str(info["value"])
       
   420             type = element.GetElementInfos()["type"]
       
   421             FbdBlock = self.GetBlockType(type)
       
   422             if type == "TextCtrl":
       
   423                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
       
   424                 fct += "    {\n"
       
   425                 fct += "      flag_"+element_id+" = false;\n"
       
   426                 fct += "      _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
       
   427                 fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
       
   428                 fct += "      flag_"+element_id+" = true;\n"
       
   429                 fct += "    }\n"
       
   430         fct += "  }\n"
       
   431         fct += "}\n"
       
   432 
       
   433         
       
   434         
       
   435         fct += "void Program::OnClick(wxMouseEvent& event)\n{\n"
       
   436         fct += "  SVGUIContainer* container = GetSVGUIRootElement();\n"
       
   437         fct += "  if (container->GetFocusedElementName() == wxT(\"ScrollBar\"))\n"
       
   438         fct += "  {\n"
       
   439         fct += "    wxString focusedId = container->GetFocusedElement();\n"
       
   440         fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(focusedId);\n"
       
   441         fct += "    scrollbar->SendMouseEvent(event);\n"
       
   442         for element in elementsTab:
       
   443             infos = element.getElementAttributes()
       
   444             for info in infos:
       
   445                 if info["name"] == "id":
       
   446                     element_id = str(info["value"])
       
   447             type = element.GetElementInfos()["type"]
       
   448             FbdBlock = self.GetBlockType(type)
       
   449             if type == "ScrollBar":
       
   450                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
       
   451                 fct += "    {\n"
       
   452                 fct += "      flag_"+element_id+" = false;\n"
       
   453                 fct += "      unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
       
   454                 fct += "      _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
       
   455                 fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
       
   456                 fct += "      flag_"+element_id+" = true;\n"
       
   457                 fct += "    }\n"
       
   458         fct += "  }\n"
       
   459         fct += "  event.Skip();\n"
       
   460         fct += "}\n"
       
   461 
       
   462         
       
   463         
       
   464         
       
   465         fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n"
       
   466         fct += "  int old_state;\n"
       
   467         for element in elementsTab:
       
   468             infos = element.getElementAttributes()
       
   469             for info in infos:
       
   470                 if info["name"] == "id":
       
   471                     element_id = str(info["value"])
       
   472             type = element.GetElementInfos()["type"]
       
   473             FbdBlock = self.GetBlockType(type)
       
   474             if type == "Button":
       
   475                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   476                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   477                 fct += "  {\n"
       
   478                 fct += "    flag_"+element_id+" = false;\n"
       
   479                 fct += "    SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   480                 fct += "    if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
       
   481                 fct += "      button->Show();\n"
       
   482                 fct += "    else\n"
       
   483                 fct += "      button->Hide();\n"
       
   484                 fct += "    flag_"+element_id+" = true;\n"
       
   485                 fct += "  }\n"
       
   486                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   487             elif type == "Container":
       
   488                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   489                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   490                 fct += "  {\n"
       
   491                 fct += "    flag_"+element_id+" = false;\n"
       
   492                 fct += "    SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   493                 fct += "    if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
       
   494                 fct += "      container->Show();\n"
       
   495                 fct += "    else\n"
       
   496                 fct += "      container->Hide();\n"
       
   497                 fct += "    flag_"+element_id+" = true;\n"
       
   498                 fct += "  }\n"
       
   499                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   500             elif type == "TextCtrl":
       
   501                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   502                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   503                 fct += "  {\n"
       
   504                 fct += "    flag_"+element_id+" = false;\n"
       
   505                 fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   506                 fct += "    wxString str = wxString::FromAscii(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n"
       
   507                 fct += "    text->SetText(str);\n"
       
   508                 fct += "    flag_"+element_id+" = true;\n"
       
   509                 fct += "  }\n"
       
   510                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   511             elif type == "ScrollBar":
       
   512                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   513                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   514                 fct += "  {\n"
       
   515                 fct += "    flag_"+element_id+" = false;\n"
       
   516                 fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   517                 fct += "    scrollbar->SetThumbPosition(_copy__IW"+self.BusNumber+"_"+element_id+"_1);\n"
       
   518                 fct += "    flag_"+element_id+" = true;\n"
       
   519                 fct += "  }\n"
       
   520                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   521             elif type == "RotatingCtrl":
       
   522                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   523                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   524                 fct += "  {\n"
       
   525                 fct += "    flag_"+element_id+" = false;\n"
       
   526                 fct += "    SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   527                 fct += "    rotating->SetAngle(_copy__ID"+self.BusNumber+"_"+element_id+"_1);\n"
       
   528                 fct += "    flag_"+element_id+" = true;\n"
       
   529                 fct += "  }\n"
       
   530                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   531             elif type == "NoteBook":
       
   532                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   533                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   534                 fct += "  {\n"
       
   535                 fct += "    flag_"+element_id+" = false;\n"
       
   536                 fct += "    SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   537                 fct += "    notebook->SetCurrentPage(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n"
       
   538                 fct += "    flag_"+element_id+" = true;\n"
       
   539                 fct += "  }\n"
       
   540                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   541             elif type == "Transform":
       
   542                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
       
   543                 fct += "  if (_copy__IX"+self.BusNumber+"_"+element_id+"_6 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
       
   544                 fct += "  {\n"
       
   545                 fct += "    flag_"+element_id+" = false;\n"
       
   546                 fct += "    SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   547                 fct += "    transform->Move(_copy__ID"+self.BusNumber+"_"+element_id+"_1,_copy__ID"+self.BusNumber+"_"+element_id+"_2);\n"
       
   548                 fct += "    transform->Scale(_copy__ID"+self.BusNumber+"_"+element_id+"_3,_copy__ID"+self.BusNumber+"_"+element_id+"_4);\n"
       
   549                 fct += "    transform->Rotate(_copy__ID"+self.BusNumber+"_"+element_id+"_5);\n"
       
   550                 fct += "    flag_"+element_id+" = true;\n"
       
   551                 fct += "  }\n"
       
   552                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
       
   553         fct += "  Update_Elements();\n"
       
   554         fct += "  Refresh();\n"
       
   555         fct += "  event.Skip();\n"
       
   556         fct += "}\n\n"
       
   557         return fct
       
   558     
       
   559     def GenerateProgramPrivateFunctions(self):
       
   560         elementsTab = self.GetElementsTab()
       
   561         fct = "void Program::OUT_"+self.BusNumber+"()\n{\n"
       
   562         for element in elementsTab:
       
   563             infos = element.getElementAttributes()
       
   564             for info in infos:
       
   565                 if info["name"] == "id":
       
   566                     element_id = str(info["value"])
       
   567             type = element.GetElementInfos()["type"]
       
   568             FbdBlock = self.GetBlockType(type)
       
   569             fct += "  if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", PLC_BUSY, FREE_AND_CHANGES) == PLC_BUSY){\n"
       
   570             #fct += "  if ( flag_"+element_id+" ){\n"
       
   571             fct += "    flag_"+element_id+" = false;\n"
       
   572             element_num_patte = 1
       
   573             for input in FbdBlock["inputs"]:
       
   574                 element_type = TYPECONVERSION[input[1]]
       
   575                 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
       
   576                 fct +="    _copy"+var+ " = "+var+";\n"
       
   577                 element_num_patte +=1
       
   578             fct += "    flag_"+element_id+" = true;\n"
       
   579             fct += "  }\n"
       
   580         fct +="  wxCommandEvent event( EVT_PLC );\n"
       
   581         fct +="  ProcessEvent(event);\n"
       
   582         fct +="};\n\n" 
       
   583         
       
   584         fct += "void Program::IN_"+self.BusNumber+"()\n{\n"
       
   585 
       
   586         for element in elementsTab:
       
   587             infos = element.getElementAttributes()
       
   588             for info in infos:
       
   589                 if info["name"] == "id":
       
   590                     element_id = str(info["value"])
       
   591             type = element.GetElementInfos()["type"]
       
   592             FbdBlock = self.GetBlockType(type)
       
   593             fct += "  if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_NO_CHANGES, PLC_BUSY) == FREE_AND_NO_CHANGES){\n"
       
   594             fct += "    flag_"+element_id+" = false;\n"
       
   595             element_num_patte = 1
       
   596             for output in FbdBlock["outputs"]:
       
   597                 element_type = TYPECONVERSION[output[1]]
       
   598                 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
       
   599                 fct +="     "+var+ " = _copy"+var+";\n"
       
   600                 element_num_patte +=1
       
   601             fct += "    flag_"+element_id+" = true;\n"
       
   602             fct += "  }\n"
       
   603         fct += "  SetNoChanges();\n"
       
   604         fct +="};\n\n" 
       
   605         
       
   606         fct += "void Program::Initialize()\n{\n"
       
   607         button = False
       
   608         container = False
       
   609         textctrl = False
       
   610         scrollbar = False
       
   611         rotatingctrl = False
       
   612         notebook = False
       
   613         transform = False
       
   614         for element in elementsTab:
       
   615             infos = element.getElementAttributes()
       
   616             for info in infos:
       
   617                 if info["name"] == "id":
       
   618                     element_id = str(info["value"])
       
   619             type = element.GetElementInfos()["type"]
       
   620             FbdBlock = self.GetBlockType(type)
       
   621             if type == "Button":
       
   622                 if (not button):
       
   623                     fct += "  SVGUIButton* button;\n"
       
   624                 fct += "  button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   625                 fct += "  if (button->IsVisible())\n"
       
   626                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
       
   627                 fct += "  else\n"
       
   628                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
       
   629                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   630                 button = True
       
   631             elif type == "Container":
       
   632                 if (not container):
       
   633                     fct += "  SVGUIContainer* container;\n"
       
   634                 fct += "  container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   635                 fct += "  if (container->IsVisible())\n"
       
   636                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
       
   637                 fct += "  else\n"
       
   638                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
       
   639                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   640                 container = True
       
   641             elif type == "TextCtrl":
       
   642                 if (not textctrl):
       
   643                     fct += "  SVGUITextCtrl* text;\n"
       
   644                 fct += "  text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   645                 fct += "  _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
       
   646                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   647                 textctrl = True
       
   648             elif type == "ScrollBar":
       
   649                 if (not scrollbar):
       
   650                     fct += "  SVGUIScrollBar* scrollbar;\n"
       
   651                 fct += "  scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   652                 fct += "  _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollbar->GetThumbPosition();\n"
       
   653                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   654                 scrollbar = True
       
   655             elif type == "RotatingCtrl":
       
   656                 if (not rotatingctrl):
       
   657                     fct += "  SVGUIRotatingCtrl* rotating;\n"
       
   658                 fct += "  rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   659                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_1 = rotating->GetAngle();\n"
       
   660                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   661                 rotatingctrl = True
       
   662             elif type == "NoteBook":
       
   663                 if (not notebook):
       
   664                     fct += "  SVGUINoteBook* notebook;\n"
       
   665                 fct += "  notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   666                 fct += "  _copy__QB"+self.BusNumber+"_"+element_id+"_1 = notebook->GetCurrentPage();\n"
       
   667                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
       
   668                 notebook = True
       
   669             elif type == "Transform":
       
   670                 if (not transform):
       
   671                     fct += "  SVGUITransform* transform;\n"
       
   672                 fct += "  transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
       
   673                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
       
   674                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
       
   675                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
       
   676                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
       
   677                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
       
   678                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
       
   679                 transform = True
       
   680         fct += "}\n\n"
       
   681         
       
   682         fct += "void Program::SetNoChanges()\n{\n"
       
   683         for element in elementsTab:
       
   684             infos = element.getElementAttributes()
       
   685             for info in infos:
       
   686                 if info["name"] == "id":
       
   687                     element_id = str(info["value"])
       
   688             type = element.GetElementInfos()["type"]
       
   689             FbdBlock = self.GetBlockType(type)
       
   690             if type == "Button":
       
   691                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   692             elif type == "Container":
       
   693                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   694             elif type == "TextCtrl":
       
   695                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   696             elif type == "ScrollBar":
       
   697                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   698             elif type == "RotatingCtrl":
       
   699                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   700             elif type == "NoteBook":
       
   701                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   702             elif type == "Transform":
       
   703                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
       
   704         fct += "}\n\n"
       
   705         
       
   706         #DEBUG Fonction d'affichage
       
   707         fct += "void Program::Print()\n{\n"
       
   708         for element in elementsTab:
       
   709             infos = element.getElementAttributes()
       
   710             for info in infos:
       
   711                 if info["name"] == "id":
       
   712                     element_id = str(info["value"])
       
   713             type = element.GetElementInfos()["type"]
       
   714             FbdBlock = self.GetBlockType(type)
       
   715             element_num_patte = 1
       
   716             for input in FbdBlock["inputs"]:
       
   717                 element_type = TYPECONVERSION[input[1]]
       
   718                 c_type = CPRINTTYPECONVERSION[input[1]]
       
   719                 var = "_copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
       
   720                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
       
   721                 element_num_patte +=1
       
   722             element_num_patte = 1
       
   723             for output in FbdBlock["outputs"]:
       
   724                 element_type = TYPECONVERSION[output[1]]
       
   725                 c_type = CPRINTTYPECONVERSION[output[1]]
       
   726                 var = "_copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
       
   727                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
       
   728                 element_num_patte +=1
       
   729         #fct +="    wxPostEvent(Program,wxEVT_PLCOUT);\n"
       
   730         fct +="};\n\n"    
       
   731         return fct
       
   732     
       
   733     def PlugGenerate_C(self, buildpath, locations, logger):
       
   734         current_location = self.GetCurrentLocation()
       
   735         self.BusNumber = "_".join(map(lambda x:str(x), current_location))
       
   736         self.GenerateProgram(buildpath)
       
   737         Gen_C_file = os.path.join(buildpath, "program.cpp" )
       
   738         return [(Gen_C_file,"")],""
    40     
   739     
    41     def BlockTypesFactory(self):
   740     def BlockTypesFactory(self):
    42         def generate_svgui_block(generator, block, body, link):
   741         def generate_svgui_block(generator, block, body, link):
    43             controller = generator.GetController()
   742             controller = generator.GetController()
    44             name = block.getInstanceName()
   743             name = block.getInstanceName()
    45             type = block.getTypeName()
   744             type = block.getTypeName()
    46             block_infos = GetBlockType(type)
   745             block_infos = self.GetBlockType(type)
    47             bus_id, name = [word for word in name.split("_") if word != ""]
   746             bus_id, name = [word for word in name.split("_") if word != ""]
    48             block_id = self.PlugChilds[bus_id].GetElementIdFromName(name)
   747             block_id = self.PlugChilds[bus_id].GetElementIdFromName(name)
    49             if block_id == None:
   748             if block_id == None:
    50                 raise ValueError, "No corresponding block found"
   749                 raise ValueError, "No corresponding block found"
    51             if not generator.ComputedBlocks.get(name, False):
   750             if not generator.ComputedBlocks.get(name, False):
    66             else:
   765             else:
    67                 return None
   766                 return None
    68 
   767 
    69         return [{"name" : "SVGUI function blocks", "list" :
   768         return [{"name" : "SVGUI function blocks", "list" :
    70            [{"name" : "Container", "type" : "functionBlock", "extensible" : False, 
   769            [{"name" : "Container", "type" : "functionBlock", "extensible" : False, 
    71              "inputs" : [("X","FLOAT","none"),("SetX","BOOL","none"),("Y","FLOAT","none"),("SetY","BOOL","none"),("Angle","FLOAT","none"),("SetAngle","BOOL","none")], 
   770                     "inputs" : [("Show","BOOL","none"),("Set State","BOOL","none")], 
    72              "outputs" : [("X","FLOAT","none"),("X Changed","BOOL","none"),("Y","FLOAT","none"),("Y Changed","BOOL","none"),("Angle","FLOAT","none"),("Angle Changed","BOOL","none")],
   771                     "outputs" : [("Show","BOOL","none"),("State Changed","BOOL","none")],
    73              "comment" : "SVGUI Container", "generate": generate_svgui_block},
   772                     "comment" : "SVGUI Container"},
    74             {"name" : "Button", "type" : "functionBlock", "extensible" : False, 
   773                 {"name" : "Button", "type" : "functionBlock", "extensible" : False, 
    75              "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")], 
   774                     "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")], 
    76              "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")],
   775                     "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")],
    77              "comment" : "SVGUI Button", "generate": generate_svgui_block},
   776                     "comment" : "SVGUI Button"},
    78             {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False, 
   777                 {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False, 
    79              "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")], 
   778                     "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")], 
    80              "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")],
   779                     "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")],
    81              "comment" : "SVGUI Text Control", "generate": generate_svgui_block},
   780                     "comment" : "SVGUI Text Control"},
    82             {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False, 
   781                 {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False, 
    83              "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")], 
   782                     "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")], 
    84              "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")],
   783                     "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")],
    85              "comment" : "SVGUI ScrollBar", "generate": generate_svgui_block},
   784                     "comment" : "SVGUI ScrollBar"},
    86             {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False, 
   785                 {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False, 
    87              "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")], 
   786                     "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")], 
    88              "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")],
   787                     "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")],
    89              "comment" : "SVGUI Notebook", "generate": generate_svgui_block},
   788                     "comment" : "SVGUI Notebook"},
    90             {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False, 
   789                 {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False, 
    91              "inputs" : [("Angle","FLOAT","none"),("Set Angle","BOOL","none")], 
   790                     "inputs" : [("Angle","REAL","none"),("Set Angle","BOOL","none")], 
    92              "outputs" : [("Angle","FLOAT","none"),("Angle changed","BOOL","none")],
   791                     "outputs" : [("Angle","REAL","none"),("Angle changed","BOOL","none")],
    93              "comment" : "SVGUI Rotating Control", "generate": generate_svgui_block}
   792                     "comment" : "SVGUI Rotating Control"},
    94            ]}]
   793                 {"name" : "Transform", "type" : "functionBlock", "extensible" : False, 
    95 
   794                     "inputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Set","BOOL","none")], 
    96 
   795                     "outputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Changed","BOOL","none")],
    97 
   796                     "comment" : "SVGUI Transform"},
    98 
   797                ]}
    99 
   798         ]
   100 
   799     
   101 
   800     def GetBlockType(self,type):
   102 
   801         for category in self.BlockTypesFactory():
   103 
   802             for blocktype in category["list"]:
       
   803                 if blocktype["name"] == type:
       
   804                     return blocktype
       
   805         return None
       
   806 
       
   807 #DEBUG
       
   808 if __name__ == '__main__':
       
   809     app = wxPySimpleApp()
       
   810     wxInitAllImageHandlers()
       
   811     
       
   812     # Install a exception handle for bug reports
       
   813     #wxAddExceptHook(os.getcwd(),__version__)
       
   814     
       
   815     cont = RootClass(sys.path[0])
       
   816     frame = _EditorFramePlug(cont)
       
   817 
       
   818     frame.Show()
       
   819     app.MainLoop()
       
   820 #DEBUG
       
   821 
       
   822 
       
   823 
       
   824 
       
   825