plugins/svgui/svgui.py
changeset 38 8cb20bc13a91
parent 37 625f52bba682
child 39 243ff39fef11
equal deleted inserted replaced
37:625f52bba682 38:8cb20bc13a91
    11     This Class add IEC specific features to the SVGUI DEFEditor :
    11     This Class add IEC specific features to the SVGUI DEFEditor :
    12         - FDB preview
    12         - FDB preview
    13         - FBD begin drag 
    13         - FBD begin drag 
    14     """
    14     """
    15     def __init__(self,controller):
    15     def __init__(self,controller):
    16         EditorFrame.__init__(self,controller)
    16         EditorFrame.__init__(self,controller, solo_mode=False)
    17         self.FbdWindow = wx.Panel(name='fbdwindow',parent=self.EditorPanel,
    17         self.FbdWindow = wx.Panel(name='fbdwindow',parent=self.EditorPanel,
    18                                        pos=wx.Point(300, 355),size=wx.Size(240, 240),
    18                                        pos=wx.Point(300, 355),size=wx.Size(240, 240),
    19                                        style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
    19                                        style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
    20         self.FbdWindow.SetBackgroundColour(wxColour(255,255,255))
    20         self.FbdWindow.SetBackgroundColour(wxColour(255,255,255))
    21         self.FbdWindow.Bind(wx.EVT_LEFT_DOWN, self.OnFbdClick)
    21         self.FbdWindow.Bind(wx.EVT_LEFT_DOWN, self.OnFbdClick)
    77         self.SaveProject()
    77         self.SaveProject()
    78         self.Controler.PlugGenerate_C(sys.path[0],(0,0,4,5),None)
    78         self.Controler.PlugGenerate_C(sys.path[0],(0,0,4,5),None)
    79         event.Skip()    
    79         event.Skip()    
    80     
    80     
    81     def OnClose(self, event):
    81     def OnClose(self, event):
    82         self.OnPlugClose()
    82         self._onclose()
    83         event.Skip()
    83         event.Skip()
    84     
    84     
    85 """
    85 """
    86 TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
    86 TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
    87     "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
    87     "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
    90 TYPECONVERSION = {"BOOL" : "X", "UINT" : "W","REAL" : "D","STRING" : "B"}
    90 TYPECONVERSION = {"BOOL" : "X", "UINT" : "W","REAL" : "D","STRING" : "B"}
    91 CTYPECONVERSION = {"BOOL" : "bool", "UINT" : "unsigned int", "STRING" : "char*", "REAL" : "float"}
    91 CTYPECONVERSION = {"BOOL" : "bool", "UINT" : "unsigned int", "STRING" : "char*", "REAL" : "float"}
    92 CPRINTTYPECONVERSION = {"BOOL" : "d", "UINT" : "d", "STRING" : "s", "REAL" : "f"}
    92 CPRINTTYPECONVERSION = {"BOOL" : "d", "UINT" : "d", "STRING" : "s", "REAL" : "f"}
    93 class RootClass(DEFControler):
    93 class RootClass(DEFControler):
    94 
    94 
    95     def __init__(self, buspath):
    95     def __init__(self):
    96         DEFControler.__init__(self)
    96         DEFControler.__init__(self)
    97         filepath = os.path.join(self.PlugPath(), "gui.def")
    97         filepath = os.path.join(self.PlugPath(), "gui.def")
    98         
    98         
    99         if os.path.isfile(filepath):
    99         if os.path.isfile(filepath):
   100             svgfile = os.path.join(self.PlugPath(), "gui.svg")
   100             svgfile = os.path.join(self.PlugPath(), "gui.svg")
   103             self.OpenXMLFile(filepath)
   103             self.OpenXMLFile(filepath)
   104         else:
   104         else:
   105             self.CreateRootElement()
   105             self.CreateRootElement()
   106             self.SetFilePath(filepath)
   106             self.SetFilePath(filepath)
   107 
   107 
       
   108     _View = None
       
   109     def _OpenView(self, logger):
       
   110         if not self._View:
       
   111             def _onclose():
       
   112                 self._View = None
       
   113             def _onsave():
       
   114                 self.GetPlugRoot().SaveProject()
       
   115             self._View = _EditorFramePlug(self)
       
   116             self._View._onclose = _onclose
       
   117             self._View._onsave = _onsave
       
   118             filepath = os.path.join(self.PlugPath(), "gui.def")
       
   119             self._View.OpenSVGFile(filepath)
       
   120             self._View.Show()
       
   121 
       
   122     PluginMethods = [("HMI Editor",_OpenView), ("Import SVG",_OpenView), ("Import DEF",_OpenView)]
       
   123     
   108     def OnPlugSave(self):
   124     def OnPlugSave(self):
   109         self.SaveXMLFile()
   125         self.SaveXMLFile()
   110         return True
   126         return True
   111     
   127     
   112     def GenerateProgramHeadersPublicVars(self):
   128     def GenerateProgramHeadersPublicVars(self):
   117         fct += "    void Initialize();\n"
   133         fct += "    void Initialize();\n"
   118         fct += "    void SetNoChanges();\n"
   134         fct += "    void SetNoChanges();\n"
   119         fct += "    void Print();\n"
   135         fct += "    void Print();\n"
   120         return fct
   136         return fct
   121     
   137     
   122     def GenerateProgramHeadersPrivateVars(self):
   138     def GenerateIECVars(self):
   123         text = ""
   139         text = ""
   124         elementsTab = self.GetElementsTab()
   140         elementsTab = self.GetElementsTab()
   125         for element in elementsTab:
   141         for element in elementsTab:
   126             infos = element.getElementAttributes()
   142             infos = element.getElementAttributes()
   127             for info in infos:
   143             for info in infos:
   128                 if info["name"] == "id":
   144                 if info["name"] == "id":
   129                     element_id = str(info["value"])
   145                     element_id = str(info["value"])
   130             text += "    bool flag_"+element_id+";\n"
   146             text += "bool flag_"+element_id+";\n"
   131             text += "    volatile int step_"+element_id+";\n"
   147             text += "volatile int step_"+element_id+";\n"
   132         text +="\n"
   148         text +="\n"
   133         #Declaration des variables
   149         #Declaration des variables
   134         for element in elementsTab:
   150         for element in elementsTab:
   135             infos = element.getElementAttributes()
   151             infos = element.getElementAttributes()
   136             for info in infos:
   152             for info in infos:
   140             FbdBlock = self.GetBlockType(type)
   156             FbdBlock = self.GetBlockType(type)
   141             element_num_patte = 1
   157             element_num_patte = 1
   142             for input in FbdBlock["inputs"]:
   158             for input in FbdBlock["inputs"]:
   143                 element_type = TYPECONVERSION[input[1]]
   159                 element_type = TYPECONVERSION[input[1]]
   144                 element_c_type = CTYPECONVERSION[input[1]]
   160                 element_c_type = CTYPECONVERSION[input[1]]
   145                 line = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
   161                 line = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
   146                 text += "    "+element_c_type+" "+line
   162                 text += element_c_type+" "+line
   147                 text += "    "+element_c_type+" _copy"+line
   163                 text += element_c_type+" _copy"+line
   148                 element_num_patte +=1
   164                 element_num_patte +=1
   149             element_num_patte = 1
   165             element_num_patte = 1
   150             for output in FbdBlock["outputs"]:
   166             for output in FbdBlock["outputs"]:
   151                 element_type = TYPECONVERSION[output[1]]
   167                 element_type = TYPECONVERSION[output[1]]
   152                 element_c_type = CTYPECONVERSION[output[1]]
   168                 element_c_type = CTYPECONVERSION[output[1]]
   153                     
   169                     
   154                 line = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
   170                 line = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
   155                 text += "    "+element_c_type+" "+line
   171                 text += element_c_type+" "+line
   156                 text += "    "+element_c_type+" _copy"+line
   172                 text += element_c_type+" _copy"+line
   157                 element_num_patte +=1
   173                 element_num_patte +=1
   158             text +="\n"
   174             text +="\n"
   159         return text
   175         return text
   160     
   176     
   161     def GenerateGlobalVarsAndFuncs(self):
   177     def GenerateGlobalVarsAndFuncs(self):
   162         text = ""
   178         text = ""
       
   179         pri_vars = self.GenerateIECVars()
       
   180         if (pri_vars):
       
   181             text += pri_vars
       
   182 
   163         text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
   183         text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
   164         text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
   184         text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
   165         text += "SVGViewApp *myapp;\n"
   185         text += "SVGViewApp *myapp;\n"
   166         text += "pthread_t wxMainLoop,automate;\n"
   186         text += "pthread_t wxMainLoop,automate;\n"
   167         text += "int myargc;\n"
   187         text += "int myargc;\n"
   301                 fct += "  if (flag_"+element_id+")\n  {\n"
   321                 fct += "  if (flag_"+element_id+")\n  {\n"
   302                 fct += "    flag_"+element_id+" = false;\n"
   322                 fct += "    flag_"+element_id+" = false;\n"
   303                 element_num_patte = 1
   323                 element_num_patte = 1
   304                 for output in FbdBlock["outputs"]:
   324                 for output in FbdBlock["outputs"]:
   305                     element_type = TYPECONVERSION[output[1]]
   325                     element_type = TYPECONVERSION[output[1]]
   306                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
   326                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
   307                     element_num_patte +=1
   327                     element_num_patte +=1
   308                 fct += "    flag_"+element_id+" = true;\n"
   328                 fct += "    flag_"+element_id+" = true;\n"
   309                 fct += "  }\n"
   329                 fct += "  }\n"
   310                 fct += "  event.Skip();\n"
   330                 fct += "  event.Skip();\n"
   311                 fct += "}\n\n"               
   331                 fct += "}\n\n"               
   323                     
   343                     
   324                     if element_num_patte == 1:
   344                     if element_num_patte == 1:
   325                         value = "angle"
   345                         value = "angle"
   326                     elif element_num_patte == 2:
   346                     elif element_num_patte == 2:
   327                         value = "true"
   347                         value = "true"
   328                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   348                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   329                     element_num_patte +=1
   349                     element_num_patte +=1
   330                 fct += "    flag_"+element_id+" = true;\n"
   350                 fct += "    flag_"+element_id+" = true;\n"
   331                 fct += "  }\n"
   351                 fct += "  }\n"
   332                 fct += "}\n\n"
   352                 fct += "}\n\n"
   333             elif type == "NoteBook":
   353             elif type == "NoteBook":
   343                     
   363                     
   344                     if element_num_patte == 1:
   364                     if element_num_patte == 1:
   345                         value = "selected"
   365                         value = "selected"
   346                     elif element_num_patte == 2:
   366                     elif element_num_patte == 2:
   347                         value = "true"
   367                         value = "true"
   348                     fct += "    _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   368                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   349                     element_num_patte +=1
   369                     element_num_patte +=1
   350                 fct += "    flag_"+element_id+" = true;\n"
   370                 fct += "    flag_"+element_id+" = true;\n"
   351                 fct += "  }\n"
   371                 fct += "  }\n"
   352                 fct += "}\n\n"
   372                 fct += "}\n\n"
   353             elif type == "Transform":
   373             elif type == "Transform":
   356                 fct += "  if (flag_"+element_id+")\n  {\n"
   376                 fct += "  if (flag_"+element_id+")\n  {\n"
   357                 fct += "    flag_"+element_id+" = false;\n"
   377                 fct += "    flag_"+element_id+" = false;\n"
   358                 element_num_patte = 1
   378                 element_num_patte = 1
   359                 for output in FbdBlock["outputs"]:                    
   379                 for output in FbdBlock["outputs"]:                    
   360                     if element_num_patte == 1:
   380                     if element_num_patte == 1:
   361                         fct += "    if (transform->GetX() != _copy__QD"+self.BusNumber+"_"+element_id+"_1)\n"
   381                         fct += "    if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n"
   362                         fct += "    {\n"
   382                         fct += "    {\n"
   363                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   383                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   364                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   384                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   365                         fct += "    }\n"
   385                         fct += "    }\n"
   366                     elif element_num_patte == 2:
   386                     elif element_num_patte == 2:
   367                         fct += "    if (transform->GetY() != _copy__QD"+self.BusNumber+"_"+element_id+"_2)\n"
   387                         fct += "    if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n"
   368                         fct += "    {\n"
   388                         fct += "    {\n"
   369                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   389                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   370                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   390                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   371                         fct += "    }\n"
   391                         fct += "    }\n"
   372                     elif element_num_patte == 3:
   392                     elif element_num_patte == 3:
   373                         fct += "    if (transform->GetXScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_3)\n"
   393                         fct += "    if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n"
   374                         fct += "    {\n"
   394                         fct += "    {\n"
   375                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   395                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   376                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   396                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   377                         fct += "    }\n"
   397                         fct += "    }\n"
   378                     elif element_num_patte == 4:
   398                     elif element_num_patte == 4:
   379                         fct += "    if (transform->GetYScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_4)\n"
   399                         fct += "    if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n"
   380                         fct += "    {\n"
   400                         fct += "    {\n"
   381                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   401                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   382                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   402                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   383                         fct += "    }\n"
   403                         fct += "    }\n"
   384                     elif element_num_patte == 5:
   404                     elif element_num_patte == 5:
   385                         fct += "    if (transform->GetAngle() != _copy__QD"+self.BusNumber+"_"+element_id+"_5)\n"
   405                         fct += "    if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n"
   386                         fct += "    {\n"
   406                         fct += "    {\n"
   387                         fct += "      _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   407                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   388                         fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   408                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   389                         fct += "    }\n"
   409                         fct += "    }\n"
   390                     element_num_patte +=1
   410                     element_num_patte +=1
   391                 fct += "    flag_"+element_id+" = true;\n"
   411                 fct += "    flag_"+element_id+" = true;\n"
   392                 fct += "  }\n"
   412                 fct += "  }\n"
   393                 fct += "  event.Skip();\n"
   413                 fct += "  event.Skip();\n"
   394                 fct += "}\n\n"
   414                 fct += "}\n\n"
   395             elif type == "Container":
   415             elif type == "Container":
   396                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   416                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   397                 fct += "  SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   417                 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"
   418                 fct += "  if (container->IsVisible() != _copy__IX"+self.BusNumber+"_"+element_id+"_1  && flag_"+element_id+")\n"
   399                 fct += "  {\n"
   419                 fct += "  {\n"
   400                 fct += "    flag_"+element_id+" = false;\n"
   420                 fct += "    flag_"+element_id+" = false;\n"
   401                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
   421                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
   402                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   422                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   403                 fct += "    flag_"+element_id+" = true;\n"
   423                 fct += "    flag_"+element_id+" = true;\n"
   404                 fct += "  }\n"
   424                 fct += "  }\n"
   405                 fct += "  event.Skip();\n"
   425                 fct += "  event.Skip();\n"
   406                 fct += "}\n\n"
   426                 fct += "}\n\n"
   407         
   427         
   421             FbdBlock = self.GetBlockType(type)
   441             FbdBlock = self.GetBlockType(type)
   422             if type == "TextCtrl":
   442             if type == "TextCtrl":
   423                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   443                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   424                 fct += "    {\n"
   444                 fct += "    {\n"
   425                 fct += "      flag_"+element_id+" = false;\n"
   445                 fct += "      flag_"+element_id+" = false;\n"
   426                 fct += "      _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   446                 fct += "      _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   427                 fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   447                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   428                 fct += "      flag_"+element_id+" = true;\n"
   448                 fct += "      flag_"+element_id+" = true;\n"
   429                 fct += "    }\n"
   449                 fct += "    }\n"
   430         fct += "  }\n"
   450         fct += "  }\n"
   431         fct += "}\n"
   451         fct += "}\n"
   432 
   452 
   449             if type == "ScrollBar":
   469             if type == "ScrollBar":
   450                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   470                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   451                 fct += "    {\n"
   471                 fct += "    {\n"
   452                 fct += "      flag_"+element_id+" = false;\n"
   472                 fct += "      flag_"+element_id+" = false;\n"
   453                 fct += "      unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
   473                 fct += "      unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
   454                 fct += "      _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
   474                 fct += "      _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
   455                 fct += "      _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   475                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   456                 fct += "      flag_"+element_id+" = true;\n"
   476                 fct += "      flag_"+element_id+" = true;\n"
   457                 fct += "    }\n"
   477                 fct += "    }\n"
   458         fct += "  }\n"
   478         fct += "  }\n"
   459         fct += "  event.Skip();\n"
   479         fct += "  event.Skip();\n"
   460         fct += "}\n"
   480         fct += "}\n"
   471                     element_id = str(info["value"])
   491                     element_id = str(info["value"])
   472             type = element.GetElementInfos()["type"]
   492             type = element.GetElementInfos()["type"]
   473             FbdBlock = self.GetBlockType(type)
   493             FbdBlock = self.GetBlockType(type)
   474             if type == "Button":
   494             if type == "Button":
   475                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   495                 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"
   496                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   477                 fct += "  {\n"
   497                 fct += "  {\n"
   478                 fct += "    flag_"+element_id+" = false;\n"
   498                 fct += "    flag_"+element_id+" = false;\n"
   479                 fct += "    SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   499                 fct += "    SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   480                 fct += "    if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
   500                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   481                 fct += "      button->Show();\n"
   501                 fct += "      button->Show();\n"
   482                 fct += "    else\n"
   502                 fct += "    else\n"
   483                 fct += "      button->Hide();\n"
   503                 fct += "      button->Hide();\n"
   484                 fct += "    flag_"+element_id+" = true;\n"
   504                 fct += "    flag_"+element_id+" = true;\n"
   485                 fct += "  }\n"
   505                 fct += "  }\n"
   486                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   506                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   487             elif type == "Container":
   507             elif type == "Container":
   488                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   508                 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"
   509                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   490                 fct += "  {\n"
   510                 fct += "  {\n"
   491                 fct += "    flag_"+element_id+" = false;\n"
   511                 fct += "    flag_"+element_id+" = false;\n"
   492                 fct += "    SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   512                 fct += "    SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   493                 fct += "    if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
   513                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   494                 fct += "      container->Show();\n"
   514                 fct += "      container->Show();\n"
   495                 fct += "    else\n"
   515                 fct += "    else\n"
   496                 fct += "      container->Hide();\n"
   516                 fct += "      container->Hide();\n"
   497                 fct += "    flag_"+element_id+" = true;\n"
   517                 fct += "    flag_"+element_id+" = true;\n"
   498                 fct += "  }\n"
   518                 fct += "  }\n"
   499                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   519                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   500             elif type == "TextCtrl":
   520             elif type == "TextCtrl":
   501                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   521                 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"
   522                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   503                 fct += "  {\n"
   523                 fct += "  {\n"
   504                 fct += "    flag_"+element_id+" = false;\n"
   524                 fct += "    flag_"+element_id+" = false;\n"
   505                 fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   525                 fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   506                 fct += "    wxString str = wxString::FromAscii(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n"
   526                 fct += "    wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   507                 fct += "    text->SetText(str);\n"
   527                 fct += "    text->SetText(str);\n"
   508                 fct += "    flag_"+element_id+" = true;\n"
   528                 fct += "    flag_"+element_id+" = true;\n"
   509                 fct += "  }\n"
   529                 fct += "  }\n"
   510                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   530                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   511             elif type == "ScrollBar":
   531             elif type == "ScrollBar":
   512                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   532                 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"
   533                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   514                 fct += "  {\n"
   534                 fct += "  {\n"
   515                 fct += "    flag_"+element_id+" = false;\n"
   535                 fct += "    flag_"+element_id+" = false;\n"
   516                 fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   536                 fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   517                 fct += "    scrollbar->SetThumbPosition(_copy__IW"+self.BusNumber+"_"+element_id+"_1);\n"
   537                 fct += "    scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n"
   518                 fct += "    flag_"+element_id+" = true;\n"
   538                 fct += "    flag_"+element_id+" = true;\n"
   519                 fct += "  }\n"
   539                 fct += "  }\n"
   520                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   540                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   521             elif type == "RotatingCtrl":
   541             elif type == "RotatingCtrl":
   522                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   542                 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"
   543                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   524                 fct += "  {\n"
   544                 fct += "  {\n"
   525                 fct += "    flag_"+element_id+" = false;\n"
   545                 fct += "    flag_"+element_id+" = false;\n"
   526                 fct += "    SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   546                 fct += "    SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   527                 fct += "    rotating->SetAngle(_copy__ID"+self.BusNumber+"_"+element_id+"_1);\n"
   547                 fct += "    rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n"
   528                 fct += "    flag_"+element_id+" = true;\n"
   548                 fct += "    flag_"+element_id+" = true;\n"
   529                 fct += "  }\n"
   549                 fct += "  }\n"
   530                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   550                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   531             elif type == "NoteBook":
   551             elif type == "NoteBook":
   532                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   552                 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"
   553                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   534                 fct += "  {\n"
   554                 fct += "  {\n"
   535                 fct += "    flag_"+element_id+" = false;\n"
   555                 fct += "    flag_"+element_id+" = false;\n"
   536                 fct += "    SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   556                 fct += "    SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   537                 fct += "    notebook->SetCurrentPage(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n"
   557                 fct += "    notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   538                 fct += "    flag_"+element_id+" = true;\n"
   558                 fct += "    flag_"+element_id+" = true;\n"
   539                 fct += "  }\n"
   559                 fct += "  }\n"
   540                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   560                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   541             elif type == "Transform":
   561             elif type == "Transform":
   542                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   562                 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"
   563                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_6 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   544                 fct += "  {\n"
   564                 fct += "  {\n"
   545                 fct += "    flag_"+element_id+" = false;\n"
   565                 fct += "    flag_"+element_id+" = false;\n"
   546                 fct += "    SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   566                 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"
   567                 fct += "    transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+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"
   568                 fct += "    transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n"
   549                 fct += "    transform->Rotate(_copy__ID"+self.BusNumber+"_"+element_id+"_5);\n"
   569                 fct += "    transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n"
   550                 fct += "    flag_"+element_id+" = true;\n"
   570                 fct += "    flag_"+element_id+" = true;\n"
   551                 fct += "  }\n"
   571                 fct += "  }\n"
   552                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   572                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   553         fct += "  Update_Elements();\n"
   573         fct += "  Update_Elements();\n"
   554         fct += "  Refresh();\n"
   574         fct += "  Refresh();\n"
   570             #fct += "  if ( flag_"+element_id+" ){\n"
   590             #fct += "  if ( flag_"+element_id+" ){\n"
   571             fct += "    flag_"+element_id+" = false;\n"
   591             fct += "    flag_"+element_id+" = false;\n"
   572             element_num_patte = 1
   592             element_num_patte = 1
   573             for input in FbdBlock["inputs"]:
   593             for input in FbdBlock["inputs"]:
   574                 element_type = TYPECONVERSION[input[1]]
   594                 element_type = TYPECONVERSION[input[1]]
   575                 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   595                 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   576                 fct +="    _copy"+var+ " = "+var+";\n"
   596                 fct +="    _copy"+var+ " = "+var+";\n"
   577                 element_num_patte +=1
   597                 element_num_patte +=1
   578             fct += "    flag_"+element_id+" = true;\n"
   598             fct += "    flag_"+element_id+" = true;\n"
   579             fct += "  }\n"
   599             fct += "  }\n"
   580         fct +="  wxCommandEvent event( EVT_PLC );\n"
   600         fct +="  wxCommandEvent event( EVT_PLC );\n"
   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"
   613             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"
   614             fct += "    flag_"+element_id+" = false;\n"
   595             element_num_patte = 1
   615             element_num_patte = 1
   596             for output in FbdBlock["outputs"]:
   616             for output in FbdBlock["outputs"]:
   597                 element_type = TYPECONVERSION[output[1]]
   617                 element_type = TYPECONVERSION[output[1]]
   598                 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   618                 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   599                 fct +="     "+var+ " = _copy"+var+";\n"
   619                 fct +="     "+var+ " = _copy"+var+";\n"
   600                 element_num_patte +=1
   620                 element_num_patte +=1
   601             fct += "    flag_"+element_id+" = true;\n"
   621             fct += "    flag_"+element_id+" = true;\n"
   602             fct += "  }\n"
   622             fct += "  }\n"
   603         fct += "  SetNoChanges();\n"
   623         fct += "  SetNoChanges();\n"
   621             if type == "Button":
   641             if type == "Button":
   622                 if (not button):
   642                 if (not button):
   623                     fct += "  SVGUIButton* button;\n"
   643                     fct += "  SVGUIButton* button;\n"
   624                 fct += "  button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   644                 fct += "  button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   625                 fct += "  if (button->IsVisible())\n"
   645                 fct += "  if (button->IsVisible())\n"
   626                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
   646                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
   627                 fct += "  else\n"
   647                 fct += "  else\n"
   628                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
   648                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
   629                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   649                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   630                 button = True
   650                 button = True
   631             elif type == "Container":
   651             elif type == "Container":
   632                 if (not container):
   652                 if (not container):
   633                     fct += "  SVGUIContainer* container;\n"
   653                     fct += "  SVGUIContainer* container;\n"
   634                 fct += "  container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   654                 fct += "  container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   635                 fct += "  if (container->IsVisible())\n"
   655                 fct += "  if (container->IsVisible())\n"
   636                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
   656                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
   637                 fct += "  else\n"
   657                 fct += "  else\n"
   638                 fct += "    _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
   658                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
   639                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   659                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   640                 container = True
   660                 container = True
   641             elif type == "TextCtrl":
   661             elif type == "TextCtrl":
   642                 if (not textctrl):
   662                 if (not textctrl):
   643                     fct += "  SVGUITextCtrl* text;\n"
   663                     fct += "  SVGUITextCtrl* text;\n"
   644                 fct += "  text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   664                 fct += "  text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   645                 fct += "  _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   665                 fct += "  _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   646                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   666                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   647                 textctrl = True
   667                 textctrl = True
   648             elif type == "ScrollBar":
   668             elif type == "ScrollBar":
   649                 if (not scrollbar):
   669                 if (not scrollbar):
   650                     fct += "  SVGUIScrollBar* scrollbar;\n"
   670                     fct += "  SVGUIScrollBar* scrollbar;\n"
   651                 fct += "  scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   671                 fct += "  scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   652                 fct += "  _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollbar->GetThumbPosition();\n"
   672                 fct += "  _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollbar->GetThumbPosition();\n"
   653                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   673                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   654                 scrollbar = True
   674                 scrollbar = True
   655             elif type == "RotatingCtrl":
   675             elif type == "RotatingCtrl":
   656                 if (not rotatingctrl):
   676                 if (not rotatingctrl):
   657                     fct += "  SVGUIRotatingCtrl* rotating;\n"
   677                     fct += "  SVGUIRotatingCtrl* rotating;\n"
   658                 fct += "  rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   678                 fct += "  rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   659                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_1 = rotating->GetAngle();\n"
   679                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_1 = rotating->GetAngle();\n"
   660                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   680                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   661                 rotatingctrl = True
   681                 rotatingctrl = True
   662             elif type == "NoteBook":
   682             elif type == "NoteBook":
   663                 if (not notebook):
   683                 if (not notebook):
   664                     fct += "  SVGUINoteBook* notebook;\n"
   684                     fct += "  SVGUINoteBook* notebook;\n"
   665                 fct += "  notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   685                 fct += "  notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   666                 fct += "  _copy__QB"+self.BusNumber+"_"+element_id+"_1 = notebook->GetCurrentPage();\n"
   686                 fct += "  _copy__IB"+self.BusNumber+"_"+element_id+"_1 = notebook->GetCurrentPage();\n"
   667                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   687                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
   668                 notebook = True
   688                 notebook = True
   669             elif type == "Transform":
   689             elif type == "Transform":
   670                 if (not transform):
   690                 if (not transform):
   671                     fct += "  SVGUITransform* transform;\n"
   691                     fct += "  SVGUITransform* transform;\n"
   672                 fct += "  transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   692                 fct += "  transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   673                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   693                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   674                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   694                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   675                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   695                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   676                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   696                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   677                 fct += "  _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   697                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   678                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
   698                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
   679                 transform = True
   699                 transform = True
   680         fct += "}\n\n"
   700         fct += "}\n\n"
   681         
   701         
   682         fct += "void Program::SetNoChanges()\n{\n"
   702         fct += "void Program::SetNoChanges()\n{\n"
   683         for element in elementsTab:
   703         for element in elementsTab:
   686                 if info["name"] == "id":
   706                 if info["name"] == "id":
   687                     element_id = str(info["value"])
   707                     element_id = str(info["value"])
   688             type = element.GetElementInfos()["type"]
   708             type = element.GetElementInfos()["type"]
   689             FbdBlock = self.GetBlockType(type)
   709             FbdBlock = self.GetBlockType(type)
   690             if type == "Button":
   710             if type == "Button":
   691                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   711                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   692             elif type == "Container":
   712             elif type == "Container":
   693                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   713                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   694             elif type == "TextCtrl":
   714             elif type == "TextCtrl":
   695                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   715                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   696             elif type == "ScrollBar":
   716             elif type == "ScrollBar":
   697                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   717                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   698             elif type == "RotatingCtrl":
   718             elif type == "RotatingCtrl":
   699                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   719                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   700             elif type == "NoteBook":
   720             elif type == "NoteBook":
   701                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   721                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
   702             elif type == "Transform":
   722             elif type == "Transform":
   703                 fct += "  _copy__QX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
   723                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
   704         fct += "}\n\n"
   724         fct += "}\n\n"
   705         
   725         
   706         #DEBUG Fonction d'affichage
   726         #DEBUG Fonction d'affichage
   707         fct += "void Program::Print()\n{\n"
   727         fct += "void Program::Print()\n{\n"
   708         for element in elementsTab:
   728         for element in elementsTab:
   714             FbdBlock = self.GetBlockType(type)
   734             FbdBlock = self.GetBlockType(type)
   715             element_num_patte = 1
   735             element_num_patte = 1
   716             for input in FbdBlock["inputs"]:
   736             for input in FbdBlock["inputs"]:
   717                 element_type = TYPECONVERSION[input[1]]
   737                 element_type = TYPECONVERSION[input[1]]
   718                 c_type = CPRINTTYPECONVERSION[input[1]]
   738                 c_type = CPRINTTYPECONVERSION[input[1]]
   719                 var = "_copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   739                 var = "_copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   720                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
   740                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
   721                 element_num_patte +=1
   741                 element_num_patte +=1
   722             element_num_patte = 1
   742             element_num_patte = 1
   723             for output in FbdBlock["outputs"]:
   743             for output in FbdBlock["outputs"]:
   724                 element_type = TYPECONVERSION[output[1]]
   744                 element_type = TYPECONVERSION[output[1]]
   725                 c_type = CPRINTTYPECONVERSION[output[1]]
   745                 c_type = CPRINTTYPECONVERSION[output[1]]
   726                 var = "_copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   746                 var = "_copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   727                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
   747                 fct +="  printf(\""+var+": %"+c_type+"\\n\","+var+");\n"
   728                 element_num_patte +=1
   748                 element_num_patte +=1
   729         #fct +="    wxPostEvent(Program,wxEVT_PLCOUT);\n"
   749         #fct +="    wxPostEvent(Program,wxEVT_PLCOUT);\n"
   730         fct +="};\n\n"    
   750         fct +="};\n\n"    
   731         return fct
   751         return fct
   749                 raise ValueError, "No corresponding block found"
   769                 raise ValueError, "No corresponding block found"
   750             if not generator.ComputedBlocks.get(name, False):
   770             if not generator.ComputedBlocks.get(name, False):
   751                 for num, variable in enumerate(block.inputVariables.getVariable()):
   771                 for num, variable in enumerate(block.inputVariables.getVariable()):
   752                     connections = variable.connectionPointIn.getConnections()
   772                     connections = variable.connectionPointIn.getConnections()
   753                     if connections and len(connections) == 1:
   773                     if connections and len(connections) == 1:
   754                         parameter = "__I%s%d_%d_%d"%(TYPECONVERSION[block_infos["inputs"][num][1]], bus_id, block_id, num)
   774                         parameter = "__Q%s%d_%d_%d"%(TYPECONVERSION[block_infos["inputs"][num][1]], bus_id, block_id, num)
   755                         value = generator.ComputeFBDExpression(body, connections[0])
   775                         value = generator.ComputeFBDExpression(body, connections[0])
   756                         generator.Program += ("  %s := %s;\n"%(parameter, generator.ExtractModifier(variable, value)))
   776                         generator.Program += ("  %s := %s;\n"%(parameter, generator.ExtractModifier(variable, value)))
   757                 generator.ComputedBlocks[name] = True
   777                 generator.ComputedBlocks[name] = True
   758             if link:
   778             if link:
   759                 connectionPoint = link.getPosition()[-1]
   779                 connectionPoint = link.getPosition()[-1]
   760                 for num, variable in enumerate(block.outputVariables.getVariable()):
   780                 for num, variable in enumerate(block.outputVariables.getVariable()):
   761                     blockPointx, blockPointy = variable.connectionPointOut.getRelPosition()
   781                     blockPointx, blockPointy = variable.connectionPointOut.getRelPosition()
   762                     if block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY():
   782                     if block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY():
   763                         return "__Q%s%d_%d_%d"%(TYPECONVERSION[block_infos["outputs"][num][1]], bus_id, block_id, num)
   783                         return "__I%s%d_%d_%d"%(TYPECONVERSION[block_infos["outputs"][num][1]], bus_id, block_id, num)
   764                 raise ValueError, "No output variable found"
   784                 raise ValueError, "No output variable found"
   765             else:
   785             else:
   766                 return None
   786                 return None
   767 
   787 
   768         return [{"name" : "SVGUI function blocks", "list" :
   788         return [{"name" : "SVGUI function blocks", "list" :