PLCControler.py
changeset 1321 83f41ea00b97
parent 1319 748347102c97
child 1322 0a9227f743b3
--- a/PLCControler.py	Wed Sep 18 15:31:38 2013 +0200
+++ b/PLCControler.py	Mon Sep 23 00:32:39 2013 +0200
@@ -279,6 +279,57 @@
     os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"))
 
 #-------------------------------------------------------------------------------
+#            Helpers object for generating instance tagname
+#-------------------------------------------------------------------------------
+
+class InstanceTagName(etree.XSLTExtension):
+
+    def __init__(self, controller):
+        etree.XSLTExtension.__init__(self)
+        self.Controller = controller
+    
+    def GetTagName(self, infos):
+        return ""
+    
+    def execute(self, context, self_node, input_node, output_parent):
+        tagname_infos = etree.Element('infos')
+        self.process_children(context, tagname_infos)
+        tagname = etree.Element('tagname')
+        tagname.text = self.GetTagName(tagname_infos)
+        output_parent.append(tagname)
+
+class ConfigTagName(InstanceTagName):
+    
+    def GetTagName(self, infos):
+        return self.Controller.ComputeConfigurationName(infos.get("name"))
+        
+class ResourceTagName(InstanceTagName):
+    
+    def GetTagName(self, infos):
+        return self.Controller.ComputeConfigurationResourceName(
+            infos.get("config_name"), infos.get("name"))
+
+class PouTagName(InstanceTagName):
+    
+    def GetTagName(self, infos):
+        return self.Controller.ComputePouName(infos.get("name"))
+
+class ActionTagName(InstanceTagName):
+    
+    def GetTagName(self, infos):
+        return self.Controller.ComputePouActionName(
+            infos.get("pou_name"), infos.get("name"))
+
+class TransitionTagName(InstanceTagName):
+    
+    def GetTagName(self, infos):
+        return self.Controller.ComputePouTransitionName(
+            infos.get("pou_name"), infos.get("name"))
+
+instance_tagname_xslt = etree.parse(
+    os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"))
+
+#-------------------------------------------------------------------------------
 #                         Undo Buffer for PLCOpenEditor
 #-------------------------------------------------------------------------------
 
@@ -587,7 +638,7 @@
             if obj is not None:
                 return compute_instance_tree(
                         pou_variable_xslt_tree(obj).getroot())
-        return []
+        return None
 
     def GetInstanceList(self, root, name, debug = False):
         project = self.GetProject(debug)
@@ -621,99 +672,24 @@
                             self.ComputePouName(words[1]), debug)]
         return []
     
-    def RecursiveGetPouInstanceTagName(self, project, pou_type, parts, debug = False):
-        pou = project.getpou(pou_type)
-        if pou is not None:
-            if len(parts) == 0:
-                return self.ComputePouName(pou_type)
-            
-            for varlist_type, varlist in pou.getvars():
-                for variable in varlist.getvariable():
-                    if variable.getname() == parts[0]:
-                        vartype_content = variable.gettype().getcontent()
-                        if vartype_content.getLocalTag() == "derived":
-                            return self.RecursiveGetPouInstanceTagName(
-                                            project, 
-                                            vartype_content.getname(),
-                                            parts[1:], debug)
-            
-            if pou.getbodyType() == "SFC" and len(parts) == 1:
-                for action in pou.getactionList():
-                    if action.getname() == parts[0]:
-                        return self.ComputePouActionName(pou_type, parts[0])
-                for transition in pou.gettransitionList():
-                    if transition.getname() == parts[0]:
-                        return self.ComputePouTransitionName(pou_type, parts[0])
-        else:
-            block_infos = self.GetBlockType(pou_type, debug=debug)
-            if (block_infos is not None and 
-                block_infos["type"] in ["program", "functionBlock"]):
-                
-                if len(parts) == 0:
-                    return self.ComputePouName(pou_type)
-                
-                for varname, vartype, varmodifier in block_infos["inputs"] + block_infos["outputs"]:
-                    if varname == parts[0]:
-                        return self.RecursiveGetPouInstanceTagName(project, vartype, parts[1:], debug)
-        return None
-    
-    def GetGlobalInstanceTagName(self, project, element, parts, debug = False):
-        for varlist in element.getglobalVars():
-            for variable in varlist.getvariable():
-                if variable.getname() == parts[0]:
-                    vartype_content = variable.gettype().getcontent()
-                    if vartype_content.getLocalTag() == "derived":                        
-                        if len(parts) == 1:
-                            return self.ComputePouName(
-                                        vartype_content.getname())
-                        else:
-                            return self.RecursiveGetPouInstanceTagName(
-                                        project, 
-                                        vartype_content.getname(),
-                                        parts[1:], debug)
-        return None
-    
     def GetPouInstanceTagName(self, instance_path, debug = False):
         project = self.GetProject(debug)
