plcopen/plcopen.py
changeset 145 4fb225afddf4
parent 143 015a34da60eb
child 147 5ef987c1b927
--- a/plcopen/plcopen.py	Fri Jan 04 17:49:17 2008 +0100
+++ b/plcopen/plcopen.py	Fri Jan 11 17:51:56 2008 +0100
@@ -91,6 +91,14 @@
 if cls:
     cls.singleLineAttributes = False
     
+    def setName(self, name):
+        self.contentHeader.setName(name)
+    setattr(cls, "setName", setName)
+        
+    def getName(self):
+        return self.contentHeader.getName()
+    setattr(cls, "getName", getName)
+    
     def getFileHeader(self):
         fileheader = {}
         fileheader["companyName"] = self.fileHeader.getCompanyName()
@@ -119,14 +127,40 @@
             self.fileHeader.setContentDescription(fileheader["contentDescription"])
     setattr(cls, "setFileHeader", setFileHeader)
     
-    def setName(self, name):
-        self.contentHeader.setName(name)
-    setattr(cls, "setName", setName)
-        
-    def getName(self):
-        return self.contentHeader.getName()
-    setattr(cls, "getName", getName)
-
+    def getContentHeader(self):
+        contentheader = {}
+        contentheader["projectName"] = self.contentHeader.getName()
+        if self.contentHeader.getVersion():
+            contentheader["projectVersion"] = self.contentHeader.getVersion()
+        if self.contentHeader.getModificationDateTime():
+            contentheader["modificationDateTime"] = self.contentHeader.getModificationDateTime()
+        if self.contentHeader.getOrganization():
+            contentheader["organization"] = self.contentHeader.getOrganization()
+        if self.contentHeader.getAuthor():
+            contentheader["authorName"] = self.contentHeader.getAuthor()
+        if self.contentHeader.getLanguage():
+            contentheader["language"] = self.contentHeader.getLanguage()
+        contentheader["pageSize"] = self.contentHeader.getPageSize()
+        contentheader["scaling"] = self.contentHeader.getScaling()
+        return contentheader
+    setattr(cls, "getContentHeader", getContentHeader)
+    
+    def setContentHeader(self, contentheader):
+        self.contentHeader.setName(contentheader["projectName"])
+        if "projectVersion" in contentheader:
+            self.contentHeader.setVersion(contentheader["projectVersion"])
+        if "modificationDateTime" in contentheader:
+            self.contentHeader.setModificationDateTime(contentheader["modificationDateTime"])
+        if "organization" in contentheader:
+            self.contentHeader.setOrganization(contentheader["organization"])
+        if "authorName" in contentheader:
+            self.contentHeader.setAuthor(contentheader["authorName"])
+        if "language" in contentheader:
+            self.contentHeader.setLanguage(contentheader["language"])
+        self.contentHeader.setPageSize(*contentheader["pageSize"])
+        self.contentHeader.setScaling(contentheader["scaling"])
+    setattr(cls, "setContentHeader", setContentHeader)
+    
     def getDataTypes(self):
         return self.types.getDataTypeElements()
     setattr(cls, "getDataTypes", getDataTypes)
@@ -219,7 +253,7 @@
             new_resource = PLCOpenClasses["configuration_resource"]()
             new_resource.setName(name)
             configuration.appendResource(new_resource)
-    setattr(cls, "addConfigurationResource", addConfigurationResource)    
+    setattr(cls, "addConfigurationResource", addConfigurationResource)
 
     def removeConfigurationResource(self, config_name, name):
         configuration = self.getConfiguration(config_name)
@@ -245,6 +279,71 @@
 if cls:
     cls.singleLineAttributes = False
 
+cls = PLCOpenClasses.get("project_contentHeader", None)
+if cls:
+    cls.singleLineAttributes = False
+    
+    def setPageSize(self, width, height):
+        self.coordinateInfo.setPageSize(width, height)
+    setattr(cls, "setPageSize", setPageSize)
+    
+    def getPageSize(self):
+        return self.coordinateInfo.getPageSize()
+    setattr(cls, "getPageSize", getPageSize)
+
+    def setScaling(self, scaling):
+        for language, (x, y) in scaling.items():
+            self.coordinateInfo.setScaling(language, x, y)
+    setattr(cls, "setScaling", setScaling)
+    
+    def getScaling(self):
+        scaling = {}
+        scaling["FBD"] = self.coordinateInfo.getScaling("FBD")
+        scaling["LD"] = self.coordinateInfo.getScaling("LD")
+        scaling["SFC"] = self.coordinateInfo.getScaling("SFC")
+        return scaling
+    setattr(cls, "getScaling", getScaling)
+
+cls = PLCOpenClasses.get("contentHeader_coordinateInfo", None)
+if cls:
+    def setPageSize(self, width, height):
+        if width == 0 and height == 0:
+            self.deletePageSize()
+        else:
+            if self.pageSize is None:
+                self.addPageSize()
+            self.pageSize.setX(width)
+            self.pageSize.setY(height)
+    setattr(cls, "setPageSize", setPageSize)
+    
+    def getPageSize(self):
+        if self.pageSize is not None:
+            return self.pageSize.getX(), self.pageSize.getY()
+        return 0, 0
+    setattr(cls, "getPageSize", getPageSize)
+
+    def setScaling(self, language, x, y):
+        if language == "FBD":
+            self.fbd.scaling.setX(x)
+            self.fbd.scaling.setY(y)
+        elif language == "LD":
+            self.ld.scaling.setX(x)
+            self.ld.scaling.setY(y)
+        elif language == "SFC":
+            self.sfc.scaling.setX(x)
+            self.sfc.scaling.setY(y)
+    setattr(cls, "setScaling", setScaling)
+    
+    def getScaling(self, language):
+        if language == "FBD":
+            return self.fbd.scaling.getX(), self.fbd.scaling.getY()
+        elif language == "LD":
+            return self.ld.scaling.getX(), self.ld.scaling.getY()
+        elif language == "SFC":
+            return self.sfc.scaling.getX(), self.sfc.scaling.getY()
+        return 0, 0
+    setattr(cls, "getScaling", getScaling)
+
 cls = PLCOpenClasses.get("configurations_configuration", None)
 if cls:
     def updateElementName(self, old_name, new_name):
@@ -1455,13 +1554,27 @@
         return self.content["value"].getValue()
     setattr(cls, "getValue", getValue)
 
+def extractValues(self, values):
+    items = values.split(",")
+    i = 1
+    while i < len(items):
+        opened = items[i - 1].count("(") + items[i - 1].count("[")
+        closed = items[i - 1].count(")") + items[i - 1].count("]")
+        if opened > closed:
+            items[i - 1] = ','.join([items[i - 1], items.pop(i)])
+        elif opened == closed:
+            i += 1
+        else:
+            raise ValueError, "\"%s\" is an invalid value!"%value
+    return items
+
 cls = PLCOpenClasses.get("value_arrayValue", None)
 if cls:
-    arrayValue_model = re.compile("([0-9]*)\((.*)\)")
+    arrayValue_model = re.compile("([0-9]*)\((.*)\)$")
     
     def setValue(self, value):
         self.value = []
-        for item in value[1:-1].split(","):
+        for item in extractValues(value[1:-1]):
             item = item.strip()
             element = PLCOpenClasses["arrayValue_value"]()
             result = arrayValue_model.match(item)
@@ -1491,7 +1604,7 @@
     
     def setValue(self, value):
         self.value = []
-        for item in value[1:-1].split(","):
+        for item in extractValues(value[1:-1]):
             result = arrayValue_model.match(item)
             if result is not None:
                 groups = result.groups()