Ejemplo n.º 1
0
    def OnOpenProjectMenu(self, event):
        if self.Controler is not None and not self.CheckSaveBeforeClosing():
            return
        filepath = ""
        if self.Controler is not None:
            filepath = self.Controler.GetFilePath()
        if filepath != "":
            directory = os.path.dirname(filepath)
        else:
            directory = os.getcwd()

        result = None

        dialog = wx.FileDialog(self, _("Choose a file"), directory, "",
                               _("PLCOpen files (*.xml)|*.xml|All files|*.*"),
                               wx.OPEN)
        if dialog.ShowModal() == wx.ID_OK:
            filepath = dialog.GetPath()
            if os.path.isfile(filepath):
                self.ResetView()
                controler = PLCControler()
                result = controler.OpenXMLFile(filepath)
                self.Controler = controler
                self.LibraryPanel.SetController(controler)
                self.ProjectTree.Enable(True)
                self.PouInstanceVariablesPanel.SetController(controler)
                self._Refresh(PROJECTTREE, LIBRARYTREE)
            self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
        dialog.Destroy()

        if result is not None:
            (num, line) = result
            self.ShowErrorMessage(
                _("PLC syntax error at line {a1}:\n{a2}").format(a1=num,
                                                                 a2=line))
Ejemplo n.º 2
0
class POULibrary(object):
    def __init__(self, CTR, LibName, TypeStack):
        from PLCControler import PLCControler
        self.CTR = ref(CTR)
        self.LibName = LibName
        self.LibraryControler = PLCControler()
        self.LibraryControler.OpenXMLFile(self.GetLibraryPath())
        self.LibraryControler.ClearConfNodeTypes()
        self.LibraryControler.AddConfNodeTypesList(TypeStack)
        self.program = None

    def GetSTCode(self):
        if not self.program:
            self.program = self.LibraryControler.GenerateProgram()[0] + "\n"
        return self.program

    def GetName(self):
        return self.LibName

    def GetCTR(self):
        return self.CTR()

    def GetTypes(self):
        return {"name": self.GetName(), "types": self.LibraryControler.Project}

    def GetLibraryPath(self):
        raise Exception("Not implemented")

    def Generate_C(self, buildpath, varlist, IECCFLAGS):
        # Pure python or IEC libs doesn't produce C code
        return ((""), [], False), ""
Ejemplo n.º 3
0
    def __init__(self, parent, fileOpen=None):
        self.icon = wx.Icon(os.path.join(beremiz_dir, "images", "poe.ico"),
                            wx.BITMAP_TYPE_ICO)
        IDEFrame.__init__(self, parent)

        result = None

        # Open the filepath if defined
        if fileOpen is not None:
            fileOpen = DecodeFileSystemPath(fileOpen, False)
            if os.path.isfile(fileOpen):
                # Create a new controller
                controler = PLCControler()
                result = controler.OpenXMLFile(fileOpen)
                self.Controler = controler
                self.LibraryPanel.SetController(controler)
                self.ProjectTree.Enable(True)
                self.PouInstanceVariablesPanel.SetController(controler)
                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL,
                              LIBRARYTREE)

        # Define PLCOpenEditor icon
        self.SetIcon(self.icon)

        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)

        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)

        if result is not None:
            (num, line) = result
            self.ShowErrorMessage(
                _("PLC syntax error at line {a1}:\n{a2}").format(a1=num,
                                                                 a2=line))
Ejemplo n.º 4
0
 def __init__(self, CTR, LibName, TypeStack):
     from PLCControler import PLCControler
     self.CTR = ref(CTR)
     self.LibName = LibName
     self.LibraryControler = PLCControler()
     self.LibraryControler.OpenXMLFile(self.GetLibraryPath())
     self.LibraryControler.ClearConfNodeTypes()
     self.LibraryControler.AddConfNodeTypesList(TypeStack)
     self.program = None
Ejemplo n.º 5
0
 def OnNewProjectMenu(self, event):
     if self.Controler is not None and not self.CheckSaveBeforeClosing():
         return
     dialog = ProjectDialog(self)
     if dialog.ShowModal() == wx.ID_OK:
         properties = dialog.GetValues()
         self.ResetView()
         self.Controler = PLCControler()
         self.Controler.CreateNewProject(properties)
         self.LibraryPanel.SetController(self.Controler)
         self.ProjectTree.Enable(True)
         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE,
                       POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
Ejemplo n.º 6
0
class POULibrary(object):
    def __init__(self, CTR, LibName, TypeStack):
        from PLCControler import PLCControler
        self.CTR = ref(CTR)
        self.LibName = LibName
        self.LibraryControler = PLCControler()
        self.LibraryControler.OpenXMLFile(self.GetLibraryPath())
        self.LibraryControler.ClearConfNodeTypes()
        self.LibraryControler.AddConfNodeTypesList(TypeStack)
        self.program = None

    def GetSTCode(self):
        if not self.program:
            self.program = self.LibraryControler.GenerateProgram()[0] + "\n"
        return self.program

    def GetName(self):
        return self.LibName

    def GetCTR(self):
        return self.CTR()

    def GetTypes(self):
        return {"name": self.GetName(), "types": self.LibraryControler.Project}

    def GetLibraryPath(self):
        raise Exception("Not implemented")

    def Generate_C(self, buildpath, varlist, IECCFLAGS):
        # Pure python or IEC libs doesn't produce C code
        return ((""), [], False), ""

    def FatalError(self, message):
        """ Raise an exception that will trigger error message intended to 
            the user, but without backtrace since it is not a software error """

        raise UserAddressedException(message)
Ejemplo n.º 7
0
class PLCOpenEditor(IDEFrame):

    # Compatibility function for wx versions < 2.6
    if wx.VERSION < (2, 6, 0):

        def Bind(self, event, function, id=None):
            if id is not None:
                event(self, id, function)
            else:
                event(self, function)

    def _init_coll_FileMenu_Items(self, parent):
        AppendMenu(parent,
                   help='',
                   id=wx.ID_NEW,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'New') + '\tCTRL+N')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_OPEN,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Open') + '\tCTRL+O')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_CLOSE,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Close Tab') + '\tCTRL+W')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_CLOSE_ALL,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Close Project') + '\tCTRL+SHIFT+W')
        parent.AppendSeparator()
        AppendMenu(parent,
                   help='',
                   id=wx.ID_SAVE,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Save') + '\tCTRL+S')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_SAVEAS,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Save As...') + '\tCTRL+SHIFT+S')
        AppendMenu(parent,
                   help='',
                   id=ID_PLCOPENEDITORFILEMENUGENERATE,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Generate Program') + '\tCTRL+G')
        parent.AppendSeparator()
        AppendMenu(parent,
                   help='',
                   id=wx.ID_PAGE_SETUP,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Page Setup') + '\tCTRL+ALT+P')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_PREVIEW,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Preview') + '\tCTRL+SHIFT+P')
        AppendMenu(parent,
                   help='',
                   id=wx.ID_PRINT,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Print') + '\tCTRL+P')
        parent.AppendSeparator()
        AppendMenu(parent,
                   help='',
                   id=wx.ID_PROPERTIES,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'&Properties'))
        parent.AppendSeparator()
        AppendMenu(parent,
                   help='',
                   id=wx.ID_EXIT,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'Quit') + '\tCTRL+Q')

        self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
        self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
        self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
        self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
        self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
        self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
        self.Bind(wx.EVT_MENU,
                  self.OnGenerateProgramMenu,
                  id=ID_PLCOPENEDITORFILEMENUGENERATE)
        self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
        self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
        self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
        self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
        self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)

        self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None),
                               (wx.ID_OPEN, "open", _(u'Open'), None),
                               (wx.ID_SAVE, "save", _(u'Save'), None),
                               (wx.ID_SAVEAS, "saveas",
                                _(u'Save As...'), None),
                               (wx.ID_PRINT, "print", _(u'Print'), None)])

    def _init_coll_HelpMenu_Items(self, parent):
        AppendMenu(parent,
                   help='',
                   id=wx.ID_HELP,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'PLCOpenEditor') + '\tF1')

        # AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
        #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
        # AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
        #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')

        def handler(event):
            return wx.MessageBox(version.GetCommunityHelpMsg(),
                                 _(u'Community support'),
                                 wx.OK | wx.ICON_INFORMATION)

        id = wx.NewId()
        parent.Append(help='',
                      id=id,
                      kind=wx.ITEM_NORMAL,
                      text=_(u'Community support'))
        self.Bind(wx.EVT_MENU, handler, id=id)

        AppendMenu(parent,
                   help='',
                   id=wx.ID_ABOUT,
                   kind=wx.ITEM_NORMAL,
                   text=_(u'About'))
        self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
        # self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
        self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)

    def __init__(self, parent, fileOpen=None):
        """ Constructor of the PLCOpenEditor class.

        :param parent: The parent window.
        :param fileOpen: The filepath to open if no controler defined (default: None).
        """
        self.icon = wx.Icon(os.path.join(beremiz_dir, "images", "poe.ico"),
                            wx.BITMAP_TYPE_ICO)
        IDEFrame.__init__(self, parent)

        result = None

        # Open the filepath if defined
        if fileOpen is not None:
            fileOpen = DecodeFileSystemPath(fileOpen, False)
            if os.path.isfile(fileOpen):
                # Create a new controller
                controler = PLCControler()
                result = controler.OpenXMLFile(fileOpen)
                self.Controler = controler
                self.LibraryPanel.SetController(controler)
                self.ProjectTree.Enable(True)
                self.PouInstanceVariablesPanel.SetController(controler)
                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL,
                              LIBRARYTREE)

        # Define PLCOpenEditor icon
        self.SetIcon(self.icon)

        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)

        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)

        if result is not None:
            (num, line) = result
            self.ShowErrorMessage(
                _("PLC syntax error at line {a1}:\n{a2}").format(a1=num,
                                                                 a2=line))

    def OnCloseFrame(self, event):
        if self.Controler is None or self.CheckSaveBeforeClosing(
                _("Close Application")):
            self.AUIManager.UnInit()

            self.SaveLastState()

            event.Skip()
        else:
            event.Veto()

    def RefreshTitle(self):
        name = _("PLCOpenEditor")
        if self.Controler is not None:
            self.SetTitle("%s - %s" % (name, self.Controler.GetFilename()))
        else:
            self.SetTitle(name)

    # -------------------------------------------------------------------------------
    #                            File Menu Functions
    # -------------------------------------------------------------------------------

    def RefreshFileMenu(self):
        MenuToolBar = self.Panes["MenuToolBar"]
        if self.Controler is not None:
            selected = self.TabsOpened.GetSelection()
            if selected >= 0:
                graphic_viewer = isinstance(self.TabsOpened.GetPage(selected),
                                            Viewer)
            else:
                graphic_viewer = False
            if self.TabsOpened.GetPageCount() > 0:
                self.FileMenu.Enable(wx.ID_CLOSE, True)
                if graphic_viewer:
                    self.FileMenu.Enable(wx.ID_PREVIEW, True)
                    self.FileMenu.Enable(wx.ID_PRINT, True)
                    MenuToolBar.EnableTool(wx.ID_PRINT, True)
                else:
                    self.FileMenu.Enable(wx.ID_PREVIEW, False)
                    self.FileMenu.Enable(wx.ID_PRINT, False)
                    MenuToolBar.EnableTool(wx.ID_PRINT, False)
            else:
                self.FileMenu.Enable(wx.ID_CLOSE, False)
                self.FileMenu.Enable(wx.ID_PREVIEW, False)
                self.FileMenu.Enable(wx.ID_PRINT, False)
                MenuToolBar.EnableTool(wx.ID_PRINT, False)
            self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
            project_modified = not self.Controler.ProjectIsSaved()
            self.FileMenu.Enable(wx.ID_SAVE, project_modified)
            MenuToolBar.EnableTool(wx.ID_SAVE, project_modified)
            self.FileMenu.Enable(wx.ID_PROPERTIES, True)
            self.FileMenu.Enable(wx.ID_CLOSE_ALL, True)
            self.FileMenu.Enable(wx.ID_SAVEAS, True)
            MenuToolBar.EnableTool(wx.ID_SAVEAS, True)
            self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, True)
        else:
            self.FileMenu.Enable(wx.ID_CLOSE, False)
            self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
            self.FileMenu.Enable(wx.ID_PREVIEW, False)
            self.FileMenu.Enable(wx.ID_PRINT, False)
            MenuToolBar.EnableTool(wx.ID_PRINT, False)
            self.FileMenu.Enable(wx.ID_SAVE, False)
            MenuToolBar.EnableTool(wx.ID_SAVE, False)
            self.FileMenu.Enable(wx.ID_PROPERTIES, False)
            self.FileMenu.Enable(wx.ID_CLOSE_ALL, False)
            self.FileMenu.Enable(wx.ID_SAVEAS, False)
            MenuToolBar.EnableTool(wx.ID_SAVEAS, False)
            self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, False)

    def OnNewProjectMenu(self, event):
        if self.Controler is not None and not self.CheckSaveBeforeClosing():
            return
        dialog = ProjectDialog(self)
        if dialog.ShowModal() == wx.ID_OK:
            properties = dialog.GetValues()
            self.ResetView()
            self.Controler = PLCControler()
            self.Controler.CreateNewProject(properties)
            self.LibraryPanel.SetController(self.Controler)
            self.ProjectTree.Enable(True)
            self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE,
                          POUINSTANCEVARIABLESPANEL, LIBRARYTREE)

    def OnOpenProjectMenu(self, event):
        if self.Controler is not None and not self.CheckSaveBeforeClosing():
            return
        filepath = ""
        if self.Controler is not None:
            filepath = self.Controler.GetFilePath()
        if filepath != "":
            directory = os.path.dirname(filepath)
        else:
            directory = os.getcwd()

        result = None

        dialog = wx.FileDialog(self, _("Choose a file"), directory, "",
                               _("PLCOpen files (*.xml)|*.xml|All files|*.*"),
                               wx.OPEN)
        if dialog.ShowModal() == wx.ID_OK:
            filepath = dialog.GetPath()
            if os.path.isfile(filepath):
                self.ResetView()
                controler = PLCControler()
                result = controler.OpenXMLFile(filepath)
                self.Controler = controler
                self.LibraryPanel.SetController(controler)
                self.ProjectTree.Enable(True)
                self.PouInstanceVariablesPanel.SetController(controler)
                self._Refresh(PROJECTTREE, LIBRARYTREE)
            self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
        dialog.Destroy()

        if result is not None:
            (num, line) = result
            self.ShowErrorMessage(
                _("PLC syntax error at line {a1}:\n{a2}").format(a1=num,
                                                                 a2=line))

    def OnCloseProjectMenu(self, event):
        if not self.CheckSaveBeforeClosing():
            return
        self.ResetView()
        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)

    def OnSaveProjectMenu(self, event):
        self.SaveProject()

    def OnSaveProjectAsMenu(self, event):
        self.SaveProjectAs()

    def OnGenerateProgramMenu(self, event):
        dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(),
                               self.Controler.GetProgramFilePath(),
                               _("ST files (*.st)|*.st|All files|*.*"),
                               wx.SAVE | wx.CHANGE_DIR)
        if dialog.ShowModal() == wx.ID_OK:
            filepath = dialog.GetPath()
            message_text = ""
            header, icon = _("Done"), wx.ICON_INFORMATION
            if os.path.isdir(os.path.dirname(filepath)):
                _program, errors, warnings = self.Controler.GenerateProgram(
                    filepath)
                message_text += "".join(
                    [_("warning: %s\n") % warning for warning in warnings])
                if len(errors) > 0:
                    message_text += "".join(
                        [_("error: %s\n") % error for error in errors])
                    message_text += _(
                        "Can't generate program to file %s!") % filepath
                    header, icon = _("Error"), wx.ICON_ERROR
                else:
                    message_text += _("Program was successfully generated!")
            else:
                message_text += _("\"%s\" is not a valid folder!"
                                  ) % os.path.dirname(filepath)
                header, icon = _("Error"), wx.ICON_ERROR
            message = wx.MessageDialog(self, message_text, header,
                                       wx.OK | icon)
            message.ShowModal()
            message.Destroy()
        dialog.Destroy()

    def OnPLCOpenEditorMenu(self, event):
        wx.MessageBox(_("No documentation available.\nComing soon."))

    def OnPLCOpenMenu(self, event):
        open_pdf(os.path.join(beremiz_dir, "plcopen", "TC6_XML_V101.pdf"))

    def OnAboutMenu(self, event):
        info = version.GetAboutDialogInfo()
        info.Name = "PLCOpenEditor"
        info.Description = _("PLCOpenEditor is part of Beremiz project.\n\n"
                             "Beremiz is an ") + info.Description
        info.Icon = wx.Icon(
            os.path.join(beremiz_dir, "images", "aboutlogo.png"),
            wx.BITMAP_TYPE_PNG)
        ShowAboutDialog(self, info)

    def SaveProject(self):
        result = self.Controler.SaveXMLFile()
        if not result:
            self.SaveProjectAs()
        else:
            self._Refresh(TITLE, FILEMENU, PAGETITLES)

    def SaveProjectAs(self):
        filepath = self.Controler.GetFilePath()
        if filepath != "":
            directory, filename = os.path.split(filepath)
        else:
            directory, filename = os.getcwd(
            ), "%(projectName)s.xml" % self.Controler.GetProjectProperties()
        dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,
                               _("PLCOpen files (*.xml)|*.xml|All files|*.*"),
                               wx.SAVE | wx.OVERWRITE_PROMPT)
        if dialog.ShowModal() == wx.ID_OK:
            filepath = dialog.GetPath()
            if os.path.isdir(os.path.dirname(filepath)):
                result = self.Controler.SaveXMLFile(filepath)
                if not result:
                    self.ShowErrorMessage(
                        _("Can't save project to file %s!") % filepath)
            else:
                self.ShowErrorMessage(
                    _("\"%s\" is not a valid folder!") %
                    os.path.dirname(filepath))
            self._Refresh(TITLE, FILEMENU, PAGETITLES)
        dialog.Destroy()
Ejemplo n.º 8
0
 def __init__(self):
     self.controller = PLCControler()
     #        PLCControler.__init__(self)
     self.BuildPath = None
     self.DefaultBuildPath = paths.AbsParentDir(__file__)
     self.RefreshConfNodesBlockLists()
Ejemplo n.º 9
0
class ProjectControllerPy:
    def __init__(self):
        self.controller = PLCControler()
        #        PLCControler.__init__(self)
        self.BuildPath = None
        self.DefaultBuildPath = paths.AbsParentDir(__file__)
        self.RefreshConfNodesBlockLists()

    def printhello(self):
        #        print("I am in class ProjectControllerPy")
        return ()

    def _setBuildPath(self, buildpath):
        print "======== In setBuildPath_3.0==================="
        self.BuildPath = convertProjectPathFromC(buildpath)
        print self.BuildPath
        self.DefaultBuildPath = None
        print self.BuildPath
        print "hhhhhhhhh==================================="

    def _getBuildPath(self):
        if self.BuildPath is not None:
            return self.BuildPath
        if self.DefaultBuildPath is not None:
            return self.DefaultBuildPath

    def _getIECgeneratedcodePath(self):
        return os.path.join(self._getBuildPath(), "generated_plc.st")

    def Generate_PLC_ST(self):
        _program, errors, warnings = self.controller.GenerateProgram(
            self._getIECgeneratedcodePath())
        if len(warnings) > 0 or len(errors) > 0:
            print("Generate ST code error\n")

    def AddProjectDefaultConfiguration(self,
                                       config_name="config",
                                       res_name="resource1"):
        self.controller.ProjectAddConfiguration(config_name)