-        parts = instance_path.split(".")
-        if len(parts) == 1:
-            return self.ComputeConfigurationName(parts[0])
-        elif len(parts) == 2:
-            for config in project.getconfigurations():
-                if config.getname() == parts[0]:
-                    result = self.GetGlobalInstanceTagName(project, 
-                                                           config, 
-                                                           parts[1:],
-                                                           debug)
-                    if result is not None:
-                        return result
-            return self.ComputeConfigurationResourceName(parts[0], parts[1])
-        else:
-            for config in project.getconfigurations():
-                if config.getname() == parts[0]:
-                    for resource in config.getresource():
-                        if resource.getname() == parts[1]:
-                            pou_instances = resource.getpouInstance()[:]
-                            for task in resource.gettask():
-                                pou_instances.extend(task.getpouInstance())
-                            for pou_instance in pou_instances:
-                                if pou_instance.getname() == parts[2]:
-                                    if len(parts) == 3:
-                                        return self.ComputePouName(
-                                                    pou_instance.gettypeName())
-                                    else:
-                                        return self.RecursiveGetPouInstanceTagName(
-                                                    project,
-                                                    pou_instance.gettypeName(),
-                                                    parts[3:], debug)
-                            return self.GetGlobalInstanceTagName(project, 
-                                                                 resource, 
-                                                                 parts[2:], 
-                                                                 debug)
-                    return self.GetGlobalInstanceTagName(project, 
-                                                         config, 
-                                                         parts[1:],
-                                                         debug)
+        
+        instance_tagname_xslt_tree = etree.XSLT(
+            instance_tagname_xslt, 
+            extensions = {
+                ("instance_tagname_ns", "instance_definition"): InstanceDefinition(self, debug),
+                ("instance_tagname_ns", "config_tagname"): ConfigTagName(self),
+                ("instance_tagname_ns", "resource_tagname"): ResourceTagName(self),
+                ("instance_tagname_ns", "pou_tagname"): PouTagName(self),
+                ("instance_tagname_ns", "action_tagname"): ActionTagName(self),
+                ("instance_tagname_ns", "transition_tagname"): TransitionTagName(self)})
+        
+        result = instance_tagname_xslt_tree(project, 
+                instance_path=etree.XSLT.strparam(instance_path)).getroot()
+        if result is not None:
+            return result.text
+        
         return None
     
     def GetInstanceInfos(self, instance_path, debug = False):
@@ -1675,7 +1651,7 @@
             return False
         elif basetype_content_type == "derived":
             return self.IsLocatableType(basetype_content.getname())
-        elif basetype_content_name == "array":
+        elif basetype_content_type == "array":
             array_base_type = basetype_content.baseType.getcontent()
             if array_base_type.getLocalTag() == "derived":
                 return self.IsLocatableType(array_base_type.getname(), debug)
@@ -3076,10 +3052,10 @@
             return tasks_data, instances_data
 
     def OpenXMLFile(self, filepath):
-        try:
-            self.Project = LoadProject(filepath)
-        except Exception, e:
-            return _("Project file syntax error:\n\n") + str(e)
+        #try:
+        self.Project = LoadProject(filepath)
+        #except Exception, e:
+        #    return _("Project file syntax error:\n\n") + str(e)
         self.SetFilePath(filepath)
         self.CreateProjectBuffer(True)
         self.ProgramChunks = []