plugins/svgui/svgui.py
changeset 39 243ff39fef11
parent 38 8cb20bc13a91
child 42 2bff00eb6cd0
equal deleted inserted replaced
38:8cb20bc13a91 39:243ff39fef11
   129         fct = ""
   129         fct = ""
   130         fct += "    void OnPlcOutEvent(wxEvent& event);\n\n"
   130         fct += "    void OnPlcOutEvent(wxEvent& event);\n\n"
   131         fct += "    void IN_"+self.BusNumber+"();\n"
   131         fct += "    void IN_"+self.BusNumber+"();\n"
   132         fct += "    void OUT_"+self.BusNumber+"();\n"
   132         fct += "    void OUT_"+self.BusNumber+"();\n"
   133         fct += "    void Initialize();\n"
   133         fct += "    void Initialize();\n"
   134         fct += "    void SetNoChanges();\n"
       
   135         fct += "    void Print();\n"
   134         fct += "    void Print();\n"
   136         return fct
   135         return fct
   137     
   136     
   138     def GenerateIECVars(self):
   137     def GenerateIECVars(self):
   139         text = ""
   138         text = ""
   141         for element in elementsTab:
   140         for element in elementsTab:
   142             infos = element.getElementAttributes()
   141             infos = element.getElementAttributes()
   143             for info in infos:
   142             for info in infos:
   144                 if info["name"] == "id":
   143                 if info["name"] == "id":
   145                     element_id = str(info["value"])
   144                     element_id = str(info["value"])
   146             text += "bool flag_"+element_id+";\n"
   145             text += "volatile int out_state_"+element_id+";\n"
   147             text += "volatile int step_"+element_id+";\n"
   146             text += "volatile int in_state_"+element_id+";\n"
   148         text +="\n"
   147         text +="\n"
   149         #Declaration des variables
   148         #Declaration des variables
   150         for element in elementsTab:
   149         for element in elementsTab:
   151             infos = element.getElementAttributes()
   150             infos = element.getElementAttributes()
   152             for info in infos:
   151             for info in infos:
   180         if (pri_vars):
   179         if (pri_vars):
   181             text += pri_vars
   180             text += pri_vars
   182 
   181 
   183         text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
   182         text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
   184         text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
   183         text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
   185         text += "SVGViewApp *myapp;\n"
   184         text += "SVGViewApp *myapp = NULL;\n"
   186         text += "pthread_t wxMainLoop,automate;\n"
   185         text += "pthread_t wxMainLoop,automate;\n"
   187         text += "int myargc;\n"
   186         text += "int myargc = 0;\n"
   188         text += "char** myargv;\n\n"
   187         text += "char** myargv = NULL;\n\n"
   189         
   188         
   190         text += "#define FREE_AND_NO_CHANGES 1 \n"
   189         text += "#define UNCHANGED 1 \n"
   191         text += "#define PLC_BUSY 2 \n"
   190         text += "#define PLC_BUSY 2 \n"
   192         text += "#define FREE_AND_CHANGES 3 \n"
   191         text += "#define CHANGED 3 \n"
   193         text += "#define PLC_OUT_BUSY 4 \n\n"
   192         text += "#define GUI_BUSY 4 \n\n"
   194         
   193         
   195         
   194         
   196         text += "void* InitWxEntry(void* args)\n{\n"
   195         text += "void* InitWxEntry(void* args)\n{\n"
   197         text += "  wxEntry(myargc,myargv);\n"
   196         text += "  wxEntry(myargc,myargv);\n"
   198         text += "  return args;\n"
   197         text += "  return args;\n"
   199         text += "}\n\n"
   198         text += "}\n\n"
   200         
   199         
   201         text += "void* SimulAutomate(void* args)\n{\n"
   200 #        text += "void* SimulAutomate(void* args)\n{\n"
   202         text += "  while(1){\n"
   201 #        text += "  while(1){\n"
   203         text += "    myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"();\n"
   202 #        text += "    myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"();\n"
   204         text += "    //printf(\"AUTOMATE\\n\");\n"
   203 #        text += "    //printf(\"AUTOMATE\\n\");\n"
   205         text += "    myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"();\n"
   204 #        text += "    myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"();\n"
   206         text += "    sleep(1);\n"
   205 #        text += "    sleep(1);\n"
   207         text += "  }\n"
   206 #        text += "  }\n"
   208         text += "  return args;\n"
   207 #        text += "  return args;\n"
   209         text += "}\n\n"
   208 #        text += "}\n\n"
   210         
   209         
   211         if (self.SVGUIRootElement):
   210         if (self.SVGUIRootElement):
   212             width = self.SVGUIRootElement.GetBBox().GetWidth()
   211             width = self.SVGUIRootElement.GetBBox().GetWidth()
   213             height = self.SVGUIRootElement.GetBBox().GetHeight()
   212             height = self.SVGUIRootElement.GetBBox().GetHeight()
   214         else :
   213         else :
   218         text += "  #ifndef __WXMSW__\n"
   217         text += "  #ifndef __WXMSW__\n"
   219         text += "    setlocale(LC_NUMERIC, \"C\");\n"
   218         text += "    setlocale(LC_NUMERIC, \"C\");\n"
   220         text += "  #endif\n"
   219         text += "  #endif\n"
   221         text += "  frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize((int)"+str(width)+", (int)"+str(height)+"));\n"
   220         text += "  frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize((int)"+str(width)+", (int)"+str(height)+"));\n"
   222         text += "  myapp = this;\n"
   221         text += "  myapp = this;\n"
   223         text += "  pthread_create(&automate, NULL, SimulAutomate, NULL);\n"
   222 #        text += "  pthread_create(&automate, NULL, SimulAutomate, NULL);\n"
   224         text += "  return true;\n"
   223         text += "  return true;\n"
   225         text += "}\n\n"
   224         text += "}\n\n"
   226         
   225         
   227         text += "int main(int argc, char** argv)\n{\n"
   226         text += "int __init_"+self.BusNumber+"(int argc, char** argv)\n{\n"
   228         text += "  myargc = argc;\n"
   227         text += "  myargc = argc;\n"
   229         text += "  myargv = argv;\n"
   228         text += "  myargv = argv;\n"
   230         text += "  pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL);\n"
   229         text += "  pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL);\n"
   231         text += "  pause();\n"
   230         text += "  pause();\n"
       
   231         text += "}\n\n"
       
   232 
       
   233         text += "int __retrive_"+self.BusNumber+"()\n{\n"
       
   234         text += "  if(myapp){"
       
   235         text += "    myapp->Retrive()"
       
   236         text += "  }"        
       
   237         text += "}\n\n"
       
   238 
       
   239         text += "int __publish_"+self.BusNumber+"()\n{\n"
       
   240         text += "  if(myapp){"
       
   241         text += "    myapp->Publish()"
       
   242         text += "  }"        
   232         text += "}\n\n"
   243         text += "}\n\n"
   233         
   244         
   234         return text
   245         return text
   235     
   246     
   236     def GenerateProgramEventTable(self):
   247     def GenerateProgramEventTable(self):
   297         for element in elementsTab:
   308         for element in elementsTab:
   298             infos = element.getElementAttributes()
   309             infos = element.getElementAttributes()
   299             for info in infos:
   310             for info in infos:
   300                 if info["name"] == "id":
   311                 if info["name"] == "id":
   301                     element_id = str(info["value"])
   312                     element_id = str(info["value"])
   302             text += "    flag_"+element_id+" = true;\n"
   313             text += "    out_state_"+element_id+" = UNCHANGED;\n"
   303             text += "    step_"+element_id+" = FREE_AND_NO_CHANGES;\n"
       
   304         text += "}\n\n"
   314         text += "}\n\n"
   305         return text
   315         return text
   306     
   316     
   307     def GenerateProgramEventFunctions(self):
   317     def GenerateProgramEventFunctions(self):
   308         fct=""
   318         fct=""
   310         for element in elementsTab:
   320         for element in elementsTab:
   311             infos = element.getElementAttributes()
   321             infos = element.getElementAttributes()
   312             for info in infos:
   322             for info in infos:
   313                 if info["name"] == "id":
   323                 if info["name"] == "id":
   314                     element_id = str(info["value"])
   324                     element_id = str(info["value"])
       
   325                     _lock   = "  in_state_"+element_id+" = GUI_BUSY;\n"
       
   326                     _unlock = "  in_state_"+element_id+" = CHANGED;\n"
   315                 if info["name"] == "name":
   327                 if info["name"] == "name":
   316                     element_name = str(info["value"])
   328                     element_name = str(info["value"])
   317             type = element.GetElementInfos()["type"]
   329             type = element.GetElementInfos()["type"]
   318             FbdBlock = self.GetBlockType(type)
   330             FbdBlock = self.GetBlockType(type)
   319             if type == "Button":
   331             if type == "Button":
   320                 fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n"
   332                 fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n"
   321                 fct += "  if (flag_"+element_id+")\n  {\n"
   333                 fct += _lock
   322                 fct += "    flag_"+element_id+" = false;\n"
       
   323                 element_num_patte = 1
   334                 element_num_patte = 1
   324                 for output in FbdBlock["outputs"]:
   335                 for output in FbdBlock["outputs"]:
   325                     element_type = TYPECONVERSION[output[1]]
   336                     element_type = TYPECONVERSION[output[1]]
   326                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
   337                     fct += "  _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
   327                     element_num_patte +=1
   338                     element_num_patte +=1
   328                 fct += "    flag_"+element_id+" = true;\n"
   339                 fct += _unlock
   329                 fct += "  }\n"
       
   330                 fct += "  event.Skip();\n"
   340                 fct += "  event.Skip();\n"
   331                 fct += "}\n\n"               
   341                 fct += "}\n\n"               
   332                 
   342                 
   333             elif type == "RotatingCtrl":
   343             elif type == "RotatingCtrl":
   334                 fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n"
   344                 fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n"
   335                 fct += "  SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   345                 fct += "  SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   336                 fct += "  rotating->SendScrollEvent(event);\n"
   346                 fct += "  rotating->SendScrollEvent(event);\n"
   337                 fct += "  double angle = rotating->GetAngle();\n"
   347                 fct += "  double angle = rotating->GetAngle();\n"
   338                 fct += "  if (flag_"+element_id+")\n  {\n"
   348                 fct += _lock
   339                 fct += "    flag_"+element_id+" = false;\n"
       
   340                 element_num_patte = 1
   349                 element_num_patte = 1
   341                 for output in FbdBlock["outputs"]:
   350                 for output in FbdBlock["outputs"]:
   342                     element_type = TYPECONVERSION[output[1]]
   351                     element_type = TYPECONVERSION[output[1]]
   343                     
   352                     
   344                     if element_num_patte == 1:
   353                     if element_num_patte == 1:
   345                         value = "angle"
   354                         value = "angle"
   346                     elif element_num_patte == 2:
   355                     elif element_num_patte == 2:
   347                         value = "true"
   356                         value = "true"
   348                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   357                     fct += "  _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   349                     element_num_patte +=1
   358                     element_num_patte +=1
   350                 fct += "    flag_"+element_id+" = true;\n"
   359                 fct += _unlock
   351                 fct += "  }\n"
       
   352                 fct += "}\n\n"
   360                 fct += "}\n\n"
   353             elif type == "NoteBook":
   361             elif type == "NoteBook":
   354                 fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n"
   362                 fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n"
   355                 fct += "  SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   363                 fct += "  SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   356                 fct += "  notebook->SendNotebookEvent(event);\n"
   364                 fct += "  notebook->SendNotebookEvent(event);\n"
   357                 fct += "  unsigned int selected = notebook->GetCurrentPage();\n"
   365                 fct += "  unsigned int selected = notebook->GetCurrentPage();\n"
   358                 fct += "  if (flag_"+element_id+")\n  {\n"
   366                 fct += _lock
   359                 fct += "    flag_"+element_id+" = false;\n"
       
   360                 element_num_patte = 1
   367                 element_num_patte = 1
   361                 for output in FbdBlock["outputs"]:
   368                 for output in FbdBlock["outputs"]:
   362                     element_type = TYPECONVERSION[output[1]]
   369                     element_type = TYPECONVERSION[output[1]]
   363                     
   370                     
   364                     if element_num_patte == 1:
   371                     if element_num_patte == 1:
   365                         value = "selected"
   372                         value = "selected"
   366                     elif element_num_patte == 2:
   373                     elif element_num_patte == 2:
   367                         value = "true"
   374                         value = "true"
   368                     fct += "    _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   375                     fct += "  _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
   369                     element_num_patte +=1
   376                     element_num_patte +=1
   370                 fct += "    flag_"+element_id+" = true;\n"
   377                 fct += _unlock
   371                 fct += "  }\n"
       
   372                 fct += "}\n\n"
   378                 fct += "}\n\n"
   373             elif type == "Transform":
   379             elif type == "Transform":
   374                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   380                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   375                 fct += "  SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   381                 fct += "  SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   376                 fct += "  if (flag_"+element_id+")\n  {\n"
   382                 fct += _lock
   377                 fct += "    flag_"+element_id+" = false;\n"
       
   378                 element_num_patte = 1
   383                 element_num_patte = 1
   379                 for output in FbdBlock["outputs"]:                    
   384                 for output in FbdBlock["outputs"]:                    
   380                     if element_num_patte == 1:
   385                     if element_num_patte == 1:
   381                         fct += "    if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n"
   386                         fct += "  if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n"
   382                         fct += "    {\n"
   387                         fct += "  {\n"
   383                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   388                         fct += "    _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
   384                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   389                         fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   385                         fct += "    }\n"
   390                         fct += "  }\n"
   386                     elif element_num_patte == 2:
   391                     elif element_num_patte == 2:
   387                         fct += "    if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n"
   392                         fct += "  if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n"
   388                         fct += "    {\n"
   393                         fct += "  {\n"
   389                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   394                         fct += "    _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
   390                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   395                         fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   391                         fct += "    }\n"
   396                         fct += "  }\n"
   392                     elif element_num_patte == 3:
   397                     elif element_num_patte == 3:
   393                         fct += "    if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n"
   398                         fct += "  if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n"
   394                         fct += "    {\n"
   399                         fct += "  {\n"
   395                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   400                         fct += "    _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
   396                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   401                         fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   397                         fct += "    }\n"
   402                         fct += "  }\n"
   398                     elif element_num_patte == 4:
   403                     elif element_num_patte == 4:
   399                         fct += "    if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n"
   404                         fct += "  if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n"
   400                         fct += "    {\n"
   405                         fct += "  {\n"
   401                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   406                         fct += "    _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
   402                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   407                         fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   403                         fct += "    }\n"
   408                         fct += "  }\n"
   404                     elif element_num_patte == 5:
   409                     elif element_num_patte == 5:
   405                         fct += "    if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n"
   410                         fct += "  if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n"
   406                         fct += "    {\n"
   411                         fct += "  {\n"
   407                         fct += "      _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   412                         fct += "    _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   408                         fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   413                         fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
   409                         fct += "    }\n"
   414                         fct += "  }\n"
   410                     element_num_patte +=1
   415                     element_num_patte +=1
   411                 fct += "    flag_"+element_id+" = true;\n"
   416                 fct += _unlock
   412                 fct += "  }\n"
       
   413                 fct += "  event.Skip();\n"
   417                 fct += "  event.Skip();\n"
   414                 fct += "}\n\n"
   418                 fct += "}\n\n"
   415             elif type == "Container":
   419             elif type == "Container":
   416                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   420                 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
   417                 fct += "  SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   421                 fct += "  SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   418                 fct += "  if (container->IsVisible() != _copy__IX"+self.BusNumber+"_"+element_id+"_1  && flag_"+element_id+")\n"
   422                 fct += "  bool isvisible = container->IsVisible();\n"
       
   423                 fct += _lock
       
   424                 fct += "  if (isvisible != _copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
   419                 fct += "  {\n"
   425                 fct += "  {\n"
   420                 fct += "    flag_"+element_id+" = false;\n"
       
   421                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
   426                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
   422                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   427                 fct += "    _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   423                 fct += "    flag_"+element_id+" = true;\n"
       
   424                 fct += "  }\n"
   428                 fct += "  }\n"
       
   429                 fct += _unlock
   425                 fct += "  event.Skip();\n"
   430                 fct += "  event.Skip();\n"
   426                 fct += "}\n\n"
   431                 fct += "}\n\n"
   427         
   432         
   428         fct += "void Program::OnChar(wxKeyEvent& event)\n{\n"
   433         fct += "void Program::OnChar(wxKeyEvent& event)\n{\n"
   429         fct += "  SVGUIContainer* container = GetSVGUIRootElement();\n"
   434         fct += "  SVGUIContainer* container = GetSVGUIRootElement();\n"
   435         for element in elementsTab:
   440         for element in elementsTab:
   436             infos = element.getElementAttributes()
   441             infos = element.getElementAttributes()
   437             for info in infos:
   442             for info in infos:
   438                 if info["name"] == "id":
   443                 if info["name"] == "id":
   439                     element_id = str(info["value"])
   444                     element_id = str(info["value"])
       
   445                     _lock   = "      in_state_"+element_id+" = GUI_BUSY;\n"
       
   446                     _unlock = "      in_state_"+element_id+" = CHANGED;\n"
   440             type = element.GetElementInfos()["type"]
   447             type = element.GetElementInfos()["type"]
   441             FbdBlock = self.GetBlockType(type)
   448             FbdBlock = self.GetBlockType(type)
   442             if type == "TextCtrl":
   449             if type == "TextCtrl":
   443                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   450                 fct += "    if (focusedId == wxT(\""+element_id+"\"))\n"
   444                 fct += "    {\n"
   451                 fct += "    {\n"
   445                 fct += "      flag_"+element_id+" = false;\n"
   452                 fct += _lock
   446                 fct += "      _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   453                 fct += "      _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n"
   447                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   454                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   448                 fct += "      flag_"+element_id+" = true;\n"
   455                 fct += _unlock
   449                 fct += "    }\n"
   456                 fct += "    }\n"
   450         fct += "  }\n"
   457         fct += "  }\n"
   451         fct += "}\n"
   458         fct += "}\n"
   452 
   459 
   453         
   460         
   465                 if info["name"] == "id":
   472                 if info["name"] == "id":
   466                     element_id = str(info["value"])
   473                     element_id = str(info["value"])
   467             type = element.GetElementInfos()["type"]
   474             type = element.GetElementInfos()["type"]
   468             FbdBlock = self.GetBlockType(type)
   475             FbdBlock = self.GetBlockType(type)
   469             if type == "ScrollBar":
   476             if type == "ScrollBar":
   470                 fct += "    if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n"
   477                 fct += "    if (focusedId == wxT(\""+element_id+"\"))\n"
   471                 fct += "    {\n"
   478                 fct += "    {\n"
   472                 fct += "      flag_"+element_id+" = false;\n"
       
   473                 fct += "      unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
   479                 fct += "      unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
   474                 fct += "      _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
   480                 fct += "      _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
   475                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   481                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
   476                 fct += "      flag_"+element_id+" = true;\n"
       
   477                 fct += "    }\n"
   482                 fct += "    }\n"
   478         fct += "  }\n"
   483         fct += "  }\n"
   479         fct += "  event.Skip();\n"
   484         fct += "  event.Skip();\n"
   480         fct += "}\n"
   485         fct += "}\n"
   481 
   486 
   482         
   487         
   483         
   488         
   484         
   489         
       
   490         fct += "/* OnPlcOutEvent updatde GUI with provided IEC __Q* PLC output variables */\n"
   485         fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n"
   491         fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n"
   486         fct += "  int old_state;\n"
   492         for element in elementsTab:
   487         for element in elementsTab:
   493             infos = element.getElementAttributes()
   488             infos = element.getElementAttributes()
   494             for info in infos:
   489             for info in infos:
   495                 if info["name"] == "id":
   490                 if info["name"] == "id":
   496                     element_id = str(info["value"])
   491                     element_id = str(info["value"])
   497             _lock =   " if (__sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, GUI_BUSY) == CHANGED)"
       
   498             _lock +=  " {\n"
       
   499             _unlock = "  __sync_val_compare_and_swap (&out_state_"+element_id+", GUI_BUSY, UNCHANGED);\n"
       
   500             _unlock +=" }\n"
   492             type = element.GetElementInfos()["type"]
   501             type = element.GetElementInfos()["type"]
   493             FbdBlock = self.GetBlockType(type)
   502             FbdBlock = self.GetBlockType(type)
   494             if type == "Button":
   503             if type == "Button":
   495                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   504                 fct += _lock
   496                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   505                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   497                 fct += "  {\n"
   506                 fct += "  {\n"
   498                 fct += "    flag_"+element_id+" = false;\n"
       
   499                 fct += "    SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   507                 fct += "    SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
   500                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   508                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   501                 fct += "      button->Show();\n"
   509                 fct += "      button->Show();\n"
   502                 fct += "    else\n"
   510                 fct += "    else\n"
   503                 fct += "      button->Hide();\n"
   511                 fct += "      button->Hide();\n"
   504                 fct += "    flag_"+element_id+" = true;\n"
       
   505                 fct += "  }\n"
   512                 fct += "  }\n"
   506                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   513                 fct += _unlock
   507             elif type == "Container":
   514             elif type == "Container":
   508                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   515                 fct += _lock
   509                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   516                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   510                 fct += "  {\n"
   517                 fct += "  {\n"
   511                 fct += "    flag_"+element_id+" = false;\n"
       
   512                 fct += "    SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   518                 fct += "    SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
   513                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   519                 fct += "    if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
   514                 fct += "      container->Show();\n"
   520                 fct += "      container->Show();\n"
   515                 fct += "    else\n"
   521                 fct += "    else\n"
   516                 fct += "      container->Hide();\n"
   522                 fct += "      container->Hide();\n"
   517                 fct += "    flag_"+element_id+" = true;\n"
       
   518                 fct += "  }\n"
   523                 fct += "  }\n"
   519                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   524                 fct += _unlock
   520             elif type == "TextCtrl":
   525             elif type == "TextCtrl":
   521                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   526                 fct += _lock
   522                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   527                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   523                 fct += "  {\n"
   528                 fct += "  {\n"
   524                 fct += "    flag_"+element_id+" = false;\n"
       
   525                 fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   529                 fct += "    SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   526                 fct += "    wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   530                 fct += "    wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   527                 fct += "    text->SetText(str);\n"
   531                 fct += "    text->SetText(str);\n"
   528                 fct += "    flag_"+element_id+" = true;\n"
       
   529                 fct += "  }\n"
   532                 fct += "  }\n"
   530                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   533                 fct += _unlock
   531             elif type == "ScrollBar":
   534             elif type == "ScrollBar":
   532                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   535                 fct += _lock
   533                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   536                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   534                 fct += "  {\n"
   537                 fct += "  {\n"
   535                 fct += "    flag_"+element_id+" = false;\n"
       
   536                 fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   538                 fct += "    SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
   537                 fct += "    scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n"
   539                 fct += "    scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n"
   538                 fct += "    flag_"+element_id+" = true;\n"
       
   539                 fct += "  }\n"
   540                 fct += "  }\n"
   540                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   541                 fct += _unlock
   541             elif type == "RotatingCtrl":
   542             elif type == "RotatingCtrl":
   542                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   543                 fct += _lock
   543                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   544                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   544                 fct += "  {\n"
   545                 fct += "  {\n"
   545                 fct += "    flag_"+element_id+" = false;\n"
       
   546                 fct += "    SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   546                 fct += "    SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
   547                 fct += "    rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n"
   547                 fct += "    rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n"
   548                 fct += "    flag_"+element_id+" = true;\n"
       
   549                 fct += "  }\n"
   548                 fct += "  }\n"
   550                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   549                 fct += _unlock
   551             elif type == "NoteBook":
   550             elif type == "NoteBook":
   552                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   551                 fct += _lock
   553                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   552                 fct += "  if (copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
   554                 fct += "  {\n"
   553                 fct += "  {\n"
   555                 fct += "    flag_"+element_id+" = false;\n"
       
   556                 fct += "    SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   554                 fct += "    SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
   557                 fct += "    notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   555                 fct += "    notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
   558                 fct += "    flag_"+element_id+" = true;\n"
       
   559                 fct += "  }\n"
   556                 fct += "  }\n"
   560                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   557                 fct += _unlock
   561             elif type == "Transform":
   558             elif type == "Transform":
   562                 fct += "  old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n"
   559                 fct += _lock
   563                 fct += "  if (_copy__QX"+self.BusNumber+"_"+element_id+"_6 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n"
   560                 fct += "  if (copy__QX"+self.BusNumber+"_"+element_id+"_6)\n"
   564                 fct += "  {\n"
   561                 fct += "  {\n"
   565                 fct += "    flag_"+element_id+" = false;\n"
       
   566                 fct += "    SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   562                 fct += "    SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
   567                 fct += "    transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+self.BusNumber+"_"+element_id+"_2);\n"
   563                 fct += "    transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+self.BusNumber+"_"+element_id+"_2);\n"
   568                 fct += "    transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n"
   564                 fct += "    transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n"
   569                 fct += "    transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n"
   565                 fct += "    transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n"
   570                 fct += "    flag_"+element_id+" = true;\n"
       
   571                 fct += "  }\n"
   566                 fct += "  }\n"
   572                 fct += "  __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n"
   567                 fct += _unlock
   573         fct += "  Update_Elements();\n"
   568         fct += "  Update_Elements();\n"
   574         fct += "  Refresh();\n"
   569         fct += "  Refresh();\n"
   575         fct += "  event.Skip();\n"
   570         fct += "  event.Skip();\n"
   576         fct += "}\n\n"
   571         fct += "}\n\n"
   577         return fct
   572         return fct
   578     
   573     
   579     def GenerateProgramPrivateFunctions(self):
   574     def GenerateProgramPrivateFunctions(self):
   580         elementsTab = self.GetElementsTab()
   575         elementsTab = self.GetElementsTab()
   581         fct = "void Program::OUT_"+self.BusNumber+"()\n{\n"
   576         fct = "void Program::Retrive()\n{\n"
   582         for element in elementsTab:
   577         for element in elementsTab:
   583             infos = element.getElementAttributes()
   578             infos = element.getElementAttributes()
   584             for info in infos:
   579             for info in infos:
   585                 if info["name"] == "id":
   580                 if info["name"] == "id":
   586                     element_id = str(info["value"])
   581                     element_id = str(info["value"])
   587             type = element.GetElementInfos()["type"]
   582             type = element.GetElementInfos()["type"]
   588             FbdBlock = self.GetBlockType(type)
   583             FbdBlock = self.GetBlockType(type)
   589             fct += "  if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", PLC_BUSY, FREE_AND_CHANGES) == PLC_BUSY){\n"
   584             fct += "  if ( __sync_val_compare_and_swap (&out_state_"+element_id+", UNCHANGED, PLC_BUSY) == UNCHANGED ||\n"
   590             #fct += "  if ( flag_"+element_id+" ){\n"
   585             fct += "       __sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n"
   591             fct += "    flag_"+element_id+" = false;\n"
   586             fct += "    bool diff = False;\n"
   592             element_num_patte = 1
   587             element_num_patte = 1
   593             for input in FbdBlock["inputs"]:
   588             for input in FbdBlock["inputs"]:
   594                 element_type = TYPECONVERSION[input[1]]
   589                 element_type = TYPECONVERSION[input[1]]
   595                 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   590                 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
       
   591                 fct +="    diff |= _copy"+var+ " != "+var+";\n"
   596                 fct +="    _copy"+var+ " = "+var+";\n"
   592                 fct +="    _copy"+var+ " = "+var+";\n"
   597                 element_num_patte +=1
   593                 element_num_patte +=1
   598             fct += "    flag_"+element_id+" = true;\n"
   594             fct += "    if(diff) out_state_"+element_id+" = CHANGED;\n"
   599             fct += "  }\n"
   595             fct += "  }\n"
       
   596         fct +="  /*Replace this with determinist signal if called from RT*/;\n"
   600         fct +="  wxCommandEvent event( EVT_PLC );\n"
   597         fct +="  wxCommandEvent event( EVT_PLC );\n"
   601         fct +="  ProcessEvent(event);\n"
   598         fct +="  ProcessEvent(event);\n"
   602         fct +="};\n\n" 
   599         fct +="};\n\n" 
   603         
   600         
   604         fct += "void Program::IN_"+self.BusNumber+"()\n{\n"
   601         fct += "void Program::Publish()\n{\n"
   605 
   602 
   606         for element in elementsTab:
   603         for element in elementsTab:
   607             infos = element.getElementAttributes()
   604             infos = element.getElementAttributes()
   608             for info in infos:
   605             for info in infos:
   609                 if info["name"] == "id":
   606                 if info["name"] == "id":
   610                     element_id = str(info["value"])
   607                     element_id = str(info["value"])
   611             type = element.GetElementInfos()["type"]
   608             type = element.GetElementInfos()["type"]
   612             FbdBlock = self.GetBlockType(type)
   609             FbdBlock = self.GetBlockType(type)
   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"
   610             fct += "  do{\n"
   614             fct += "    flag_"+element_id+" = false;\n"
   611             fct += "    if ( __sync_val_compare_and_swap (&in_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n"
   615             element_num_patte = 1
   612             element_num_patte = 1
   616             for output in FbdBlock["outputs"]:
   613             for output in FbdBlock["outputs"]:
   617                 element_type = TYPECONVERSION[output[1]]
   614                 element_type = TYPECONVERSION[output[1]]
   618                 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   615                 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
   619                 fct +="     "+var+ " = _copy"+var+";\n"
   616                 fct +="      "+var+ " = _copy"+var+";\n"
   620                 element_num_patte +=1
   617                 element_num_patte +=1
   621             fct += "    flag_"+element_id+" = true;\n"
   618             fct += "      /* reset change status pin */\n"
   622             fct += "  }\n"
   619             if type == "Button":
   623         fct += "  SetNoChanges();\n"
   620                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   621             elif type == "Container":
       
   622                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   623             elif type == "TextCtrl":
       
   624                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   625             elif type == "ScrollBar":
       
   626                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   627             elif type == "RotatingCtrl":
       
   628                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   629             elif type == "NoteBook":
       
   630                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   631             elif type == "Transform":
       
   632                 fct += "      _copy__IX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
       
   633             fct += "    }else{\n"
       
   634             fct += "      break;\n"
       
   635             fct += "    }\n"
       
   636             #If GUI did change data while publishing, do it again (in real-time this should be avoided with priority stuff)
       
   637             fct += "  }while(__sync_val_compare_and_swap (&in_state_"+element_id+", PLC_BUSY, UNCHANGED) != PLC_BUSY)\n"
   624         fct +="};\n\n" 
   638         fct +="};\n\n" 
   625         
   639         
   626         fct += "void Program::Initialize()\n{\n"
   640         fct += "void Program::Initialize()\n{\n"
   627         button = False
   641         button = False
   628         container = False
   642         container = False
   697                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   711                 fct += "  _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
   698                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
   712                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
   699                 transform = True
   713                 transform = True
   700         fct += "}\n\n"
   714         fct += "}\n\n"
   701         
   715         
   702         fct += "void Program::SetNoChanges()\n{\n"
       
   703         for element in elementsTab:
       
   704             infos = element.getElementAttributes()
       
   705             for info in infos:
       
   706                 if info["name"] == "id":
       
   707                     element_id = str(info["value"])
       
   708             type = element.GetElementInfos()["type"]
       
   709             FbdBlock = self.GetBlockType(type)
       
   710             if type == "Button":
       
   711                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   712             elif type == "Container":
       
   713                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   714             elif type == "TextCtrl":
       
   715                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   716             elif type == "ScrollBar":
       
   717                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   718             elif type == "RotatingCtrl":
       
   719                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   720             elif type == "NoteBook":
       
   721                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
       
   722             elif type == "Transform":
       
   723                 fct += "  _copy__IX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
       
   724         fct += "}\n\n"
       
   725         
       
   726         #DEBUG Fonction d'affichage
   716         #DEBUG Fonction d'affichage
   727         fct += "void Program::Print()\n{\n"
   717         fct += "void Program::Print()\n{\n"
   728         for element in elementsTab:
   718         for element in elementsTab:
   729             infos = element.getElementAttributes()
   719             infos = element.getElementAttributes()
   730             for info in infos:
   720             for info in infos: