author | Andrey Skvortsov <andrej.skvortzov@gmail.com> |
Thu, 21 Apr 2016 19:14:28 +0300 | |
changeset 1497 | 7330c85534ea |
parent 1406 | 82db84fe88ea |
child 1534 | d2abe4109467 |
permissions | -rw-r--r-- |
814 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
4 |
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor |
|
5 |
#based on the plcopen standard. |
|
6 |
# |
|
7 |
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
|
8 |
# |
|
9 |
#See COPYING file for copyrights details. |
|
10 |
# |
|
11 |
#This library is free software; you can redistribute it and/or |
|
12 |
#modify it under the terms of the GNU General Public |
|
13 |
#License as published by the Free Software Foundation; either |
|
14 |
#version 2.1 of the License, or (at your option) any later version. |
|
15 |
# |
|
16 |
#This library is distributed in the hope that it will be useful, |
|
17 |
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
18 |
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
19 |
#General Public License for more details. |
|
20 |
# |
|
21 |
#You should have received a copy of the GNU General Public |
|
22 |
#License along with this library; if not, write to the Free Software |
|
23 |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
24 |
||
25 |
from xmlclass import * |
|
26 |
from types import * |
|
27 |
import os, re |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
28 |
from lxml import etree |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
29 |
from collections import OrderedDict |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
30 |
|
814 | 31 |
""" |
32 |
Dictionary that makes the relation between var names in plcopen and displayed values |
|
33 |
""" |
|
34 |
VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars", |
|
35 |
"Output" : "outputVars", "InOut" : "inOutVars", "External" : "externalVars", |
|
36 |
"Global" : "globalVars", "Access" : "accessVars"} |
|
37 |
||
38 |
searchResultVarTypes = { |
|
39 |
"inputVars": "var_input", |
|
40 |
"outputVars": "var_output", |
|
41 |
"inOutVars": "var_inout" |
|
42 |
} |
|
43 |
||
44 |
""" |
|
45 |
Define in which order var types must be displayed |
|
46 |
""" |
|
47 |
VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"] |
|
48 |
||
49 |
""" |
|
50 |
Define which action qualifier must be associated with a duration |
|
51 |
""" |
|
1339 | 52 |
QualifierList = OrderedDict([("N", False), ("R", False), ("S", False), |
53 |
("L", True), ("D", True), ("P", False), ("P0", False), |
|
54 |
("P1", False), ("SD", True), ("DS", True), ("SL", True)]) |
|
814 | 55 |
|
56 |
||
57 |
FILTER_ADDRESS_MODEL = "(%%[IQM](?:[XBWDL])?)(%s)((?:\.[0-9]+)*)" |
|
58 |
||
59 |
def update_address(address, address_model, new_leading): |
|
60 |
result = address_model.match(address) |
|
61 |
if result is None: |
|
62 |
return address |
|
63 |
groups = result.groups() |
|
64 |
return groups[0] + new_leading + groups[2] |
|
65 |
||
66 |
def _init_and_compare(function, v1, v2): |
|
67 |
if v1 is None: |
|
68 |
return v2 |
|
69 |
if v2 is not None: |
|
70 |
return function(v1, v2) |
|
71 |
return v1 |
|
72 |
||
73 |
""" |
|
74 |
Helper class for bounding_box calculation |
|
75 |
""" |
|
76 |
class rect: |
|
77 |
||
78 |
def __init__(self, x=None, y=None, width=None, height=None): |
|
79 |
self.x_min = x |
|
80 |
self.x_max = None |
|
81 |
self.y_min = y |
|
82 |
self.y_max = None |
|
83 |
if width is not None and x is not None: |
|
84 |
self.x_max = x + width |
|
85 |
if height is not None and y is not None: |
|
86 |
self.y_max = y + height |
|
87 |
||
88 |
def update(self, x, y): |
|
89 |
self.x_min = _init_and_compare(min, self.x_min, x) |
|
90 |
self.x_max = _init_and_compare(max, self.x_max, x) |
|
91 |
self.y_min = _init_and_compare(min, self.y_min, y) |
|
92 |
self.y_max = _init_and_compare(max, self.y_max, y) |
|
93 |
||
94 |
def union(self, rect): |
|
95 |
self.x_min = _init_and_compare(min, self.x_min, rect.x_min) |
|
96 |
self.x_max = _init_and_compare(max, self.x_max, rect.x_max) |
|
97 |
self.y_min = _init_and_compare(min, self.y_min, rect.y_min) |
|
98 |
self.y_max = _init_and_compare(max, self.y_max, rect.y_max) |
|
99 |
||
100 |
def bounding_box(self): |
|
101 |
width = height = None |
|
102 |
if self.x_min is not None and self.x_max is not None: |
|
103 |
width = self.x_max - self.x_min |
|
104 |
if self.y_min is not None and self.y_max is not None: |
|
105 |
height = self.y_max - self.y_min |
|
106 |
return self.x_min, self.y_min, width, height |
|
107 |
||
108 |
def TextLenInRowColumn(text): |
|
109 |
if text == "": |
|
110 |
return (0, 0) |
|
111 |
lines = text.split("\n") |
|
112 |
return len(lines) - 1, len(lines[-1]) |
|
113 |
||
114 |
def TestTextElement(text, criteria): |
|
115 |
lines = text.splitlines() |
|
116 |
if not criteria["case_sensitive"]: |
|
117 |
text = text.upper() |
|
118 |
test_result = [] |
|
119 |
result = criteria["pattern"].search(text) |
|
120 |
while result is not None: |
|
121 |
start = TextLenInRowColumn(text[:result.start()]) |
|
122 |
end = TextLenInRowColumn(text[:result.end() - 1]) |
|
123 |
test_result.append((start, end, "\n".join(lines[start[0]:end[0] + 1]))) |
|
124 |
result = criteria["pattern"].search(text, result.end()) |
|
125 |
return test_result |
|
126 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
127 |
PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd")) |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
128 |
PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
129 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
130 |
LOAD_POU_PROJECT_TEMPLATE = """ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
131 |
<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
132 |
xmlns:xhtml="http://www.w3.org/1999/xhtml" |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
133 |
xmlns:xsd="http://www.w3.org/2001/XMLSchema" |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
134 |
xmlns="http://www.plcopen.org/xml/tc6_0201"> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
135 |
<fileHeader companyName="" productName="" productVersion="" |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
136 |
creationDateTime="1970-01-01T00:00:00"/> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
137 |
<contentHeader name="paste_project"> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
138 |
<coordinateInfo> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
139 |
<fbd><scaling x="0" y="0"/></fbd> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
140 |
<ld><scaling x="0" y="0"/></ld> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
141 |
<sfc><scaling x="0" y="0"/></sfc> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
142 |
</coordinateInfo> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
143 |
</contentHeader> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
144 |
<types> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
145 |
<dataTypes/> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
146 |
<pous>%s</pous> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
147 |
</types> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
148 |
<instances> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
149 |
<configurations/> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
150 |
</instances> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
151 |
</project> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
152 |
""" |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
153 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
154 |
def LOAD_POU_INSTANCES_PROJECT_TEMPLATE(body_type): |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
155 |
return LOAD_POU_PROJECT_TEMPLATE % """ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
156 |
<pou name="paste_pou" pouType="program"> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
157 |
<body> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
158 |
<%(body_type)s>%%s</%(body_type)s> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
159 |
</body> |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
160 |
</pou>""" % locals() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
161 |
|
1334
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
162 |
PLCOpen_v1_file = open(os.path.join(os.path.split(__file__)[0], "TC6_XML_V10_B.xsd")) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
163 |
PLCOpen_v1_xml = PLCOpen_v1_file.read() |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
164 |
PLCOpen_v1_file.close() |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
165 |
PLCOpen_v1_xml = PLCOpen_v1_xml.replace( |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
166 |
"http://www.plcopen.org/xml/tc6.xsd", |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
167 |
"http://www.plcopen.org/xml/tc6_0201") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
168 |
PLCOpen_v1_xsd = etree.XMLSchema(etree.fromstring(PLCOpen_v1_xml)) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
169 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
170 |
# XPath for file compatibility process |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
171 |
ProjectResourcesXPath = PLCOpen_XPath("ppx:instances/ppx:configurations/ppx:configuration/ppx:resource") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
172 |
ResourceInstancesXpath = PLCOpen_XPath("ppx:pouInstance | ppx:task/ppx:pouInstance") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
173 |
TransitionsConditionXPath = PLCOpen_XPath("ppx:types/ppx:pous/ppx:pou/ppx:body/*/ppx:transition/ppx:condition") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
174 |
ConditionConnectionsXPath = PLCOpen_XPath("ppx:connection") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
175 |
ActionBlocksXPath = PLCOpen_XPath("ppx:types/ppx:pous/ppx:pou/ppx:body/*/ppx:actionBlock") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
176 |
ActionBlocksConnectionPointOutXPath = PLCOpen_XPath("ppx:connectionPointOut") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
177 |
|
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
178 |
def LoadProjectXML(project_xml): |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
179 |
project_xml = project_xml.replace( |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
180 |
"http://www.plcopen.org/xml/tc6.xsd", |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
181 |
"http://www.plcopen.org/xml/tc6_0201") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
182 |
for cre, repl in [ |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
183 |
(re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
184 |
(re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
185 |
project_xml = cre.sub(repl, project_xml) |
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
186 |
|
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
187 |
try: |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
188 |
tree, error = PLCOpenParser.LoadXMLString(project_xml) |
1334
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
189 |
if error is None: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
190 |
return tree, None |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
191 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
192 |
if PLCOpen_v1_xsd.validate(tree): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
193 |
# Make file compatible with PLCOpen v2 |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
194 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
195 |
# Update resource interval value |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
196 |
for resource in ProjectResourcesXPath(tree): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
197 |
for task in resource.gettask(): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
198 |
interval = task.get("interval") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
199 |
if interval is not None: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
200 |
result = time_model.match(interval) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
201 |
if result is not None: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
202 |
values = result.groups() |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
203 |
time_values = [int(v) for v in values[:2]] |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
204 |
seconds = float(values[2]) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
205 |
time_values.extend([int(seconds), int((seconds % 1) * 1000000)]) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
206 |
text = "T#" |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
207 |
if time_values[0] != 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
208 |
text += "%dh"%time_values[0] |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
209 |
if time_values[1] != 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
210 |
text += "%dm"%time_values[1] |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
211 |
if time_values[2] != 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
212 |
text += "%ds"%time_values[2] |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
213 |
if time_values[3] != 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
214 |
if time_values[3] % 1000 != 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
215 |
text += "%.3fms"%(float(time_values[3]) / 1000) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
216 |
else: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
217 |
text += "%dms"%(time_values[3] / 1000) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
218 |
task.set("interval", text) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
219 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
220 |
# Update resources pou instance attributes |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
221 |
for pouInstance in ResourceInstancesXpath(resource): |
1339 | 222 |
type_name = pouInstance.attrib.pop("type") |
1334
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
223 |
if type_name is not None: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
224 |
pouInstance.set("typeName", type_name) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
225 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
226 |
# Update transitions condition |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
227 |
for transition_condition in TransitionsConditionXPath(tree): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
228 |
connections = ConditionConnectionsXPath(transition_condition) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
229 |
if len(connections) > 0: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
230 |
connectionPointIn = PLCOpenParser.CreateElement("connectionPointIn", "condition") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
231 |
transition_condition.setcontent(connectionPointIn) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
232 |
connectionPointIn.setrelPositionXY(0, 0) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
233 |
for connection in connections: |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
234 |
connectionPointIn.append(connection) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
235 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
236 |
# Update actionBlocks |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
237 |
for actionBlock in ActionBlocksXPath(tree): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
238 |
for connectionPointOut in ActionBlocksConnectionPointOutXPath(actionBlock): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
239 |
actionBlock.remove(connectionPointOut) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
240 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
241 |
for action in actionBlock.getaction(): |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
242 |
action.set("localId", "0") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
243 |
relPosition = PLCOpenParser.CreateElement("relPosition", "action") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
244 |
relPosition.set("x", "0") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
245 |
relPosition.set("y", "0") |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
246 |
action.setrelPosition(relPosition) |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
247 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
248 |
return tree, None |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
249 |
|
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
250 |
return tree, error |
b0c2c4e1c1f1
Added support for loading PLCOpen v1 files and modify their content to be compatible with PLCOpen v2
Laurent Bessard
parents:
1331
diff
changeset
|
251 |
|
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
252 |
except Exception, e: |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
253 |
return None, e.message |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
254 |
|
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
255 |
def LoadProject(filepath): |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
256 |
project_file = open(filepath) |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
257 |
project_xml = project_file.read() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
258 |
project_file.close() |
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
259 |
return LoadProjectXML(project_xml) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
260 |
|
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
261 |
project_pou_xpath = PLCOpen_XPath("/ppx:project/ppx:types/ppx:pous/ppx:pou") |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
262 |
def LoadPou(xml_string): |
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
263 |
root, error = LoadProjectXML(LOAD_POU_PROJECT_TEMPLATE % xml_string) |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
264 |
return project_pou_xpath(root)[0], error |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
265 |
|
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
266 |
project_pou_instances_xpath = { |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
267 |
body_type: PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
268 |
"/ppx:project/ppx:types/ppx:pous/ppx:pou[@name='paste_pou']/ppx:body/ppx:%s/*" % body_type) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
269 |
for body_type in ["FBD", "LD", "SFC"]} |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
270 |
def LoadPouInstances(xml_string, body_type): |
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
271 |
root, error = LoadProjectXML( |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
272 |
LOAD_POU_INSTANCES_PROJECT_TEMPLATE(body_type) % xml_string) |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
273 |
return project_pou_instances_xpath[body_type](root), error |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
274 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
275 |
def SaveProject(project, filepath): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
276 |
project_file = open(filepath, 'w') |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
277 |
project_file.write(etree.tostring( |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
278 |
project, |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
279 |
pretty_print=True, |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
280 |
xml_declaration=True, |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
281 |
encoding='utf-8')) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
282 |
project_file.close() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
283 |
|
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
284 |
cls = PLCOpenParser.GetElementClass("formattedText") |
814 | 285 |
if cls: |
286 |
def updateElementName(self, old_name, new_name): |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
287 |
text = self.getanyText() |
814 | 288 |
index = text.find(old_name) |
289 |
while index != -1: |
|
290 |
if index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_"): |
|
291 |
index = text.find(old_name, index + len(old_name)) |
|
292 |
elif index < len(text) - len(old_name) and (text[index + len(old_name)].isalnum() or text[index + len(old_name)] == "_"): |
|
293 |
index = text.find(old_name, index + len(old_name)) |
|
294 |
else: |
|
295 |
text = text[:index] + new_name + text[index + len(old_name):] |
|
296 |
index = text.find(old_name, index + len(new_name)) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
297 |
self.setanyText(text) |
814 | 298 |
setattr(cls, "updateElementName", updateElementName) |
299 |
||
300 |
def updateElementAddress(self, address_model, new_leading): |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
301 |
text = self.getanyText() |
814 | 302 |
startpos = 0 |
303 |
result = address_model.search(text, startpos) |
|
304 |
while result is not None: |
|
305 |
groups = result.groups() |
|
306 |
new_address = groups[0] + new_leading + groups[2] |
|
307 |
text = text[:result.start()] + new_address + text[result.end():] |
|
308 |
startpos = result.start() + len(new_address) |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
309 |
result = address_model.search(text, startpos) |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
310 |
self.setanyText(text) |
814 | 311 |
setattr(cls, "updateElementAddress", updateElementAddress) |
312 |
||
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
313 |
def hasblock(self, block_type): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
314 |
text = self.getanyText().upper() |
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
315 |
index = text.find(block_type.upper()) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
316 |
while index != -1: |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
317 |
if (not (index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_")) and |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
318 |
not (index < len(text) - len(block_type) and text[index + len(block_type)] != "(")): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
319 |
return True |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
320 |
index = text.find(block_type.upper(), index + len(block_type)) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
321 |
return False |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
322 |
setattr(cls, "hasblock", hasblock) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
323 |
|
814 | 324 |
def Search(self, criteria, parent_infos): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
325 |
return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)] |
814 | 326 |
setattr(cls, "Search", Search) |
327 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
328 |
cls = PLCOpenParser.GetElementClass("project") |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
329 |
if cls: |
814 | 330 |
|
331 |
def setname(self, name): |
|
332 |
self.contentHeader.setname(name) |
|
333 |
setattr(cls, "setname", setname) |
|
334 |
||
335 |
def getname(self): |
|
336 |
return self.contentHeader.getname() |
|
337 |
setattr(cls, "getname", getname) |
|
338 |
||
339 |
def getfileHeader(self): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
340 |
fileheader_obj = self.fileHeader |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
341 |
return { |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
342 |
attr: value if value is not None else "" |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
343 |
for attr, value in [ |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
344 |
("companyName", fileheader_obj.getcompanyName()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
345 |
("companyURL", fileheader_obj.getcompanyURL()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
346 |
("productName", fileheader_obj.getproductName()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
347 |
("productVersion", fileheader_obj.getproductVersion()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
348 |
("productRelease", fileheader_obj.getproductRelease()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
349 |
("creationDateTime", fileheader_obj.getcreationDateTime()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
350 |
("contentDescription", fileheader_obj.getcontentDescription())] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
351 |
} |
814 | 352 |
setattr(cls, "getfileHeader", getfileHeader) |
353 |
||
354 |
def setfileHeader(self, fileheader): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
355 |
fileheader_obj = self.fileHeader |
1309
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
356 |
for attr in ["companyName", "companyURL", "productName", |
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
357 |
"productVersion", "productRelease", "creationDateTime", |
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
358 |
"contentDescription"]: |
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
359 |
value = fileheader.get(attr) |
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
360 |
if value is not None: |
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
361 |
setattr(fileheader_obj, attr, value) |
814 | 362 |
setattr(cls, "setfileHeader", setfileHeader) |
363 |
||
364 |
def getcontentHeader(self): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
365 |
contentheader_obj = self.contentHeader |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
366 |
contentheader = { |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
367 |
attr: value if value is not None else "" |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
368 |
for attr, value in [ |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
369 |
("projectName", contentheader_obj.getname()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
370 |
("projectVersion", contentheader_obj.getversion()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
371 |
("modificationDateTime", contentheader_obj.getmodificationDateTime()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
372 |
("organization", contentheader_obj.getorganization()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
373 |
("authorName", contentheader_obj.getauthor()), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
374 |
("language", contentheader_obj.getlanguage())] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
375 |
} |
814 | 376 |
contentheader["pageSize"] = self.contentHeader.getpageSize() |
377 |
contentheader["scaling"] = self.contentHeader.getscaling() |
|
378 |
return contentheader |
|
379 |
setattr(cls, "getcontentHeader", getcontentHeader) |
|
380 |
||
381 |
def setcontentHeader(self, contentheader): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
382 |
contentheader_obj = self.contentHeader |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
383 |
for attr, value in contentheader.iteritems(): |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
384 |
func = {"projectName": contentheader_obj.setname, |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
385 |
"projectVersion": contentheader_obj.setversion, |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
386 |
"authorName": contentheader_obj.setauthor, |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
387 |
"pageSize": lambda v: contentheader_obj.setpageSize(*v), |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
388 |
"scaling": contentheader_obj.setscaling}.get(attr) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
389 |
if func is not None: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
390 |
func(value) |
1309
85ce56758900
Fixed bug when modifying project properties
Laurent Bessard
parents:
1307
diff
changeset
|
391 |
elif attr in ["modificationDateTime", "organization", "language"]: |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
392 |
setattr(contentheader_obj, attr, value) |
814 | 393 |
setattr(cls, "setcontentHeader", setcontentHeader) |
394 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
395 |
def gettypeElementFunc(element_type): |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
396 |
elements_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
397 |
"ppx:types/ppx:%(element_type)ss/ppx:%(element_type)s[@name=$name]" % locals()) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
398 |
def gettypeElement(self, name): |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
399 |
elements = elements_xpath(self, name=name) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
400 |
if len(elements) == 1: |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
401 |
return elements[0] |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
402 |
return None |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
403 |
return gettypeElement |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
404 |
|
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
405 |
datatypes_xpath = PLCOpen_XPath("ppx:types/ppx:dataTypes/ppx:dataType") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
406 |
filtered_datatypes_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
407 |
"ppx:types/ppx:dataTypes/ppx:dataType[@name!=$exclude]") |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
408 |
def getdataTypes(self, exclude=None): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
409 |
if exclude is not None: |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
410 |
return filtered_datatypes_xpath(self, exclude=exclude) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
411 |
return datatypes_xpath(self) |
814 | 412 |
setattr(cls, "getdataTypes", getdataTypes) |
413 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
414 |
setattr(cls, "getdataType", gettypeElementFunc("dataType")) |
814 | 415 |
|
416 |
def appenddataType(self, name): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
417 |
if self.getdataType(name) is not None: |
814 | 418 |
raise ValueError, "\"%s\" Data Type already exists !!!"%name |
419 |
self.types.appenddataTypeElement(name) |
|
420 |
setattr(cls, "appenddataType", appenddataType) |
|
421 |
||
422 |
def insertdataType(self, index, datatype): |
|
423 |
self.types.insertdataTypeElement(index, datatype) |
|
424 |
setattr(cls, "insertdataType", insertdataType) |
|
425 |
||
426 |
def removedataType(self, name): |
|
427 |
self.types.removedataTypeElement(name) |
|
428 |
setattr(cls, "removedataType", removedataType) |
|
429 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
430 |
def getpous(self, exclude=None, filter=[]): |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
431 |
return self.xpath( |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
432 |
"ppx:types/ppx:pous/ppx:pou%s%s" % |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
433 |
(("[@name!='%s']" % exclude) if exclude is not None else '', |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
434 |
("[%s]" % " or ".join( |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
435 |
map(lambda x: "@pouType='%s'" % x, filter))) |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
436 |
if len(filter) > 0 else ""), |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
437 |
namespaces=PLCOpenParser.NSMAP) |
814 | 438 |
setattr(cls, "getpous", getpous) |
439 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
440 |
setattr(cls, "getpou", gettypeElementFunc("pou")) |
814 | 441 |
|
442 |
def appendpou(self, name, pou_type, body_type): |
|
443 |
self.types.appendpouElement(name, pou_type, body_type) |
|
444 |
setattr(cls, "appendpou", appendpou) |
|
445 |
||
446 |
def insertpou(self, index, pou): |
|
447 |
self.types.insertpouElement(index, pou) |
|
448 |
setattr(cls, "insertpou", insertpou) |
|
449 |
||
450 |
def removepou(self, name): |
|
451 |
self.types.removepouElement(name) |
|
452 |
setattr(cls, "removepou", removepou) |
|
453 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
454 |
configurations_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
455 |
"ppx:instances/ppx:configurations/ppx:configuration") |
814 | 456 |
def getconfigurations(self): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
457 |
return configurations_xpath(self) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
458 |
setattr(cls, "getconfigurations", getconfigurations) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
459 |
|
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
460 |
configuration_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
461 |
"ppx:instances/ppx:configurations/ppx:configuration[@name=$name]") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
462 |
def getconfiguration(self, name): |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
463 |
configurations = configuration_xpath(self, name=name) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
464 |
if len(configurations) == 1: |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
465 |
return configurations[0] |
814 | 466 |
return None |
467 |
setattr(cls, "getconfiguration", getconfiguration) |
|
468 |
||
469 |
def addconfiguration(self, name): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
470 |
if self.getconfiguration(name) is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
471 |
raise ValueError, _("\"%s\" configuration already exists !!!") % name |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
472 |
new_configuration = PLCOpenParser.CreateElement("configuration", "configurations") |
814 | 473 |
new_configuration.setname(name) |
474 |
self.instances.configurations.appendconfiguration(new_configuration) |
|
475 |
setattr(cls, "addconfiguration", addconfiguration) |
|
476 |
||
477 |
def removeconfiguration(self, name): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
478 |
configuration = self.getconfiguration(name) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
479 |
if configuration is None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
480 |
raise ValueError, ("\"%s\" configuration doesn't exist !!!") % name |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
481 |
self.instances.configurations.remove(configuration) |
814 | 482 |
setattr(cls, "removeconfiguration", removeconfiguration) |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
483 |
|
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
484 |
resources_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
485 |
"ppx:instances/ppx:configurations/ppx:configuration[@name=$configname]/ppx:resource[@name=$name]") |
814 | 486 |
def getconfigurationResource(self, config_name, name): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
487 |
resources = resources_xpath(self, configname=config_name, name=name) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
488 |
if len(resources) == 1: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
489 |
return resources[0] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
490 |
return None |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
491 |
setattr(cls, "getconfigurationResource", getconfigurationResource) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
492 |
|
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
493 |
def addconfigurationResource(self, config_name, name): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
494 |
if self.getconfigurationResource(config_name, name) is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
495 |
raise ValueError, _("\"%s\" resource already exists in \"%s\" configuration !!!") % (name, config_name) |
814 | 496 |
configuration = self.getconfiguration(config_name) |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
497 |
if configuration is not None: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
498 |
new_resource = PLCOpenParser.CreateElement("resource", "configuration") |
814 | 499 |
new_resource.setname(name) |
500 |
configuration.appendresource(new_resource) |
|
501 |
setattr(cls, "addconfigurationResource", addconfigurationResource) |
|
502 |
||
503 |
def removeconfigurationResource(self, config_name, name): |
|
504 |
configuration = self.getconfiguration(config_name) |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
505 |
found = False |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
506 |
if configuration is not None: |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
507 |
resource = self.getconfigurationResource(config_name, name) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
508 |
if resource is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
509 |
configuration.remove(resource) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
510 |
found = True |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
511 |
if not found: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
512 |
raise ValueError, _("\"%s\" resource doesn't exist in \"%s\" configuration !!!")%(name, config_name) |
814 | 513 |
setattr(cls, "removeconfigurationResource", removeconfigurationResource) |
514 |
||
515 |
def updateElementName(self, old_name, new_name): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
516 |
for datatype in self.getdataTypes(): |
814 | 517 |
datatype.updateElementName(old_name, new_name) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
518 |
for pou in self.getpous(): |
814 | 519 |
pou.updateElementName(old_name, new_name) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
520 |
for configuration in self.getconfigurations(): |
814 | 521 |
configuration.updateElementName(old_name, new_name) |
522 |
setattr(cls, "updateElementName", updateElementName) |
|
523 |
||
524 |
def updateElementAddress(self, old_leading, new_leading): |
|
525 |
address_model = re.compile(FILTER_ADDRESS_MODEL % old_leading) |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
526 |
for pou in self.getpous(): |
814 | 527 |
pou.updateElementAddress(address_model, new_leading) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
528 |
for configuration in self.getconfigurations(): |
814 | 529 |
configuration.updateElementAddress(address_model, new_leading) |
530 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
531 |
||
532 |
def removeVariableByAddress(self, address): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
533 |
for pou in self.getpous(): |
814 | 534 |
pou.removeVariableByAddress(address) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
535 |
for configuration in self.getconfigurations(): |
814 | 536 |
configuration.removeVariableByAddress(address) |
537 |
setattr(cls, "removeVariableByAddress", removeVariableByAddress) |
|
538 |
||
539 |
def removeVariableByFilter(self, leading): |
|
540 |
address_model = re.compile(FILTER_ADDRESS_MODEL % leading) |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
541 |
for pou in self.getpous(): |
814 | 542 |
pou.removeVariableByFilter(address_model) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
543 |
for configuration in self.getconfigurations(): |
814 | 544 |
configuration.removeVariableByFilter(address_model) |
545 |
setattr(cls, "removeVariableByFilter", removeVariableByFilter) |
|
546 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
547 |
enumerated_values_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
548 |
"ppx:types/ppx:dataTypes/ppx:dataType/ppx:baseType/ppx:enum/ppx:values/ppx:value") |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
549 |
def GetEnumeratedDataTypeValues(self): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
550 |
return [value.getname() for value in enumerated_values_xpath(self)] |
814 | 551 |
setattr(cls, "GetEnumeratedDataTypeValues", GetEnumeratedDataTypeValues) |
552 |
||
553 |
def Search(self, criteria, parent_infos=[]): |
|
554 |
result = self.types.Search(criteria, parent_infos) |
|
555 |
for configuration in self.instances.configurations.getconfiguration(): |
|
556 |
result.extend(configuration.Search(criteria, parent_infos)) |
|
557 |
return result |
|
558 |
setattr(cls, "Search", Search) |
|
559 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
560 |
cls = PLCOpenParser.GetElementClass("contentHeader", "project") |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
561 |
if cls: |
814 | 562 |
|
563 |
def setpageSize(self, width, height): |
|
564 |
self.coordinateInfo.setpageSize(width, height) |
|
565 |
setattr(cls, "setpageSize", setpageSize) |
|
566 |
||
567 |
def getpageSize(self): |
|
568 |
return self.coordinateInfo.getpageSize() |
|
569 |
setattr(cls, "getpageSize", getpageSize) |
|
570 |
||
571 |
def setscaling(self, scaling): |
|
572 |
for language, (x, y) in scaling.items(): |
|
573 |
self.coordinateInfo.setscaling(language, x, y) |
|
574 |
setattr(cls, "setscaling", setscaling) |
|
575 |
||
576 |
def getscaling(self): |
|
577 |
scaling = {} |
|
578 |
scaling["FBD"] = self.coordinateInfo.getscaling("FBD") |
|
579 |
scaling["LD"] = self.coordinateInfo.getscaling("LD") |
|
580 |
scaling["SFC"] = self.coordinateInfo.getscaling("SFC") |
|
581 |
return scaling |
|
582 |
setattr(cls, "getscaling", getscaling) |
|
583 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
584 |
cls = PLCOpenParser.GetElementClass("coordinateInfo", "contentHeader") |
814 | 585 |
if cls: |
586 |
def setpageSize(self, width, height): |
|
587 |
if width == 0 and height == 0: |
|
588 |
self.deletepageSize() |
|
589 |
else: |
|
590 |
if self.pageSize is None: |
|
591 |
self.addpageSize() |
|
592 |
self.pageSize.setx(width) |
|
593 |
self.pageSize.sety(height) |
|
594 |
setattr(cls, "setpageSize", setpageSize) |
|
595 |
||
596 |
def getpageSize(self): |
|
597 |
if self.pageSize is not None: |
|
598 |
return self.pageSize.getx(), self.pageSize.gety() |
|
599 |
return 0, 0 |
|
600 |
setattr(cls, "getpageSize", getpageSize) |
|
601 |
||
602 |
def setscaling(self, language, x, y): |
|
603 |
if language == "FBD": |
|
604 |
self.fbd.scaling.setx(x) |
|
605 |
self.fbd.scaling.sety(y) |
|
606 |
elif language == "LD": |
|
607 |
self.ld.scaling.setx(x) |
|
608 |
self.ld.scaling.sety(y) |
|
609 |
elif language == "SFC": |
|
610 |
self.sfc.scaling.setx(x) |
|
611 |
self.sfc.scaling.sety(y) |
|
612 |
setattr(cls, "setscaling", setscaling) |
|
613 |
||
614 |
def getscaling(self, language): |
|
615 |
if language == "FBD": |
|
616 |
return self.fbd.scaling.getx(), self.fbd.scaling.gety() |
|
617 |
elif language == "LD": |
|
618 |
return self.ld.scaling.getx(), self.ld.scaling.gety() |
|
619 |
elif language == "SFC": |
|
620 |
return self.sfc.scaling.getx(), self.sfc.scaling.gety() |
|
621 |
return 0, 0 |
|
622 |
setattr(cls, "getscaling", getscaling) |
|
623 |
||
624 |
def _Search(attributes, criteria, parent_infos): |
|
625 |
search_result = [] |
|
626 |
for attr, value in attributes: |
|
627 |
if value is not None: |
|
628 |
search_result.extend([(tuple(parent_infos + [attr]),) + result for result in TestTextElement(value, criteria)]) |
|
629 |
return search_result |
|
630 |
||
631 |
def _updateConfigurationResourceElementName(self, old_name, new_name): |
|
632 |
for varlist in self.getglobalVars(): |
|
633 |
for var in varlist.getvariable(): |
|
634 |
var_address = var.getaddress() |
|
635 |
if var_address is not None: |
|
636 |
if var_address == old_name: |
|
637 |
var.setaddress(new_name) |
|
638 |
if var.getname() == old_name: |
|
639 |
var.setname(new_name) |
|
640 |
||
641 |
def _updateConfigurationResourceElementAddress(self, address_model, new_leading): |
|
642 |
for varlist in self.getglobalVars(): |
|
643 |
for var in varlist.getvariable(): |
|
644 |
var_address = var.getaddress() |
|
645 |
if var_address is not None: |
|
646 |
var.setaddress(update_address(var_address, address_model, new_leading)) |
|
647 |
||
648 |
def _removeConfigurationResourceVariableByAddress(self, address): |
|
649 |
for varlist in self.getglobalVars(): |
|
650 |
variables = varlist.getvariable() |
|
651 |
for i in xrange(len(variables)-1, -1, -1): |
|
652 |
if variables[i].getaddress() == address: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
653 |
variables.remove(variables[i]) |
814 | 654 |
|
655 |
def _removeConfigurationResourceVariableByFilter(self, address_model): |
|
656 |
for varlist in self.getglobalVars(): |
|
657 |
variables = varlist.getvariable() |
|
658 |
for i in xrange(len(variables)-1, -1, -1): |
|
659 |
var_address = variables[i].getaddress() |
|
660 |
if var_address is not None: |
|
661 |
result = address_model.match(var_address) |
|
662 |
if result is not None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
663 |
variables.remove(variables[i]) |
814 | 664 |
|
665 |
def _SearchInConfigurationResource(self, criteria, parent_infos=[]): |
|
666 |
search_result = _Search([("name", self.getname())], criteria, parent_infos) |
|
667 |
var_number = 0 |
|
668 |
for varlist in self.getglobalVars(): |
|
669 |
variable_type = searchResultVarTypes.get("globalVars", "var_local") |
|
670 |
variables = varlist.getvariable() |
|
671 |
for modifier, has_modifier in [("constant", varlist.getconstant()), |
|
672 |
("retain", varlist.getretain()), |
|
673 |
("non_retain", varlist.getnonretain())]: |
|
674 |
if has_modifier: |
|
675 |
for result in TestTextElement(modifier, criteria): |
|
676 |
search_result.append((tuple(parent_infos + [variable_type, (var_number, var_number + len(variables)), modifier]),) + result) |
|
677 |
break |
|
678 |
for variable in variables: |
|
679 |
search_result.extend(variable.Search(criteria, parent_infos + [variable_type, var_number])) |
|
680 |
var_number += 1 |
|
681 |
return search_result |
|
682 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
683 |
cls = PLCOpenParser.GetElementClass("configuration", "configurations") |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
684 |
if cls: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
685 |
|
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
686 |
def addglobalVar(self, var_type, name, location="", description=""): |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
687 |
globalvars = self.getglobalVars() |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
688 |
if len(globalvars) == 0: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
689 |
globalvars.append(PLCOpenParser.CreateElement("varList")) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
690 |
var = PLCOpenParser.CreateElement("variable", "varListPlain") |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
691 |
var.setname(name) |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
692 |
var.settype(var_type) |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
693 |
if location != "": |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
694 |
var.setaddress(location) |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
695 |
if description != "": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
696 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
697 |
ft.setanyText(description) |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
698 |
var.setdocumentation(ft) |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
699 |
globalvars[-1].appendvariable(var) |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
700 |
setattr(cls, "addglobalVar", addglobalVar) |
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1142
diff
changeset
|
701 |
|
814 | 702 |
def updateElementName(self, old_name, new_name): |
703 |
_updateConfigurationResourceElementName(self, old_name, new_name) |
|
704 |
for resource in self.getresource(): |
|
705 |
resource.updateElementName(old_name, new_name) |
|
706 |
setattr(cls, "updateElementName", updateElementName) |
|
707 |
||
708 |
def updateElementAddress(self, address_model, new_leading): |
|
709 |
_updateConfigurationResourceElementAddress(self, address_model, new_leading) |
|
710 |
for resource in self.getresource(): |
|
711 |
resource.updateElementAddress(address_model, new_leading) |
|
712 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
713 |
||
714 |
setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress) |
|
715 |
setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter) |
|
716 |
||
717 |
def Search(self, criteria, parent_infos=[]): |
|
718 |
search_result = [] |
|
719 |
parent_infos = parent_infos + ["C::%s" % self.getname()] |
|
720 |
filter = criteria["filter"] |
|
721 |
if filter == "all" or "configuration" in filter: |
|
722 |
search_result = _SearchInConfigurationResource(self, criteria, parent_infos) |
|
723 |
for resource in self.getresource(): |
|
724 |
search_result.extend(resource.Search(criteria, parent_infos)) |
|
725 |
return search_result |
|
726 |
setattr(cls, "Search", Search) |
|
727 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
728 |
cls = PLCOpenParser.GetElementClass("resource", "configuration") |
814 | 729 |
if cls: |
730 |
def updateElementName(self, old_name, new_name): |
|
731 |
_updateConfigurationResourceElementName(self, old_name, new_name) |
|
732 |
for instance in self.getpouInstance(): |
|
733 |
instance.updateElementName(old_name, new_name) |
|
734 |
for task in self.gettask(): |
|
735 |
task.updateElementName(old_name, new_name) |
|
736 |
setattr(cls, "updateElementName", updateElementName) |
|
737 |
||
738 |
def updateElementAddress(self, address_model, new_leading): |
|
739 |
_updateConfigurationResourceElementAddress(self, address_model, new_leading) |
|
740 |
for task in self.gettask(): |
|
741 |
task.updateElementAddress(address_model, new_leading) |
|
742 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
743 |
||
744 |
setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress) |
|
745 |
setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter) |
|
746 |
||
747 |
def Search(self, criteria, parent_infos=[]): |
|
748 |
parent_infos = parent_infos[:-1] + ["R::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())] |
|
749 |
search_result = _SearchInConfigurationResource(self, criteria, parent_infos) |
|
750 |
task_number = 0 |
|
751 |
instance_number = 0 |
|
752 |
for task in self.gettask(): |
|
753 |
results = TestTextElement(task.getname(), criteria) |
|
754 |
for result in results: |
|
755 |
search_result.append((tuple(parent_infos + ["task", task_number, "name"]),) + result) |
|
756 |
search_result.extend(task.Search(criteria, parent_infos + ["task", task_number])) |
|
757 |
task_number += 1 |
|
758 |
for instance in task.getpouInstance(): |
|
759 |
search_result.extend(task.Search(criteria, parent_infos + ["instance", instance_number])) |
|
760 |
for result in results: |
|
761 |
search_result.append((tuple(parent_infos + ["instance", instance_number, "task"]),) + result) |
|
762 |
instance_number += 1 |
|
763 |
for instance in self.getpouInstance(): |
|
764 |
search_result.extend(instance.Search(criteria, parent_infos + ["instance", instance_number])) |
|
765 |
instance_number += 1 |
|
766 |
return search_result |
|
767 |
setattr(cls, "Search", Search) |
|
768 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
769 |
cls = PLCOpenParser.GetElementClass("task", "resource") |
814 | 770 |
if cls: |
771 |
def updateElementName(self, old_name, new_name): |
|
772 |
if self.single == old_name: |
|
773 |
self.single = new_name |
|
774 |
if self.interval == old_name: |
|
775 |
self.interval = new_name |
|
776 |
for instance in self.getpouInstance(): |
|
777 |
instance.updateElementName(old_name, new_name) |
|
778 |
setattr(cls, "updateElementName", updateElementName) |
|
779 |
||
780 |
def updateElementAddress(self, address_model, new_leading): |
|
781 |
if self.single is not None: |
|
782 |
self.single = update_address(self.single, address_model, new_leading) |
|
783 |
if self.interval is not None: |
|
784 |
self.interval = update_address(self.interval, address_model, new_leading) |
|
785 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
786 |
||
787 |
def Search(self, criteria, parent_infos=[]): |
|
788 |
return _Search([("single", self.getsingle()), |
|
789 |
("interval", self.getinterval()), |
|
790 |
("priority", str(self.getpriority()))], |
|
791 |
criteria, parent_infos) |
|
792 |
setattr(cls, "Search", Search) |
|
793 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
794 |
cls = PLCOpenParser.GetElementClass("pouInstance") |
814 | 795 |
if cls: |
796 |
def updateElementName(self, old_name, new_name): |
|
797 |
if self.typeName == old_name: |
|
798 |
self.typeName = new_name |
|
799 |
setattr(cls, "updateElementName", updateElementName) |
|
800 |
||
801 |
def Search(self, criteria, parent_infos=[]): |
|
802 |
return _Search([("name", self.getname()), |
|
803 |
("type", self.gettypeName())], |
|
804 |
criteria, parent_infos) |
|
805 |
setattr(cls, "Search", Search) |
|
806 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
807 |
cls = PLCOpenParser.GetElementClass("variable", "varListPlain") |
814 | 808 |
if cls: |
809 |
def gettypeAsText(self): |
|
810 |
vartype_content = self.gettype().getcontent() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
811 |
vartype_content_name = vartype_content.getLocalTag() |
814 | 812 |
# Variable type is a user data type |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
813 |
if vartype_content_name == "derived": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
814 |
return vartype_content.getname() |
814 | 815 |
# Variable type is a string type |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
816 |
elif vartype_content_name in ["string", "wstring"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
817 |
return vartype_content_name.upper() |
814 | 818 |
# Variable type is an array |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
819 |
elif vartype_content_name == "array": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
820 |
base_type = vartype_content.baseType.getcontent() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
821 |
base_type_name = base_type.getLocalTag() |
814 | 822 |
# Array derived directly from a user defined type |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
823 |
if base_type_name == "derived": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
824 |
basetype_name = base_type.getname() |
814 | 825 |
# Array derived directly from a string type |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
826 |
elif base_type_name in ["string", "wstring"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
827 |
basetype_name = base_type_name.upper() |
814 | 828 |
# Array derived directly from an elementary type |
829 |
else: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
830 |
basetype_name = base_type_name |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
831 |
return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "%s..%s" % (x.getlower(), x.getupper()), vartype_content.getdimension())), basetype_name) |
814 | 832 |
# Variable type is an elementary type |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
833 |
return vartype_content_name |
814 | 834 |
setattr(cls, "gettypeAsText", gettypeAsText) |
835 |
||
836 |
def Search(self, criteria, parent_infos=[]): |
|
837 |
search_result = _Search([("name", self.getname()), |
|
838 |
("type", self.gettypeAsText()), |
|
839 |
("location", self.getaddress())], |
|
840 |
criteria, parent_infos) |
|
841 |
initial = self.getinitialValue() |
|
842 |
if initial is not None: |
|
843 |
search_result.extend(_Search([("initial value", initial.getvalue())], criteria, parent_infos)) |
|
844 |
doc = self.getdocumentation() |
|
845 |
if doc is not None: |
|
846 |
search_result.extend(doc.Search(criteria, parent_infos + ["documentation"])) |
|
847 |
return search_result |
|
848 |
setattr(cls, "Search", Search) |
|
849 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
850 |
cls = PLCOpenParser.GetElementClass("types", "project") |
814 | 851 |
if cls: |
852 |
def getdataTypeElements(self): |
|
853 |
return self.dataTypes.getdataType() |
|
854 |
setattr(cls, "getdataTypeElements", getdataTypeElements) |
|
855 |
||
856 |
def getdataTypeElement(self, name): |
|
857 |
elements = self.dataTypes.getdataType() |
|
858 |
for element in elements: |
|
859 |
if element.getname() == name: |
|
860 |
return element |
|
861 |
return None |
|
862 |
setattr(cls, "getdataTypeElement", getdataTypeElement) |
|
863 |
||
864 |
def appenddataTypeElement(self, name): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
865 |
new_datatype = PLCOpenParser.CreateElement("dataType", "dataTypes") |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
866 |
self.dataTypes.appenddataType(new_datatype) |
814 | 867 |
new_datatype.setname(name) |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
868 |
new_datatype.baseType.setcontent(PLCOpenParser.CreateElement("BOOL", "dataType")) |
814 | 869 |
setattr(cls, "appenddataTypeElement", appenddataTypeElement) |
870 |
||
871 |
def insertdataTypeElement(self, index, dataType): |
|
872 |
self.dataTypes.insertdataType(index, dataType) |
|
873 |
setattr(cls, "insertdataTypeElement", insertdataTypeElement) |
|
874 |
||
875 |
def removedataTypeElement(self, name): |
|
876 |
found = False |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
877 |
for element in self.dataTypes.getdataType(): |
814 | 878 |
if element.getname() == name: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
879 |
self.dataTypes.remove(element) |
814 | 880 |
found = True |
881 |
break |
|
882 |
if not found: |
|
883 |
raise ValueError, _("\"%s\" Data Type doesn't exist !!!")%name |
|
884 |
setattr(cls, "removedataTypeElement", removedataTypeElement) |
|
885 |
||
886 |
def getpouElements(self): |
|
887 |
return self.pous.getpou() |
|
888 |
setattr(cls, "getpouElements", getpouElements) |
|
889 |
||
890 |
def getpouElement(self, name): |
|
891 |
elements = self.pous.getpou() |
|
892 |
for element in elements: |
|
893 |
if element.getname() == name: |
|
894 |
return element |
|
895 |
return None |
|
896 |
setattr(cls, "getpouElement", getpouElement) |
|
897 |
||
898 |
def appendpouElement(self, name, pou_type, body_type): |
|
899 |
for element in self.pous.getpou(): |
|
900 |
if element.getname() == name: |
|
901 |
raise ValueError, _("\"%s\" POU already exists !!!")%name |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
902 |
new_pou = PLCOpenParser.CreateElement("pou", "pous") |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
903 |
self.pous.appendpou(new_pou) |
814 | 904 |
new_pou.setname(name) |
905 |
new_pou.setpouType(pou_type) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
906 |
new_pou.appendbody(PLCOpenParser.CreateElement("body", "pou")) |
814 | 907 |
new_pou.setbodyType(body_type) |
908 |
setattr(cls, "appendpouElement", appendpouElement) |
|
909 |
||
910 |
def insertpouElement(self, index, pou): |
|
911 |
self.pous.insertpou(index, pou) |
|
912 |
setattr(cls, "insertpouElement", insertpouElement) |
|
913 |
||
914 |
def removepouElement(self, name): |
|
915 |
found = False |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
916 |
for element in self.pous.getpou(): |
814 | 917 |
if element.getname() == name: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
918 |
self.pous.remove(element) |
814 | 919 |
found = True |
920 |
break |
|
921 |
if not found: |
|
922 |
raise ValueError, _("\"%s\" POU doesn't exist !!!")%name |
|
923 |
setattr(cls, "removepouElement", removepouElement) |
|
924 |
||
925 |
def Search(self, criteria, parent_infos=[]): |
|
926 |
search_result = [] |
|
927 |
filter = criteria["filter"] |
|
928 |
for datatype in self.dataTypes.getdataType(): |
|
929 |
search_result.extend(datatype.Search(criteria, parent_infos)) |
|
930 |
for pou in self.pous.getpou(): |
|
931 |
search_result.extend(pou.Search(criteria, parent_infos)) |
|
932 |
return search_result |
|
933 |
setattr(cls, "Search", Search) |
|
934 |
||
935 |
def _updateBaseTypeElementName(self, old_name, new_name): |
|
936 |
self.baseType.updateElementName(old_name, new_name) |
|
937 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
938 |
cls = PLCOpenParser.GetElementClass("dataType", "dataTypes") |
814 | 939 |
if cls: |
940 |
setattr(cls, "updateElementName", _updateBaseTypeElementName) |
|
941 |
||
942 |
def Search(self, criteria, parent_infos=[]): |
|
943 |
search_result = [] |
|
944 |
filter = criteria["filter"] |
|
945 |
if filter == "all" or "datatype" in filter: |
|
946 |
parent_infos = parent_infos + ["D::%s" % self.getname()] |
|
947 |
search_result.extend(_Search([("name", self.getname())], criteria, parent_infos)) |
|
948 |
search_result.extend(self.baseType.Search(criteria, parent_infos)) |
|
949 |
if self.initialValue is not None: |
|
950 |
search_result.extend(_Search([("initial", self.initialValue.getvalue())], criteria, parent_infos)) |
|
951 |
return search_result |
|
952 |
setattr(cls, "Search", Search) |
|
953 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
954 |
cls = PLCOpenParser.GetElementClass("dataType") |
814 | 955 |
if cls: |
956 |
||
957 |
def updateElementName(self, old_name, new_name): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
958 |
content_name = self.content.getLocalTag() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
959 |
if content_name in ["derived", "array", "subrangeSigned", "subrangeUnsigned"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
960 |
self.content.updateElementName(old_name, new_name) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
961 |
elif content_name == "struct": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
962 |
for element in self.content.getvariable(): |
814 | 963 |
element_type = element.type.updateElementName(old_name, new_name) |
964 |
setattr(cls, "updateElementName", updateElementName) |
|
965 |
||
966 |
def Search(self, criteria, parent_infos=[]): |
|
967 |
search_result = [] |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
968 |
content_name = self.content.getLocalTag() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
969 |
if content_name in ["derived", "array", "enum", "subrangeSigned", "subrangeUnsigned"]: |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
970 |
search_result.extend(self.content.Search(criteria, parent_infos + ["base"])) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
971 |
elif content_name == "struct": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
972 |
for i, element in enumerate(self.content.getvariable()): |
814 | 973 |
search_result.extend(element.Search(criteria, parent_infos + ["struct", i])) |
974 |
else: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
975 |
if content_name in ["string", "wstring"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
976 |
content_name = content_name.upper() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
977 |
search_result.extend(_Search([("base", content_name)], criteria, parent_infos)) |
814 | 978 |
return search_result |
979 |
setattr(cls, "Search", Search) |
|
980 |
||
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
981 |
cls = PLCOpenParser.GetElementClass("derived", "dataType") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
982 |
if cls: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
983 |
def updateElementName(self, old_name, new_name): |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
984 |
if self.name == old_name: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
985 |
self.name = new_name |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
986 |
setattr(cls, "updateElementName", updateElementName) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
987 |
|
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
988 |
def Search(self, criteria, parent_infos=[]): |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
989 |
return [(tuple(parent_infos),) + result for result in TestTextElement(self.name, criteria)] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
990 |
setattr(cls, "Search", Search) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
991 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
992 |
cls = PLCOpenParser.GetElementClass("array", "dataType") |
814 | 993 |
if cls: |
994 |
setattr(cls, "updateElementName", _updateBaseTypeElementName) |
|
995 |
||
996 |
def Search(self, criteria, parent_infos=[]): |
|
997 |
search_result = self.baseType.Search(criteria, parent_infos) |
|
998 |
for i, dimension in enumerate(self.getdimension()): |
|
999 |
search_result.extend(_Search([("lower", dimension.getlower()), |
|
1000 |
("upper", dimension.getupper())], |
|
1001 |
criteria, parent_infos + ["range", i])) |
|
1002 |
return search_result |
|
1003 |
setattr(cls, "Search", Search) |
|
1004 |
||
1005 |
def _SearchInSubrange(self, criteria, parent_infos=[]): |
|
1006 |
search_result = self.baseType.Search(criteria, parent_infos) |
|
1007 |
search_result.extend(_Search([("lower", self.range.getlower()), |
|
1008 |
("upper", self.range.getupper())], |
|
1009 |
criteria, parent_infos)) |
|
1010 |
return search_result |
|
1011 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1012 |
cls = PLCOpenParser.GetElementClass("subrangeSigned", "dataType") |
814 | 1013 |
if cls: |
1014 |
setattr(cls, "updateElementName", _updateBaseTypeElementName) |
|
1015 |
setattr(cls, "Search", _SearchInSubrange) |
|
1016 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1017 |
cls = PLCOpenParser.GetElementClass("subrangeUnsigned", "dataType") |
814 | 1018 |
if cls: |
1019 |
setattr(cls, "updateElementName", _updateBaseTypeElementName) |
|
1020 |
setattr(cls, "Search", _SearchInSubrange) |
|
1021 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1022 |
cls = PLCOpenParser.GetElementClass("enum", "dataType") |
814 | 1023 |
if cls: |
1024 |
||
1025 |
def updateElementName(self, old_name, new_name): |
|
1026 |
pass |
|
1027 |
setattr(cls, "updateElementName", updateElementName) |
|
1028 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1029 |
enumerated_datatype_values_xpath = PLCOpen_XPath("ppx:values/ppx:value") |
814 | 1030 |
def Search(self, criteria, parent_infos=[]): |
1031 |
search_result = [] |
|
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1032 |
for i, value in enumerate(enumerated_datatype_values_xpath(self)): |
814 | 1033 |
for result in TestTextElement(value.getname(), criteria): |
1034 |
search_result.append((tuple(parent_infos + ["value", i]),) + result) |
|
1035 |
return search_result |
|
1036 |
setattr(cls, "Search", Search) |
|
1037 |
||
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1038 |
def _getvariableTypeinfos(variable_type): |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1039 |
type_content = variable_type.getcontent() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1040 |
type_content_type = type_content.getLocalTag() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1041 |
if type_content_type == "derived": |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1042 |
return type_content.getname() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1043 |
return type_content_type.upper() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1044 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1045 |
cls = PLCOpenParser.GetElementClass("pou", "pous") |
814 | 1046 |
if cls: |
1047 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1048 |
block_inputs_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1049 |
"ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars]/ppx:variable") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1050 |
block_outputs_xpath = PLCOpen_XPath( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1051 |
"ppx:interface/*[self::ppx:outputVars or self::ppx:inOutVars]/ppx:variable") |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1052 |
def getblockInfos(self): |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1053 |
block_infos = { |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1054 |
"name" : self.getname(), |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1055 |
"type" : self.getpouType(), |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1056 |
"extensible" : False, |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1057 |
"inputs" : [], |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1058 |
"outputs" : [], |
1310
3d7fa2257b24
Removed obsolete process for customizing block code generated in extensions
Laurent Bessard
parents:
1309
diff
changeset
|
1059 |
"comment" : self.getdescription()} |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1060 |
if self.interface is not None: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1061 |
return_type = self.interface.getreturnType() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1062 |
if return_type is not None: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1063 |
block_infos["outputs"].append( |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1064 |
("OUT", _getvariableTypeinfos(return_type), "none")) |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1065 |
block_infos["inputs"].extend( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1066 |
[(var.getname(), _getvariableTypeinfos(var.type), "none") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1067 |
for var in block_inputs_xpath(self)]) |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1068 |
block_infos["outputs"].extend( |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1069 |
[(var.getname(), _getvariableTypeinfos(var.type), "none") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1070 |
for var in block_outputs_xpath(self)]) |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1071 |
|
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1072 |
block_infos["usage"] = ("\n (%s) => (%s)" % |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1073 |
(", ".join(["%s:%s" % (input[1], input[0]) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1074 |
for input in block_infos["inputs"]]), |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1075 |
", ".join(["%s:%s" % (output[1], output[0]) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1076 |
for output in block_infos["outputs"]]))) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1077 |
return block_infos |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1078 |
setattr(cls, "getblockInfos", getblockInfos) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1079 |
|
814 | 1080 |
def setdescription(self, description): |
1081 |
doc = self.getdocumentation() |
|
1082 |
if doc is None: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1083 |
doc = PLCOpenParser.CreateElement("documentation", "pou") |
814 | 1084 |
self.setdocumentation(doc) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1085 |
doc.setanyText(description) |
814 | 1086 |
setattr(cls, "setdescription", setdescription) |
1087 |
||
1088 |
def getdescription(self): |
|
1089 |
doc = self.getdocumentation() |
|
1090 |
if doc is not None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1091 |
return doc.getanyText() |
814 | 1092 |
return "" |
1093 |
setattr(cls, "getdescription", getdescription) |
|
1094 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1095 |
def setbodyType(self, body_type): |
814 | 1096 |
if len(self.body) > 0: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1097 |
if body_type in ["IL", "ST", "LD", "FBD", "SFC"]: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1098 |
self.body[0].setcontent(PLCOpenParser.CreateElement(body_type, "body")) |
814 | 1099 |
else: |
1100 |
raise ValueError, "%s isn't a valid body type!"%type |
|
1101 |
setattr(cls, "setbodyType", setbodyType) |
|
1102 |
||
1103 |
def getbodyType(self): |
|
1104 |
if len(self.body) > 0: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1105 |
return self.body[0].getcontent().getLocalTag() |
814 | 1106 |
setattr(cls, "getbodyType", getbodyType) |
1107 |
||
1108 |
def resetexecutionOrder(self): |
|
1109 |
if len(self.body) > 0: |
|
1110 |
self.body[0].resetexecutionOrder() |
|
1111 |
setattr(cls, "resetexecutionOrder", resetexecutionOrder) |
|
1112 |
||
1113 |
def compileexecutionOrder(self): |
|
1114 |
if len(self.body) > 0: |
|
1115 |
self.body[0].compileexecutionOrder() |
|
1116 |
setattr(cls, "compileexecutionOrder", compileexecutionOrder) |
|
1117 |
||
1118 |
def setelementExecutionOrder(self, instance, new_executionOrder): |
|
1119 |
if len(self.body) > 0: |
|
1120 |
self.body[0].setelementExecutionOrder(instance, new_executionOrder) |
|
1121 |
setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) |
|
1122 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1123 |
def addinstance(self, instance): |
814 | 1124 |
if len(self.body) > 0: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1125 |
self.body[0].appendcontentInstance(instance) |
814 | 1126 |
setattr(cls, "addinstance", addinstance) |
1127 |
||
1128 |
def getinstances(self): |
|
1129 |
if len(self.body) > 0: |
|
1130 |
return self.body[0].getcontentInstances() |
|
1131 |
return [] |
|
1132 |
setattr(cls, "getinstances", getinstances) |
|
1133 |
||
1134 |
def getinstance(self, id): |
|
1135 |
if len(self.body) > 0: |
|
1136 |
return self.body[0].getcontentInstance(id) |
|
1137 |
return None |
|
1138 |
setattr(cls, "getinstance", getinstance) |
|
1139 |
||
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1140 |
def getinstancesIds(self): |
814 | 1141 |
if len(self.body) > 0: |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1142 |
return self.body[0].getcontentInstancesIds() |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1143 |
return [] |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1144 |
setattr(cls, "getinstancesIds", getinstancesIds) |
814 | 1145 |
|
1146 |
def getinstanceByName(self, name): |
|
1147 |
if len(self.body) > 0: |
|
1148 |
return self.body[0].getcontentInstanceByName(name) |
|
1149 |
return None |
|
1150 |
setattr(cls, "getinstanceByName", getinstanceByName) |
|
1151 |
||
1152 |
def removeinstance(self, id): |
|
1153 |
if len(self.body) > 0: |
|
1154 |
self.body[0].removecontentInstance(id) |
|
1155 |
setattr(cls, "removeinstance", removeinstance) |
|
1156 |
||
1157 |
def settext(self, text): |
|
1158 |
if len(self.body) > 0: |
|
1159 |
self.body[0].settext(text) |
|
1160 |
setattr(cls, "settext", settext) |
|
1161 |
||
1162 |
def gettext(self): |
|
1163 |
if len(self.body) > 0: |
|
1164 |
return self.body[0].gettext() |
|
1165 |
return "" |
|
1166 |
setattr(cls, "gettext", gettext) |
|
1167 |
||
1168 |
def getvars(self): |
|
1169 |
vars = [] |
|
1170 |
if self.interface is not None: |
|
1171 |
reverse_types = {} |
|
1172 |
for name, value in VarTypes.items(): |
|
1173 |
reverse_types[value] = name |
|
1174 |
for varlist in self.interface.getcontent(): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1175 |
vars.append((reverse_types[varlist.getLocalTag()], varlist)) |
814 | 1176 |
return vars |
1177 |
setattr(cls, "getvars", getvars) |
|
1178 |
||
1179 |
def setvars(self, vars): |
|
1180 |
if self.interface is None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1181 |
self.interface = PLCOpenParser.CreateElement("interface", "pou") |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1182 |
self.interface.setcontent(vars) |
814 | 1183 |
setattr(cls, "setvars", setvars) |
1184 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1185 |
def addpouExternalVar(self, var_type, name): |
1406
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1186 |
self.addpouVar(var_type, name, "externalVars") |
814 | 1187 |
setattr(cls, "addpouExternalVar", addpouExternalVar) |
1188 |
||
1406
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1189 |
def addpouVar(self, var_type, name, var_class="localVars", location="", description="", initval=""): |
814 | 1190 |
if self.interface is None: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1191 |
self.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1192 |
content = self.interface.getcontent() |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1193 |
if len(content) == 0: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1194 |
varlist = PLCOpenParser.CreateElement(var_class, "interface") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1195 |
self.interface.setcontent([varlist]) |
1371
3c55c99b10ab
Fixed bug when adding and removing function block in graphic viewer. In some cases, the associated variable could stay in the variable panel.
Laurent Bessard
parents:
1355
diff
changeset
|
1196 |
elif content[-1].getLocalTag() != var_class: |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1197 |
varlist = PLCOpenParser.CreateElement(var_class, "interface") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1198 |
content[-1].addnext(varlist) |
814 | 1199 |
else: |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1200 |
varlist = content[-1] |
814 | 1201 |
variables = varlist.getvariable() |
1202 |
if varlist.getconstant() or varlist.getretain() or len(variables) > 0 and variables[0].getaddress(): |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1203 |
varlist = PLCOpenParser.CreateElement(var_class, "interface") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1204 |
content[-1].addnext(varlist) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1205 |
var = PLCOpenParser.CreateElement("variable", "varListPlain") |
814 | 1206 |
var.setname(name) |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1310
diff
changeset
|
1207 |
var.settype(var_type) |
814 | 1208 |
if location != "": |
1209 |
var.setaddress(location) |
|
1210 |
if description != "": |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1211 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1212 |
ft.setanyText(description) |
814 | 1213 |
var.setdocumentation(ft) |
1406
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1214 |
if initval != "": |
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1215 |
el = PLCOpenParser.CreateElement("initialValue", "variable") |
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1216 |
el.setvalue(initval) |
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1217 |
var.setinitialValue(el) |
814 | 1218 |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1219 |
varlist.appendvariable(var) |
814 | 1220 |
setattr(cls, "addpouVar", addpouVar) |
1406
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1400
diff
changeset
|
1221 |
setattr(cls, "addpouLocalVar", addpouVar) |
814 | 1222 |
|
1223 |
def changepouVar(self, old_type, old_name, new_type, new_name): |
|
1224 |
if self.interface is not None: |
|
1225 |
content = self.interface.getcontent() |
|
1226 |
for varlist in content: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1227 |
variables = varlist.getvariable() |
814 | 1228 |
for var in variables: |
1229 |
if var.getname() == old_name: |
|
1230 |
vartype_content = var.gettype().getcontent() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1231 |
if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == old_type: |
814 | 1232 |
var.setname(new_name) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1233 |
vartype_content.setname(new_type) |
814 | 1234 |
return |
1235 |
setattr(cls, "changepouVar", changepouVar) |
|
1236 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1237 |
def removepouVar(self, var_type, name): |
814 | 1238 |
if self.interface is not None: |
1239 |
content = self.interface.getcontent() |
|
1240 |
for varlist in content: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1241 |
for var in varlist.getvariable(): |
814 | 1242 |
if var.getname() == name: |
1243 |
vartype_content = var.gettype().getcontent() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1244 |
if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == var_type: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1245 |
varlist.remove(var) |
1371
3c55c99b10ab
Fixed bug when adding and removing function block in graphic viewer. In some cases, the associated variable could stay in the variable panel.
Laurent Bessard
parents:
1355
diff
changeset
|
1246 |
if len(varlist.getvariable()) == 0: |
3c55c99b10ab
Fixed bug when adding and removing function block in graphic viewer. In some cases, the associated variable could stay in the variable panel.
Laurent Bessard
parents:
1355
diff
changeset
|
1247 |
self.interface.remove(varlist) |
814 | 1248 |
break |
1249 |
setattr(cls, "removepouVar", removepouVar) |
|
1250 |
||
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1251 |
def hasblock(self, name=None, block_type=None): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1252 |
if self.getbodyType() in ["FBD", "LD", "SFC"]: |
814 | 1253 |
for instance in self.getinstances(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1254 |
if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and |
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1255 |
(name and instance.getinstanceName() == name or |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1256 |
block_type and instance.gettypeName() == block_type)): |
814 | 1257 |
return True |
1258 |
if self.transitions: |
|
1259 |
for transition in self.transitions.gettransition(): |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1260 |
result = transition.hasblock(name, block_type) |
814 | 1261 |
if result: |
1262 |
return result |
|
1263 |
if self.actions: |
|
1264 |
for action in self.actions.getaction(): |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1265 |
result = action.hasblock(name, block_type) |
814 | 1266 |
if result: |
1267 |
return result |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1268 |
elif block_type is not None and len(self.body) > 0: |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1269 |
return self.body[0].hasblock(block_type) |
814 | 1270 |
return False |
1271 |
setattr(cls, "hasblock", hasblock) |
|
1272 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1273 |
def addtransition(self, name, body_type): |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1274 |
if self.transitions is None: |
814 | 1275 |
self.addtransitions() |
1276 |
self.transitions.settransition([]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1277 |
transition = PLCOpenParser.CreateElement("transition", "transitions") |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1278 |
self.transitions.appendtransition(transition) |
814 | 1279 |
transition.setname(name) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1280 |
transition.setbodyType(body_type) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1281 |
if body_type == "ST": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1282 |
transition.setanyText(":= ;") |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1283 |
elif body_type == "IL": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1284 |
transition.setanyText("\tST\t%s"%name) |
814 | 1285 |
setattr(cls, "addtransition", addtransition) |
1286 |
||
1287 |
def gettransition(self, name): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1288 |
if self.transitions is not None: |
814 | 1289 |
for transition in self.transitions.gettransition(): |
1290 |
if transition.getname() == name: |
|
1291 |
return transition |
|
1292 |
return None |
|
1293 |
setattr(cls, "gettransition", gettransition) |
|
1294 |
||
1295 |
def gettransitionList(self): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1296 |
if self.transitions is not None: |
814 | 1297 |
return self.transitions.gettransition() |
1298 |
return [] |
|
1299 |
setattr(cls, "gettransitionList", gettransitionList) |
|
1300 |
||
1301 |
def removetransition(self, name): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1302 |
if self.transitions is not None: |
814 | 1303 |
removed = False |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1304 |
for transition in self.transitions.gettransition(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1305 |
if transition.getname() == name: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1306 |
if transition.getbodyType() in ["FBD", "LD", "SFC"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1307 |
for instance in transition.getinstances(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1308 |
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")): |
824
be669f4c51c4
Fix bug in SFC function block declarations from transition and action not removed when transition or action is deleted
laurent
parents:
814
diff
changeset
|
1309 |
self.removepouVar(instance.gettypeName(), |
be669f4c51c4
Fix bug in SFC function block declarations from transition and action not removed when transition or action is deleted
laurent
parents:
814
diff
changeset
|
1310 |
instance.getinstanceName()) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1311 |
self.transitions.remove(transition) |
814 | 1312 |
removed = True |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1313 |
break |
814 | 1314 |
if not removed: |
1315 |
raise ValueError, _("Transition with name %s doesn't exist!")%name |
|
1316 |
setattr(cls, "removetransition", removetransition) |
|
1317 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1318 |
def addaction(self, name, body_type): |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1319 |
if self.actions is None: |
814 | 1320 |
self.addactions() |
1321 |
self.actions.setaction([]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1322 |
action = PLCOpenParser.CreateElement("action", "actions") |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1323 |
self.actions.appendaction(action) |
814 | 1324 |
action.setname(name) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1325 |
action.setbodyType(body_type) |
814 | 1326 |
setattr(cls, "addaction", addaction) |
1327 |
||
1328 |
def getaction(self, name): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1329 |
if self.actions is not None: |
814 | 1330 |
for action in self.actions.getaction(): |
1331 |
if action.getname() == name: |
|
1332 |
return action |
|
1333 |
return None |
|
1334 |
setattr(cls, "getaction", getaction) |
|
1335 |
||
1336 |
def getactionList(self): |
|
1382
675a6229fc60
Fixed bugs in SFC when loading transition condition and referenced transition or action body
Laurent Bessard
parents:
1371
diff
changeset
|
1337 |
if self.actions is not None: |
814 | 1338 |
return self.actions.getaction() |
1339 |
return [] |
|
1340 |
setattr(cls, "getactionList", getactionList) |
|
824
be669f4c51c4
Fix bug in SFC function block declarations from transition and action not removed when transition or action is deleted
laurent
parents:
814
diff
changeset
|
1341 |
|
814 | 1342 |
def removeaction(self, name): |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1343 |
if self.actions is not None: |
814 | 1344 |
removed = False |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1345 |
for action in self.actions.getaction(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1346 |
if action.getname() == name: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1347 |
if action.getbodyType() in ["FBD", "LD", "SFC"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1348 |
for instance in action.getinstances(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1349 |
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")): |
824
be669f4c51c4
Fix bug in SFC function block declarations from transition and action not removed when transition or action is deleted
laurent
parents:
814
diff
changeset
|
1350 |
self.removepouVar(instance.gettypeName(), |
be669f4c51c4
Fix bug in SFC function block declarations from transition and action not removed when transition or action is deleted
laurent
parents:
814
diff
changeset
|
1351 |
instance.getinstanceName()) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1352 |
self.actions.remove(action) |
814 | 1353 |
removed = True |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1354 |
break |
814 | 1355 |
if not removed: |
1356 |
raise ValueError, _("Action with name %s doesn't exist!")%name |
|
1357 |
setattr(cls, "removeaction", removeaction) |
|
1358 |
||
1359 |
def updateElementName(self, old_name, new_name): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1360 |
if self.interface is not None: |
814 | 1361 |
for content in self.interface.getcontent(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1362 |
for var in content.getvariable(): |
814 | 1363 |
var_address = var.getaddress() |
1364 |
if var_address is not None: |
|
1365 |
if var_address == old_name: |
|
1366 |
var.setaddress(new_name) |
|
1367 |
if var.getname() == old_name: |
|
1368 |
var.setname(new_name) |
|
1369 |
var_type_content = var.gettype().getcontent() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1370 |
if var_type_content.getLocalTag() == "derived": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1371 |
if var_type_content.getname() == old_name: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1372 |
var_type_content.setname(new_name) |
814 | 1373 |
self.body[0].updateElementName(old_name, new_name) |
1374 |
for action in self.getactionList(): |
|
1375 |
action.updateElementName(old_name, new_name) |
|
1376 |
for transition in self.gettransitionList(): |
|
1377 |
transition.updateElementName(old_name, new_name) |
|
1378 |
setattr(cls, "updateElementName", updateElementName) |
|
1379 |
||
1380 |
def updateElementAddress(self, address_model, new_leading): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1381 |
if self.interface is not None: |
814 | 1382 |
for content in self.interface.getcontent(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1383 |
for var in content.getvariable(): |
814 | 1384 |
var_address = var.getaddress() |
1385 |
if var_address is not None: |
|
1386 |
var.setaddress(update_address(var_address, address_model, new_leading)) |
|
1387 |
self.body[0].updateElementAddress(address_model, new_leading) |
|
1388 |
for action in self.getactionList(): |
|
1389 |
action.updateElementAddress(address_model, new_leading) |
|
1390 |
for transition in self.gettransitionList(): |
|
1391 |
transition.updateElementAddress(address_model, new_leading) |
|
1392 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
1393 |
||
1394 |
def removeVariableByAddress(self, address): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1395 |
if self.interface is not None: |
814 | 1396 |
for content in self.interface.getcontent(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1397 |
for variable in content.getvariable(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1398 |
if variable.getaddress() == address: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1399 |
content.remove(variable) |
814 | 1400 |
setattr(cls, "removeVariableByAddress", removeVariableByAddress) |
1401 |
||
1402 |
def removeVariableByFilter(self, address_model): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1403 |
if self.interface is not None: |
814 | 1404 |
for content in self.interface.getcontent(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1405 |
for variable in content.getvariable(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1406 |
var_address = variable.getaddress() |
814 | 1407 |
if var_address is not None: |
1408 |
result = address_model.match(var_address) |
|
1409 |
if result is not None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1410 |
content.remove(variable) |
814 | 1411 |
setattr(cls, "removeVariableByFilter", removeVariableByFilter) |
1412 |
||
1413 |
def Search(self, criteria, parent_infos=[]): |
|
1414 |
search_result = [] |
|
1415 |
filter = criteria["filter"] |
|
1416 |
if filter == "all" or self.getpouType() in filter: |
|
1417 |
parent_infos = parent_infos + ["P::%s" % self.getname()] |
|
1418 |
search_result.extend(_Search([("name", self.getname())], criteria, parent_infos)) |
|
1419 |
if self.interface is not None: |
|
1420 |
var_number = 0 |
|
1421 |
for content in self.interface.getcontent(): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1422 |
variable_type = searchResultVarTypes.get(content, "var_local") |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1423 |
variables = content.getvariable() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1424 |
for modifier, has_modifier in [("constant", content.getconstant()), |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1425 |
("retain", content.getretain()), |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1426 |
("non_retain", content.getnonretain())]: |
814 | 1427 |
if has_modifier: |
1428 |
for result in TestTextElement(modifier, criteria): |
|
1429 |
search_result.append((tuple(parent_infos + [variable_type, (var_number, var_number + len(variables)), modifier]),) + result) |
|
1430 |
break |
|
1431 |
for variable in variables: |
|
1432 |
search_result.extend(variable.Search(criteria, parent_infos + [variable_type, var_number])) |
|
1433 |
var_number += 1 |
|
1434 |
if len(self.body) > 0: |
|
1435 |
search_result.extend(self.body[0].Search(criteria, parent_infos)) |
|
1436 |
for action in self.getactionList(): |
|
1437 |
search_result.extend(action.Search(criteria, parent_infos)) |
|
1438 |
for transition in self.gettransitionList(): |
|
1439 |
search_result.extend(transition.Search(criteria, parent_infos)) |
|
1440 |
return search_result |
|
1441 |
setattr(cls, "Search", Search) |
|
1442 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1443 |
def setbodyType(self, body_type): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1444 |
if body_type in ["IL", "ST", "LD", "FBD", "SFC"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1445 |
self.body.setcontent(PLCOpenParser.CreateElement(body_type, "body")) |
814 | 1446 |
else: |
1447 |
raise ValueError, "%s isn't a valid body type!"%type |
|
1448 |
||
1449 |
def getbodyType(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1450 |
return self.body.getcontent().getLocalTag() |
814 | 1451 |
|
1452 |
def resetexecutionOrder(self): |
|
1453 |
self.body.resetexecutionOrder() |
|
1454 |
||
1455 |
def compileexecutionOrder(self): |
|
1456 |
self.body.compileexecutionOrder() |
|
1457 |
||
1458 |
def setelementExecutionOrder(self, instance, new_executionOrder): |
|
1459 |
self.body.setelementExecutionOrder(instance, new_executionOrder) |
|
1460 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1461 |
def addinstance(self, instance): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1462 |
self.body.appendcontentInstance(instance) |
814 | 1463 |
|
1464 |
def getinstances(self): |
|
1465 |
return self.body.getcontentInstances() |
|
1466 |
||
1467 |
def getinstance(self, id): |
|
1468 |
return self.body.getcontentInstance(id) |
|
1469 |
||
1470 |
def getrandomInstance(self, exclude): |
|
1471 |
return self.body.getcontentRandomInstance(exclude) |
|
1472 |
||
1473 |
def getinstanceByName(self, name): |
|
1474 |
return self.body.getcontentInstanceByName(name) |
|
1475 |
||
1476 |
def removeinstance(self, id): |
|
1477 |
self.body.removecontentInstance(id) |
|
1478 |
||
1479 |
def settext(self, text): |
|
1480 |
self.body.settext(text) |
|
1481 |
||
1482 |
def gettext(self): |
|
1483 |
return self.body.gettext() |
|
1484 |
||
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1485 |
def hasblock(self, name=None, block_type=None): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1486 |
if self.getbodyType() in ["FBD", "LD", "SFC"]: |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1487 |
for instance in self.getinstances(): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1488 |
if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and |
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1489 |
(name and instance.getinstanceName() == name or |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1490 |
block_type and instance.gettypeName() == block_type)): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1491 |
return True |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1492 |
elif block_type is not None: |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1493 |
return self.body.hasblock(block_type) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1494 |
return False |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1495 |
|
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1496 |
def updateElementName(self, old_name, new_name): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1497 |
self.body.updateElementName(old_name, new_name) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1498 |
|
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1499 |
def updateElementAddress(self, address_model, new_leading): |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1500 |
self.body.updateElementAddress(address_model, new_leading) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1501 |
|
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1502 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1503 |
cls = PLCOpenParser.GetElementClass("transition", "transitions") |
814 | 1504 |
if cls: |
1505 |
setattr(cls, "setbodyType", setbodyType) |
|
1506 |
setattr(cls, "getbodyType", getbodyType) |
|
1507 |
setattr(cls, "resetexecutionOrder", resetexecutionOrder) |
|
1508 |
setattr(cls, "compileexecutionOrder", compileexecutionOrder) |
|
1509 |
setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) |
|
1510 |
setattr(cls, "addinstance", addinstance) |
|
1511 |
setattr(cls, "getinstances", getinstances) |
|
1512 |
setattr(cls, "getinstance", getinstance) |
|
1513 |
setattr(cls, "getrandomInstance", getrandomInstance) |
|
1514 |
setattr(cls, "getinstanceByName", getinstanceByName) |
|
1515 |
setattr(cls, "removeinstance", removeinstance) |
|
1516 |
setattr(cls, "settext", settext) |
|
1517 |
setattr(cls, "gettext", gettext) |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1518 |
setattr(cls, "hasblock", hasblock) |
814 | 1519 |
setattr(cls, "updateElementName", updateElementName) |
1520 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1521 |
|
814 | 1522 |
def Search(self, criteria, parent_infos): |
1523 |
search_result = [] |
|
1524 |
parent_infos = parent_infos[:-1] + ["T::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())] |
|
1525 |
for result in TestTextElement(self.getname(), criteria): |
|
1526 |
search_result.append((tuple(parent_infos + ["name"]),) + result) |
|
1527 |
search_result.extend(self.body.Search(criteria, parent_infos)) |
|
1528 |
return search_result |
|
1529 |
setattr(cls, "Search", Search) |
|
1530 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1531 |
cls = PLCOpenParser.GetElementClass("action", "actions") |
814 | 1532 |
if cls: |
1533 |
setattr(cls, "setbodyType", setbodyType) |
|
1534 |
setattr(cls, "getbodyType", getbodyType) |
|
1535 |
setattr(cls, "resetexecutionOrder", resetexecutionOrder) |
|
1536 |
setattr(cls, "compileexecutionOrder", compileexecutionOrder) |
|
1537 |
setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) |
|
1538 |
setattr(cls, "addinstance", addinstance) |
|
1539 |
setattr(cls, "getinstances", getinstances) |
|
1540 |
setattr(cls, "getinstance", getinstance) |
|
1541 |
setattr(cls, "getrandomInstance", getrandomInstance) |
|
1542 |
setattr(cls, "getinstanceByName", getinstanceByName) |
|
1543 |
setattr(cls, "removeinstance", removeinstance) |
|
1544 |
setattr(cls, "settext", settext) |
|
1545 |
setattr(cls, "gettext", gettext) |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1546 |
setattr(cls, "hasblock", hasblock) |
814 | 1547 |
setattr(cls, "updateElementName", updateElementName) |
1548 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1549 |
|
814 | 1550 |
def Search(self, criteria, parent_infos): |
1551 |
search_result = [] |
|
1552 |
parent_infos = parent_infos[:-1] + ["A::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())] |
|
1553 |
for result in TestTextElement(self.getname(), criteria): |
|
1554 |
search_result.append((tuple(parent_infos + ["name"]),) + result) |
|
1555 |
search_result.extend(self.body.Search(criteria, parent_infos)) |
|
1556 |
return search_result |
|
1557 |
setattr(cls, "Search", Search) |
|
1558 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1559 |
cls = PLCOpenParser.GetElementClass("body") |
814 | 1560 |
if cls: |
1561 |
cls.currentExecutionOrderId = 0 |
|
1562 |
||
1563 |
def resetcurrentExecutionOrderId(self): |
|
1564 |
object.__setattr__(self, "currentExecutionOrderId", 0) |
|
1565 |
setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId) |
|
1566 |
||
1567 |
def getnewExecutionOrderId(self): |
|
1568 |
object.__setattr__(self, "currentExecutionOrderId", self.currentExecutionOrderId + 1) |
|
1569 |
return self.currentExecutionOrderId |
|
1570 |
setattr(cls, "getnewExecutionOrderId", getnewExecutionOrderId) |
|
1571 |
||
1572 |
def resetexecutionOrder(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1573 |
if self.content.getLocalTag() == "FBD": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1574 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1575 |
if not isinstance(element, (PLCOpenParser.GetElementClass("comment", "commonObjects"), |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1576 |
PLCOpenParser.GetElementClass("connector", "commonObjects"), |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1577 |
PLCOpenParser.GetElementClass("continuation", "commonObjects"))): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1578 |
element.setexecutionOrderId(0) |
814 | 1579 |
else: |
1580 |
raise TypeError, _("Can only generate execution order on FBD networks!") |
|
1581 |
setattr(cls, "resetexecutionOrder", resetexecutionOrder) |
|
1582 |
||
1583 |
def compileexecutionOrder(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1584 |
if self.content.getLocalTag() == "FBD": |
814 | 1585 |
self.resetexecutionOrder() |
1586 |
self.resetcurrentExecutionOrderId() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1587 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1588 |
if isinstance(element, PLCOpenParser.GetElementClass("outVariable", "fbdObjects")) and element.getexecutionOrderId() == 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1589 |
connections = element.connectionPointIn.getconnections() |
814 | 1590 |
if connections and len(connections) == 1: |
1591 |
self.compileelementExecutionOrder(connections[0]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1592 |
element.setexecutionOrderId(self.getnewExecutionOrderId()) |
814 | 1593 |
else: |
1594 |
raise TypeError, _("Can only generate execution order on FBD networks!") |
|
1595 |
setattr(cls, "compileexecutionOrder", compileexecutionOrder) |
|
1596 |
||
1597 |
def compileelementExecutionOrder(self, link): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1598 |
if self.content.getLocalTag() == "FBD": |
814 | 1599 |
localid = link.getrefLocalId() |
1600 |
instance = self.getcontentInstance(localid) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1601 |
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and instance.getexecutionOrderId() == 0: |
814 | 1602 |
for variable in instance.inputVariables.getvariable(): |
1603 |
connections = variable.connectionPointIn.getconnections() |
|
1604 |
if connections and len(connections) == 1: |
|
1605 |
self.compileelementExecutionOrder(connections[0]) |
|
1606 |
instance.setexecutionOrderId(self.getnewExecutionOrderId()) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1607 |
elif isinstance(instance, PLCOpenParser.GetElementClass("continuation", "commonObjects")) and instance.getexecutionOrderId() == 0: |
814 | 1608 |
name = instance.getname() |
1609 |
for tmp_instance in self.getcontentInstances(): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1610 |
if isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and tmp_instance.getname() == name and tmp_instance.getexecutionOrderId() == 0: |
814 | 1611 |
connections = tmp_instance.connectionPointIn.getconnections() |
1612 |
if connections and len(connections) == 1: |
|
1613 |
self.compileelementExecutionOrder(connections[0]) |
|
1614 |
else: |
|
1615 |
raise TypeError, _("Can only generate execution order on FBD networks!") |
|
1616 |
setattr(cls, "compileelementExecutionOrder", compileelementExecutionOrder) |
|
1617 |
||
1618 |
def setelementExecutionOrder(self, instance, new_executionOrder): |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1619 |
if self.content.getLocalTag() == "FBD": |
814 | 1620 |
old_executionOrder = instance.getexecutionOrderId() |
1621 |
if old_executionOrder is not None and old_executionOrder != 0 and new_executionOrder != 0: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1622 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1623 |
if element != instance and not isinstance(element, PLCOpenParser.GetElementClass("comment", "commonObjects")): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1624 |
element_executionOrder = element.getexecutionOrderId() |
814 | 1625 |
if old_executionOrder <= element_executionOrder <= new_executionOrder: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1626 |
element.setexecutionOrderId(element_executionOrder - 1) |
814 | 1627 |
if new_executionOrder <= element_executionOrder <= old_executionOrder: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1628 |
element.setexecutionOrderId(element_executionOrder + 1) |
814 | 1629 |
instance.setexecutionOrderId(new_executionOrder) |
1630 |
else: |
|
1631 |
raise TypeError, _("Can only generate execution order on FBD networks!") |
|
1632 |
setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) |
|
1633 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1634 |
def appendcontentInstance(self, instance): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1635 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1636 |
self.content.appendcontent(instance) |
814 | 1637 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1638 |
raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag() |
814 | 1639 |
setattr(cls, "appendcontentInstance", appendcontentInstance) |
1640 |
||
1641 |
def getcontentInstances(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1642 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1643 |
return self.content.getcontent() |
814 | 1644 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1645 |
raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag() |
814 | 1646 |
setattr(cls, "getcontentInstances", getcontentInstances) |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1647 |
|
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1648 |
instance_by_id_xpath = PLCOpen_XPath("*[@localId=$localId]") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1649 |
instance_by_name_xpath = PLCOpen_XPath("ppx:block[@instanceName=$name]") |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1650 |
def getcontentInstance(self, local_id): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1651 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1652 |
instance = instance_by_id_xpath(self.content, localId=local_id) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1653 |
if len(instance) > 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1654 |
return instance[0] |
814 | 1655 |
return None |
1656 |
else: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1657 |
raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag() |
814 | 1658 |
setattr(cls, "getcontentInstance", getcontentInstance) |
1659 |
||
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1660 |
def getcontentInstancesIds(self): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1661 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1662 |
return OrderedDict([(instance.getlocalId(), True) |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1663 |
for instance in self.content]) |
814 | 1664 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1665 |
raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag() |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1666 |
setattr(cls, "getcontentInstancesIds", getcontentInstancesIds) |
814 | 1667 |
|
1668 |
def getcontentInstanceByName(self, name): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1669 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
1670 |
instance = instance_by_name_xpath(self.content) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1671 |
if len(instance) > 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1672 |
return instance[0] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1673 |
return None |
814 | 1674 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1675 |
raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag() |
814 | 1676 |
setattr(cls, "getcontentInstanceByName", getcontentInstanceByName) |
1677 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1678 |
def removecontentInstance(self, local_id): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1679 |
if self.content.getLocalTag() in ["LD","FBD","SFC"]: |
1318 | 1680 |
instance = instance_by_id_xpath(self.content, localId=local_id) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1681 |
if len(instance) > 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1682 |
self.content.remove(instance[0]) |
1232
b6894285d4cc
Added support for speed up loading graphic viewers
Laurent Bessard
parents:
1171
diff
changeset
|
1683 |
else: |
814 | 1684 |
raise ValueError, _("Instance with id %d doesn't exist!")%id |
1685 |
else: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1686 |
raise TypeError, "%s body don't have instances!"%self.content.getLocalTag() |
814 | 1687 |
setattr(cls, "removecontentInstance", removecontentInstance) |
1688 |
||
1689 |
def settext(self, text): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1690 |
if self.content.getLocalTag() in ["IL","ST"]: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1691 |
self.content.setanyText(text) |
814 | 1692 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1693 |
raise TypeError, _("%s body don't have text!")%self.content.getLocalTag() |
814 | 1694 |
setattr(cls, "settext", settext) |
1695 |
||
1696 |
def gettext(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1697 |
if self.content.getLocalTag() in ["IL","ST"]: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1698 |
return self.content.getanyText() |
814 | 1699 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1700 |
raise TypeError, _("%s body don't have text!")%self.content.getLocalTag() |
814 | 1701 |
setattr(cls, "gettext", gettext) |
1702 |
||
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1703 |
def hasblock(self, block_type): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1704 |
if self.content.getLocalTag() in ["IL","ST"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1705 |
return self.content.hasblock(block_type) |
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1706 |
else: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1707 |
raise TypeError, _("%s body don't have text!")%self.content.getLocalTag() |
1142
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1708 |
setattr(cls, "hasblock", hasblock) |
8ded55ada6d6
Fixed functions used by one or more POU not showing question dialog when trying to delete
Laurent Bessard
parents:
990
diff
changeset
|
1709 |
|
814 | 1710 |
def updateElementName(self, old_name, new_name): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1711 |
if self.content.getLocalTag() in ["IL", "ST"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1712 |
self.content.updateElementName(old_name, new_name) |
814 | 1713 |
else: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1714 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1715 |
element.updateElementName(old_name, new_name) |
814 | 1716 |
setattr(cls, "updateElementName", updateElementName) |
1717 |
||
1718 |
def updateElementAddress(self, address_model, new_leading): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1719 |
if self.content.getLocalTag() in ["IL", "ST"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1720 |
self.content.updateElementAddress(address_model, new_leading) |
814 | 1721 |
else: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1722 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1723 |
element.updateElementAddress(address_model, new_leading) |
814 | 1724 |
setattr(cls, "updateElementAddress", updateElementAddress) |
1725 |
||
1726 |
def Search(self, criteria, parent_infos=[]): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1727 |
if self.content.getLocalTag() in ["IL", "ST"]: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1728 |
search_result = self.content.Search(criteria, parent_infos + ["body", 0]) |
814 | 1729 |
else: |
1730 |
search_result = [] |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1731 |
for element in self.content.getcontent(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1732 |
search_result.extend(element.Search(criteria, parent_infos)) |
814 | 1733 |
return search_result |
1734 |
setattr(cls, "Search", Search) |
|
1735 |
||
1736 |
def getx(self): |
|
1737 |
return self.position.getx() |
|
1738 |
||
1739 |
def gety(self): |
|
1740 |
return self.position.gety() |
|
1741 |
||
1742 |
def setx(self, x): |
|
1743 |
self.position.setx(x) |
|
1744 |
||
1745 |
def sety(self, y): |
|
1746 |
self.position.sety(y) |
|
1747 |
||
1748 |
def _getBoundingBox(self): |
|
1749 |
return rect(self.getx(), self.gety(), self.getwidth(), self.getheight()) |
|
1750 |
||
1751 |
def _getConnectionsBoundingBox(connectionPointIn): |
|
1752 |
bbox = rect() |
|
1753 |
connections = connectionPointIn.getconnections() |
|
1754 |
if connections is not None: |
|
1755 |
for connection in connections: |
|
1756 |
for x, y in connection.getpoints(): |
|
1757 |
bbox.update(x, y) |
|
1758 |
return bbox |
|
1759 |
||
1760 |
def _getBoundingBoxSingle(self): |
|
1761 |
bbox = _getBoundingBox(self) |
|
1762 |
if self.connectionPointIn is not None: |
|
1763 |
bbox.union(_getConnectionsBoundingBox(self.connectionPointIn)) |
|
1764 |
return bbox |
|
1765 |
||
1766 |
def _getBoundingBoxMultiple(self): |
|
1767 |
bbox = _getBoundingBox(self) |
|
1768 |
for connectionPointIn in self.getconnectionPointIn(): |
|
1769 |
bbox.union(_getConnectionsBoundingBox(connectionPointIn)) |
|
1770 |
return bbox |
|
1771 |
||
1772 |
def _filterConnections(connectionPointIn, localId, connections): |
|
1773 |
in_connections = connectionPointIn.getconnections() |
|
1774 |
if in_connections is not None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1775 |
for connection in in_connections: |
814 | 1776 |
connected = connection.getrefLocalId() |
1777 |
if not connections.has_key((localId, connected)) and \ |
|
1778 |
not connections.has_key((connected, localId)): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1779 |
connectionPointIn.remove(connection) |
814 | 1780 |
|
1781 |
def _filterConnectionsSingle(self, connections): |
|
1782 |
if self.connectionPointIn is not None: |
|
1783 |
_filterConnections(self.connectionPointIn, self.localId, connections) |
|
1784 |
||
1785 |
def _filterConnectionsMultiple(self, connections): |
|
1786 |
for connectionPointIn in self.getconnectionPointIn(): |
|
1787 |
_filterConnections(connectionPointIn, self.localId, connections) |
|
1788 |
||
1789 |
def _getconnectionsdefinition(instance, connections_end): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1790 |
local_id = instance.getlocalId() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1791 |
return dict([((local_id, end), True) for end in connections_end]) |
814 | 1792 |
|
1793 |
def _updateConnectionsId(connectionPointIn, translation): |
|
1794 |
connections_end = [] |
|
1795 |
connections = connectionPointIn.getconnections() |
|
1796 |
if connections is not None: |
|
1797 |
for connection in connections: |
|
1798 |
refLocalId = connection.getrefLocalId() |
|
1799 |
new_reflocalId = translation.get(refLocalId, refLocalId) |
|
1800 |
connection.setrefLocalId(new_reflocalId) |
|
1801 |
connections_end.append(new_reflocalId) |
|
1802 |
return connections_end |
|
1803 |
||
1804 |
def _updateConnectionsIdSingle(self, translation): |
|
1805 |
connections_end = [] |
|
1806 |
if self.connectionPointIn is not None: |
|
1807 |
connections_end = _updateConnectionsId(self.connectionPointIn, translation) |
|
1808 |
return _getconnectionsdefinition(self, connections_end) |
|
1809 |
||
1810 |
def _updateConnectionsIdMultiple(self, translation): |
|
1811 |
connections_end = [] |
|
1812 |
for connectionPointIn in self.getconnectionPointIn(): |
|
1813 |
connections_end.extend(_updateConnectionsId(connectionPointIn, translation)) |
|
1814 |
return _getconnectionsdefinition(self, connections_end) |
|
1815 |
||
1816 |
def _translate(self, dx, dy): |
|
1817 |
self.setx(self.getx() + dx) |
|
1818 |
self.sety(self.gety() + dy) |
|
1819 |
||
1820 |
def _translateConnections(connectionPointIn, dx, dy): |
|
1821 |
connections = connectionPointIn.getconnections() |
|
1822 |
if connections is not None: |
|
1823 |
for connection in connections: |
|
1824 |
for position in connection.getposition(): |
|
1825 |
position.setx(position.getx() + dx) |
|
1826 |
position.sety(position.gety() + dy) |
|
1827 |
||
1828 |
def _translateSingle(self, dx, dy): |
|
1829 |
_translate(self, dx, dy) |
|
1830 |
if self.connectionPointIn is not None: |
|
1831 |
_translateConnections(self.connectionPointIn, dx, dy) |
|
1832 |
||
1833 |
def _translateMultiple(self, dx, dy): |
|
1834 |
_translate(self, dx, dy) |
|
1835 |
for connectionPointIn in self.getconnectionPointIn(): |
|
1836 |
_translateConnections(connectionPointIn, dx, dy) |
|
1837 |
||
1838 |
def _updateElementName(self, old_name, new_name): |
|
1839 |
pass |
|
1840 |
||
1841 |
def _updateElementAddress(self, address_model, new_leading): |
|
1842 |
pass |
|
1843 |
||
1844 |
def _SearchInElement(self, criteria, parent_infos=[]): |
|
1845 |
return [] |
|
1846 |
||
1847 |
_connectionsFunctions = { |
|
1848 |
"bbox": {"none": _getBoundingBox, |
|
1849 |
"single": _getBoundingBoxSingle, |
|
1850 |
"multiple": _getBoundingBoxMultiple}, |
|
1851 |
"translate": {"none": _translate, |
|
1852 |
"single": _translateSingle, |
|
1853 |
"multiple": _translateMultiple}, |
|
1854 |
"filter": {"none": lambda self, connections: None, |
|
1855 |
"single": _filterConnectionsSingle, |
|
1856 |
"multiple": _filterConnectionsMultiple}, |
|
1857 |
"update": {"none": lambda self, translation: {}, |
|
1858 |
"single": _updateConnectionsIdSingle, |
|
1859 |
"multiple": _updateConnectionsIdMultiple}, |
|
1860 |
} |
|
1861 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1862 |
def _initElementClass(name, parent, connectionPointInType="none"): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1863 |
cls = PLCOpenParser.GetElementClass(name, parent) |
814 | 1864 |
if cls: |
1865 |
setattr(cls, "getx", getx) |
|
1866 |
setattr(cls, "gety", gety) |
|
1867 |
setattr(cls, "setx", setx) |
|
1868 |
setattr(cls, "sety", sety) |
|
1869 |
setattr(cls, "updateElementName", _updateElementName) |
|
1870 |
setattr(cls, "updateElementAddress", _updateElementAddress) |
|
1871 |
setattr(cls, "getBoundingBox", _connectionsFunctions["bbox"][connectionPointInType]) |
|
1872 |
setattr(cls, "translate", _connectionsFunctions["translate"][connectionPointInType]) |
|
1873 |
setattr(cls, "filterConnections", _connectionsFunctions["filter"][connectionPointInType]) |
|
1874 |
setattr(cls, "updateConnectionsId", _connectionsFunctions["update"][connectionPointInType]) |
|
1875 |
setattr(cls, "Search", _SearchInElement) |
|
1876 |
return cls |
|
1877 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1878 |
cls = _initElementClass("comment", "commonObjects") |
814 | 1879 |
if cls: |
1880 |
def setcontentText(self, text): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1881 |
self.content.setanyText(text) |
814 | 1882 |
setattr(cls, "setcontentText", setcontentText) |
1883 |
||
1884 |
def getcontentText(self): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1885 |
return self.content.getanyText() |
814 | 1886 |
setattr(cls, "getcontentText", getcontentText) |
1887 |
||
1888 |
def updateElementName(self, old_name, new_name): |
|
1889 |
self.content.updateElementName(old_name, new_name) |
|
1890 |
setattr(cls, "updateElementName", updateElementName) |
|
1891 |
||
1892 |
def updateElementAddress(self, address_model, new_leading): |
|
1893 |
self.content.updateElementAddress(address_model, new_leading) |
|
1894 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
1895 |
||
1896 |
def Search(self, criteria, parent_infos=[]): |
|
1897 |
return self.content.Search(criteria, parent_infos + ["comment", self.getlocalId(), "content"]) |
|
1898 |
setattr(cls, "Search", Search) |
|
1899 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1900 |
cls = _initElementClass("block", "fbdObjects") |
814 | 1901 |
if cls: |
1902 |
def getBoundingBox(self): |
|
1903 |
bbox = _getBoundingBox(self) |
|
1904 |
for input in self.inputVariables.getvariable(): |
|
1905 |
bbox.union(_getConnectionsBoundingBox(input.connectionPointIn)) |
|
1906 |
return bbox |
|
1907 |
setattr(cls, "getBoundingBox", getBoundingBox) |
|
1908 |
||
1909 |
def updateElementName(self, old_name, new_name): |
|
1910 |
if self.typeName == old_name: |
|
1911 |
self.typeName = new_name |
|
1912 |
setattr(cls, "updateElementName", updateElementName) |
|
1913 |
||
1914 |
def filterConnections(self, connections): |
|
1915 |
for input in self.inputVariables.getvariable(): |
|
1916 |
_filterConnections(input.connectionPointIn, self.localId, connections) |
|
1917 |
setattr(cls, "filterConnections", filterConnections) |
|
1918 |
||
1919 |
def updateConnectionsId(self, translation): |
|
1920 |
connections_end = [] |
|
1921 |
for input in self.inputVariables.getvariable(): |
|
1922 |
connections_end.extend(_updateConnectionsId(input.connectionPointIn, translation)) |
|
1923 |
return _getconnectionsdefinition(self, connections_end) |
|
1924 |
setattr(cls, "updateConnectionsId", updateConnectionsId) |
|
1925 |
||
1926 |
def translate(self, dx, dy): |
|
1927 |
_translate(self, dx, dy) |
|
1928 |
for input in self.inputVariables.getvariable(): |
|
1929 |
_translateConnections(input.connectionPointIn, dx, dy) |
|
1930 |
setattr(cls, "translate", translate) |
|
1931 |
||
1932 |
def Search(self, criteria, parent_infos=[]): |
|
1933 |
parent_infos = parent_infos + ["block", self.getlocalId()] |
|
1934 |
search_result = _Search([("name", self.getinstanceName()), |
|
1935 |
("type", self.gettypeName())], |
|
1936 |
criteria, parent_infos) |
|
1937 |
for i, variable in enumerate(self.inputVariables.getvariable()): |
|
1938 |
for result in TestTextElement(variable.getformalParameter(), criteria): |
|
1939 |
search_result.append((tuple(parent_infos + ["input", i]),) + result) |
|
1940 |
for i, variable in enumerate(self.outputVariables.getvariable()): |
|
1941 |
for result in TestTextElement(variable.getformalParameter(), criteria): |
|
1942 |
search_result.append((tuple(parent_infos + ["output", i]),) + result) |
|
1943 |
return search_result |
|
1944 |
setattr(cls, "Search", Search) |
|
1945 |
||
1355
9183fb765f16
Fixed bug when modifying power rail in LD Viewer
Laurent Bessard
parents:
1346
diff
changeset
|
1946 |
_initElementClass("leftPowerRail", "ldObjects") |
9183fb765f16
Fixed bug when modifying power rail in LD Viewer
Laurent Bessard
parents:
1346
diff
changeset
|
1947 |
_initElementClass("rightPowerRail", "ldObjects", "multiple") |
9183fb765f16
Fixed bug when modifying power rail in LD Viewer
Laurent Bessard
parents:
1346
diff
changeset
|
1948 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1949 |
def _UpdateLDElementName(self, old_name, new_name): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
1950 |
if self.variable == old_name: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
1951 |
self.variable = new_name |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1952 |
|
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1953 |
def _UpdateLDElementAddress(self, address_model, new_leading): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
1954 |
self.variable = update_address(self.variable, address_model, new_leading) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1955 |
|
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1956 |
def _getSearchInLDElement(ld_element_type): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1957 |
def SearchInLDElement(self, criteria, parent_infos=[]): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
1958 |
return _Search([("reference", self.variable)], criteria, parent_infos + [ld_element_type, self.getlocalId()]) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1959 |
return SearchInLDElement |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1960 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1961 |
cls = _initElementClass("contact", "ldObjects", "single") |
814 | 1962 |
if cls: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1963 |
setattr(cls, "updateElementName", _UpdateLDElementName) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1964 |
setattr(cls, "updateElementAddress", _UpdateLDElementAddress) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1965 |
setattr(cls, "Search", _getSearchInLDElement("contact")) |
814 | 1966 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1967 |
cls = _initElementClass("coil", "ldObjects", "single") |
814 | 1968 |
if cls: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1969 |
setattr(cls, "updateElementName", _UpdateLDElementName) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1970 |
setattr(cls, "updateElementAddress", _UpdateLDElementAddress) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1971 |
setattr(cls, "Search", _getSearchInLDElement("coil")) |
814 | 1972 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1973 |
cls = _initElementClass("step", "sfcObjects", "single") |
814 | 1974 |
if cls: |
1975 |
def Search(self, criteria, parent_infos=[]): |
|
1976 |
return _Search([("name", self.getname())], criteria, parent_infos + ["step", self.getlocalId()]) |
|
1977 |
setattr(cls, "Search", Search) |
|
1978 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1979 |
cls = _initElementClass("transition", "sfcObjects") |
814 | 1980 |
if cls: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1981 |
def setconditionContent(self, condition_type, value): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
1982 |
if self.condition is None: |
814 | 1983 |
self.addcondition() |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1984 |
if condition_type == "connection": |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1985 |
condition = PLCOpenParser.CreateElement("connectionPointIn", "condition") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1986 |
else: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1987 |
condition = PLCOpenParser.CreateElement(condition_type, "condition") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1988 |
self.condition.setcontent(condition) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1989 |
if condition_type == "reference": |
814 | 1990 |
condition.setname(value) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1991 |
elif condition_type == "inline": |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1992 |
condition.setcontent(PLCOpenParser.CreateElement("ST", "inline")) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1993 |
condition.settext(value) |
814 | 1994 |
setattr(cls, "setconditionContent", setconditionContent) |
1995 |
||
1996 |
def getconditionContent(self): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
1997 |
if self.condition is not None: |
814 | 1998 |
content = self.condition.getcontent() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
1999 |
values = {"type" : content.getLocalTag()} |
814 | 2000 |
if values["type"] == "reference": |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2001 |
values["value"] = content.getname() |
814 | 2002 |
elif values["type"] == "inline": |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2003 |
values["value"] = content.gettext() |
814 | 2004 |
elif values["type"] == "connectionPointIn": |
2005 |
values["type"] = "connection" |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2006 |
values["value"] = content |
814 | 2007 |
return values |
2008 |
return "" |
|
2009 |
setattr(cls, "getconditionContent", getconditionContent) |
|
2010 |
||
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2011 |
def getconditionConnection(self): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2012 |
if self.condition is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2013 |
content = self.condition.getcontent() |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2014 |
if content.getLocalTag() == "connectionPointIn": |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2015 |
return content |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2016 |
return None |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2017 |
setattr(cls, "getconditionConnection", getconditionConnection) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2018 |
|
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2019 |
def getBoundingBox(self): |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2020 |
bbox = _getBoundingBoxSingle(self) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2021 |
condition_connection = self.getconditionConnection() |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
2022 |
if condition_connection is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2023 |
bbox.union(_getConnectionsBoundingBox(condition_connection)) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2024 |
return bbox |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2025 |
setattr(cls, "getBoundingBox", getBoundingBox) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2026 |
|
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2027 |
def translate(self, dx, dy): |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2028 |
_translateSingle(self, dx, dy) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2029 |
condition_connection = self.getconditionConnection() |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2030 |
if condition_connection is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2031 |
_translateConnections(condition_connection, dx, dy) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2032 |
setattr(cls, "translate", translate) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2033 |
|
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2034 |
def filterConnections(self, connections): |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2035 |
_filterConnectionsSingle(self, connections) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2036 |
condition_connection = self.getconditionConnection() |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
2037 |
if condition_connection is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2038 |
_filterConnections(condition_connection, self.localId, connections) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2039 |
setattr(cls, "filterConnections", filterConnections) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2040 |
|
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2041 |
def updateConnectionsId(self, translation): |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2042 |
connections_end = [] |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2043 |
if self.connectionPointIn is not None: |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2044 |
connections_end = _updateConnectionsId(self.connectionPointIn, translation) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2045 |
condition_connection = self.getconditionConnection() |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
2046 |
if condition_connection is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2047 |
connections_end.extend(_updateConnectionsId(condition_connection, translation)) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2048 |
return _getconnectionsdefinition(self, connections_end) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2049 |
setattr(cls, "updateConnectionsId", updateConnectionsId) |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2050 |
|
814 | 2051 |
def updateElementName(self, old_name, new_name): |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
2052 |
if self.condition is not None: |
814 | 2053 |
content = self.condition.getcontent() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2054 |
content_name = content.getLocalTag() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2055 |
if content_name == "reference": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2056 |
if content.getname() == old_name: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2057 |
content.setname(new_name) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2058 |
elif content_name == "inline": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2059 |
content.updateElementName(old_name, new_name) |
814 | 2060 |
setattr(cls, "updateElementName", updateElementName) |
2061 |
||
2062 |
def updateElementAddress(self, address_model, new_leading): |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
2063 |
if self.condition is not None: |
814 | 2064 |
content = self.condition.getcontent() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2065 |
content_name = content.getLocalTag() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2066 |
if content_name == "reference": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2067 |
content.setname(update_address(content.getname(), address_model, new_leading)) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2068 |
elif content_name == "inline": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2069 |
content.updateElementAddress(address_model, new_leading) |
814 | 2070 |
setattr(cls, "updateElementAddress", updateElementAddress) |
2071 |
||
2072 |
def getconnections(self): |
|
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2073 |
condition_connection = self.getconditionConnection() |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
2074 |
if condition_connection is not None: |
891
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2075 |
return condition_connection.getconnections() |
39f355a535d8
Fix bug when copying transition and the connected FBD or LD diagram
Laurent Bessard
parents:
854
diff
changeset
|
2076 |
return None |
814 | 2077 |
setattr(cls, "getconnections", getconnections) |
2078 |
||
2079 |
def Search(self, criteria, parent_infos=[]): |
|
2080 |
parent_infos = parent_infos + ["transition", self.getlocalId()] |
|
2081 |
search_result = [] |
|
2082 |
content = self.condition.getcontent() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2083 |
content_name = content.getLocalTag() |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2084 |
if content_name == "reference": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2085 |
search_result.extend(_Search([("reference", content.getname())], criteria, parent_infos)) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2086 |
elif content_name == "inline": |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2087 |
search_result.extend(content.Search(criteria, parent_infos + ["inline"])) |
814 | 2088 |
return search_result |
2089 |
setattr(cls, "Search", Search) |
|
1346 | 2090 |
|
2091 |
_initElementClass("selectionDivergence", "sfcObjects", "single") |
|
2092 |
_initElementClass("selectionConvergence", "sfcObjects", "multiple") |
|
2093 |
_initElementClass("simultaneousDivergence", "sfcObjects", "single") |
|
2094 |
_initElementClass("simultaneousConvergence", "sfcObjects", "multiple") |
|
814 | 2095 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2096 |
cls = _initElementClass("jumpStep", "sfcObjects", "single") |
814 | 2097 |
if cls: |
2098 |
def Search(self, criteria, parent_infos): |
|
2099 |
return _Search([("target", self.gettargetName())], criteria, parent_infos + ["jump", self.getlocalId()]) |
|
2100 |
setattr(cls, "Search", Search) |
|
2101 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2102 |
cls = PLCOpenParser.GetElementClass("action", "actionBlock") |
814 | 2103 |
if cls: |
2104 |
def setreferenceName(self, name): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2105 |
if self.reference is not None: |
814 | 2106 |
self.reference.setname(name) |
2107 |
setattr(cls, "setreferenceName", setreferenceName) |
|
2108 |
||
2109 |
def getreferenceName(self): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2110 |
if self.reference is not None: |
814 | 2111 |
return self.reference.getname() |
2112 |
return None |
|
2113 |
setattr(cls, "getreferenceName", getreferenceName) |
|
2114 |
||
2115 |
def setinlineContent(self, content): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2116 |
if self.inline is not None: |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2117 |
self.inline.setcontent(PLCOpenParser.CreateElement("ST", "inline")) |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2118 |
self.inline.settext(content) |
814 | 2119 |
setattr(cls, "setinlineContent", setinlineContent) |
2120 |
||
2121 |
def getinlineContent(self): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2122 |
if self.inline is not None: |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2123 |
return self.inline.gettext() |
814 | 2124 |
return None |
2125 |
setattr(cls, "getinlineContent", getinlineContent) |
|
2126 |
||
2127 |
def updateElementName(self, old_name, new_name): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2128 |
if self.reference is not None and self.reference.getname() == old_name: |
814 | 2129 |
self.reference.setname(new_name) |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2130 |
if self.inline is not None: |
814 | 2131 |
self.inline.updateElementName(old_name, new_name) |
2132 |
setattr(cls, "updateElementName", updateElementName) |
|
2133 |
||
2134 |
def updateElementAddress(self, address_model, new_leading): |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2135 |
if self.reference is not None: |
814 | 2136 |
self.reference.setname(update_address(self.reference.getname(), address_model, new_leading)) |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2137 |
if self.inline is not None: |
814 | 2138 |
self.inline.updateElementAddress(address_model, new_leading) |
2139 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
2140 |
||
2141 |
def Search(self, criteria, parent_infos=[]): |
|
2142 |
qualifier = self.getqualifier() |
|
2143 |
if qualifier is None: |
|
2144 |
qualifier = "N" |
|
2145 |
return _Search([("inline", self.getinlineContent()), |
|
2146 |
("reference", self.getreferenceName()), |
|
2147 |
("qualifier", qualifier), |
|
2148 |
("duration", self.getduration()), |
|
2149 |
("indicator", self.getindicator())], |
|
2150 |
criteria, parent_infos) |
|
2151 |
setattr(cls, "Search", Search) |
|
2152 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2153 |
cls = _initElementClass("actionBlock", "commonObjects", "single") |
814 | 2154 |
if cls: |
2155 |
def setactions(self, actions): |
|
2156 |
self.action = [] |
|
2157 |
for params in actions: |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2158 |
action = PLCOpenParser.CreateElement("action", "actionBlock") |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2159 |
self.appendaction(action) |
1339 | 2160 |
action.setqualifier(params.qualifier) |
2161 |
if params.type == "reference": |
|
814 | 2162 |
action.addreference() |
1339 | 2163 |
action.setreferenceName(params.value) |
814 | 2164 |
else: |
2165 |
action.addinline() |
|
1339 | 2166 |
action.setinlineContent(params.value) |
2167 |
if params.duration != "": |
|
2168 |
action.setduration(params.duration) |
|
2169 |
if params.indicator != "": |
|
2170 |
action.setindicator(params.indicator) |
|
814 | 2171 |
setattr(cls, "setactions", setactions) |
2172 |
||
2173 |
def getactions(self): |
|
2174 |
actions = [] |
|
2175 |
for action in self.action: |
|
2176 |
params = {} |
|
2177 |
params["qualifier"] = action.getqualifier() |
|
2178 |
if params["qualifier"] is None: |
|
2179 |
params["qualifier"] = "N" |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2180 |
if action.getreference() is not None: |
814 | 2181 |
params["type"] = "reference" |
2182 |
params["value"] = action.getreferenceName() |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2183 |
elif action.getinline() is not None: |
814 | 2184 |
params["type"] = "inline" |
2185 |
params["value"] = action.getinlineContent() |
|
2186 |
duration = action.getduration() |
|
2187 |
if duration: |
|
2188 |
params["duration"] = duration |
|
2189 |
indicator = action.getindicator() |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1294
diff
changeset
|
2190 |
if indicator is not None: |
814 | 2191 |
params["indicator"] = indicator |
2192 |
actions.append(params) |
|
2193 |
return actions |
|
2194 |
setattr(cls, "getactions", getactions) |
|
2195 |
||
2196 |
def updateElementName(self, old_name, new_name): |
|
2197 |
for action in self.action: |
|
2198 |
action.updateElementName(old_name, new_name) |
|
2199 |
setattr(cls, "updateElementName", updateElementName) |
|
2200 |
||
2201 |
def updateElementAddress(self, address_model, new_leading): |
|
2202 |
for action in self.action: |
|
2203 |
action.updateElementAddress(address_model, new_leading) |
|
2204 |
setattr(cls, "updateElementAddress", updateElementAddress) |
|
2205 |
||
2206 |
def Search(self, criteria, parent_infos=[]): |
|
2207 |
parent_infos = parent_infos + ["action_block", self.getlocalId()] |
|
2208 |
search_result = [] |
|
2209 |
for idx, action in enumerate(self.action): |
|
2210 |
search_result.extend(action.Search(criteria, parent_infos + ["action", idx])) |
|
2211 |
return search_result |
|
2212 |
setattr(cls, "Search", Search) |
|
2213 |
||
2214 |
def _SearchInIOVariable(self, criteria, parent_infos=[]): |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
2215 |
return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()]) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2216 |
|
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2217 |
def _UpdateIOElementName(self, old_name, new_name): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
2218 |
if self.expression == old_name: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
2219 |
self.expression = new_name |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2220 |
|
1400 | 2221 |
def _UpdateIOElementAddress(self, address_model, new_leading): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1318
diff
changeset
|
2222 |
self.expression = update_address(self.expression, address_model, new_leading) |
814 | 2223 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2224 |
cls = _initElementClass("inVariable", "fbdObjects") |
814 | 2225 |
if cls: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2226 |
setattr(cls, "updateElementName", _UpdateIOElementName) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2227 |
setattr(cls, "updateElementAddress", _UpdateIOElementAddress) |
814 | 2228 |
setattr(cls, "Search", _SearchInIOVariable) |
2229 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2230 |
cls = _initElementClass("outVariable", "fbdObjects", "single") |
814 | 2231 |
if cls: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2232 |
setattr(cls, "updateElementName", _UpdateIOElementName) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2233 |
setattr(cls, "updateElementAddress", _UpdateIOElementAddress) |
814 | 2234 |
setattr(cls, "Search", _SearchInIOVariable) |
2235 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2236 |
cls = _initElementClass("inOutVariable", "fbdObjects", "single") |
814 | 2237 |
if cls: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2238 |
setattr(cls, "updateElementName", _UpdateIOElementName) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2239 |
setattr(cls, "updateElementAddress", _UpdateIOElementAddress) |
814 | 2240 |
setattr(cls, "Search", _SearchInIOVariable) |
2241 |
||
2242 |
||
2243 |
def _SearchInConnector(self, criteria, parent_infos=[]): |
|
2244 |
return _Search([("name", self.getname())], criteria, parent_infos + ["connector", self.getlocalId()]) |
|
2245 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2246 |
cls = _initElementClass("continuation", "commonObjects") |
814 | 2247 |
if cls: |
2248 |
setattr(cls, "Search", _SearchInConnector) |
|
2249 |
||
2250 |
def updateElementName(self, old_name, new_name): |
|
2251 |
if self.name == old_name: |
|
2252 |
self.name = new_name |
|
2253 |
setattr(cls, "updateElementName", updateElementName) |
|
2254 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2255 |
cls = _initElementClass("connector", "commonObjects", "single") |
814 | 2256 |
if cls: |
2257 |
setattr(cls, "Search", _SearchInConnector) |
|
2258 |
||
2259 |
def updateElementName(self, old_name, new_name): |
|
2260 |
if self.name == old_name: |
|
2261 |
self.name = new_name |
|
2262 |
setattr(cls, "updateElementName", updateElementName) |
|
2263 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2264 |
cls = PLCOpenParser.GetElementClass("connection") |
814 | 2265 |
if cls: |
2266 |
def setpoints(self, points): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2267 |
positions = [] |
814 | 2268 |
for point in points: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2269 |
position = PLCOpenParser.CreateElement("position", "connection") |
814 | 2270 |
position.setx(point.x) |
2271 |
position.sety(point.y) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2272 |
positions.append(position) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2273 |
self.position = positions |
814 | 2274 |
setattr(cls, "setpoints", setpoints) |
2275 |
||
2276 |
def getpoints(self): |
|
2277 |
points = [] |
|
2278 |
for position in self.position: |
|
2279 |
points.append((position.getx(),position.gety())) |
|
2280 |
return points |
|
2281 |
setattr(cls, "getpoints", getpoints) |
|
2282 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2283 |
cls = PLCOpenParser.GetElementClass("connectionPointIn") |
814 | 2284 |
if cls: |
2285 |
def setrelPositionXY(self, x, y): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2286 |
self.relPosition = PLCOpenParser.CreateElement("relPosition", "connectionPointIn") |
814 | 2287 |
self.relPosition.setx(x) |
2288 |
self.relPosition.sety(y) |
|
2289 |
setattr(cls, "setrelPositionXY", setrelPositionXY) |
|
2290 |
||
2291 |
def getrelPositionXY(self): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2292 |
if self.relPosition is not None: |
814 | 2293 |
return self.relPosition.getx(), self.relPosition.gety() |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2294 |
return self.relPosition |
814 | 2295 |
setattr(cls, "getrelPositionXY", getrelPositionXY) |
2296 |
||
2297 |
def addconnection(self): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2298 |
self.append(PLCOpenParser.CreateElement("connection", "connectionPointIn")) |
814 | 2299 |
setattr(cls, "addconnection", addconnection) |
2300 |
||
2301 |
def removeconnection(self, idx): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2302 |
if len(self.content) > idx: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2303 |
self.remove(self.content[idx]) |
814 | 2304 |
setattr(cls, "removeconnection", removeconnection) |
2305 |
||
2306 |
def removeconnections(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2307 |
self.content = None |
814 | 2308 |
setattr(cls, "removeconnections", removeconnections) |
2309 |
||
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
2310 |
connection_xpath = PLCOpen_XPath("ppx:connection") |
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
2311 |
connection_by_position_xpath = PLCOpen_XPath("ppx:connection[position()=$pos]") |
814 | 2312 |
def getconnections(self): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
2313 |
return connection_xpath(self) |
814 | 2314 |
setattr(cls, "getconnections", getconnections) |
2315 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2316 |
def getconnection(self, idx): |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1302
diff
changeset
|
2317 |
connection = connection_by_position_xpath(self, pos=idx+1) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2318 |
if len(connection) > 0: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2319 |
return connection[0] |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2320 |
return None |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2321 |
setattr(cls, "getconnection", getconnection) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2322 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2323 |
def setconnectionId(self, idx, local_id): |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2324 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2325 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2326 |
connection.setrefLocalId(local_id) |
814 | 2327 |
setattr(cls, "setconnectionId", setconnectionId) |
2328 |
||
2329 |
def getconnectionId(self, idx): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2330 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2331 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2332 |
return connection.getrefLocalId() |
814 | 2333 |
return None |
2334 |
setattr(cls, "getconnectionId", getconnectionId) |
|
2335 |
||
2336 |
def setconnectionPoints(self, idx, points): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2337 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2338 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2339 |
connection.setpoints(points) |
814 | 2340 |
setattr(cls, "setconnectionPoints", setconnectionPoints) |
2341 |
||
2342 |
def getconnectionPoints(self, idx): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2343 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2344 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2345 |
return connection.getpoints() |
1285
fa77f3b8f182
Fixed bug when no connection defined for connectionPointIn
Laurent Bessard
parents:
1283
diff
changeset
|
2346 |
return [] |
814 | 2347 |
setattr(cls, "getconnectionPoints", getconnectionPoints) |
2348 |
||
2349 |
def setconnectionParameter(self, idx, parameter): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2350 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2351 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2352 |
connection.setformalParameter(parameter) |
814 | 2353 |
setattr(cls, "setconnectionParameter", setconnectionParameter) |
2354 |
||
2355 |
def getconnectionParameter(self, idx): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2356 |
connection = self.getconnection(idx) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2357 |
if connection is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2358 |
return connection.getformalParameter() |
814 | 2359 |
return None |
2360 |
setattr(cls, "getconnectionParameter", getconnectionParameter) |
|
2361 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2362 |
cls = PLCOpenParser.GetElementClass("connectionPointOut") |
814 | 2363 |
if cls: |
2364 |
def setrelPositionXY(self, x, y): |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2365 |
self.relPosition = PLCOpenParser.CreateElement("relPosition", "connectionPointOut") |
814 | 2366 |
self.relPosition.setx(x) |
2367 |
self.relPosition.sety(y) |
|
2368 |
setattr(cls, "setrelPositionXY", setrelPositionXY) |
|
2369 |
||
2370 |
def getrelPositionXY(self): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2371 |
if self.relPosition is not None: |
814 | 2372 |
return self.relPosition.getx(), self.relPosition.gety() |
2373 |
return self.relPosition |
|
2374 |
setattr(cls, "getrelPositionXY", getrelPositionXY) |
|
2375 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2376 |
cls = PLCOpenParser.GetElementClass("value") |
814 | 2377 |
if cls: |
2378 |
def setvalue(self, value): |
|
2379 |
value = value.strip() |
|
2380 |
if value.startswith("[") and value.endswith("]"): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2381 |
content = PLCOpenParser.CreateElement("arrayValue", "value") |
814 | 2382 |
elif value.startswith("(") and value.endswith(")"): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2383 |
content = PLCOpenParser.CreateElement("structValue", "value") |
814 | 2384 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2385 |
content = PLCOpenParser.CreateElement("simpleValue", "value") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2386 |
content.setvalue(value) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2387 |
self.setcontent(content) |
814 | 2388 |
setattr(cls, "setvalue", setvalue) |
2389 |
||
2390 |
def getvalue(self): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2391 |
return self.content.getvalue() |
814 | 2392 |
setattr(cls, "getvalue", getvalue) |
2393 |
||
2394 |
def extractValues(values): |
|
2395 |
items = values.split(",") |
|
2396 |
i = 1 |
|
2397 |
while i < len(items): |
|
2398 |
opened = items[i - 1].count("(") + items[i - 1].count("[") |
|
2399 |
closed = items[i - 1].count(")") + items[i - 1].count("]") |
|
2400 |
if opened > closed: |
|
2401 |
items[i - 1] = ','.join([items[i - 1], items.pop(i)]) |
|
2402 |
elif opened == closed: |
|
2403 |
i += 1 |
|
2404 |
else: |
|
2405 |
raise ValueError, _("\"%s\" is an invalid value!")%value |
|
2406 |
return items |
|
2407 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2408 |
cls = PLCOpenParser.GetElementClass("arrayValue", "value") |
814 | 2409 |
if cls: |
2410 |
arrayValue_model = re.compile("([0-9]*)\((.*)\)$") |
|
2411 |
||
2412 |
def setvalue(self, value): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2413 |
elements = [] |
814 | 2414 |
for item in extractValues(value[1:-1]): |
2415 |
item = item.strip() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2416 |
element = PLCOpenParser.CreateElement("value", "arrayValue") |
814 | 2417 |
result = arrayValue_model.match(item) |
2418 |
if result is not None: |
|
2419 |
groups = result.groups() |
|
2420 |
element.setrepetitionValue(groups[0]) |
|
2421 |
element.setvalue(groups[1].strip()) |
|
2422 |
else: |
|
2423 |
element.setvalue(item) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2424 |
elements.append(element) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2425 |
self.value = elements |
814 | 2426 |
setattr(cls, "setvalue", setvalue) |
2427 |
||
2428 |
def getvalue(self): |
|
2429 |
values = [] |
|
2430 |
for element in self.value: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2431 |
try: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2432 |
repetition = int(element.getrepetitionValue()) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2433 |
except: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2434 |
repetition = 1 |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2435 |
if repetition > 1: |
814 | 2436 |
value = element.getvalue() |
2437 |
if value is None: |
|
2438 |
value = "" |
|
2439 |
values.append("%s(%s)"%(repetition, value)) |
|
2440 |
else: |
|
2441 |
values.append(element.getvalue()) |
|
2442 |
return "[%s]"%", ".join(values) |
|
2443 |
setattr(cls, "getvalue", getvalue) |
|
2444 |
||
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2445 |
cls = PLCOpenParser.GetElementClass("structValue", "value") |
814 | 2446 |
if cls: |
2447 |
structValue_model = re.compile("(.*):=(.*)") |
|
2448 |
||
2449 |
def setvalue(self, value): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2450 |
elements = [] |
814 | 2451 |
for item in extractValues(value[1:-1]): |
2452 |
result = structValue_model.match(item) |
|
2453 |
if result is not None: |
|
2454 |
groups = result.groups() |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2455 |
element = PLCOpenParser.CreateElement("value", "structValue") |
814 | 2456 |
element.setmember(groups[0].strip()) |
2457 |
element.setvalue(groups[1].strip()) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2458 |
elements.append(element) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2459 |
self.value = elements |
814 | 2460 |
setattr(cls, "setvalue", setvalue) |
2461 |
||
2462 |
def getvalue(self): |
|
2463 |
values = [] |
|
2464 |
for element in self.value: |
|
2465 |
values.append("%s := %s"%(element.getmember(), element.getvalue())) |
|
2466 |
return "(%s)"%", ".join(values) |
|
2467 |
setattr(cls, "getvalue", getvalue) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1285
diff
changeset
|
2468 |