#        self.controller.ProjectAddConfigurationResource(config_name, res_name)

#    新建工程时并判断当用户创建主程序时添加

    def SetProjectDefaultConfiguration(self):
        # Sets default task and instance for new project
        config = self.controller.Project.getconfiguration(
            self.GetProjectMainConfigurationName())
        resource = config.getresource()[0].getname()
        config = config.getname()
        resource_tagname = self.controller.ComputeConfigurationResourceName(
            config, resource)
        def_task = [{
            'Priority': '0',
            'Single': '',
            'Interval': 'T#20ms',
            'Name': 'task0',
            'Triggering': 'Cyclic'
        }]
        def_instance = [{
            'Task': def_task[0].get('Name'),
            'Type': self.GetProjectPouNames()[0],
            'Name': 'instance0'
        }]
        self.controller.SetEditedResourceInfos(resource_tagname, def_task,
                                               def_instance)

    def NewProject(self, ProjectPath, BuildPath=None):
        if not os.path.isdir(ProjectPath):
            print("It is not a folder. You can't use is for a new project")
            return False
        self.controller.CreateNewProject({
            "rrojectName":
            "Unnamed",
            "productNaem":
            "Unnamed",
            "productVersion":
            "1",
            "companyName":
            "Unknown",
            "createDateTime":
            datetime(*localtime()[:6])
        })
        self.AddProjectDefaultConfiguration()

        # Change XSD into class members
        #        self._AddParamsMembers()
        #        self.Children = {}
        self.ProjectPath = ProjectPath
        self.SaveProject()

    def LoadProject(self, ProjPath):
        projectPath = convertProjectPathFromC(ProjPath)
        #add 2018/1/6
        self.ProjectPath = projectPath
        plc_file = os.path.join(projectPath, "plc.xml")
        print("=============================================")
        print("In Python LoadProject")
        print plc_file
        print("=============================================")
        if not os.path.isfile(plc_file):
            print("chosen folder doesn't contain a program.")
            return False
        error = self.controller.OpenXMLFile(plc_file)
        if error is not None:
            print("open XML file error")
            return False
        print self.controller.Project
        return True

    #只有调用了SaveProject才将Project写入XML文件
    def SaveProject(self):
        self.controller.SaveXMLFile(os.path.join(self.ProjectPath, 'plc.xml'))

    def LoadLibraries(self):
        self.Libraries = []
        TypeStack = []
        for libname, clsname in features.libraries:
            #            if self.BeremizRoot.Libraries is None or getattr(self.BeremizRoot.Libraries, "Enable_"+libname+"_Library"):
            Lib = GetClassImporter(clsname)()(self, libname, TypeStack)
            TypeStack.append(Lib.GetTypes())
            self.Libraries.append(Lib)

    def GetLibrariesTypes(self):
        self.LoadLibraries()
        return [lib.GetTypes() for lib in self.Libraries]

    # Update PLCOpenEditor ConfNode Block types from loaded confnodes
    def RefreshConfNodesBlockLists(self):
        #       if getattr(self, "Children", None) is not None:
        self.controller.ClearConfNodeTypes()
        self.controller.AddConfNodeTypesList(self.GetLibrariesTypes())

    #和资源有关的获取设置函数
    def getProjectConfigNames(self):
        return self.controller.GetProjectConfigNames()

    def getProjectCurrentConfigName(self):
        config_names = self.getProjectConfigNames()
        if len(config_names) > 0:
            return config_names[0]
        return ""

    def getBlockResource(self):
        return self.controller.GetBlockResource()

    def getEditedResourceVariables(self, tagname):
        return self.controller.GetEditedResourceVariables(tagname)

    def getEditedResourceInfos(self, tagname):
        ret = self.controller.GetEditedResourceInfos(tagname)
        if ret is None:
            return ()
        return ret

    def getEditedResourceElemnetVariables(self, configName, resourceName):
        values = self.controller.GetConfigurationResourceGlobalVars(
            configName, resourceName)
        print(
            "================== in getEditedResourceVariables =================="
        )
        variables = []
        for oneValue in values:
            onevar = []
            onevar.append(getattr(oneValue, "Name"))
            onevar.append(getattr(oneValue, "Type"))
            onevar.append(getattr(oneValue, "Location"))
            onevar.append(getattr(oneValue, "InitialValue"))
            onevar.append(getattr(oneValue, "Option"))
            variables.append(onevar)
        return variables

    #添加新的资源时需要添加xml文件config节点的资源
    def projectAddConfigurationResource(self, config_name, resource_name):
        self.controller.ProjectAddConfigurationResource(
            config_name, resource_name)

    def projectRemoveConfigurationResource(self, config_name, resource_name):
        self.controller.ProjectRemoveConfigurationResource(
            config_name, resource_name)

    def setEditedResourceInfos(self, tagname, tasksInfo, instancesInfo):
        self.controller.SetEditedResourceInfos(tagname, tasksInfo,
                                               instancesInfo)

    def setEditedResourceElementVariables(self, configName, resourceName,
                                          varsList):
        values = []
        for oneVar in varsList:
            value = _VariableInfos("", "", "", "", "", True, "", "INT",
                                   ([], []), 0)
            setattr(value, "Name", oneVar[0])
            setattr(value, "Type", oneVar[1])
            setattr(value, "Location", oneVar[2])
            setattr(value, "InitialValue", oneVar[3])
            setattr(value, "Option", oneVar[4])
            setattr(value, "Class", "Global")
            values.append(value)
        self.controller.SetConfigurationResourceGlobalVars(
            configName, resourceName, values)

    #获取整个工程信息
    def getProjectInfos(self):
        return self.controller.GetProjectInfos()

    #获取变量类型
    def getBaseTypes(self):
        return self.controller.GetBaseTypes()

    def getDataTypes(self):
        return self.controller.GetDataTypes(basetypes=False,
                                            confnodetypes=False)

    def getConfNodeDataTypes(self):
        return self.controller.GetConfNodeDataTypes()

    def getFunctionBlockTypes(self, tagName):
        return self.controller.GetFunctionBlockTypes(tagName)

    def getEditedElementInterfaceVars(self, tagName):
        values = self.controller.GetEditedElementInterfaceVars(tagName)
        variables = []
        for oneValue in values:
            onevar = []
            onevar.append(getattr(oneValue, "Name"))
            onevar.append(getattr(oneValue, "Class"))
            onevar.append(getattr(oneValue, "Type"))
            onevar.append(getattr(oneValue, "InitialValue"))
            onevar.append(getattr(oneValue, "Option"))
            variables.append(onevar)
        return variables

    def getEditedElementInterfaceReturnType(self, tagName):
        ret = self.controller.GetEditedElementInterfaceReturnType(tagName)
        if ret is None:
            return ""
        return ret

    # 将修改后的变量存入PLCcontroler中
    def setPouInterfaceReturnType(self, tagName, return_type):
        self.controller.SetPouInterfaceReturnType(tagName, return_type)

    def setPouInterfaceVars(self, name, varsList):
        values = []
        for oneVar in varsList:
            value = _VariableInfos("", "", "", "", "", True, "", "INT",
                                   ([], []), 0)
            setattr(value, "Name", oneVar[0])
            setattr(value, "Class", oneVar[1])
            setattr(value, "Type", oneVar[2])
            setattr(value, "InitialValue", oneVar[3])
            setattr(value, "Option", oneVar[4])
            values.append(value)
        self.controller.SetPouInterfaceVars(name, values)

    #POU的增删修改
    def projectAddPou(self, pou_name, pou_type, body_type="ST"):
        self.controller.ProjectAddPou(pou_name, pou_type, body_type)

    def projectRemovePou(self, pou_name):
        self.controller.ProjectRemovePou(pou_name)

    def changePouName(self, old_name, new_name):
        self.controller.ChangePouName(old_name, new_name)

    # 获取POU中编辑的程序
    def getEditedPouElementText(self, tagName):
        return self.controller.GetEditedElementText(tagName)

    # 将编辑框中的程序更新值PLCController
    def setEditedPouElementText(self, tagName, text):
        print("in Python setEditedPouElemetnText")
        print text
        encodedText = unicode(text, "utf-8")
        self.controller.SetEditedElementText(tagName, encodedText)

    # 获取库功能块名称和内容
    def getLibraryNodes(self):
        blocktypes = self.controller.GetBlockTypes()
        LibNameList = []
        LibContents = []

        if blocktypes is not None:
            for category in blocktypes:
                category_name = category["name"]
                LibNameList.append(category_name)
                tempList = []
                for blocktype in category["list"]:
                    tempList.append(blocktype["name"])
                LibContents.append(tempList)
        return (LibNameList, LibContents)

    def secondHello(self):
        print("I am python hello")
        return []