--- a/plugins/svgui/svgui.py Thu Mar 13 15:38:27 2008 +0100
+++ b/plugins/svgui/svgui.py Mon Mar 31 18:33:35 2008 +0200
@@ -1,100 +1,109 @@
base_folder = os.path.split(sys.path[0])[0]
-sys.path.append(os.path.join(base_folder, "wxsvg", "defeditor"))
+sys.path.append(os.path.join(base_folder, "wxsvg", "SVGUIEditor")) +sys.path.append(os.path.join(base_folder, "plcopeneditor", "graphics")) -from DEFControler import *
+from SVGUIControler import * +from SVGUIEditor import * from FBD_Objects import *
-class _EditorFramePlug(EditorFrame):
+from wxPopen import ProcessLogger +[ID_SVGUIEDITORFBDPANEL, +] = [wx.NewId() for _init_ctrls in range(1)] +SVGUIFB_Types = {ITEM_CONTAINER : "Container", + ITEM_BUTTON : "Button", + ITEM_TEXT : "TextCtrl", + ITEM_SCROLLBAR : "ScrollBar", + ITEM_ROTATING : "RotatingCtrl", + ITEM_NOTEBOOK : "NoteBook", + ITEM_TRANSFORM : "Transform"} +class _SVGUIEditor(SVGUIEditor): - This Class add IEC specific features to the SVGUI DEFEditor :
+ This Class add IEC specific features to the SVGUIEditor : - def __init__(self,controller):
- EditorFrame.__init__(self,controller, solo_mode=False)
- self.FbdWindow = wx.Panel(name='fbdwindow',parent=self.EditorPanel,
- pos=wx.Point(300, 355),size=wx.Size(240, 240),
- style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.FbdWindow.SetBackgroundColour(wxColour(255,255,255))
- self.FbdWindow.Bind(wx.EVT_LEFT_DOWN, self.OnFbdClick)
- wx.EVT_PAINT(self.FbdWindow,self.OnPaintFBD)
+ def _init_coll_EditorGridSizer_Items(self, parent): + SVGUIEditor._init_coll_EditorGridSizer_Items(self, parent) + parent.AddWindow(self.FBDPanel, 0, border=0, flag=wx.GROW) + def _init_ctrls(self, prnt): + SVGUIEditor._init_ctrls(self, prnt, False)
- self.RefreshProjectTree()
- if (controller.SvgFilepath):
- self.OpenSVGFile(controller.filepath)
- self.mySVGctrl.Refresh()
+ self.FBDPanel = wx.Panel(id=ID_SVGUIEDITORFBDPANEL, + name='FBDPanel', parent=self.EditorPanel, pos=wx.Point(0, 0), + size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) + self.FBDPanel.SetBackgroundColour(wx.WHITE) + self.FBDPanel.Bind(wx.EVT_LEFT_DOWN, self.OnFBDPanelClick) + self.FBDPanel.Bind(wx.EVT_PAINT, self.OnPaintFBDPanel) + setattr(self.FBDPanel, "GetScaling", lambda: None) - def SetFbdDragData(self,selected_type):
- self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='')
- name = self.Controler.GetSelectedElementName()
- self.FbdData = str((selected_type,"functionBlock", name))
+ def __init__(self, parent, controler = None, fileOpen = None): + SVGUIEditor.__init__(self, parent, controler, fileOpen)
- dc = wx.ClientDC(self.FbdWindow)
+ def RefreshView(self, select_id = None): + SVGUIEditor.RefreshView(self, select_id) + self.FBDPanel.Refresh() + def OnPaintFBDPanel(self,event): + dc = wx.ClientDC(self.FBDPanel) - if self.Controler.HasOpenedProject():
- selected_type = self.Controler.GetSelectedElementType()
- self.SetFbdDragData(selected_type)
- self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='')
- width,height = self.FbdBlock.GetMinSize()
- self.FbdBlock.SetSize(width,height)
- clientsize = self.FbdWindow.GetClientSize()
+ selected = self.GetSelected() + if selected is not None: + selected_type = self.Controler.GetElementType(selected) + if selected_type is not None: + self.FBDBlock = FBD_Block(parent=self.FBDPanel,type=SVGUIFB_Types[selected_type],name=self.Controler.GetElementName(selected)) + width, height = self.FBDBlock.GetMinSize() + self.FBDBlock.SetSize(width,height) + clientsize = self.FBDPanel.GetClientSize() x = (clientsize.width - width) / 2
y = (clientsize.height - height) / 2
- self.FbdBlock.SetPosition(x, y)
- def OnPaintFBD(self,event):
+ self.FBDBlock.SetPosition(x, y) - def OnFbdClick(self,event):
- data = wx.TextDataObject(self.FbdData)
- DropSrc = wx.DropSource(self.FbdWindow)
+ def OnFBDPanelClick(self, event): + data = wx.TextDataObject(str((self.FBDBlock.GetType(), "functionBlock", self.FBDBlock.GetName()))) + DropSrc = wx.DropSource(self.FBDPanel)
- def OnProjectTreeItemSelected(self,event):
- EditorFrame.OnProjectTreeItemSelected(self,event)
- EditorFrame.OnNew(self,event)
- def OnOpen(self,event):
- EditorFrame.OnOpen(self,event)
+ def OnInterfaceTreeItemSelected(self, event): + self.FBDPanel.Refresh() + SVGUIEditor.OnInterfaceTreeItemSelected(self, event) def OnGenerate(self,event):
self.Controler.PlugGenerate_C(sys.path[0],(0,0,4,5),None)
- def OnClose(self, event):
TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
"USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
"STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"}
-TYPECONVERSION = {"BOOL" : "X", "UINT" : "W","REAL" : "D","STRING" : "B"}
CTYPECONVERSION = {"BOOL" : "IEC_BOOL", "UINT" : "IEC_UINT", "STRING" : "IEC_STRING", "REAL" : "IEC_REAL"}
CPRINTTYPECONVERSION = {"BOOL" : "d", "UINT" : "d", "STRING" : "s", "REAL" : "f"}
-class RootClass(DEFControler):
+class RootClass(SVGUIControler): - DEFControler.__init__(self)
- filepath = os.path.join(self.PlugPath(), "gui.def")
+ SVGUIControler.__init__(self) + filepath = os.path.join(self.PlugPath(), "gui.xml") if os.path.isfile(filepath):
svgfile = os.path.join(self.PlugPath(), "gui.svg")
@@ -102,9 +111,15 @@
self.SvgFilepath = svgfile
self.OpenXMLFile(filepath)
- self.CreateRootElement()
+ self.CreateNewInterface() self.SetFilePath(filepath)
+ def GetElementIdFromName(self, name): + element = self.GetElementByName(name) + if element is not None: def _OpenView(self, logger):
@@ -112,13 +127,33 @@
self.GetPlugRoot().SaveProject()
- self._View = _EditorFramePlug(self)
+ self._View = _SVGUIEditor(self.GetPlugRoot().AppFrame, self) self._View._onclose = _onclose
self._View._onsave = _onsave
- filepath = os.path.join(self.PlugPath(), "gui.def")
- self._View.OpenSVGFile(filepath)
+ def _ImportSVG(self, logger): + dialog = wx.FileDialog(self.GetPlugRoot().AppFrame, "Choose a SVG file", os.getcwd(), "", "SVG files (*.svg)|*.svg|All files|*.*", wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + svgpath = dialog.GetPath() + if os.path.isfile(svgpath): + shutil.copy(svgpath, os.path.join(self.PlugPath(), "gui.svg")) + logger.write_error("No such SVG file: %s\n"%svgpath) + def _ImportXML(self, logger): + dialog = wx.FileDialog(self.GetPlugRoot().AppFrame, "Choose a XML file", os.getcwd(), "", "XML files (*.xml)|*.xml|All files|*.*", wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + xmlpath = dialog.GetPath() + if os.path.isfile(xmlpath): + shutil.copy(xmlpath, os.path.join(self.PlugPath(), "gui.xml")) + logger.write_error("No such XML file: %s\n"%xmlpath) {"bitmap" : os.path.join("images","HMIEditor"),
@@ -127,545 +162,506 @@
{"bitmap" : os.path.join("images","ImportSVG"),
"tooltip" : "Import SVG",
- "method" : "_OpenView"},
+ "method" : "_ImportSVG"}, {"bitmap" : os.path.join("images","ImportDEF"),
- "tooltip" : "Import DEF",
- "method" : "_OpenView"},
+ "tooltip" : "Import XML", + "method" : "_InportXML"}, - def GenerateProgramHeadersPublicVars(self):
- fct += " void OnPlcOutEvent(wxEvent& event);\n\n"
- fct += " void Retrive();\n"
- fct += " void Publish();\n"
- fct += " void Initialize();\n"
-# fct += " void Print();\n"
+ def GenerateProgramHeadersPublicVars(self, elements): + text = """ void OnPlcOutEvent(wxEvent& event); +# text += " void Print();\n" - def GenerateIECVars(self):
+ def GenerateIECVars(self, elements): - elementsTab = self.GetElementsTab()
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- text += "volatile int out_state_"+element_id+";\n"
- text += "volatile int in_state_"+element_id+";\n"
+ for element in elements: + text += "volatile int out_state_%d;\n"%element.getid() + text += "volatile int in_state_%d;\n"%element.getid() + current_location = "_".join(map(str, self.GetCurrentLocation())) #Declaration des variables
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- for input in FbdBlock["inputs"]:
- element_type = TYPECONVERSION[input[1]]
+ for element in elements: + block_infos = GetBlockType(SVGUIFB_Types[GetElementType(element)]) + block_id = element.getid() + for i, input in enumerate(block_infos["inputs"]): element_c_type = CTYPECONVERSION[input[1]]
- line = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
- text += element_c_type+" "+line
- text += element_c_type+" _copy"+line
- for output in FbdBlock["outputs"]:
- element_type = TYPECONVERSION[output[1]]
+ variable = "__Q%s%s_%d_%d"%(TYPECONVERSION[input[1]], current_location, block_id, i + 1) + text += "%s %s;\n"%(element_c_type, variable) + text += "%s _copy%s;\n"%(element_c_type, variable) + for i, output in enumerate(block_infos["outputs"]): element_c_type = CTYPECONVERSION[output[1]]
- line = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n"
- text += element_c_type+" "+line
- text += element_c_type+" _copy"+line
+ variable = "__I%s%s_%d_%d"%(TYPECONVERSION[output[1]], current_location, block_id, i + 1) + text += "%s %s;\n"%(element_c_type, variable) + text += "%s _copy%s;\n"%(element_c_type, variable) - def GenerateGlobalVarsAndFuncs(self):
- text = "#include \"iec_types.h\"\n\n"
- pri_vars = self.GenerateIECVars()
- text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n"
- text += "IMPLEMENT_WX_THEME_SUPPORT;\n"
- text += "SVGViewApp *myapp = NULL;\n"
- text += "pthread_t wxMainLoop;\n"
-# text += "pthread_t wxMainLoop,automate;\n"
- text += "int myargc = 0;\n"
- text += "char** myargv = NULL;\n\n"
+ def GenerateGlobalVarsAndFuncs(self, elements, size): + text = "#include \"iec_std_lib.h\"\n\n" + text += self.GenerateIECVars(elements) - text += "#define UNCHANGED 1 \n"
- text += "#define PLC_BUSY 2 \n"
- text += "#define CHANGED 3 \n"
- text += "#define GUI_BUSY 4 \n\n"
+ text += """IMPLEMENT_APP_NO_MAIN(SVGViewApp); +IMPLEMENT_WX_THEME_SUPPORT; +SVGViewApp *myapp = NULL; +# text += "pthread_t wxMainLoop,automate;\n" + text += """int myargc = 0; - text += "void* InitWxEntry(void* args)\n{\n"
- text += " wxEntry(myargc,myargv);\n"
- text += " return args;\n"
-# text += "void* SimulAutomate(void* args)\n{\n"
-# text += " while(1){\n"
-# text += " myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"();\n"
-# text += " //printf(\"AUTOMATE\\n\");\n"
-# text += " myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"();\n"
-# text += " sleep(1);\n"
-# text += " return args;\n"
-# if (self.SVGUIRootElement):
-# width = self.SVGUIRootElement.GetBBox().GetWidth()
-# height = self.SVGUIRootElement.GetBBox().GetHeight()
- text += "bool SVGViewApp::OnInit()\n{\n"
- text += " #ifndef __WXMSW__\n"
- text += " setlocale(LC_NUMERIC, \"C\");\n"
- #text += " frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize((int)"+str(width)+", (int)"+str(height)+"));\n"
- text += " frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxDefaultSize);\n"
- text += " myapp = this;\n"
+void* InitWxEntry(void* args) + wxEntry(myargc,myargv); +# text += """void* SimulAutomate(void* args) +# myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"(); +# //printf(\"AUTOMATE\\n\"); +# myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"(); + text += """bool SVGViewApp::OnInit() + setlocale(LC_NUMERIC, "C"); + #text += " frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize(%d, %d));\n"%size + text += """ frame = new MainFrame(NULL, wxT("Program"),wxDefaultPosition, wxDefaultSize); # text += " pthread_create(&automate, NULL, SimulAutomate, NULL);\n"
- text += " return true;\n"
- text += "int __init_"+self.BusNumber+"(int argc, char** argv)\n{\n"
- text += " myargc = argc;\n"
- text += " myargv = argv;\n"
- text += " pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL);\n"
+ text += """ return true; - text += "int __cleanup_"+self.BusNumber+"()\n{\n"
+int __init_%(location)s(int argc, char** argv) + pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL); - text += "int __retrive_"+self.BusNumber+"()\n{\n"
- text += " myapp->Retrive()"
+void __cleanup_%(location)s() +void __retrieve_%(location)s() + myapp->frame->m_svgCtrl->Retrieve(); - text += "int __publish_"+self.BusNumber+"()\n{\n"
- text += " myapp->Publish()"
+void __publish_%(location)s() + myapp->frame->m_svgCtrl->Publish(); - text += "IEC_STRING wxStringToIEC_STRING(wxString s)\n"
- text += " STRING res = {0,""};\n"
- text += " for(int i=0; i<s.Length() && i<STR_MAX_LEN; i++)\n"
- text += " res.body[i] = s.GetChar(i);\n"
- text += " res.len = i;\n"
- text += " return res;\n"
+IEC_STRING wxStringToIEC_STRING(wxString s) + for(i = 0; i<s.Length() && i<STR_MAX_LEN; i++) + res.body[i] = s.GetChar(i); +"""%{"location" : "_".join(map(str, self.GetCurrentLocation()))} - def GenerateProgramEventTable(self):
- elementsTab = self.GetElementsTab()
- #evt += "wxEVT_PLCOUT = wxNewEventType();\n\n";
- evt += "BEGIN_DECLARE_EVENT_TYPES()\n"
- evt += "DECLARE_LOCAL_EVENT_TYPE( EVT_PLC, wxNewEventType() )\n"
- evt += "END_DECLARE_EVENT_TYPES()\n\n"
+ def GenerateProgramEventTable(self, elements): + #text += "wxEVT_PLCOUT = wxNewEventType();\n\n"; + text += """BEGIN_DECLARE_EVENT_TYPES() +DECLARE_LOCAL_EVENT_TYPE( EVT_PLC, wxNewEventType() ) +END_DECLARE_EVENT_TYPES() - evt += "DEFINE_LOCAL_EVENT_TYPE( EVT_PLC )\n\n"
+DEFINE_LOCAL_EVENT_TYPE( EVT_PLC ) - evt += "BEGIN_EVENT_TABLE(Program, SVGUIWindow)\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- if info["name"] == "name":
- element_name = str(info["value"])
- type = element.GetElementInfos()["type"]
- evt += " EVT_BUTTON (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Click)\n"
- elif type == "ScrollBar":
- #evt += " EVT_LEFT_UP (Program::OnClick)\n"
- #evt += " EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n"
- elif type == "RotatingCtrl":
- evt += " EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n"
- elif type == "NoteBook":
- evt += " EVT_NOTEBOOK_PAGE_CHANGED (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"TabChanged)\n"
- elif type == "Container" or type == "Transform":
- evt += " EVT_PAINT(Program::On"+element_name+"Paint)\n"
- evt += " EVT_LEFT_UP (Program::OnClick)\n"
- evt += " EVT_CUSTOM( EVT_PLC, wxID_ANY, Program::OnPlcOutEvent )\n"
- evt += "END_EVENT_TABLE()\n\n"
- def GenerateProgramInitFrame(self):
- text = "MainFrame::MainFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,const wxSize& size, long style): wxFrame(parent, wxID_ANY, title, pos, size, style)\n{\n"
- text += " m_svgCtrl = new Program(this);\n"
- text += " if (m_svgCtrl->LoadFiles(wxT(\""+self.SvgFilepath+"\"), wxT(\""+self.filepath+"\")))\n"
- text += " Show(true);\n"
- text += " m_svgCtrl->SetFocus();\n"
- text += " m_svgCtrl->SetFitToFrame(true);\n"
- text += " m_svgCtrl->RefreshScale();\n"
- text += " m_svgCtrl->InitScrollBars();\n"
- text += " m_svgCtrl->Initialize();\n"
- text += " m_svgCtrl->Update();\n"
- text += " //m_svgCtrl->Print();\n"
- text += " printf(\"Error while opening files\\n\");\n"
+ text += "BEGIN_EVENT_TABLE(Program, SVGUIWindow)\n" + for element in elements: + element_type = GetElementType(element) + element_name = element.getname() + if element_type == ITEM_BUTTON: + text += " EVT_BUTTON (SVGUIID(\"%s\"), Program::On%sClick)\n"%(element_name, element_name) + elif element_type in [ITEM_SCROLLBAR, ITEM_ROTATING]: + text += " EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\"%s\"), Program::On%sChanged)\n"%(element_name, element_name) + elif element_type == ITEM_NOTEBOOK: + text += " EVT_NOTEBOOK_PAGE_CHANGED (SVGUIID(\"%s\"), Program::On%sTabChanged)\n"%(element_name, element_name) +## elif element_type in [ITEM_CONTAINER, ITEM_TRANSFORM]: +## text += " EVT_PAINT(Program::On%sPaint)\n"%element_name + text += " EVT_LEFT_UP (Program::OnClick)\n" + text += " EVT_CUSTOM( EVT_PLC, wxID_ANY, Program::OnPlcOutEvent )\n" + text += "END_EVENT_TABLE()\n\n" - def GenerateProgramInitProgram(self):
- elementsTab = self.GetElementsTab()
+ def GenerateProgramInitFrame(self, elements): + text = """MainFrame::MainFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,const wxSize& size, long style): wxFrame(parent, wxID_ANY, title, pos, size, style) + m_svgCtrl = new Program(this); + if (m_svgCtrl->LoadFiles(wxT("%s"), wxT("%s"))) + m_svgCtrl->SetFitToFrame(true); + m_svgCtrl->RefreshScale(); + m_svgCtrl->InitScrollBars(); + m_svgCtrl->Initialize(); + printf("Error while opening files\\n"); +"""%(self.GetSVGFilePath(), self.GetFilePath()) + def GenerateProgramInitProgram(self, elements): text = "Program::Program(wxWindow* parent):SVGUIWindow(parent)\n{\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- text += " out_state_"+element_id+" = UNCHANGED;\n"
- text += " in_state_"+element_id+" = UNCHANGED;\n"
+ for element in elements: + text += " out_state_%d = UNCHANGED;\n"%element.getid() + text += " in_state_%d = UNCHANGED;\n"%element.getid() - def GenerateProgramEventFunctions(self):
- elementsTab = self.GetElementsTab()
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- _lock = " in_state_"+element_id+" = GUI_BUSY;\n"
- _unlock = " in_state_"+element_id+" = CHANGED;\n"
- if info["name"] == "name":
- element_name = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n"
- for output in FbdBlock["outputs"]:
- element_type = TYPECONVERSION[output[1]]
- fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n"
- fct += " event.Skip();\n"
+ def GenerateProgramEventFunctions(self, elements): + current_location = "_".join(map(str, self.GetCurrentLocation())) + for element in elements: + element_type = GetElementType(element) + element_state = " in_state_%d = %s;\n"%(element.getid(), "%s") + element_name = element.getname() - elif type == "RotatingCtrl":
- fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n"
- fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " rotating->SendScrollEvent(event);\n"
- fct += " double angle = rotating->GetAngle();\n"
- for output in FbdBlock["outputs"]:
+ block_infos = GetBlockType(SVGUIFB_Types[element_type]) + if element_type == ITEM_BUTTON: + text += """void Program::On%sClick(wxCommandEvent& event) + SVGUIButton* button = (SVGUIButton*)GetElementByName(wxT("%s"));\n"""%(element_name, element_name) + text += element_state%"GUI_BUSY" + for i, output in enumerate(block_infos["outputs"]): element_type = TYPECONVERSION[output[1]]
- if element_num_patte == 1:
- elif element_num_patte == 2:
- fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
- elif type == "NoteBook":
- fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n"
- fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " notebook->SendNotebookEvent(event);\n"
- fct += " unsigned int selected = notebook->GetCurrentPage();\n"
- for output in FbdBlock["outputs"]:
- element_type = TYPECONVERSION[output[1]]
+ value = "button->IsVisible()" + value = "button->GetToggle()" + text += " _copy__I%s%s_%d_%d = %s;\n"%(TYPECONVERSION[output[1]], current_location, element.getid(), i + 1, value) + text += element_state%"CHANGED" + text += " event.Skip();\n}\n\n" + elif element_type == ITEM_ROTATING: + text += """void Program::On%sChanged(wxScrollEvent& event) + SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementByName(wxT("%s")); + rotating->SendScrollEvent(event); + double angle = rotating->GetAngle(); +"""%(element_name, element_name) + text += element_state%"GUI_BUSY" + for i, output in enumerate(block_infos["outputs"]): + text += " _copy__I%s%s_%d_%d = %s;\n"%(TYPECONVERSION[output[1]], current_location, element.getid(), i + 1, ["angle", "true"][value]) + text += element_state%"CHANGED" + text += " event.Skip();\n}\n\n" + elif element_type == ITEM_NOTEBOOK: + text += """void Program::On%sTabChanged(wxNotebookEvent& event) + SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementByName(wxT("%s")); + notebook->SendNotebookEvent(event); + unsigned int selected = notebook->GetCurrentPage(); +"""%(element_name, element_name) + text += element_state%"GUI_BUSY" + for i, output in enumerate(block_infos["outputs"]): + text += " _copy__I%s%s_%d_%d = %s;\n"%(TYPECONVERSION[output[1]], current_location, element.getid(), i + 1, ["selected", "true"][value]) + text += element_state%"CHANGED" + text += " event.Skip();\n}\n\n" + elif element_type == ITEM_TRANSFORM: + text += """void Program::On%sPaint(wxPaintEvent& event) + SVGUITransform* transform = (SVGUITransform*)GetElementByName(wxT("%s")); +"""%(element_name, element_name) + text += element_state%"GUI_BUSY" + for i, output in enumerate(block_infos["outputs"]): + texts = {"location" : current_location, "id" : element.getid(), + "pin" : i + 1, "param" : ["X", "Y", "XScale", "YScale", "Angle"][i]} - if element_num_patte == 1:
- elif element_num_patte == 2:
- fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n"
- elif type == "Transform":
- fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
- fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
- for output in FbdBlock["outputs"]:
- if element_num_patte == 1:
- fct += " if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
- elif element_num_patte == 2:
- fct += " if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
- elif element_num_patte == 3:
- fct += " if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
- elif element_num_patte == 4:
- fct += " if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
- elif element_num_patte == 5:
- fct += " if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n"
- fct += " event.Skip();\n"
- elif type == "Container":
- fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n"
- fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " bool isvisible = container->IsVisible();\n"
- fct += " if (isvisible != _copy__IX"+self.BusNumber+"_"+element_id+"_1)\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
- fct += " event.Skip();\n"
- fct += "void Program::OnChar(wxKeyEvent& event)\n{\n"
- fct += " SVGUIContainer* container = GetSVGUIRootElement();\n"
- fct += " if (container->GetFocusedElementName() == wxT(\"TextCtrl\"))\n"
- fct += " wxString focusedId = container->GetFocusedElement();\n"
- fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(container->GetFocusedElement());\n"
- fct += " text->SendKeyEvent(event);\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- _lock = " in_state_"+element_id+" = GUI_BUSY;\n"
- _unlock = " in_state_"+element_id+" = CHANGED;\n"
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- fct += " if (focusedId == wxT(\""+element_id+"\"))\n"
- fct += " _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToIEC_STRING(text->GetValue());\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
+ text += """ if (transform->Get%(param)s() != _copy__ID%(location)s_%(id)d_%(pin)d) + _copy__ID%(location)s_%(id)d_%(pin)d = transform->Get%(param)s(); + _copy__IX%(location)s_%(id)d_6 = true; + text += element_state%"CHANGED" + text += " event.Skip();\n}\n\n" + elif element_type == ITEM_CONTAINER: + text += """void Program::On%sPaint(wxPaintEvent& event) + SVGUIContainer* container = (SVGUIContainer*)GetElementByName(wxT("%s")); + bool isvisible = container->IsVisible(); +"""%(element_name, element_name) + text += element_state%"GUI_BUSY" + texts = {"location" : current_location, "id" : element.getid()} + text += """ if (isvisible != _copy__IX%(location)s_%(id)d_1) + _copy__IX%(location)s_%(id)d_1 = container->IsVisible(); + _copy__IX%(location)s_%(id)d_2 = true; + text += " %s }\n else {\n %s }\n"%(element_state%"CHANGED", element_state%"UNCHANGED") + text += " event.Skip();\n}\n\n" + text += """void Program::OnChar(wxKeyEvent& event) + SVGUIContainer* container = GetSVGUIRootElement(); + if (container->GetFocusedElementName() == wxT("TextCtrl")) + wxString focusedId = container->GetFocusedElement(); + SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(focusedId); + text->SendKeyEvent(event); + for element in elements: + element_type = GetElementType(element) + if element_type == ITEM_TEXT: + texts = {"location" : current_location, "id" : element.getid()} + text += """ if (focusedId == wxT("%(id)d")) + in_state_%(id)d = GUI_BUSY; + _copy__IB%(location)s_%(id)d_1 = wxStringToIEC_STRING(text->GetValue()); + _copy__IX%(location)s_%(id)d_2 = true; + in_state_%(id)d = CHANGED; + text += " }\n event.Skip();\n}\n\n" + text += """void Program::OnClick(wxMouseEvent& event) + SVGUIContainer* container = GetSVGUIRootElement(); + if (container->GetFocusedElementName() == wxT("ScrollBar")) + wxString focusedId = container->GetFocusedElement(); + SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(focusedId); + scrollbar->SendMouseEvent(event); + for element in elements: + element_type = GetElementType(element) + if element_type == ITEM_SCROLLBAR: + texts = {"location" : current_location, "id" : element.getid()} + text += """ if (focusedId == wxT("%(id)d")) + unsigned int scrollPos = scrollbar->GetThumbPosition(); + _copy__IW%(location)s_%(id)d_1 = scrollPos; + _copy__IX%(location)s_%(id)d_2 = true;\n" + text += " }\n event.Skip();\n}\n\n"
- fct += "void Program::OnClick(wxMouseEvent& event)\n{\n"
- fct += " SVGUIContainer* container = GetSVGUIRootElement();\n"
- fct += " if (container->GetFocusedElementName() == wxT(\"ScrollBar\"))\n"
- fct += " wxString focusedId = container->GetFocusedElement();\n"
- fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(focusedId);\n"
- fct += " scrollbar->SendMouseEvent(event);\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- if type == "ScrollBar":
- fct += " if (focusedId == wxT(\""+element_id+"\"))\n"
- fct += " unsigned int scrollPos = scrollbar->GetThumbPosition();\n"
- fct += " _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n"
- fct += " event.Skip();\n"
+ text += "/* OnPlcOutEvent update GUI with provided IEC __Q* PLC output variables */\n" + text += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n wxMutexGuiEnter();" + for element in elements: + element_type = GetElementType(element) + texts = {"location" : current_location, "id" : element.getid()} + element_lock = " if (__sync_val_compare_and_swap (&out_state_%(id)d, CHANGED, GUI_BUSY) == CHANGED)\n {\n"%texts + element_unlock = " __sync_val_compare_and_swap (&out_state_%(id)d, GUI_BUSY, UNCHANGED);\n }\n"%texts + if element_type == ITEM_BUTTON: + text += """ SVGUIButton* button = (SVGUIButton*)GetElementById(wxT("%(id)d")); + //if (_copy__QX%(location)s_%(id)d_1) + if (_copy__QX%(location)s_%(id)d_2 != button->GetToggle()) { + button->SetToggle(_copy__QX%(location)s_%(id)d_2); + elif element_type == ITEM_CONTAINER: + text += """ if (_copy__QX%(location)s_%(id)d_2) + SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT("%(id)d")); + //if (_copy__QX%(location)s_%(id)d_1) + elif element_type == ITEM_TEXT: + text += """ if (_copy__QX%(location)s_%(id)d_2) + SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT("%(id)d")); + wxString str = wxString::FromAscii(_copy__QB%(location)s_%(id)d_1); + elif element_type == ITEM_SCROLLBAR: + text += """ if (_copy__QX%(location)s_%(id)d_2) + SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT("%(id)d")); + scrollbar->SetThumbPosition(_copy__QW%(location)s_%(id)d_1);\n" + elif element_type == ITEM_ROTATING: + text += """ if (_copy__QX%(location)s_%(id)d_2) + SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT("%(id)d")); + rotating->SetAngle(_copy__QD%(location)s_%(id)d_1);\n" + elif elment_type == ITEM_NOTEBOOK: + text += """ if (copy__QX%(location)s_%(id)d_2) + SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT("%(id)d")); + notebook->SetCurrentPage(_copy__QB%(location)s_%(id)d_1); + elif elment_type == ITEM_TRANSFORM: + text += """ if (copy__QX%(location)s_%(id)d_6) + SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT("%(id)d")); + transform->Move(_copy__QD%(location)s_%(id)d_1, _copy__QD%(location)s_%(id)d_2); + transform->Scale(_copy__QD%(location)s_%(id)d_3, _copy__QD%(location)s_%(id)d_4); + transform->Rotate(_copy__QD%(location)s_%(id)d_5); + text += """ wxMutexGuiLeave();
+ def GenerateProgramPrivateFunctions(self, elements): + current_location = "_".join(map(str, self.GetCurrentLocation())) - fct += "/* OnPlcOutEvent updatde GUI with provided IEC __Q* PLC output variables */\n"
- fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- _lock = " if (__sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, GUI_BUSY) == CHANGED)"
- _unlock = " __sync_val_compare_and_swap (&out_state_"+element_id+", GUI_BUSY, UNCHANGED);\n"
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
- fct += " button->Show();\n"
- fct += " button->Hide();\n"
- elif type == "Container":
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n"
- fct += " container->Show();\n"
- fct += " container->Hide();\n"
- elif type == "TextCtrl":
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
- fct += " text->SetText(str);\n"
- elif type == "ScrollBar":
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n"
- elif type == "RotatingCtrl":
- fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n"
- elif type == "NoteBook":
- fct += " if (copy__QX"+self.BusNumber+"_"+element_id+"_2)\n"
- fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n"
- elif type == "Transform":
- fct += " if (copy__QX"+self.BusNumber+"_"+element_id+"_6)\n"
- fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+self.BusNumber+"_"+element_id+"_2);\n"
- fct += " transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n"
- fct += " transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n"
- fct += " Update_Elements();\n"
- fct += " event.Skip();\n"
- def GenerateProgramPrivateFunctions(self):
- elementsTab = self.GetElementsTab()
- fct = "void Program::Retrive()\n{\n"
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- fct += " if ( __sync_val_compare_and_swap (&out_state_"+element_id+", UNCHANGED, PLC_BUSY) == UNCHANGED ||\n"
- fct += " __sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n"
- fct += " bool diff = False;\n"
- for input in FbdBlock["inputs"]:
- element_type = TYPECONVERSION[input[1]]
- var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
- fct +=" diff |= _copy"+var+ " != "+var+";\n"
- fct +=" _copy"+var+ " = "+var+";\n"
- fct += " if(diff) out_state_"+element_id+" = CHANGED;\n"
- fct +=" /*Replace this with determinist signal if called from RT*/;\n"
- fct +=" wxCommandEvent event( EVT_PLC );\n"
- fct +=" ProcessEvent(event);\n"
+ text = "void Program::Retrieve()\n{\n" + for element in elements: + element_type = GetElementType(element) + texts = {"location" : current_location, "id" : element.getid()} + block_infos = GetBlockType(SVGUIFB_Types[GetElementType(element)]) + if ( __sync_val_compare_and_swap (&in_state_%(id)d, CHANGED, PLC_BUSY) == CHANGED){ + for i, output in enumerate(block_infos["outputs"]): + texts["type"] = TYPECONVERSION[output[1]] + variable = "__I%(type)s%(location)s_%(id)d_%(pin)d"%texts + text +=" %s = _copy%s;\n"%(variable, variable) + text += " /* reset change status pin */\n" + if element_type in [ITEM_BUTTON, ITEM_CONTAINER, ITEM_TEXT, ITEM_SCROLLBAR, ITEM_ROTATING, ITEM_NOTEBOOK]: + text += " _copy__IX%(location)s_%(id)d_2 = false;\n"%texts + elif element_type == ITEM_TRANSFORM: + text += " _copy__IX%(location)s_%(id)d_6 = false;\n"%texts + #If GUI did change data while publishing, do it again (in real-time this should be avoided with priority stuff) + text += " }while(__sync_val_compare_and_swap (&in_state_%(id)s, PLC_BUSY, UNCHANGED) != PLC_BUSY);\n"%texts + text += """void Program::Publish() + for element in elements: + element_type = GetElementType(element) + texts = {"location" : current_location, "id" : element.getid()} + block_infos = GetBlockType(SVGUIFB_Types[GetElementType(element)]) + text += """ if ( __sync_bool_compare_and_swap (&out_state_%(id)d, UNCHANGED, PLC_BUSY) || + __sync_bool_compare_and_swap (&out_state_%(id)d, CHANGED, PLC_BUSY)) { + for i, input in enumerate(block_infos["inputs"]): + texts["type"] = TYPECONVERSION[input[1]] + variable = "__Q%(type)s%(location)s_%(id)d_%(pin)d"%texts + text += " if (_copy%s != %s) {\n"%(variable, variable) + text += " _copy%s = %s;\n"%(variable, variable) + text += " out_state_%(id)d = CHANGED;\n }\n"%texts + text += """ if (out_state_%(id)d == CHANGED) { + out_state_%(id)d = UNCHANGED; - fct += "void Program::Publish()\n{\n"
+ text += """ /*Replace this with determinist signal if called from RT*/; + wxCommandEvent event( EVT_PLC ); - for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
- fct += " if ( __sync_val_compare_and_swap (&in_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n"
- for output in FbdBlock["outputs"]:
- element_type = TYPECONVERSION[output[1]]
- var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)
- fct +=" "+var+ " = _copy"+var+";\n"
- fct += " /* reset change status pin */\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "Container":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "TextCtrl":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "ScrollBar":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "RotatingCtrl":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "NoteBook":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n"
- elif type == "Transform":
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = false;\n"
- #If GUI did change data while publishing, do it again (in real-time this should be avoided with priority stuff)
- fct += " }while(__sync_val_compare_and_swap (&in_state_"+element_id+", PLC_BUSY, UNCHANGED) != PLC_BUSY)\n"
- fct += "void Program::Initialize()\n{\n"
+ text += "void Program::Initialize()\n{\n" @@ -673,73 +669,84 @@
- for element in elementsTab:
- infos = element.getElementAttributes()
- if info["name"] == "id":
- element_id = str(info["value"])
- type = element.GetElementInfos()["type"]
- FbdBlock = self.GetBlockType(type)
+ for element in elements: + element_type = GetElementType(element) + texts = {"location" : current_location, "id" : element.getid()} + if element_type == ITEM_BUTTON: - fct += " SVGUIButton* button;\n"
- fct += " button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " if (button->IsVisible())\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUIButton* button;\n" + text += """ button = (SVGUIButton*)GetElementById(wxT("%(id)d")); + if (button->IsVisible()) + _copy__IX%(location)s_%(id)d_1 = true; + _copy__IX%(location)s_%(id)d_1 = false; + _copy__IX%(location)s_%(id)d_2 = false; - elif type == "Container":
+ elif element_type == ITEM_CONTAINER: - fct += " SVGUIContainer* container;\n"
- fct += " container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " if (container->IsVisible())\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = true;\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = false;\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUIContainer* container;\n" + text += """ container = (SVGUIContainer*)GetElementById(wxT("%(id)d")); + if (container->IsVisible()) + _copy__IX%(location)s_%(id)d_1 = true; + _copy__IX%(location)s_%(id)d_1 = false; + _copy__IX%(location)s_%(id)d_2 = true; - elif type == "TextCtrl":
+ elif element_type == ITEM_TEXT: - fct += " SVGUITextCtrl* text;\n"
- fct += " text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " _copy__IB"+self.BusNumber+"_"+element_id+"_1 = wxStringToIEC_STRING(text->GetValue());\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUITextCtrl* text;\n" + text += """ text = (SVGUITextCtrl*)GetElementById(wxT("%(id)d")); + _copy__IB%(location)s_%(id)d_1 = wxStringToIEC_STRING(text->GetValue()); + _copy__IX%(location)s_%(id)d_2 = true; - elif type == "ScrollBar":
+ elif element_type == ITEM_SCROLLBAR: - fct += " SVGUIScrollBar* scrollbar;\n"
- fct += " scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollbar->GetThumbPosition();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUIScrollBar* scrollbar;\n" + text += """ scrollbar = (SVGUIScrollBar*)GetElementById(wxT("%(id)d")); + _copy__IW%(location)s_%(id)d_1 = scrollbar->GetThumbPosition(); + _copy__IX%(location)s_%(id)d_2 = true; - elif type == "RotatingCtrl":
+ elif element_type == ITEM_ROTATING: - fct += " SVGUIRotatingCtrl* rotating;\n"
- fct += " rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_1 = rotating->GetAngle();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUIRotatingCtrl* rotating;\n" + text += """ rotating = (SVGUIRotatingCtrl*)GetElementById(wxT("%(id)d")); + _copy__ID%(location)s_%(id)d_1 = rotating->GetAngle(); + _copy__IX%(location)s_%(id)d_2 = true; - elif type == "NoteBook":
+ elif element_type == ITEM_NOTEBOOK: - fct += " SVGUINoteBook* notebook;\n"
- fct += " notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " _copy__IB"+self.BusNumber+"_"+element_id+"_1 = notebook->GetCurrentPage();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n"
+ text += " SVGUINoteBook* notebook;\n" + text += """ notebook = (SVGUINoteBook*)GetElementById(wxT("%(id)d")); + _copy__IB%(location)s_%(id)d_1 = notebook->GetCurrentPage(); + _copy__IX%(location)s_%(id)d_2 = true; - elif type == "Transform":
+ elif element_type == ITEM_TRANSFORM: - fct += " SVGUITransform* transform;\n"
- fct += " transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n"
- fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n"
- fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n"
+ text += " SVGUITransform* transform;\n" + text += """ transform = (SVGUITransform*)GetElementById(wxT("%(id)d")); + _copy__ID%(location)s_%(id)d_1 = transform->GetX(); + _copy__ID%(location)s_%(id)d_2 = transform->GetY(); + _copy__ID%(location)s_%(id)d_3 = transform->GetXScale(); + _copy__ID%(location)s_%(id)d_4 = transform->GetYScale(); + _copy__ID%(location)s_%(id)d_5 = transform->GetAngle(); + _copy__IX%(location)s_%(id)d_6 = true;
#DEBUG Fonction d'affichage
# fct += "void Program::Print()\n{\n"
@@ -766,38 +773,47 @@
#fct +=" wxPostEvent(Program,wxEVT_PLCOUT);\n"
def PlugGenerate_C(self, buildpath, locations, logger):
- current_location = self.GetCurrentLocation()
- self.BusNumber = "_".join(map(lambda x:str(x), current_location))
- progname = "SVGUI_" + self.BusNumber
- self.GenerateProgram(buildpath, progname)
+ progname = "SVGUI_%s"%"_".join(map(str, self.GetCurrentLocation())) + self.GenerateProgram((0, 0), buildpath, progname) Gen_C_file = os.path.join(buildpath, progname+".cpp" )
- return [(Gen_C_file,"")],"",True
+ status, result, err_result = ProcessLogger(logger, "wx-config --cxxflags", no_stdout=True).spin() + logger.write_error("Unable to get wx cxxflags\n") + cxx_flags = result.strip() + " -I../matiec/lib" + status, result, err_result = ProcessLogger(logger, "wx-config --libs", no_stdout=True).spin() + logger.write_error("Unable to get wx libs\n") + libs = result.strip() + " -lwxsvg" + return [(Gen_C_file, cxx_flags)],libs,True def BlockTypesFactory(self):
def generate_svgui_block(generator, block, body, link, order=False):
- name = block.getInstanceName()
+ name = block.getinstanceName() block_id = self.GetElementIdFromName(name)
raise ValueError, "No corresponding block found"
- type = block.getTypeName()
- block_infos = self.GetBlockType(type)
+ type = block.gettypeName() + block_infos = GetBlockType(type) current_location = ".".join(map(str, self.GetCurrentLocation()))
if not generator.ComputedBlocks.get(name, False) and not order:
- for num, variable in enumerate(block.inputVariables.getVariable()):
- connections = variable.connectionPointIn.getConnections()
+ for num, variable in enumerate(block.inputVariables.getvariable()): + connections = variable.connectionPointIn.getconnections() if connections and len(connections) == 1:
parameter = "%sQ%s%s.%d.%d"%("%", TYPECONVERSION[block_infos["inputs"][num][1]], current_location, block_id, num+1)
value = generator.ComputeFBDExpression(body, connections[0])
generator.Program += (" %s := %s;\n"%(parameter, generator.ExtractModifier(variable, value)))
generator.ComputedBlocks[block] = True
- connectionPoint = link.getPosition()[-1]
- for num, variable in enumerate(block.outputVariables.getVariable()):
- blockPointx, blockPointy = variable.connectionPointOut.getRelPosition()
- if block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY():
+ connectionPoint = link.getposition()[-1] + for num, variable in enumerate(block.outputVariables.getvariable()): + blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY() + if block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety(): return "%sI%s%s.%d.%d"%("%", TYPECONVERSION[block_infos["outputs"][num][1]], current_location, block_id, num+1)
raise ValueError, "No output variable found"
@@ -807,7 +823,7 @@
block_id = self.GetElementIdFromName(name)
raise ValueError, "No corresponding block found"
- block_infos = self.GetBlockType(type)
+ block_infos = GetBlockType(type) current_location = ".".join(map(str, self.GetCurrentLocation()))
for num, (input_name, input_type, input_modifier) in enumerate(block_infos["inputs"]):
@@ -817,9 +833,9 @@
return [{"name" : "SVGUI function blocks", "list" :
- [{"name" : "Container", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Show","BOOL","none"),("Set State","BOOL","none")],
- "outputs" : [("Show","BOOL","none"),("State Changed","BOOL","none")],
+ [{"name" : "Container", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Show","BOOL","none"),("SetState","BOOL","none")], + "outputs" : [("Visible","BOOL","none"),("StateChanged","BOOL","none")], "comment" : "SVGUI Container",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "Button", "type" : "functionBlock", "extensible" : False,
@@ -828,56 +844,30 @@
"comment" : "SVGUI Button",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")],
- "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")],
+ "inputs" : [("Text","STRING","none"),("SetText","BOOL","none")], + "outputs" : [("Text","STRING","none"),("TextChanged","BOOL","none")], "comment" : "SVGUI Text Control",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")],
- "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")],
+ "inputs" : [("Position","UINT","none"),("SetPosition","BOOL","none")], + "outputs" : [("Position","UINT","none"),("PositionChanged","BOOL","none")], "comment" : "SVGUI ScrollBar",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "NoteBook", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")],
- "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")],
+ "inputs" : [("Selected","UINT","none"),("SetSelected","BOOL","none")], + "outputs" : [("Selected","UINT","none"),("SelectedChanged","BOOL","none")], "comment" : "SVGUI Notebook",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Angle","REAL","none"),("Set Angle","BOOL","none")],
- "outputs" : [("Angle","REAL","none"),("Angle changed","BOOL","none")],
+ "inputs" : [("Angle","REAL","none"),("SetAngle","BOOL","none")], + "outputs" : [("Angle","REAL","none"),("AngleChanged","BOOL","none")], "comment" : "SVGUI Rotating Control",
"generate" : generate_svgui_block, "initialise" : initialise_block},
{"name" : "Transform", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Set","BOOL","none")],
- "outputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Changed","BOOL","none")],
+ "inputs" : [("X","REAL","none"),("Y","REAL","none"),("XScale","REAL","none"),("YScale","REAL","none"),("Angle","REAL","none"),("Set","BOOL","none")], + "outputs" : [("X","REAL","none"),("Y","REAL","none"),("XScale","REAL","none"),("YScale","REAL","none"),("Angle","REAL","none"),("Changed","BOOL","none")], "comment" : "SVGUI Transform",
"generate" : generate_svgui_block, "initialise" : initialise_block},
- def GetBlockType(self,type):
- for category in self.BlockTypesFactory():
- for blocktype in category["list"]:
- if blocktype["name"] == type:
-if __name__ == '__main__':
- wxInitAllImageHandlers()
- # Install a exception handle for bug reports
- #wxAddExceptHook(os.getcwd(),__version__)
- cont = RootClass(sys.path[0])
- frame = _EditorFramePlug(cont)