author | Andrey Skvortsov <andrej.skvortzov@gmail.com> |
Thu, 09 Mar 2017 15:35:19 +0300 | |
changeset 1657 | 3a98027ff372 |
parent 1619 | 163d3a883575 |
child 1680 | 6db967480b7d |
permissions | -rw-r--r-- |
814 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
4 |
# This file is part of Beremiz, a Integrated Development Environment for |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
5 |
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival. |
814 | 6 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
7 |
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
814 | 8 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
9 |
# See COPYING file for copyrights details. |
814 | 10 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
11 |
# This program is free software; you can redistribute it and/or |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
12 |
# modify it under the terms of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
13 |
# as published by the Free Software Foundation; either version 2 |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
14 |
# of the License, or (at your option) any later version. |
814 | 15 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
16 |
# This program is distributed in the hope that it will be useful, |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
17 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
18 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
19 |
# GNU General Public License for more details. |
814 | 20 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
21 |
# You should have received a copy of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
22 |
# along with this program; if not, write to the Free Software |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
23 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
814 | 24 |
|
25 |
from xml.dom import minidom |
|
26 |
from types import StringType, UnicodeType, TupleType |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
27 |
from lxml import etree |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
28 |
from copy import deepcopy |
814 | 29 |
import os,sys,re |
30 |
import datetime |
|
31 |
from time import localtime |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
32 |
from collections import OrderedDict, namedtuple |
814 | 33 |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
34 |
from plcopen import * |
814 | 35 |
from graphics.GraphicCommons import * |
36 |
from PLCGenerator import * |
|
37 |
||
38 |
duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?") |
|
39 |
||
40 |
ITEMS_EDITABLE = [ITEM_PROJECT, |
|
41 |
ITEM_POU, |
|
42 |
ITEM_VARIABLE, |
|
43 |
ITEM_TRANSITION, |
|
44 |
ITEM_ACTION, |
|
45 |
ITEM_CONFIGURATION, |
|
46 |
ITEM_RESOURCE, |
|
47 |
ITEM_DATATYPE |
|
48 |
] = range(8) |
|
49 |
||
50 |
ITEMS_UNEDITABLE = [ITEM_DATATYPES, |
|
51 |
ITEM_FUNCTION, |
|
52 |
ITEM_FUNCTIONBLOCK, |
|
53 |
ITEM_PROGRAM, |
|
54 |
ITEM_TRANSITIONS, |
|
55 |
ITEM_ACTIONS, |
|
56 |
ITEM_CONFIGURATIONS, |
|
57 |
ITEM_RESOURCES, |
|
58 |
ITEM_PROPERTIES |
|
59 |
] = range(8, 17) |
|
1411 | 60 |
|
814 | 61 |
ITEMS_VARIABLE = [ITEM_VAR_LOCAL, |
62 |
ITEM_VAR_GLOBAL, |
|
63 |
ITEM_VAR_EXTERNAL, |
|
64 |
ITEM_VAR_TEMP, |
|
65 |
ITEM_VAR_INPUT, |
|
66 |
ITEM_VAR_OUTPUT, |
|
67 |
ITEM_VAR_INOUT |
|
68 |
] = range(17, 24) |
|
69 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
70 |
VAR_CLASS_INFOS = { |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
71 |
"Local": ("localVars", ITEM_VAR_LOCAL), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
72 |
"Global": ("globalVars", ITEM_VAR_GLOBAL), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
73 |
"External": ("externalVars", ITEM_VAR_EXTERNAL), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
74 |
"Temp": ("tempVars", ITEM_VAR_TEMP), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
75 |
"Input": ("inputVars", ITEM_VAR_INPUT), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
76 |
"Output": ("outputVars", ITEM_VAR_OUTPUT), |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
77 |
"InOut": ("inOutVars", ITEM_VAR_INOUT)} |
814 | 78 |
|
79 |
POU_TYPES = {"program": ITEM_PROGRAM, |
|
80 |
"functionBlock": ITEM_FUNCTIONBLOCK, |
|
81 |
"function": ITEM_FUNCTION, |
|
82 |
} |
|
83 |
||
84 |
LOCATIONS_ITEMS = [LOCATION_CONFNODE, |
|
85 |
LOCATION_MODULE, |
|
86 |
LOCATION_GROUP, |
|
87 |
LOCATION_VAR_INPUT, |
|
88 |
LOCATION_VAR_OUTPUT, |
|
89 |
LOCATION_VAR_MEMORY] = range(6) |
|
90 |
||
91 |
ScriptDirectory = os.path.split(os.path.realpath(__file__))[0] |
|
92 |
||
93 |
def GetUneditableNames(): |
|
94 |
_ = lambda x:x |
|
1411 | 95 |
return [_("User-defined POUs"), _("Functions"), _("Function Blocks"), |
96 |
_("Programs"), _("Data Types"), _("Transitions"), _("Actions"), |
|
814 | 97 |
_("Configurations"), _("Resources"), _("Properties")] |
98 |
UNEDITABLE_NAMES = GetUneditableNames() |
|
1411 | 99 |
[USER_DEFINED_POUS, FUNCTIONS, FUNCTION_BLOCKS, PROGRAMS, |
100 |
DATA_TYPES, TRANSITIONS, ACTIONS, CONFIGURATIONS, |
|
814 | 101 |
RESOURCES, PROPERTIES] = UNEDITABLE_NAMES |
102 |
||
103 |
#------------------------------------------------------------------------------- |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
104 |
# Helper object for loading library in xslt stylesheets |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
105 |
#------------------------------------------------------------------------------- |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
106 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
107 |
class LibraryResolver(etree.Resolver): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
108 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
109 |
def __init__(self, controller, debug=False): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
110 |
self.Controller = controller |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
111 |
self.Debug = debug |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
112 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
113 |
def resolve(self, url, pubid, context): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
114 |
lib_name = os.path.basename(url) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
115 |
if lib_name in ["project", "stdlib", "extensions"]: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
116 |
lib_el = etree.Element(lib_name) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
117 |
if lib_name == "project": |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
118 |
lib_el.append(deepcopy(self.Controller.GetProject(self.Debug))) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
119 |
elif lib_name == "stdlib": |
1390 | 120 |
for lib in StdBlckLibs.values(): |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
121 |
lib_el.append(deepcopy(lib)) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
122 |
else: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
123 |
for ctn in self.Controller.ConfNodeTypes: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
124 |
lib_el.append(deepcopy(ctn["types"])) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
125 |
return self.resolve_string(etree.tostring(lib_el), context) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
126 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
127 |
#------------------------------------------------------------------------------- |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
128 |
# Helpers functions for translating list of arguments |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
129 |
# from xslt to valid arguments |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
130 |
#------------------------------------------------------------------------------- |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
131 |
|
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
132 |
_StringValue = lambda x: x |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
133 |
_BoolValue = lambda x: x in ["true", "0"] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
134 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
135 |
def _translate_args(translations, args): |
1411 | 136 |
return [translate(arg[0]) if len(arg) > 0 else None |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
137 |
for translate, arg in |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
138 |
zip(translations, args)] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
139 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
140 |
#------------------------------------------------------------------------------- |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
141 |
# Helpers object for generating pou var list |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
142 |
#------------------------------------------------------------------------------- |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
143 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
144 |
class _VariableInfos(object): |
1411 | 145 |
__slots__ = ["Name", "Class", "Option", "Location", "InitialValue", |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
146 |
"Edit", "Documentation", "Type", "Tree", "Number"] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
147 |
def __init__(self, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
148 |
for attr, value in zip(self.__slots__, args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
149 |
setattr(self, attr, value if value is not None else "") |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
150 |
def copy(self): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
151 |
return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__]) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
152 |
|
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
153 |
class VariablesInfosFactory: |
1411 | 154 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
155 |
def __init__(self, variables): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
156 |
self.Variables = variables |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
157 |
self.TreeStack = [] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
158 |
self.Type = None |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
159 |
self.Dimensions = None |
1411 | 160 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
161 |
def SetType(self, context, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
162 |
self.Type = args[0][0] |
1411 | 163 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
164 |
def GetType(self): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
165 |
if len(self.Dimensions) > 0: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
166 |
return ("array", self.Type, self.Dimensions) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
167 |
return self.Type |
1411 | 168 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
169 |
def GetTree(self): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
170 |
return (self.TreeStack.pop(-1), self.Dimensions) |
1411 | 171 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
172 |
def AddDimension(self, context, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
173 |
self.Dimensions.append(tuple( |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
174 |
_translate_args([_StringValue] * 2, args))) |
1411 | 175 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
176 |
def AddTree(self, context, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
177 |
self.TreeStack.append([]) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
178 |
self.Dimensions = [] |
1411 | 179 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
180 |
def AddVarToTree(self, context, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
181 |
var = (args[0][0], self.Type, self.GetTree()) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
182 |
self.TreeStack[-1].append(var) |
1411 | 183 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
184 |
def AddVariable(self, context, *args): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
185 |
self.Variables.append(_VariableInfos(*(_translate_args( |
1411 | 186 |
[_StringValue] * 5 + [_BoolValue] + [_StringValue], args) + |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
187 |
[self.GetType(), self.GetTree()]))) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
188 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
189 |
#------------------------------------------------------------------------------- |
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
190 |
# Helpers object for generating pou variable instance list |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
191 |
#------------------------------------------------------------------------------- |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
192 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
193 |
def class_extraction(value): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
194 |
class_type = { |
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
195 |
"configuration": ITEM_CONFIGURATION, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
196 |
"resource": ITEM_RESOURCE, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
197 |
"action": ITEM_ACTION, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
198 |
"transition": ITEM_TRANSITION, |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
199 |
"program": ITEM_PROGRAM}.get(value) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
200 |
if class_type is not None: |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
201 |
return class_type |
1411 | 202 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
203 |
pou_type = POU_TYPES.get(value) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
204 |
if pou_type is not None: |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
205 |
return pou_type |
1411 | 206 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
207 |
var_type = VAR_CLASS_INFOS.get(value) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
208 |
if var_type is not None: |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
209 |
return var_type[1] |
1411 | 210 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
211 |
return None |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
212 |
|
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
213 |
class _VariablesTreeItemInfos(object): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
214 |
__slots__ = ["name", "var_class", "type", "edit", "debug", "variables"] |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
215 |
def __init__(self, *args): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
216 |
for attr, value in zip(self.__slots__, args): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
217 |
setattr(self, attr, value if value is not None else "") |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
218 |
def copy(self): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
219 |
return _VariableTreeItem(*[getattr(self, attr) for attr in self.__slots__]) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
220 |
|
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
221 |
class VariablesTreeInfosFactory: |
1411 | 222 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
223 |
def __init__(self): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
224 |
self.Root = None |
1411 | 225 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
226 |
def GetRoot(self): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
227 |
return self.Root |
1411 | 228 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
229 |
def SetRoot(self, context, *args): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
230 |
self.Root = _VariablesTreeItemInfos( |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
231 |
*([''] + _translate_args( |
1411 | 232 |
[class_extraction, _StringValue] + [_BoolValue] * 2, |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
233 |
args) + [[]])) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
234 |
|
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
235 |
def AddVariable(self, context, *args): |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
236 |
if self.Root is not None: |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
237 |
self.Root.variables.append(_VariablesTreeItemInfos( |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
238 |
*(_translate_args( |
1411 | 239 |
[_StringValue, class_extraction, _StringValue] + |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
240 |
[_BoolValue] * 2, args) + [[]]))) |
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
241 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
242 |
#------------------------------------------------------------------------------- |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
243 |
# Helpers object for generating instances path list |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
244 |
#------------------------------------------------------------------------------- |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
245 |
|
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
246 |
class InstancesPathFactory: |
1411 | 247 |
|
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
248 |
def __init__(self, instances): |
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
249 |
self.Instances = instances |
1411 | 250 |
|
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
251 |
def AddInstance(self, context, *args): |
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
252 |
self.Instances.append(args[0][0]) |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
253 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
254 |
#------------------------------------------------------------------------------- |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
255 |
# Helpers object for generating instance tagname |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
256 |
#------------------------------------------------------------------------------- |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
257 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
258 |
class InstanceTagName: |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
259 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
260 |
def __init__(self, controller): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
261 |
self.Controller = controller |
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
262 |
self.TagName = None |
1411 | 263 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
264 |
def GetTagName(self): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
265 |
return self.TagName |
1411 | 266 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
267 |
def ConfigTagName(self, context, *args): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
268 |
self.TagName = self.Controller.ComputeConfigurationName(args[0][0]) |
1411 | 269 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
270 |
def ResourceTagName(self, context, *args): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
271 |
self.TagName = self.Controller.ComputeConfigurationResourceName(args[0][0], args[1][0]) |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
272 |
|
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
273 |
def PouTagName(self, context, *args): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
274 |
self.TagName = self.Controller.ComputePouName(args[0][0]) |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
275 |
|
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
276 |
def ActionTagName(self, context, *args): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
277 |
self.TagName = self.Controller.ComputePouActionName(args[0][0], args[0][1]) |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
278 |
|
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
279 |
def TransitionTagName(self, context, *args): |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
280 |
self.TagName = self.Controller.ComputePouTransitionName(args[0][0], args[0][1]) |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
281 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
282 |
#------------------------------------------------------------------------------- |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
283 |
# Helpers object for generating pou block instances list |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
284 |
#------------------------------------------------------------------------------- |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
285 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
286 |
_Point = namedtuple("Point", ["x", "y"]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
287 |
|
1411 | 288 |
_BlockInstanceInfos = namedtuple("BlockInstanceInfos", |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
289 |
["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
290 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
291 |
_BlockSpecificValues = ( |
1411 | 292 |
namedtuple("BlockSpecificValues", |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
293 |
["name", "execution_order"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
294 |
[_StringValue, int]) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
295 |
_VariableSpecificValues = ( |
1411 | 296 |
namedtuple("VariableSpecificValues", |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
297 |
["name", "value_type", "execution_order"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
298 |
[_StringValue, _StringValue, int]) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
299 |
_ConnectionSpecificValues = ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
300 |
namedtuple("ConnectionSpecificValues", ["name"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
301 |
[_StringValue]) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
302 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
303 |
_PowerRailSpecificValues = ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
304 |
namedtuple("PowerRailSpecificValues", ["connectors"]), |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
305 |
[int]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
306 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
307 |
_LDElementSpecificValues = ( |
1411 | 308 |
namedtuple("LDElementSpecificValues", |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
309 |
["name", "negated", "edge", "storage", "execution_order"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
310 |
[_StringValue, _BoolValue, _StringValue, _StringValue, int]) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
311 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
312 |
_DivergenceSpecificValues = ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
313 |
namedtuple("DivergenceSpecificValues", ["connectors"]), |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
314 |
[int]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
315 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
316 |
_SpecificValuesTuples = { |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
317 |
"comment": ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
318 |
namedtuple("CommentSpecificValues", ["content"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
319 |
[_StringValue]), |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
320 |
"input": _VariableSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
321 |
"output": _VariableSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
322 |
"inout": _VariableSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
323 |
"connector": _ConnectionSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
324 |
"continuation": _ConnectionSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
325 |
"leftPowerRail": _PowerRailSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
326 |
"rightPowerRail": _PowerRailSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
327 |
"contact": _LDElementSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
328 |
"coil": _LDElementSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
329 |
"step": ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
330 |
namedtuple("StepSpecificValues", ["name", "initial", "action"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
331 |
[_StringValue, _BoolValue, lambda x: x]), |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
332 |
"transition": ( |
1411 | 333 |
namedtuple("TransitionSpecificValues", |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
334 |
["priority", "condition_type", "condition", "connection"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
335 |
[int, _StringValue, _StringValue, lambda x: x]), |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
336 |
"selectionDivergence": _DivergenceSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
337 |
"selectionConvergence": _DivergenceSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
338 |
"simultaneousDivergence": _DivergenceSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
339 |
"simultaneousConvergence": _DivergenceSpecificValues, |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
340 |
"jump": ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
341 |
namedtuple("JumpSpecificValues", ["target"]), |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
342 |
[_StringValue]), |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
343 |
"actionBlock": ( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
344 |
namedtuple("ActionBlockSpecificValues", ["actions"]), |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
345 |
[lambda x: x]), |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
346 |
} |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
347 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
348 |
_InstanceConnectionInfos = namedtuple("InstanceConnectionInfos", |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
349 |
["name", "negated", "edge", "position", "links"]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
350 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
351 |
_ConnectionLinkInfos = namedtuple("ConnectionLinkInfos", |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
352 |
["refLocalId", "formalParameter", "points"]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
353 |
|
1341 | 354 |
class _ActionInfos(object): |
1339 | 355 |
__slots__ = ["qualifier", "type", "value", "duration", "indicator"] |
356 |
def __init__(self, *args): |
|
357 |
for attr, value in zip(self.__slots__, args): |
|
358 |
setattr(self, attr, value if value is not None else "") |
|
359 |
def copy(self): |
|
360 |
return _ActionInfos(*[getattr(self, attr) for attr in self.__slots__]) |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
361 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
362 |
class BlockInstanceFactory: |
1411 | 363 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
364 |
def __init__(self, block_instances): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
365 |
self.BlockInstances = block_instances |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
366 |
self.CurrentInstance = None |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
367 |
self.SpecificValues = None |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
368 |
self.CurrentConnection = None |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
369 |
self.CurrentLink = None |
1411 | 370 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
371 |
def SetSpecificValues(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
372 |
self.SpecificValues = list(args) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
373 |
self.CurrentInstance = None |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
374 |
self.CurrentConnection = None |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
375 |
self.CurrentLink = None |
1411 | 376 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
377 |
def AddBlockInstance(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
378 |
specific_values_tuple, specific_values_translation = \ |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
379 |
_SpecificValuesTuples.get(args[0][0], _BlockSpecificValues) |
1411 | 380 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
381 |
if (args[0][0] == "step" and len(self.SpecificValues) < 3 or |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
382 |
args[0][0] == "transition" and len(self.SpecificValues) < 4): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
383 |
self.SpecificValues.append([None]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
384 |
elif args[0][0] == "actionBlock" and len(self.SpecificValues) < 1: |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
385 |
self.SpecificValues.append([[]]) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
386 |
specific_values = specific_values_tuple(*_translate_args( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
387 |
specific_values_translation, self.SpecificValues)) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
388 |
self.SpecificValues = None |
1411 | 389 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
390 |
self.CurrentInstance = _BlockInstanceInfos( |
1411 | 391 |
*(_translate_args([_StringValue, int] + [float] * 4, args) + |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
392 |
[specific_values, [], []])) |
1411 | 393 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
394 |
self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance |
1411 | 395 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
396 |
def AddInstanceConnection(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
397 |
connection_args = _translate_args( |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
398 |
[_StringValue] * 2 + [_BoolValue, _StringValue] + [float] * 2, args) |
1411 | 399 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
400 |
self.CurrentConnection = _InstanceConnectionInfos( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
401 |
*(connection_args[1:4] + [ |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
402 |
_Point(*connection_args[4:6]), []])) |
1411 | 403 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
404 |
if self.CurrentInstance is not None: |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
405 |
if connection_args[0] == "input": |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
406 |
self.CurrentInstance.inputs.append(self.CurrentConnection) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
407 |
else: |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
408 |
self.CurrentInstance.outputs.append(self.CurrentConnection) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
409 |
else: |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
410 |
self.SpecificValues.append([self.CurrentConnection]) |
1411 | 411 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
412 |
def AddConnectionLink(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
413 |
self.CurrentLink = _ConnectionLinkInfos( |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
414 |
*(_translate_args([int, _StringValue], args) + [[]])) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
415 |
self.CurrentConnection.links.append(self.CurrentLink) |
1411 | 416 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
417 |
def AddLinkPoint(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
418 |
self.CurrentLink.points.append(_Point( |
1373
4278d5c1e414
Fixed bug when graphic element position and size and connection points are decimal
Laurent Bessard
parents:
1372
diff
changeset
|
419 |
*_translate_args([float] * 2, args))) |
1411 | 420 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
421 |
def AddAction(self, context, *args): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
422 |
if len(self.SpecificValues) == 0: |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
423 |
self.SpecificValues.append([[]]) |
1378
cbc0f64a25eb
Fixed bug with non-ascii characters in program comments
Laurent Bessard
parents:
1373
diff
changeset
|
424 |
translated_args = _translate_args([_StringValue] * 5, args) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
425 |
self.SpecificValues[0][0].append(_ActionInfos(*translated_args)) |
1411 | 426 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
427 |
pou_block_instances_xslt = etree.parse( |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
428 |
os.path.join(ScriptDirectory, "plcopen", "pou_block_instances.xslt")) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
429 |
|
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
430 |
#------------------------------------------------------------------------------- |
814 | 431 |
# Undo Buffer for PLCOpenEditor |
432 |
#------------------------------------------------------------------------------- |
|
433 |
||
434 |
# Length of the buffer |
|
435 |
UNDO_BUFFER_LENGTH = 20 |
|
436 |
||
437 |
""" |
|
438 |
Class implementing a buffer of changes made on the current editing model |
|
439 |
""" |
|
440 |
class UndoBuffer: |
|
441 |
||
442 |
# Constructor initialising buffer |
|
443 |
def __init__(self, currentstate, issaved = False): |
|
444 |
self.Buffer = [] |
|
445 |
self.CurrentIndex = -1 |
|
446 |
self.MinIndex = -1 |
|
447 |
self.MaxIndex = -1 |
|
448 |
# if current state is defined |
|
449 |
if currentstate: |
|
450 |
self.CurrentIndex = 0 |
|
451 |
self.MinIndex = 0 |
|
452 |
self.MaxIndex = 0 |
|
453 |
# Initialising buffer with currentstate at the first place |
|
454 |
for i in xrange(UNDO_BUFFER_LENGTH): |
|
455 |
if i == 0: |
|
456 |
self.Buffer.append(currentstate) |
|
457 |
else: |
|
458 |
self.Buffer.append(None) |
|
459 |
# Initialising index of state saved |
|
460 |
if issaved: |
|
461 |
self.LastSave = 0 |
|
462 |
else: |
|
463 |
self.LastSave = -1 |
|
1411 | 464 |
|
814 | 465 |
# Add a new state in buffer |
466 |
def Buffering(self, currentstate): |
|
467 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
468 |
self.Buffer[self.CurrentIndex] = currentstate |
|
469 |
# Actualising buffer limits |
|
470 |
self.MaxIndex = self.CurrentIndex |
|
471 |
if self.MinIndex == self.CurrentIndex: |
|
472 |
# If the removed state was the state saved, there is no state saved in the buffer |
|
473 |
if self.LastSave == self.MinIndex: |
|
474 |
self.LastSave = -1 |
|
475 |
self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH |
|
476 |
self.MinIndex = max(self.MinIndex, 0) |
|
1411 | 477 |
|
814 | 478 |
# Return current state of buffer |
479 |
def Current(self): |
|
480 |
return self.Buffer[self.CurrentIndex] |
|
1411 | 481 |
|
814 | 482 |
# Change current state to previous in buffer and return new current state |
483 |
def Previous(self): |
|
484 |
if self.CurrentIndex != self.MinIndex: |
|
485 |
self.CurrentIndex = (self.CurrentIndex - 1) % UNDO_BUFFER_LENGTH |
|
486 |
return self.Buffer[self.CurrentIndex] |
|
487 |
return None |
|
1411 | 488 |
|
814 | 489 |
# Change current state to next in buffer and return new current state |
490 |
def Next(self): |
|
491 |
if self.CurrentIndex != self.MaxIndex: |
|
492 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
493 |
return self.Buffer[self.CurrentIndex] |
|
494 |
return None |
|
1411 | 495 |
|
814 | 496 |
# Return True if current state is the first in buffer |
497 |
def IsFirst(self): |
|
498 |
return self.CurrentIndex == self.MinIndex |
|
1411 | 499 |
|
814 | 500 |
# Return True if current state is the last in buffer |
501 |
def IsLast(self): |
|
502 |
return self.CurrentIndex == self.MaxIndex |
|
503 |
||
504 |
# Note that current state is saved |
|
505 |
def CurrentSaved(self): |
|
506 |
self.LastSave = self.CurrentIndex |
|
1411 | 507 |
|
814 | 508 |
# Return True if current state is saved |
509 |
def IsCurrentSaved(self): |
|
510 |
return self.LastSave == self.CurrentIndex |
|
511 |
||
512 |
||
513 |
#------------------------------------------------------------------------------- |
|
514 |
# Controler for PLCOpenEditor |
|
515 |
#------------------------------------------------------------------------------- |
|
516 |
||
517 |
""" |
|
518 |
Class which controls the operations made on the plcopen model and answers to view requests |
|
519 |
""" |
|
520 |
class PLCControler: |
|
1411 | 521 |
|
814 | 522 |
# Create a new PLCControler |
523 |
def __init__(self): |
|
524 |
self.LastNewIndex = 0 |
|
525 |
self.Reset() |
|
1411 | 526 |
|
814 | 527 |
# Reset PLCControler internal variables |
528 |
def Reset(self): |
|
529 |
self.Project = None |
|
530 |
self.ProjectBufferEnabled = True |
|
531 |
self.ProjectBuffer = None |
|
532 |
self.ProjectSaved = True |
|
533 |
self.Buffering = False |
|
534 |
self.FilePath = "" |
|
535 |
self.FileName = "" |
|
536 |
self.ProgramChunks = [] |
|
537 |
self.ProgramOffset = 0 |
|
538 |
self.NextCompiledProject = None |
|
539 |
self.CurrentCompiledProject = None |
|
540 |
self.ConfNodeTypes = [] |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
541 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
542 |
self.TotalTypes = StdBlckLst[:] |
1284 | 543 |
self.ProgramFilePath = "" |
1411 | 544 |
|
814 | 545 |
def GetQualifierTypes(self): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
546 |
return QualifierList |
814 | 547 |
|
548 |
def GetProject(self, debug = False): |
|
549 |
if debug and self.CurrentCompiledProject is not None: |
|
550 |
return self.CurrentCompiledProject |
|
551 |
else: |
|
552 |
return self.Project |
|
553 |
||
554 |
#------------------------------------------------------------------------------- |
|
555 |
# Project management functions |
|
556 |
#------------------------------------------------------------------------------- |
|
557 |
||
558 |
# Return if a project is opened |
|
559 |
def HasOpenedProject(self): |
|
560 |
return self.Project is not None |
|
561 |
||
562 |
# Create a new project by replacing the current one |
|
563 |
def CreateNewProject(self, properties): |
|
564 |
# Create the project |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
565 |
self.Project = PLCOpenParser.CreateRoot() |
814 | 566 |
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) |
567 |
self.Project.setfileHeader(properties) |
|
568 |
self.Project.setcontentHeader(properties) |
|
569 |
self.SetFilePath("") |
|
1411 | 570 |
|
814 | 571 |
# Initialize the project buffer |
572 |
self.CreateProjectBuffer(False) |
|
573 |
self.ProgramChunks = [] |
|
574 |
self.ProgramOffset = 0 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
575 |
self.NextCompiledProject = self.Copy(self.Project) |
814 | 576 |
self.CurrentCompiledProject = None |
577 |
self.Buffering = False |
|
1411 | 578 |
|
814 | 579 |
# Return project data type names |
580 |
def GetProjectDataTypeNames(self, debug = False): |
|
581 |
project = self.GetProject(debug) |
|
582 |
if project is not None: |
|
583 |
return [datatype.getname() for datatype in project.getdataTypes()] |
|
584 |
return [] |
|
1411 | 585 |
|
814 | 586 |
# Return project pou names |
587 |
def GetProjectPouNames(self, debug = False): |
|
588 |
project = self.GetProject(debug) |
|
589 |
if project is not None: |
|
590 |
return [pou.getname() for pou in project.getpous()] |
|
591 |
return [] |
|
1411 | 592 |
|
814 | 593 |
# Return project pou names |
594 |
def GetProjectConfigNames(self, debug = False): |
|
595 |
project = self.GetProject(debug) |
|
596 |
if project is not None: |
|
597 |
return [config.getname() for config in project.getconfigurations()] |
|
598 |
return [] |
|
1411 | 599 |
|
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:
1127
diff
changeset
|
600 |
# Return project pou variable names |
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:
1127
diff
changeset
|
601 |
def GetProjectPouVariableNames(self, pou_name = None, debug = False): |
814 | 602 |
variables = [] |
603 |
project = self.GetProject(debug) |
|
604 |
if project is not None: |
|
605 |
for pou in project.getpous(): |
|
606 |
if pou_name is None or pou_name == pou.getname(): |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
607 |
variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) |
814 | 608 |
for transition in pou.gettransitionList(): |
609 |
variables.append(transition.getname()) |
|
610 |
for action in pou.getactionList(): |
|
611 |
variables.append(action.getname()) |
|
612 |
return variables |
|
1411 | 613 |
|
814 | 614 |
# Return file path if project is an open file |
615 |
def GetFilePath(self): |
|
616 |
return self.FilePath |
|
1411 | 617 |
|
814 | 618 |
# Return file path if project is an open file |
619 |
def GetProgramFilePath(self): |
|
620 |
return self.ProgramFilePath |
|
1411 | 621 |
|
814 | 622 |
# Return file name and point out if file is up to date |
623 |
def GetFilename(self): |
|
624 |
if self.Project is not None: |
|
625 |
if self.ProjectIsSaved(): |
|
626 |
return self.FileName |
|
627 |
else: |
|
628 |
return "~%s~"%self.FileName |
|
629 |
return "" |
|
1411 | 630 |
|
814 | 631 |
# Change file path and save file name or create a default one if file path not defined |
632 |
def SetFilePath(self, filepath): |
|
633 |
self.FilePath = filepath |
|
634 |
if filepath == "": |
|
635 |
self.LastNewIndex += 1 |
|
636 |
self.FileName = _("Unnamed%d")%self.LastNewIndex |
|
637 |
else: |
|
638 |
self.FileName = os.path.splitext(os.path.basename(filepath))[0] |
|
1411 | 639 |
|
814 | 640 |
# Change project properties |
641 |
def SetProjectProperties(self, name = None, properties = None, buffer = True): |
|
642 |
if self.Project is not None: |
|
643 |
if name is not None: |
|
644 |
self.Project.setname(name) |
|
645 |
if properties is not None: |
|
646 |
self.Project.setfileHeader(properties) |
|
647 |
self.Project.setcontentHeader(properties) |
|
648 |
if buffer and (name is not None or properties is not None): |
|
649 |
self.BufferProject() |
|
1411 | 650 |
|
814 | 651 |
# Return project name |
652 |
def GetProjectName(self, debug=False): |
|
653 |
project = self.GetProject(debug) |
|
654 |
if project is not None: |
|
655 |
return project.getname() |
|
656 |
return None |
|
1411 | 657 |
|
814 | 658 |
# Return project properties |
659 |
def GetProjectProperties(self, debug = False): |
|
660 |
project = self.GetProject(debug) |
|
661 |
if project is not None: |
|
662 |
properties = project.getfileHeader() |
|
663 |
properties.update(project.getcontentHeader()) |
|
664 |
return properties |
|
665 |
return None |
|
1411 | 666 |
|
814 | 667 |
# Return project informations |
668 |
def GetProjectInfos(self, debug = False): |
|
669 |
project = self.GetProject(debug) |
|
670 |
if project is not None: |
|
671 |
infos = {"name": project.getname(), "type": ITEM_PROJECT} |
|
672 |
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values":[]} |
|
673 |
for datatype in project.getdataTypes(): |
|
1411 | 674 |
datatypes["values"].append({"name": datatype.getname(), "type": ITEM_DATATYPE, |
814 | 675 |
"tagname": self.ComputeDataTypeName(datatype.getname()), "values": []}) |
676 |
pou_types = {"function": {"name": FUNCTIONS, "type": ITEM_FUNCTION, "values":[]}, |
|
677 |
"functionBlock": {"name": FUNCTION_BLOCKS, "type": ITEM_FUNCTIONBLOCK, "values":[]}, |
|
678 |
"program": {"name": PROGRAMS, "type": ITEM_PROGRAM, "values":[]}} |
|
679 |
for pou in project.getpous(): |
|
680 |
pou_type = pou.getpouType() |
|
681 |
pou_infos = {"name": pou.getname(), "type": ITEM_POU, |
|
682 |
"tagname": self.ComputePouName(pou.getname())} |
|
683 |
pou_values = [] |
|
684 |
if pou.getbodyType() == "SFC": |
|
685 |
transitions = [] |
|
686 |
for transition in pou.gettransitionList(): |
|
1411 | 687 |
transitions.append({"name": transition.getname(), "type": ITEM_TRANSITION, |
688 |
"tagname": self.ComputePouTransitionName(pou.getname(), transition.getname()), |
|
814 | 689 |
"values": []}) |
690 |
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions}) |
|
691 |
actions = [] |
|
692 |
for action in pou.getactionList(): |
|
1411 | 693 |
actions.append({"name": action.getname(), "type": ITEM_ACTION, |
694 |
"tagname": self.ComputePouActionName(pou.getname(), action.getname()), |
|
814 | 695 |
"values": []}) |
696 |
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions}) |
|
697 |
if pou_type in pou_types: |
|
698 |
pou_infos["values"] = pou_values |
|
699 |
pou_types[pou_type]["values"].append(pou_infos) |
|
700 |
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []} |
|
701 |
for config in project.getconfigurations(): |
|
702 |
config_name = config.getname() |
|
1411 | 703 |
config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, |
704 |
"tagname": self.ComputeConfigurationName(config.getname()), |
|
814 | 705 |
"values": []} |
706 |
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []} |
|
707 |
for resource in config.getresource(): |
|
708 |
resource_name = resource.getname() |
|
1411 | 709 |
resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, |
710 |
"tagname": self.ComputeConfigurationResourceName(config.getname(), resource.getname()), |
|
814 | 711 |
"values": []} |
712 |
resources["values"].append(resource_infos) |
|
713 |
config_infos["values"] = [resources] |
|
714 |
configurations["values"].append(config_infos) |
|
1411 | 715 |
infos["values"] = [datatypes, pou_types["function"], pou_types["functionBlock"], |
814 | 716 |
pou_types["program"], configurations] |
717 |
return infos |
|
718 |
return None |
|
719 |
||
720 |
def GetPouVariables(self, tagname, debug = False): |
|
721 |
pou_type = None |
|
722 |
project = self.GetProject(debug) |
|
723 |
if project is not None: |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
724 |
factory = VariablesTreeInfosFactory() |
1411 | 725 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
726 |
parser = etree.XMLParser() |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
727 |
parser.resolvers.add(LibraryResolver(self, debug)) |
1411 | 728 |
|
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
729 |
pou_variable_xslt_tree = etree.XSLT( |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
730 |
etree.parse( |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
731 |
os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt"), |
1411 | 732 |
parser), |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
733 |
extensions = {("pou_vars_ns", name): getattr(factory, name) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
734 |
for name in ["SetRoot", "AddVariable"]}) |
1411 | 735 |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
736 |
obj = None |
814 | 737 |
words = tagname.split("::") |
738 |
if words[0] == "P": |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
739 |
obj = self.GetPou(words[1], debug) |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
740 |
elif words[0] != "D": |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
741 |
obj = self.GetEditedElement(tagname, debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
742 |
if obj is not None: |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
743 |
pou_variable_xslt_tree(obj) |
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
744 |
return factory.GetRoot() |
1411 | 745 |
|
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
746 |
return None |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
747 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
748 |
def GetInstanceList(self, root, name, debug = False): |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
749 |
instances = [] |
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
750 |
project = self.GetProject(debug) |
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
751 |
if project is not None: |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
752 |
factory = InstancesPathFactory(instances) |
1411 | 753 |
|
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
754 |
parser = etree.XMLParser() |
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
755 |
parser.resolvers.add(LibraryResolver(self, debug)) |
1411 | 756 |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
757 |
instances_path_xslt_tree = etree.XSLT( |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
758 |
etree.parse( |
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
759 |
os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"), |
1411 | 760 |
parser), |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
761 |
extensions = { |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
762 |
("instances_ns", "AddInstance"): factory.AddInstance}) |
1411 | 763 |
|
764 |
instances_path_xslt_tree(root, |
|
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
765 |
instance_type=etree.XSLT.strparam(name)) |
1411 | 766 |
|
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
767 |
return instances |
1411 | 768 |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
769 |
def SearchPouInstances(self, tagname, debug = False): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
770 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
771 |
if project is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
772 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
773 |
if words[0] == "P": |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
774 |
return self.GetInstanceList(project, words[1]) |
814 | 775 |
elif words[0] == 'C': |
776 |
return [words[1]] |
|
777 |
elif words[0] == 'R': |
|
778 |
return ["%s.%s" % (words[1], words[2])] |
|
826
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset
|
779 |
elif words[0] in ['T', 'A']: |
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset
|
780 |
return ["%s.%s" % (instance, words[2]) |
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset
|
781 |
for instance in self.SearchPouInstances( |
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset
|
782 |
self.ComputePouName(words[1]), debug)] |
814 | 783 |
return [] |
1411 | 784 |
|
814 | 785 |
def GetPouInstanceTagName(self, instance_path, debug = False): |
1254
ebc765355536
Fixed bug when trying to add a global function block instance variable to debug variable panel and not connected
Laurent Bessard
parents:
1223
diff
changeset
|
786 |
project = self.GetProject(debug) |
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
787 |
factory = InstanceTagName(self) |
1411 | 788 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
789 |
parser = etree.XMLParser() |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
790 |
parser.resolvers.add(LibraryResolver(self, debug)) |
1411 | 791 |
|
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
792 |
instance_tagname_xslt_tree = etree.XSLT( |
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
793 |
etree.parse( |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
794 |
os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"), |
1411 | 795 |
parser), |
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
796 |
extensions = {("instance_tagname_ns", name): getattr(factory, name) |
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
797 |
for name in ["ConfigTagName", "ResourceTagName", |
1411 | 798 |
"PouTagName", "ActionTagName", |
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
799 |
"TransitionTagName"]}) |
1411 | 800 |
|
801 |
instance_tagname_xslt_tree(project, |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
802 |
instance_path=etree.XSLT.strparam(instance_path)) |
1411 | 803 |
|
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset
|
804 |
return factory.GetTagName() |
1411 | 805 |
|
814 | 806 |
def GetInstanceInfos(self, instance_path, debug = False): |
807 |
tagname = self.GetPouInstanceTagName(instance_path) |
|
808 |
if tagname is not None: |
|
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
809 |
infos = self.GetPouVariables(tagname, debug) |
1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
810 |
infos.type = tagname |
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
811 |
return infos |
814 | 812 |
else: |
813 |
pou_path, var_name = instance_path.rsplit(".", 1) |
|
814 |
tagname = self.GetPouInstanceTagName(pou_path) |
|
815 |
if tagname is not None: |
|
816 |
pou_infos = self.GetPouVariables(tagname, debug) |
|
1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
817 |
for var_infos in pou_infos.variables: |
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
818 |
if var_infos.name == var_name: |
814 | 819 |
return var_infos |
820 |
return None |
|
1411 | 821 |
|
814 | 822 |
# Return if data type given by name is used by another data type or pou |
823 |
def DataTypeIsUsed(self, name, debug = False): |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
824 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
825 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
826 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 827 |
return False |
828 |
||
829 |
# Return if pou given by name is used by another pou |
|
830 |
def PouIsUsed(self, name, debug = False): |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
831 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
832 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
833 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 834 |
return False |
835 |
||
836 |
# Return if pou given by name is directly or undirectly used by the reference pou |
|
837 |
def PouIsUsedBy(self, name, reference, debug = False): |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
838 |
pou_infos = self.GetPou(reference, debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
839 |
if pou_infos is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
840 |
return len(self.GetInstanceList(pou_infos, name, debug)) > 0 |
814 | 841 |
return False |
842 |
||
843 |
def GenerateProgram(self, filepath=None): |
|
844 |
errors = [] |
|
845 |
warnings = [] |
|
846 |
if self.Project is not None: |
|
847 |
try: |
|
848 |
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings) |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
849 |
self.NextCompiledProject = self.Copy(self.Project) |
901
ab43f3e40b9d
Fix bug when compiling project containing non-ascii characters
Laurent Bessard
parents:
887
diff
changeset
|
850 |
program_text = "".join([item[0] for item in self.ProgramChunks]) |
814 | 851 |
if filepath is not None: |
852 |
programfile = open(filepath, "w") |
|
853 |
programfile.write(program_text.encode("utf-8")) |
|
854 |
programfile.close() |
|
855 |
self.ProgramFilePath = filepath |
|
856 |
return program_text, errors, warnings |
|
857 |
except PLCGenException, e: |
|
858 |
errors.append(e.message) |
|
859 |
else: |
|
860 |
errors.append("No project opened") |
|
861 |
return "", errors, warnings |
|
862 |
||
863 |
def DebugAvailable(self): |
|
864 |
return self.CurrentCompiledProject is not None |
|
865 |
||
866 |
def ProgramTransferred(self): |
|
867 |
if self.NextCompiledProject is None: |
|
868 |
self.CurrentCompiledProject = self.NextCompiledProject |
|
869 |
else: |
|
870 |
self.CurrentCompiledProject = self.Copy(self.Project) |
|
871 |
||
872 |
def GetChunkInfos(self, from_location, to_location): |
|
873 |
row = self.ProgramOffset + 1 |
|
874 |
col = 1 |
|
875 |
infos = [] |
|
876 |
for chunk, chunk_infos in self.ProgramChunks: |
|
877 |
lines = chunk.split("\n") |
|
878 |
if len(lines) > 1: |
|
879 |
next_row = row + len(lines) - 1 |
|
880 |
next_col = len(lines[-1]) + 1 |
|
881 |
else: |
|
882 |
next_row = row |
|
883 |
next_col = col + len(chunk) |
|
884 |
if (next_row > from_location[0] or next_row == from_location[0] and next_col >= from_location[1]) and len(chunk_infos) > 0: |
|
885 |
infos.append((chunk_infos, (row, col))) |
|
886 |
if next_row == to_location[0] and next_col > to_location[1] or next_row > to_location[0]: |
|
887 |
return infos |
|
888 |
row, col = next_row, next_col |
|
889 |
return infos |
|
1411 | 890 |
|
814 | 891 |
#------------------------------------------------------------------------------- |
892 |
# Project Pous management functions |
|
893 |
#------------------------------------------------------------------------------- |
|
1411 | 894 |
|
814 | 895 |
# Add a Data Type to Project |
896 |
def ProjectAddDataType(self, datatype_name=None): |
|
897 |
if self.Project is not None: |
|
898 |
if datatype_name is None: |
|
899 |
datatype_name = self.GenerateNewName(None, None, "datatype%d") |
|
900 |
# Add the datatype to project |
|
901 |
self.Project.appenddataType(datatype_name) |
|
902 |
self.BufferProject() |
|
903 |
return self.ComputeDataTypeName(datatype_name) |
|
904 |
return None |
|
1411 | 905 |
|
814 | 906 |
# Remove a Data Type from project |
907 |
def ProjectRemoveDataType(self, datatype_name): |
|
908 |
if self.Project is not None: |
|
909 |
self.Project.removedataType(datatype_name) |
|
910 |
self.BufferProject() |
|
1411 | 911 |
|
814 | 912 |
# Add a Pou to Project |
913 |
def ProjectAddPou(self, pou_name, pou_type, body_type): |
|
914 |
if self.Project is not None: |
|
915 |
# Add the pou to project |
|
916 |
self.Project.appendpou(pou_name, pou_type, body_type) |
|
917 |
if pou_type == "function": |
|
918 |
self.SetPouInterfaceReturnType(pou_name, "BOOL") |
|
919 |
self.BufferProject() |
|
920 |
return self.ComputePouName(pou_name) |
|
921 |
return None |
|
1411 | 922 |
|
814 | 923 |
def ProjectChangePouType(self, name, pou_type): |
924 |
if self.Project is not None: |
|
925 |
pou = self.Project.getpou(name) |
|
926 |
if pou is not None: |
|
927 |
pou.setpouType(pou_type) |
|
928 |
self.BufferProject() |
|
1411 | 929 |
|
814 | 930 |
def GetPouXml(self, pou_name): |
931 |
if self.Project is not None: |
|
932 |
pou = self.Project.getpou(pou_name) |
|
933 |
if pou is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
934 |
return pou.tostring() |
814 | 935 |
return None |
1411 | 936 |
|
814 | 937 |
def PastePou(self, pou_type, pou_xml): |
938 |
''' |
|
939 |
Adds the POU defined by 'pou_xml' to the current project with type 'pou_type' |
|
940 |
''' |
|
941 |
try: |
|
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:
1328
diff
changeset
|
942 |
new_pou, error = LoadPou(pou_xml) |
814 | 943 |
except: |
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:
1328
diff
changeset
|
944 |
error = "" |
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:
1328
diff
changeset
|
945 |
if error is not None: |
814 | 946 |
return _("Couldn't paste non-POU object.") |
1411 | 947 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
948 |
name = new_pou.getname() |
1411 | 949 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
950 |
idx = 0 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
951 |
new_name = name |
1411 | 952 |
while self.Project.getpou(new_name) is not None: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
953 |
# a POU with that name already exists. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
954 |
# make a new name and test if a POU with that name exists. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
955 |
# append an incrementing numeric suffix to the POU name. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
956 |
idx += 1 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
957 |
new_name = "%s%d" % (name, idx) |
1411 | 958 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
959 |
# we've found a name that does not already exist, use it |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
960 |
new_pou.setname(new_name) |
1411 | 961 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
962 |
if pou_type is not None: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
963 |
orig_type = new_pou.getpouType() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
964 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
965 |
# prevent violations of POU content restrictions: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
966 |
# function blocks cannot be pasted as functions, |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
967 |
# programs cannot be pasted as functions or function blocks |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
968 |
if orig_type == 'functionBlock' and pou_type == 'function' or \ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
969 |
orig_type == 'program' and pou_type in ['function', 'functionBlock']: |
1581
2295fdc5c271
fix translation strings with multiple parameters
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
970 |
msg = _('''{a1} "{a2}" can't be pasted as a {a3}.''').format(a1 = orig_type, a2 = name, a3 = pou_type) |
2295fdc5c271
fix translation strings with multiple parameters
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
971 |
return msg |
1411 | 972 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
973 |
new_pou.setpouType(pou_type) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
974 |
|
1411 | 975 |
self.Project.insertpou(0, new_pou) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
976 |
self.BufferProject() |
1411 | 977 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
978 |
return self.ComputePouName(new_name), |
814 | 979 |
|
980 |
# Remove a Pou from project |
|
981 |
def ProjectRemovePou(self, pou_name): |
|
982 |
if self.Project is not None: |
|
983 |
self.Project.removepou(pou_name) |
|
984 |
self.BufferProject() |
|
1411 | 985 |
|
814 | 986 |
# Return the name of the configuration if only one exist |
987 |
def GetProjectMainConfigurationName(self): |
|
988 |
if self.Project is not None: |
|
989 |
# Found the configuration corresponding to old name and change its name to new name |
|
990 |
configurations = self.Project.getconfigurations() |
|
991 |
if len(configurations) == 1: |
|
992 |
return configurations[0].getname() |
|
993 |
return None |
|
1411 | 994 |
|
814 | 995 |
# Add a configuration to Project |
996 |
def ProjectAddConfiguration(self, config_name=None): |
|
997 |
if self.Project is not None: |
|
998 |
if config_name is None: |
|
999 |
config_name = self.GenerateNewName(None, None, "configuration%d") |
|
1000 |
self.Project.addconfiguration(config_name) |
|
1001 |
self.BufferProject() |
|
1002 |
return self.ComputeConfigurationName(config_name) |
|
1003 |
return None |
|
1411 | 1004 |
|
814 | 1005 |
# Remove a configuration from project |
1006 |
def ProjectRemoveConfiguration(self, config_name): |
|
1007 |
if self.Project is not None: |
|
1008 |
self.Project.removeconfiguration(config_name) |
|
1009 |
self.BufferProject() |
|
1411 | 1010 |
|
814 | 1011 |
# Add a resource to a configuration of the Project |
1012 |
def ProjectAddConfigurationResource(self, config_name, resource_name=None): |
|
1013 |
if self.Project is not None: |
|
1014 |
if resource_name is None: |
|
1015 |
resource_name = self.GenerateNewName(None, None, "resource%d") |
|
1016 |
self.Project.addconfigurationResource(config_name, resource_name) |
|
1017 |
self.BufferProject() |
|
1018 |
return self.ComputeConfigurationResourceName(config_name, resource_name) |
|
1019 |
return None |
|
1411 | 1020 |
|
814 | 1021 |
# Remove a resource from a configuration of the project |
1022 |
def ProjectRemoveConfigurationResource(self, config_name, resource_name): |
|
1023 |
if self.Project is not None: |
|
1024 |
self.Project.removeconfigurationResource(config_name, resource_name) |
|
1025 |
self.BufferProject() |
|
1411 | 1026 |
|
814 | 1027 |
# Add a Transition to a Project Pou |
1028 |
def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): |
|
1029 |
if self.Project is not None: |
|
1030 |
pou = self.Project.getpou(pou_name) |
|
1031 |
if pou is not None: |
|
1032 |
pou.addtransition(transition_name, transition_type) |
|
1033 |
self.BufferProject() |
|
1034 |
return self.ComputePouTransitionName(pou_name, transition_name) |
|
1035 |
return None |
|
1411 | 1036 |
|
814 | 1037 |
# Remove a Transition from a Project Pou |
1038 |
def ProjectRemovePouTransition(self, pou_name, transition_name): |
|
1039 |
# Search if the pou removed is currently opened |
|
1040 |
if self.Project is not None: |
|
1041 |
pou = self.Project.getpou(pou_name) |
|
1042 |
if pou is not None: |
|
1043 |
pou.removetransition(transition_name) |
|
1044 |
self.BufferProject() |
|
1411 | 1045 |
|
814 | 1046 |
# Add an Action to a Project Pou |
1047 |
def ProjectAddPouAction(self, pou_name, action_name, action_type): |
|
1048 |
if self.Project is not None: |
|
1049 |
pou = self.Project.getpou(pou_name) |
|
1050 |
if pou is not None: |
|
1051 |
pou.addaction(action_name, action_type) |
|
1052 |
self.BufferProject() |
|
1053 |
return self.ComputePouActionName(pou_name, action_name) |
|
1054 |
return None |
|
1411 | 1055 |
|
814 | 1056 |
# Remove an Action from a Project Pou |
1057 |
def ProjectRemovePouAction(self, pou_name, action_name): |
|
1058 |
# Search if the pou removed is currently opened |
|
1059 |
if self.Project is not None: |
|
1060 |
pou = self.Project.getpou(pou_name) |
|
1061 |
if pou is not None: |
|
1062 |
pou.removeaction(action_name) |
|
1063 |
self.BufferProject() |
|
1411 | 1064 |
|
814 | 1065 |
# Change the name of a pou |
1066 |
def ChangeDataTypeName(self, old_name, new_name): |
|
1067 |
if self.Project is not None: |
|
1068 |
# Found the pou corresponding to old name and change its name to new name |
|
1069 |
datatype = self.Project.getdataType(old_name) |
|
1070 |
if datatype is not None: |
|
1071 |
datatype.setname(new_name) |
|
1072 |
self.Project.updateElementName(old_name, new_name) |
|
1073 |
self.BufferProject() |
|
1411 | 1074 |
|
814 | 1075 |
# Change the name of a pou |
1076 |
def ChangePouName(self, old_name, new_name): |
|
1077 |
if self.Project is not None: |
|
1078 |
# Found the pou corresponding to old name and change its name to new name |
|
1079 |
pou = self.Project.getpou(old_name) |
|
1080 |
if pou is not None: |
|
1081 |
pou.setname(new_name) |
|
1082 |
self.Project.updateElementName(old_name, new_name) |
|
1083 |
self.BufferProject() |
|
1411 | 1084 |
|
814 | 1085 |
# Change the name of a pou transition |
1086 |
def ChangePouTransitionName(self, pou_name, old_name, new_name): |
|
1087 |
if self.Project is not None: |
|
1088 |
# Found the pou transition corresponding to old name and change its name to new name |
|
1089 |
pou = self.Project.getpou(pou_name) |
|
1090 |
if pou is not None: |
|
1091 |
transition = pou.gettransition(old_name) |
|
1092 |
if transition is not None: |
|
1093 |
transition.setname(new_name) |
|
1094 |
pou.updateElementName(old_name, new_name) |
|
1095 |
self.BufferProject() |
|
1411 | 1096 |
|
814 | 1097 |
# Change the name of a pou action |
1098 |
def ChangePouActionName(self, pou_name, old_name, new_name): |
|
1099 |
if self.Project is not None: |
|
1100 |
# Found the pou action corresponding to old name and change its name to new name |
|
1101 |
pou = self.Project.getpou(pou_name) |
|
1102 |
if pou is not None: |
|
1103 |
action = pou.getaction(old_name) |
|
1104 |
if action is not None: |
|
1105 |
action.setname(new_name) |
|
1106 |
pou.updateElementName(old_name, new_name) |
|
1107 |
self.BufferProject() |
|
1411 | 1108 |
|
814 | 1109 |
# Change the name of a pou variable |
1110 |
def ChangePouVariableName(self, pou_name, old_name, new_name): |
|
1111 |
if self.Project is not None: |
|
1112 |
# Found the pou action corresponding to old name and change its name to new name |
|
1113 |
pou = self.Project.getpou(pou_name) |
|
1114 |
if pou is not None: |
|
1115 |
for type, varlist in pou.getvars(): |
|
1116 |
for var in varlist.getvariable(): |
|
1117 |
if var.getname() == old_name: |
|
1118 |
var.setname(new_name) |
|
1119 |
self.BufferProject() |
|
1411 | 1120 |
|
814 | 1121 |
# Change the name of a configuration |
1122 |
def ChangeConfigurationName(self, old_name, new_name): |
|
1123 |
if self.Project is not None: |
|
1124 |
# Found the configuration corresponding to old name and change its name to new name |
|
1125 |
configuration = self.Project.getconfiguration(old_name) |
|
1126 |
if configuration is not None: |
|
1127 |
configuration.setname(new_name) |
|
1128 |
self.BufferProject() |
|
1411 | 1129 |
|
814 | 1130 |
# Change the name of a configuration resource |
1131 |
def ChangeConfigurationResourceName(self, config_name, old_name, new_name): |
|
1132 |
if self.Project is not None: |
|
1133 |
# Found the resource corresponding to old name and change its name to new name |
|
1134 |
resource = self.Project.getconfigurationResource(config_name, old_name) |
|
1135 |
if resource is not None: |
|
1136 |
resource.setname(new_name) |
|
1137 |
self.BufferProject() |
|
1411 | 1138 |
|
814 | 1139 |
# Return the description of the pou given by its name |
1140 |
def GetPouDescription(self, name, debug = False): |
|
1141 |
project = self.GetProject(debug) |
|
1142 |
if project is not None: |
|
1143 |
# Found the pou correponding to name and return its type |
|
1144 |
pou = project.getpou(name) |
|
1145 |
if pou is not None: |
|
1146 |
return pou.getdescription() |
|
1147 |
return "" |
|
1411 | 1148 |
|
814 | 1149 |
# Return the description of the pou given by its name |
1150 |
def SetPouDescription(self, name, description, debug = False): |
|
1151 |
project = self.GetProject(debug) |
|
1152 |
if project is not None: |
|
1153 |
# Found the pou correponding to name and return its type |
|
1154 |
pou = project.getpou(name) |
|
1155 |
if pou is not None: |
|
1156 |
pou.setdescription(description) |
|
1157 |
self.BufferProject() |
|
1411 | 1158 |
|
814 | 1159 |
# Return the type of the pou given by its name |
1160 |
def GetPouType(self, name, debug = False): |
|
1161 |
project = self.GetProject(debug) |
|
1162 |
if project is not None: |
|
1163 |
# Found the pou correponding to name and return its type |
|
1164 |
pou = project.getpou(name) |
|
1165 |
if pou is not None: |
|
1166 |
return pou.getpouType() |
|
1167 |
return None |
|
1411 | 1168 |
|
814 | 1169 |
# Return pous with SFC language |
1170 |
def GetSFCPous(self, debug = False): |
|
1171 |
list = [] |
|
1172 |
project = self.GetProject(debug) |
|
1173 |
if project is not None: |
|
1174 |
for pou in project.getpous(): |
|
1175 |
if pou.getBodyType() == "SFC": |
|
1176 |
list.append(pou.getname()) |
|
1177 |
return list |
|
1411 | 1178 |
|
814 | 1179 |
# Return the body language of the pou given by its name |
1180 |
def GetPouBodyType(self, name, debug = False): |
|
1181 |
project = self.GetProject(debug) |
|
1182 |
if project is not None: |
|
1183 |
# Found the pou correponding to name and return its body language |
|
1184 |
pou = project.getpou(name) |
|
1185 |
if pou is not None: |
|
1186 |
return pou.getbodyType() |
|
1187 |
return None |
|
1411 | 1188 |
|
814 | 1189 |
# Return the actions of a pou |
1190 |
def GetPouTransitions(self, pou_name, debug = False): |
|
1191 |
transitions = [] |
|
1192 |
project = self.GetProject(debug) |
|
1193 |
if project is not None: |
|
1194 |
# Found the pou correponding to name and return its transitions if SFC |
|
1195 |
pou = project.getpou(pou_name) |
|
1196 |
if pou is not None and pou.getbodyType() == "SFC": |
|
1197 |
for transition in pou.gettransitionList(): |
|
1198 |
transitions.append(transition.getname()) |
|
1199 |
return transitions |
|
1411 | 1200 |
|
814 | 1201 |
# Return the body language of the transition given by its name |
1202 |
def GetTransitionBodyType(self, pou_name, pou_transition, debug = False): |
|
1203 |
project = self.GetProject(debug) |
|
1204 |
if project is not None: |
|
1205 |
# Found the pou correponding to name |
|
1206 |
pou = project.getpou(pou_name) |
|
1207 |
if pou is not None: |
|
1208 |
# Found the pou transition correponding to name and return its body language |
|
1209 |
transition = pou.gettransition(pou_transition) |
|
1210 |
if transition is not None: |
|
1211 |
return transition.getbodyType() |
|
1212 |
return None |
|
1411 | 1213 |
|
814 | 1214 |
# Return the actions of a pou |
1215 |
def GetPouActions(self, pou_name, debug = False): |
|
1216 |
actions = [] |
|
1217 |
project = self.GetProject(debug) |
|
1218 |
if project is not None: |
|
1219 |
# Found the pou correponding to name and return its actions if SFC |
|
1220 |
pou = project.getpou(pou_name) |
|
1221 |
if pou.getbodyType() == "SFC": |
|
1222 |
for action in pou.getactionList(): |
|
1223 |
actions.append(action.getname()) |
|
1224 |
return actions |
|
1411 | 1225 |
|
814 | 1226 |
# Return the body language of the pou given by its name |
1227 |
def GetActionBodyType(self, pou_name, pou_action, debug = False): |
|
1228 |
project = self.GetProject(debug) |
|
1229 |
if project is not None: |
|
1230 |
# Found the pou correponding to name and return its body language |
|
1231 |
pou = project.getpou(pou_name) |
|
1232 |
if pou is not None: |
|
1233 |
action = pou.getaction(pou_action) |
|
1234 |
if action is not None: |
|
1235 |
return action.getbodyType() |
|
1236 |
return None |
|
1411 | 1237 |
|
814 | 1238 |
# Extract varlists from a list of vars |
1239 |
def ExtractVarLists(self, vars): |
|
1240 |
varlist_list = [] |
|
1241 |
current_varlist = None |
|
1242 |
current_type = None |
|
1243 |
for var in vars: |
|
1411 | 1244 |
next_type = (var.Class, |
1245 |
var.Option, |
|
1246 |
var.Location in ["", None] or |
|
1247 |
# When declaring globals, located |
|
1248 |
# and not located variables are |
|
814 | 1249 |
# in the same declaration block |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1250 |
var.Class == "Global") |
814 | 1251 |
if current_type != next_type: |
1252 |
current_type = next_type |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1253 |
infos = VAR_CLASS_INFOS.get(var.Class, None) |
814 | 1254 |
if infos is not None: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1255 |
current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") |
814 | 1256 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1257 |
current_varlist = PLCOpenParser.CreateElement("varList") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1258 |
varlist_list.append((var.Class, current_varlist)) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1259 |
if var.Option == "Constant": |
814 | 1260 |
current_varlist.setconstant(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1261 |
elif var.Option == "Retain": |
814 | 1262 |
current_varlist.setretain(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1263 |
elif var.Option == "Non-Retain": |
814 | 1264 |
current_varlist.setnonretain(True) |
1265 |
# Create variable and change its properties |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1266 |
tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1267 |
tempvar.setname(var.Name) |
1411 | 1268 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1269 |
var_type = PLCOpenParser.CreateElement("type", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1270 |
if isinstance(var.Type, TupleType): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1271 |
if var.Type[0] == "array": |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1272 |
array_type, base_type_name, dimensions = var.Type |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1273 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1274 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1275 |
array.setbaseType(baseType) |
814 | 1276 |
for i, dimension in enumerate(dimensions): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1277 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 1278 |
if i == 0: |
1279 |
array.setdimension([dimension_range]) |
|
1280 |
else: |
|
1281 |
array.appenddimension(dimension_range) |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
1282 |
dimension_range.setlower(dimension[0]) |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
1283 |
dimension_range.setupper(dimension[1]) |
814 | 1284 |
if base_type_name in self.GetBaseTypes(): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1285 |
baseType.setcontent(PLCOpenParser.CreateElement( |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1286 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1287 |
if base_type_name in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1288 |
else base_type_name, "dataType")) |
814 | 1289 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1290 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1291 |
derived_datatype.setname(base_type_name) |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1292 |
baseType.setcontent(derived_datatype) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1293 |
var_type.setcontent(array) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1294 |
elif var.Type in self.GetBaseTypes(): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1295 |
var_type.setcontent(PLCOpenParser.CreateElement( |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1296 |
var.Type.lower() |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1297 |
if var.Type in ["STRING", "WSTRING"] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1298 |
else var.Type, "dataType")) |
814 | 1299 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1300 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1301 |
derived_type.setname(var.Type) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1302 |
var_type.setcontent(derived_type) |
814 | 1303 |
tempvar.settype(var_type) |
1304 |
||
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1305 |
if var.InitialValue != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1306 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1307 |
value.setvalue(var.InitialValue) |
814 | 1308 |
tempvar.setinitialValue(value) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1309 |
if var.Location != "": |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1310 |
tempvar.setaddress(var.Location) |
814 | 1311 |
else: |
1312 |
tempvar.setaddress(None) |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1313 |
if var.Documentation != "": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1314 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1315 |
ft.setanyText(var.Documentation) |
814 | 1316 |
tempvar.setdocumentation(ft) |
1317 |
||
1318 |
# Add variable to varList |
|
1319 |
current_varlist.appendvariable(tempvar) |
|
1320 |
return varlist_list |
|
1411 | 1321 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1322 |
def GetVariableDictionary(self, object_with_vars, tree=False, debug=False): |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1323 |
variables = [] |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1324 |
factory = VariablesInfosFactory(variables) |
1411 | 1325 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1326 |
parser = etree.XMLParser() |
1368
e567e4bee11f
Fixed bugs with pou variable infos computation stylesheet
Laurent Bessard
parents:
1367
diff
changeset
|
1327 |
parser.resolvers.add(LibraryResolver(self, debug)) |
1411 | 1328 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1329 |
variables_infos_xslt_tree = etree.XSLT( |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1330 |
etree.parse( |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1331 |
os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), |
1411 | 1332 |
parser), |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1333 |
extensions = {("var_infos_ns", name): getattr(factory, name) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1334 |
for name in ["SetType", "AddDimension", "AddTree", |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1335 |
"AddVarToTree", "AddVariable"]}) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1336 |
variables_infos_xslt_tree(object_with_vars, |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1337 |
tree=etree.XSLT.strparam(str(tree))) |
1411 | 1338 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1339 |
return variables |
1411 | 1340 |
|
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:
1127
diff
changeset
|
1341 |
# Add a global var to configuration to configuration |
1411 | 1342 |
def AddConfigurationGlobalVar(self, config_name, var_type, var_name, |
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:
1127
diff
changeset
|
1343 |
location="", description=""): |
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:
1127
diff
changeset
|
1344 |
if self.Project is not None: |
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:
1127
diff
changeset
|
1345 |
# Found the configuration corresponding to name |
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:
1127
diff
changeset
|
1346 |
configuration = self.Project.getconfiguration(config_name) |
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:
1127
diff
changeset
|
1347 |
if configuration is not None: |
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:
1127
diff
changeset
|
1348 |
# Set configuration global vars |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1349 |
configuration.addglobalVar( |
1411 | 1350 |
self.GetVarTypeObject(var_type), |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1351 |
var_name, location, description) |
814 | 1352 |
|
1353 |
# Replace the configuration globalvars by those given |
|
1354 |
def SetConfigurationGlobalVars(self, name, vars): |
|
1355 |
if self.Project is not None: |
|
1356 |
# Found the configuration corresponding to name |
|
1357 |
configuration = self.Project.getconfiguration(name) |
|
1358 |
if configuration is not None: |
|
1359 |
# Set configuration global vars |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1360 |
configuration.setglobalVars([ |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1361 |
varlist for vartype, varlist |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1362 |
in self.ExtractVarLists(vars)]) |
1411 | 1363 |
|
814 | 1364 |
# Return the configuration globalvars |
1365 |
def GetConfigurationGlobalVars(self, name, debug = False): |
|
1366 |
project = self.GetProject(debug) |
|
1367 |
if project is not None: |
|
1368 |
# Found the configuration corresponding to name |
|
1369 |
configuration = project.getconfiguration(name) |
|
1370 |
if configuration is not None: |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1371 |
# Extract variables defined in configuration |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1372 |
return self.GetVariableDictionary(configuration, debug) |
1411 | 1373 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1374 |
return [] |
814 | 1375 |
|
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:
1127
diff
changeset
|
1376 |
# Return configuration variable names |
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:
1127
diff
changeset
|
1377 |
def GetConfigurationVariableNames(self, config_name = None, debug = False): |
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:
1127
diff
changeset
|
1378 |
variables = [] |
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:
1127
diff
changeset
|
1379 |
project = self.GetProject(debug) |
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:
1127
diff
changeset
|
1380 |
if project is not None: |
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:
1127
diff
changeset
|
1381 |
for configuration in self.Project.getconfigurations(): |
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:
1127
diff
changeset
|
1382 |
if config_name is None or config_name == configuration.getname(): |
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:
1127
diff
changeset
|
1383 |
variables.extend( |
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:
1127
diff
changeset
|
1384 |
[var.getname() for var in reduce( |
1411 | 1385 |
lambda x, y: x + y, [varlist.getvariable() |
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:
1127
diff
changeset
|
1386 |
for varlist in configuration.globalVars], |
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:
1127
diff
changeset
|
1387 |
[])]) |
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:
1127
diff
changeset
|
1388 |
return variables |
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:
1127
diff
changeset
|
1389 |
|
814 | 1390 |
# Replace the resource globalvars by those given |
1391 |
def SetConfigurationResourceGlobalVars(self, config_name, name, vars): |
|
1392 |
if self.Project is not None: |
|
1393 |
# Found the resource corresponding to name |
|
1394 |
resource = self.Project.getconfigurationResource(config_name, name) |
|
1395 |
# Set resource global vars |
|
1396 |
if resource is not None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1397 |
resource.setglobalVars([ |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1398 |
varlist for vartype, varlist |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1399 |
in self.ExtractVarLists(vars)]) |
1411 | 1400 |
|
814 | 1401 |
# Return the resource globalvars |
1402 |
def GetConfigurationResourceGlobalVars(self, config_name, name, debug = False): |
|
1403 |
project = self.GetProject(debug) |
|
1404 |
if project is not None: |
|
1405 |
# Found the resource corresponding to name |
|
1406 |
resource = project.getconfigurationResource(config_name, name) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1407 |
if resource is not None: |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1408 |
# Extract variables defined in configuration |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1409 |
return self.GetVariableDictionary(resource, debug) |
1411 | 1410 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1411 |
return [] |
1411 | 1412 |
|
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:
1127
diff
changeset
|
1413 |
# Return resource variable names |
1411 | 1414 |
def GetConfigurationResourceVariableNames(self, |
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:
1127
diff
changeset
|
1415 |
config_name = None, resource_name = None, debug = False): |
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:
1127
diff
changeset
|
1416 |
variables = [] |
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:
1127
diff
changeset
|
1417 |
project = self.GetProject(debug) |
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:
1127
diff
changeset
|
1418 |
if project is not None: |
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:
1127
diff
changeset
|
1419 |
for configuration in self.Project.getconfigurations(): |
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:
1127
diff
changeset
|
1420 |
if config_name is None or config_name == configuration.getname(): |
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:
1127
diff
changeset
|
1421 |
for resource in configuration.getresource(): |
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:
1127
diff
changeset
|
1422 |
if resource_name is None or resource.getname() == resource_name: |
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:
1127
diff
changeset
|
1423 |
variables.extend( |
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:
1127
diff
changeset
|
1424 |
[var.getname() for var in reduce( |
1411 | 1425 |
lambda x, y: x + y, [varlist.getvariable() |
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:
1127
diff
changeset
|
1426 |
for varlist in resource.globalVars], |
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:
1127
diff
changeset
|
1427 |
[])]) |
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:
1127
diff
changeset
|
1428 |
return variables |
814 | 1429 |
|
1430 |
# Return the interface for the given pou |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1431 |
def GetPouInterfaceVars(self, pou, tree=False, debug = False): |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1432 |
interface = pou.interface |
814 | 1433 |
# Verify that the pou has an interface |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1434 |
if interface is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1435 |
# Extract variables defined in interface |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1436 |
return self.GetVariableDictionary(interface, tree, debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1437 |
return [] |
814 | 1438 |
|
1439 |
# Replace the Pou interface by the one given |
|
1440 |
def SetPouInterfaceVars(self, name, vars): |
|
1441 |
if self.Project is not None: |
|
1442 |
# Found the pou corresponding to name and add interface if there isn't one yet |
|
1443 |
pou = self.Project.getpou(name) |
|
1444 |
if pou is not None: |
|
1445 |
if pou.interface is None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1446 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1447 |
# Set Pou interface |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1448 |
pou.setvars([varlist for varlist_type, varlist in self.ExtractVarLists(vars)]) |
1411 | 1449 |
|
814 | 1450 |
# Replace the return type of the pou given by its name (only for functions) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1451 |
def SetPouInterfaceReturnType(self, name, return_type): |
814 | 1452 |
if self.Project is not None: |
1453 |
pou = self.Project.getpou(name) |
|
1454 |
if pou is not None: |
|
1455 |
if pou.interface is None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1456 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1457 |
# If there isn't any return type yet, add it |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1458 |
return_type_obj = pou.interface.getreturnType() |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1459 |
if return_type_obj is None: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1460 |
return_type_obj = PLCOpenParser.CreateElement("returnType", "interface") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1461 |
pou.interface.setreturnType(return_type_obj) |
814 | 1462 |
# Change return type |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1463 |
if return_type in self.GetBaseTypes(): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1464 |
return_type_obj.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1465 |
return_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1466 |
if return_type in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1467 |
else return_type, "dataType")) |
814 | 1468 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1469 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1470 |
derived_type.setname(return_type) |
1418
c97dc5281419
Fixed declaration and ST code gen for IEC function that return derivated types
Edouard Tisserant
parents:
1411
diff
changeset
|
1471 |
return_type_obj.setcontent(derived_type) |
1411 | 1472 |
|
814 | 1473 |
def UpdateProjectUsedPous(self, old_name, new_name): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1474 |
if self.Project is not None: |
814 | 1475 |
self.Project.updateElementName(old_name, new_name) |
1411 | 1476 |
|
814 | 1477 |
def UpdateEditedElementUsedVariable(self, tagname, old_name, new_name): |
1478 |
pou = self.GetEditedElement(tagname) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1479 |
if pou is not None: |
814 | 1480 |
pou.updateElementName(old_name, new_name) |
1411 | 1481 |
|
814 | 1482 |
# Return the return type of the given pou |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1483 |
def GetPouInterfaceReturnType(self, pou, tree=False, debug=False): |
814 | 1484 |
# Verify that the pou has an interface |
1485 |
if pou.interface is not None: |
|
1486 |
# Return the return type if there is one |
|
1487 |
return_type = pou.interface.getreturnType() |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1488 |
if return_type is not None: |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1489 |
factory = VariablesInfosFactory([]) |
1411 | 1490 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1491 |
parser = etree.XMLParser() |
1379
086f52b2feac
Fixed bug with function POU when extracting return type
Laurent Bessard
parents:
1378
diff
changeset
|
1492 |
parser.resolvers.add(LibraryResolver(self)) |
1411 | 1493 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1494 |
return_type_infos_xslt_tree = etree.XSLT( |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1495 |
etree.parse( |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1496 |
os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), |
1411 | 1497 |
parser), |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1498 |
extensions = {("var_infos_ns", name): getattr(factory, name) |
1411 | 1499 |
for name in ["SetType", "AddDimension", |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1500 |
"AddTree", "AddVarToTree"]}) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1501 |
return_type_infos_xslt_tree(return_type, |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1502 |
tree=etree.XSLT.strparam(str(tree))) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1503 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1504 |
return [factory.GetType(), factory.GetTree()] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1505 |
return factory.GetType() |
1411 | 1506 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1507 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1508 |
return [None, ([], [])] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1509 |
return None |
814 | 1510 |
|
1511 |
# Function that add a new confnode to the confnode list |
|
1512 |
def AddConfNodeTypesList(self, typeslist): |
|
1513 |
self.ConfNodeTypes.extend(typeslist) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1514 |
addedcat = [{"name": _("%s POUs") % confnodetypes["name"], |
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
|
1515 |
"list": [pou.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
|
1516 |
for pou in confnodetypes["types"].getpous()]} |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1517 |
for confnodetypes in typeslist] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1518 |
self.TotalTypes.extend(addedcat) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1519 |
for cat in addedcat: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1520 |
for desc in cat["list"]: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1521 |
BlkLst = self.TotalTypesDict.setdefault(desc["name"],[]) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1522 |
BlkLst.append((section["name"], desc)) |
1411 | 1523 |
|
814 | 1524 |
# Function that clear the confnode list |
1525 |
def ClearConfNodeTypes(self): |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1526 |
self.ConfNodeTypes = [] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1527 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1528 |
self.TotalTypes = StdBlckLst[:] |
814 | 1529 |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1530 |
def GetConfNodeDataTypes(self, exclude = None, only_locatables = False): |
814 | 1531 |
return [{"name": _("%s Data Types") % confnodetypes["name"], |
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
|
1532 |
"list": [ |
1411 | 1533 |
datatype.getname() |
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
|
1534 |
for datatype in confnodetypes["types"].getdataTypes() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1535 |
if not only_locatables or self.IsLocatableDataType(datatype, debug)]} |
814 | 1536 |
for confnodetypes in self.ConfNodeTypes] |
1411 | 1537 |
|
814 | 1538 |
def GetVariableLocationTree(self): |
1539 |
return [] |
|
1540 |
||
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1541 |
def GetConfNodeGlobalInstances(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1542 |
return [] |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1543 |
|
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1544 |
def GetConfigurationExtraVariables(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1545 |
global_vars = [] |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1546 |
for var_name, var_type, var_initial in self.GetConfNodeGlobalInstances(): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1547 |
tempvar = PLCOpenParser.CreateElement("variable", "globalVars") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1548 |
tempvar.setname(var_name) |
1411 | 1549 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1550 |
tempvartype = PLCOpenParser.CreateElement("type", "variable") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1551 |
if var_type in self.GetBaseTypes(): |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1552 |
tempvartype.setcontent(PLCOpenParser.CreateElement( |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1553 |
var_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1554 |
if var_type in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1555 |
else var_type, "dataType")) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1556 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1557 |
tempderivedtype = PLCOpenParser.CreateElement("derived", "dataType") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1558 |
tempderivedtype.setname(var_type) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1559 |
tempvartype.setcontent(tempderivedtype) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1560 |
tempvar.settype(tempvartype) |
1411 | 1561 |
|
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1562 |
if var_initial != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1563 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1564 |
value.setvalue(var_initial) |
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1565 |
tempvar.setinitialValue(value) |
1411 | 1566 |
|
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1567 |
global_vars.append(tempvar) |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1568 |
return global_vars |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1569 |
|
814 | 1570 |
# Function that returns the block definition associated to the block type given |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1571 |
def GetBlockType(self, typename, inputs = None, debug = False): |
814 | 1572 |
result_blocktype = None |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1573 |
for sectioname, blocktype in self.TotalTypesDict.get(typename,[]): |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1574 |
if inputs is not None and inputs != "undefined": |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1575 |
block_inputs = tuple([var_type for name, var_type, modifier in blocktype["inputs"]]) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1576 |
if reduce(lambda x, y: x and y, map(lambda x: x[0] == "ANY" or self.IsOfType(*x), zip(inputs, block_inputs)), True): |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1577 |
return blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1578 |
else: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1579 |
if result_blocktype is not None: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1580 |
if inputs == "undefined": |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1581 |
return None |
814 | 1582 |
else: |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1583 |
result_blocktype["inputs"] = [(i[0], "ANY", i[2]) for i in result_blocktype["inputs"]] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1584 |
result_blocktype["outputs"] = [(o[0], "ANY", o[2]) for o in result_blocktype["outputs"]] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1585 |
return result_blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1586 |
result_blocktype = blocktype.copy() |
814 | 1587 |
if result_blocktype is not None: |
1588 |
return result_blocktype |
|
1589 |
project = self.GetProject(debug) |
|
1590 |
if project is not None: |
|
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
|
1591 |
blocktype = project.getpou(typename) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1592 |
if blocktype 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
|
1593 |
blocktype_infos = blocktype.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
|
1594 |
if inputs in [None, "undefined"]: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1595 |
return blocktype_infos |
1411 | 1596 |
|
1597 |
if inputs == tuple([var_type |
|
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
|
1598 |
for name, var_type, modifier in blocktype_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
|
1599 |
return blocktype_infos |
1411 | 1600 |
|
814 | 1601 |
return None |
1602 |
||
1603 |
# Return Block types checking for recursion |
|
1604 |
def GetBlockTypes(self, tagname = "", debug = False): |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1605 |
typename = None |
814 | 1606 |
words = tagname.split("::") |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1607 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1608 |
project = self.GetProject(debug) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1609 |
if project is not None: |
1284 | 1610 |
pou_type = None |
814 | 1611 |
if words[0] in ["P","T","A"]: |
1612 |
name = words[1] |
|
1284 | 1613 |
pou_type = self.GetPouType(name, debug) |
1411 | 1614 |
filter = (["function"] |
1615 |
if pou_type == "function" or words[0] == "T" |
|
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
|
1616 |
else ["functionBlock", "function"]) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1617 |
blocktypes = [ |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1618 |
{"name": category["name"], |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1619 |
"list": [block for block in category["list"] |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1620 |
if block["type"] in filter]} |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1621 |
for category in self.TotalTypes] |
1411 | 1622 |
blocktypes.append({"name" : USER_DEFINED_POUS, |
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
|
1623 |
"list": [pou.getblockInfos() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1624 |
for pou in project.getpous(name, filter) |
1411 | 1625 |
if (name is None or |
1372
ef26fcb7f5d4
Fixed bug in test if block type is used by current edited pou
Laurent Bessard
parents:
1368
diff
changeset
|
1626 |
len(self.GetInstanceList(pou, name, debug)) == 0)]}) |
1284 | 1627 |
return blocktypes |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1628 |
return self.TotalTypes |
814 | 1629 |
|
1630 |
# Return Function Block types checking for recursion |
|
1631 |
def GetFunctionBlockTypes(self, tagname = "", debug = False): |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1632 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1633 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1634 |
name = None |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1635 |
if project is not None and words[0] in ["P","T","A"]: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1636 |
name = words[1] |
814 | 1637 |
blocktypes = [] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1638 |
for blocks in self.TotalTypesDict.itervalues(): |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1639 |
for sectioname,block in blocks: |
814 | 1640 |
if block["type"] == "functionBlock": |
1641 |
blocktypes.append(block["name"]) |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1642 |
if project is not None: |
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
|
1643 |
blocktypes.extend([pou.getname() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1644 |
for pou in project.getpous(name, ["functionBlock"]) |
1411 | 1645 |
if (name is None or |
1372
ef26fcb7f5d4
Fixed bug in test if block type is used by current edited pou
Laurent Bessard
parents:
1368
diff
changeset
|
1646 |
len(self.GetInstanceList(pou, name, debug)) == 0)]) |
814 | 1647 |
return blocktypes |
1648 |
||
1649 |
# Return Block types checking for recursion |
|
1650 |
def GetBlockResource(self, debug = False): |
|
1651 |
blocktypes = [] |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1652 |
for category in StdBlckLst[:-1]: |
814 | 1653 |
for blocktype in category["list"]: |
1654 |
if blocktype["type"] == "program": |
|
1655 |
blocktypes.append(blocktype["name"]) |
|
1656 |
project = self.GetProject(debug) |
|
1657 |
if project is not None: |
|
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
|
1658 |
blocktypes.extend( |
1328
a2f2981df9b0
Fixed bug in Resource POU instance type selection
Laurent Bessard
parents:
1326
diff
changeset
|
1659 |
[pou.getname() |
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
|
1660 |
for pou in project.getpous(filter=["program"])]) |
814 | 1661 |
return blocktypes |
1662 |
||
1663 |
# Return Data Types checking for recursion |
|
863
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1664 |
def GetDataTypes(self, tagname = "", basetypes = True, confnodetypes = True, only_locatables = False, debug = False): |
814 | 1665 |
if basetypes: |
1666 |
datatypes = self.GetBaseTypes() |
|
1667 |
else: |
|
1668 |
datatypes = [] |
|
1669 |
project = self.GetProject(debug) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1670 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1671 |
if project is not None: |
814 | 1672 |
words = tagname.split("::") |
1673 |
if words[0] in ["D"]: |
|
1674 |
name = words[1] |
|
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
|
1675 |
datatypes.extend([ |
1411 | 1676 |
datatype.getname() |
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
|
1677 |
for datatype in project.getdataTypes(name) |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1678 |
if (not only_locatables or self.IsLocatableDataType(datatype, debug)) |
1411 | 1679 |
and (name is None or |
1372
ef26fcb7f5d4
Fixed bug in test if block type is used by current edited pou
Laurent Bessard
parents:
1368
diff
changeset
|
1680 |
len(self.GetInstanceList(datatype, name, debug)) == 0)]) |
863
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1681 |
if confnodetypes: |
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1682 |
for category in self.GetConfNodeDataTypes(name, only_locatables): |
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1683 |
datatypes.extend(category["list"]) |
814 | 1684 |
return datatypes |
1685 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1686 |
# Return Data Type Object |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1687 |
def GetPou(self, typename, debug = False): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1688 |
project = self.GetProject(debug) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1689 |
if project is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1690 |
result = project.getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1691 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1692 |
return result |
1390 | 1693 |
for standardlibrary in StdBlckLibs.values(): |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1694 |
result = standardlibrary.getpou(typename) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1695 |
if result is not None: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1696 |
return result |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1697 |
for confnodetype in self.ConfNodeTypes: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1698 |
result = confnodetype["types"].getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1699 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1700 |
return result |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1701 |
return None |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1702 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1703 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1704 |
# Return Data Type Object |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1705 |
def GetDataType(self, typename, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1706 |
project = self.GetProject(debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1707 |
if project 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
|
1708 |
result = project.getdataType(typename) |
814 | 1709 |
if result is not None: |
1710 |
return result |
|
1711 |
for confnodetype in self.ConfNodeTypes: |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1712 |
result = confnodetype["types"].getdataType(typename) |
814 | 1713 |
if result is not None: |
1714 |
return result |
|
1715 |
return None |
|
1716 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1717 |
# Return Data Type Object Base Type |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1718 |
def GetDataTypeBaseType(self, datatype): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1719 |
basetype_content = datatype.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1720 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1721 |
if basetype_content_type in ["array", "subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1722 |
basetype = basetype_content.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1723 |
basetype_type = basetype.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1724 |
return (basetype.getname() if basetype_type == "derived" |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1725 |
else basetype_type.upper()) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
1726 |
return (basetype_content.getname() if basetype_content_type == "derived" |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
1727 |
else basetype_content_type.upper()) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1728 |
return None |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1729 |
|
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1730 |
# Return Base Type of given possible derived type |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1731 |
def GetBaseType(self, typename, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1732 |
if TypeHierarchy.has_key(typename): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1733 |
return typename |
1411 | 1734 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1735 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1736 |
if datatype 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
|
1737 |
basetype = self.GetDataTypeBaseType(datatype) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1738 |
if basetype 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
|
1739 |
return self.GetBaseType(basetype, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1740 |
return typename |
1411 | 1741 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1742 |
return None |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1743 |
|
814 | 1744 |
def GetBaseTypes(self): |
1745 |
''' |
|
1746 |
return the list of datatypes defined in IEC 61131-3. |
|
1747 |
TypeHierarchy_list has a rough order to it (e.g. SINT, INT, DINT, ...), |
|
1748 |
which makes it easy for a user to find a type in a menu. |
|
1749 |
''' |
|
1750 |
return [x for x,y in TypeHierarchy_list if not x.startswith("ANY")] |
|
1751 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1752 |
def IsOfType(self, typename, reference, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1753 |
if reference is None or typename == reference: |
814 | 1754 |
return True |
1411 | 1755 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1756 |
basetype = TypeHierarchy.get(typename) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1757 |
if basetype 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
|
1758 |
return self.IsOfType(basetype, reference) |
1411 | 1759 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1760 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1761 |
if datatype 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
|
1762 |
basetype = self.GetDataTypeBaseType(datatype) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1763 |
if basetype 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
|
1764 |
return self.IsOfType(basetype, reference, debug) |
1411 | 1765 |
|
814 | 1766 |
return False |
1411 | 1767 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1768 |
def IsEndType(self, typename): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1769 |
if typename 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
|
1770 |
return not typename.startswith("ANY") |
814 | 1771 |
return True |
1772 |
||
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
|
1773 |
def IsLocatableDataType(self, datatype, debug = 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
|
1774 |
basetype_content = datatype.baseType.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
|
1775 |
basetype_content_type = basetype_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
|
1776 |
if basetype_content_type in ["enum", "struct"]: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1777 |
return 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
|
1778 |
elif basetype_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
|
1779 |
return self.IsLocatableType(basetype_content.getname()) |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
1780 |
elif basetype_content_type == "array": |
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
|
1781 |
array_base_type = basetype_content.baseType.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
|
1782 |
if array_base_type.getLocalTag() == "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
|
1783 |
return self.IsLocatableType(array_base_type.getname(), debug) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1784 |
return True |
1411 | 1785 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1786 |
def IsLocatableType(self, typename, debug = False): |
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
|
1787 |
if isinstance(typename, TupleType) or self.GetBlockType(typename) is not None: |
884
e12228fd8773
Add function block types as data types that are not locatable
Laurent Bessard
parents:
883
diff
changeset
|
1788 |
return False |
1411 | 1789 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1790 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1791 |
if datatype is not None: |
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
|
1792 |
return self.IsLocatableDataType(datatype) |
814 | 1793 |
return True |
1411 | 1794 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1795 |
def IsEnumeratedType(self, typename, debug = False): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1796 |
if isinstance(typename, TupleType): |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1797 |
typename = typename[1] |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1798 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1799 |
if datatype 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
|
1800 |
basetype_content = datatype.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1801 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1802 |
if basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1803 |
return self.IsEnumeratedType(basetype_content_type, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1804 |
return basetype_content_type == "enum" |
814 | 1805 |
return False |
1806 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1807 |
def IsSubrangeType(self, typename, exclude=None, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1808 |
if typename == exclude: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1809 |
return False |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1810 |
if isinstance(typename, TupleType): |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1811 |
typename = typename[1] |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1812 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1813 |
if datatype 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
|
1814 |
basetype_content = datatype.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1815 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1816 |
if basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1817 |
return self.IsSubrangeType(basetype_content_type, exclude, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1818 |
elif basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1819 |
return not self.IsOfType( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1820 |
self.GetDataTypeBaseType(datatype), exclude) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1821 |
return False |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1822 |
|
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1823 |
def IsNumType(self, typename, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1824 |
return self.IsOfType(typename, "ANY_NUM", debug) or\ |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1825 |
self.IsOfType(typename, "ANY_BIT", debug) |
1411 | 1826 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1827 |
def GetDataTypeRange(self, typename, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1828 |
range = DataTypeRange.get(typename) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1829 |
if range 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
|
1830 |
return range |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1831 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1832 |
if datatype 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
|
1833 |
basetype_content = datatype.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1834 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1835 |
if basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1836 |
return (basetype_content.range.getlower(), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1837 |
basetype_content.range.getupper()) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1838 |
elif basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1839 |
return self.GetDataTypeRange(basetype_content.getname(), debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1840 |
return None |
1411 | 1841 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1842 |
# Return Subrange types |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1843 |
def GetSubrangeBaseTypes(self, exclude, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1844 |
subrange_basetypes = DataTypeRange.keys() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1845 |
project = self.GetProject(debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1846 |
if project 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
|
1847 |
subrange_basetypes.extend( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1848 |
[datatype.getname() for datatype in project.getdataTypes() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1849 |
if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1850 |
for confnodetype in self.ConfNodeTypes: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1851 |
subrange_basetypes.extend( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1852 |
[datatype.getname() for datatype in confnodetype["types"].getdataTypes() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1853 |
if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1854 |
return subrange_basetypes |
1411 | 1855 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1856 |
# Return Enumerated Values |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1857 |
def GetEnumeratedDataValues(self, typename = None, debug = False): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1858 |
values = [] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1859 |
if typename 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
|
1860 |
datatype_obj = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1861 |
if datatype_obj 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
|
1862 |
basetype_content = datatype_obj.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1863 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1864 |
if basetype_content_type == "enum": |
1411 | 1865 |
return [value.getname() |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1866 |
for value in basetype_content.xpath( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1867 |
"ppx:values/ppx:value", |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1868 |
namespaces=PLCOpenParser.NSMAP)] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1869 |
elif basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1870 |
return self.GetEnumeratedDataValues(basetype_content.getname(), debug) |
814 | 1871 |
else: |
1872 |
project = self.GetProject(debug) |
|
1873 |
if project 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
|
1874 |
values.extend(project.GetEnumeratedDataTypeValues()) |
814 | 1875 |
for confnodetype in self.ConfNodeTypes: |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1876 |
values.extend(confnodetype["types"].GetEnumeratedDataTypeValues()) |
814 | 1877 |
return values |
1878 |
||
1879 |
#------------------------------------------------------------------------------- |
|
1880 |
# Project Element tag name computation functions |
|
1881 |
#------------------------------------------------------------------------------- |
|
1411 | 1882 |
|
814 | 1883 |
# Compute a data type name |
1884 |
def ComputeDataTypeName(self, datatype): |
|
1885 |
return "D::%s" % datatype |
|
1411 | 1886 |
|
814 | 1887 |
# Compute a pou name |
1888 |
def ComputePouName(self, pou): |
|
1889 |
return "P::%s" % pou |
|
1411 | 1890 |
|
814 | 1891 |
# Compute a pou transition name |
1892 |
def ComputePouTransitionName(self, pou, transition): |
|
1893 |
return "T::%s::%s" % (pou, transition) |
|
1411 | 1894 |
|
814 | 1895 |
# Compute a pou action name |
1896 |
def ComputePouActionName(self, pou, action): |
|
1897 |
return "A::%s::%s" % (pou, action) |
|
1898 |
||
1899 |
# Compute a pou name |
|
1900 |
def ComputeConfigurationName(self, config): |
|
1901 |
return "C::%s" % config |
|
1902 |
||
1903 |
# Compute a pou name |
|
1904 |
def ComputeConfigurationResourceName(self, config, resource): |
|
1905 |
return "R::%s::%s" % (config, resource) |
|
1906 |
||
1907 |
def GetElementType(self, tagname): |
|
1908 |
words = tagname.split("::") |
|
1411 | 1909 |
return {"D" : ITEM_DATATYPE, "P" : ITEM_POU, |
814 | 1910 |
"T" : ITEM_TRANSITION, "A" : ITEM_ACTION, |
1911 |
"C" : ITEM_CONFIGURATION, "R" : ITEM_RESOURCE}[words[0]] |
|
1912 |
||
1913 |
#------------------------------------------------------------------------------- |
|
1914 |
# Project opened Data types management functions |
|
1915 |
#------------------------------------------------------------------------------- |
|
1916 |
||
1917 |
# Return the data type informations |
|
1918 |
def GetDataTypeInfos(self, tagname, debug = False): |
|
1919 |
project = self.GetProject(debug) |
|
1920 |
if project is not None: |
|
1921 |
words = tagname.split("::") |
|
1922 |
if words[0] == "D": |
|
1923 |
infos = {} |
|
1924 |
datatype = project.getdataType(words[1]) |
|
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1925 |
if datatype is None: |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1926 |
return None |
814 | 1927 |
basetype_content = datatype.baseType.getcontent() |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1928 |
basetype_content_type = basetype_content.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1929 |
if basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
814 | 1930 |
infos["type"] = "Subrange" |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1931 |
infos["min"] = basetype_content.range.getlower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1932 |
infos["max"] = basetype_content.range.getupper() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1933 |
base_type = basetype_content.baseType.getcontent() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1934 |
base_type_type = base_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1935 |
infos["base_type"] = (base_type.getname() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1936 |
if base_type_type == "derived" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1937 |
else base_type_type) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1938 |
elif basetype_content_type == "enum": |
814 | 1939 |
infos["type"] = "Enumerated" |
1940 |
infos["values"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1941 |
for value in basetype_content.xpath("ppx:values/ppx:value", namespaces=PLCOpenParser.NSMAP): |
814 | 1942 |
infos["values"].append(value.getname()) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1943 |
elif basetype_content_type == "array": |
814 | 1944 |
infos["type"] = "Array" |
1945 |
infos["dimensions"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1946 |
for dimension in basetype_content.getdimension(): |
814 | 1947 |
infos["dimensions"].append((dimension.getlower(), dimension.getupper())) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1948 |
base_type = basetype_content.baseType.getcontent() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1949 |
base_type_type = base_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1950 |
infos["base_type"] = (base_type.getname() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1951 |
if base_type_type == "derived" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1952 |
else base_type_type.upper()) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1953 |
elif basetype_content_type == "struct": |
814 | 1954 |
infos["type"] = "Structure" |
1955 |
infos["elements"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1956 |
for element in basetype_content.getvariable(): |
814 | 1957 |
element_infos = {} |
1958 |
element_infos["Name"] = element.getname() |
|
1959 |
element_type = element.type.getcontent() |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1960 |
element_type_type = element_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1961 |
if element_type_type == "array": |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1962 |
dimensions = [] |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1963 |
for dimension in element_type.getdimension(): |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1964 |
dimensions.append((dimension.getlower(), dimension.getupper())) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1965 |
base_type = element_type.baseType.getcontent() |
1502
62eb21aab1fb
fix display of ARRAY fields inside of structure data types.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1477
diff
changeset
|
1966 |
base_type_type = base_type.getLocalTag() |
1411 | 1967 |
element_infos["Type"] = ("array", |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1968 |
base_type.getname() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1969 |
if base_type_type == "derived" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1970 |
else base_type_type.upper(), dimensions) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1971 |
elif element_type_type == "derived": |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1972 |
element_infos["Type"] = element_type.getname() |
814 | 1973 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1974 |
element_infos["Type"] = element_type_type.upper() |
814 | 1975 |
if element.initialValue is not None: |
1508
4c645e6b8c98
fix error if non-latin character was entered in initial value in
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1505
diff
changeset
|
1976 |
element_infos["Initial Value"] = element.initialValue.getvalue() |
814 | 1977 |
else: |
1978 |
element_infos["Initial Value"] = "" |
|
1979 |
infos["elements"].append(element_infos) |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1980 |
else: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1981 |
infos["type"] = "Directly" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1982 |
infos["base_type"] = (basetype_content.getname() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1983 |
if basetype_content_type == "derived" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1984 |
else basetype_content_type.upper()) |
1411 | 1985 |
|
814 | 1986 |
if datatype.initialValue is not None: |
1508
4c645e6b8c98
fix error if non-latin character was entered in initial value in
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1505
diff
changeset
|
1987 |
infos["initial"] = datatype.initialValue.getvalue() |
814 | 1988 |
else: |
1989 |
infos["initial"] = "" |
|
1990 |
return infos |
|
1991 |
return None |
|
1411 | 1992 |
|
814 | 1993 |
# Change the data type informations |
1994 |
def SetDataTypeInfos(self, tagname, infos): |
|
1995 |
words = tagname.split("::") |
|
1996 |
if self.Project is not None and words[0] == "D": |
|
1997 |
datatype = self.Project.getdataType(words[1]) |
|
1998 |
if infos["type"] == "Directly": |
|
1999 |
if infos["base_type"] in self.GetBaseTypes(): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2000 |
datatype.baseType.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2001 |
infos["base_type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2002 |
if infos["base_type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2003 |
else infos["base_type"], "dataType")) |
814 | 2004 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2005 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 2006 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2007 |
datatype.baseType.setcontent(derived_datatype) |
814 | 2008 |
elif infos["type"] == "Subrange": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2009 |
subrange = PLCOpenParser.CreateElement( |
1411 | 2010 |
"subrangeUnsigned" |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2011 |
if infos["base_type"] in GetSubTypes("ANY_UINT") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2012 |
else "subrangeSigned", "dataType") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2013 |
datatype.baseType.setcontent(subrange) |
814 | 2014 |
subrange.range.setlower(infos["min"]) |
2015 |
subrange.range.setupper(infos["max"]) |
|
2016 |
if infos["base_type"] in self.GetBaseTypes(): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2017 |
subrange.baseType.setcontent( |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2018 |
PLCOpenParser.CreateElement(infos["base_type"], "dataType")) |
814 | 2019 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2020 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 2021 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2022 |
subrange.baseType.setcontent(derived_datatype) |
814 | 2023 |
elif infos["type"] == "Enumerated": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2024 |
enumerated = PLCOpenParser.CreateElement("enum", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2025 |
datatype.baseType.setcontent(enumerated) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2026 |
values = PLCOpenParser.CreateElement("values", "enum") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2027 |
enumerated.setvalues(values) |
814 | 2028 |
for i, enum_value in enumerate(infos["values"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2029 |
value = PLCOpenParser.CreateElement("value", "values") |
814 | 2030 |
value.setname(enum_value) |
2031 |
if i == 0: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2032 |
values.setvalue([value]) |
814 | 2033 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2034 |
values.appendvalue(value) |
814 | 2035 |
elif infos["type"] == "Array": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2036 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2037 |
datatype.baseType.setcontent(array) |
814 | 2038 |
for i, dimension in enumerate(infos["dimensions"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2039 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 2040 |
dimension_range.setlower(dimension[0]) |
2041 |
dimension_range.setupper(dimension[1]) |
|
2042 |
if i == 0: |
|
2043 |
array.setdimension([dimension_range]) |
|
2044 |
else: |
|
2045 |
array.appenddimension(dimension_range) |
|
2046 |
if infos["base_type"] in self.GetBaseTypes(): |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2047 |
array.baseType.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2048 |
infos["base_type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2049 |
if infos["base_type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2050 |
else infos["base_type"], "dataType")) |
814 | 2051 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2052 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 2053 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2054 |
array.baseType.setcontent(derived_datatype) |
814 | 2055 |
elif infos["type"] == "Structure": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2056 |
struct = PLCOpenParser.CreateElement("struct", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2057 |
datatype.baseType.setcontent(struct) |
814 | 2058 |
for i, element_infos in enumerate(infos["elements"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2059 |
element = PLCOpenParser.CreateElement("variable", "struct") |
814 | 2060 |
element.setname(element_infos["Name"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2061 |
element_type = PLCOpenParser.CreateElement("type", "variable") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2062 |
if isinstance(element_infos["Type"], TupleType): |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2063 |
if element_infos["Type"][0] == "array": |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2064 |
array_type, base_type_name, dimensions = element_infos["Type"] |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2065 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1477
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
2066 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
2067 |
array.setbaseType(baseType) |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2068 |
element_type.setcontent(array) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2069 |
for j, dimension in enumerate(dimensions): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2070 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2071 |
dimension_range.setlower(dimension[0]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2072 |
dimension_range.setupper(dimension[1]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2073 |
if j == 0: |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2074 |
array.setdimension([dimension_range]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2075 |
else: |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2076 |
array.appenddimension(dimension_range) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2077 |
if base_type_name in self.GetBaseTypes(): |
1477
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
2078 |
baseType.setcontent(PLCOpenParser.CreateElement( |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2079 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2080 |
if base_type_name in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2081 |
else base_type_name, "dataType")) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2082 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2083 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2084 |
derived_datatype.setname(base_type_name) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2085 |
array.baseType.setcontent(derived_datatype) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
2086 |
elif element_infos["Type"] in self.GetBaseTypes(): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2087 |
element_type.setcontent( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2088 |
PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2089 |
element_infos["Type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2090 |
if element_infos["Type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2091 |
else element_infos["Type"], "dataType")) |
814 | 2092 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2093 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 2094 |
derived_datatype.setname(element_infos["Type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2095 |
element_type.setcontent(derived_datatype) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2096 |
element.settype(element_type) |
814 | 2097 |
if element_infos["Initial Value"] != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2098 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
814 | 2099 |
value.setvalue(element_infos["Initial Value"]) |
2100 |
element.setinitialValue(value) |
|
2101 |
if i == 0: |
|
2102 |
struct.setvariable([element]) |
|
2103 |
else: |
|
2104 |
struct.appendvariable(element) |
|
2105 |
if infos["initial"] != "": |
|
2106 |
if datatype.initialValue is None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2107 |
datatype.initialValue = PLCOpenParser.CreateElement("initialValue", "dataType") |
814 | 2108 |
datatype.initialValue.setvalue(infos["initial"]) |
2109 |
else: |
|
2110 |
datatype.initialValue = None |
|
2111 |
self.BufferProject() |
|
1411 | 2112 |
|
814 | 2113 |
#------------------------------------------------------------------------------- |
2114 |
# Project opened Pous management functions |
|
2115 |
#------------------------------------------------------------------------------- |
|
2116 |
||
2117 |
# Return edited element |
|
2118 |
def GetEditedElement(self, tagname, debug = False): |
|
2119 |
project = self.GetProject(debug) |
|
2120 |
if project is not None: |
|
2121 |
words = tagname.split("::") |
|
2122 |
if words[0] == "D": |
|
2123 |
return project.getdataType(words[1]) |
|
2124 |
elif words[0] == "P": |
|
2125 |
return project.getpou(words[1]) |
|
2126 |
elif words[0] in ['T', 'A']: |
|
2127 |
pou = project.getpou(words[1]) |
|
2128 |
if pou is not None: |
|
2129 |
if words[0] == 'T': |
|
2130 |
return pou.gettransition(words[2]) |
|
2131 |
elif words[0] == 'A': |
|
2132 |
return pou.getaction(words[2]) |
|
2133 |
elif words[0] == 'C': |
|
2134 |
return project.getconfiguration(words[1]) |
|
2135 |
elif words[0] == 'R': |
|
2136 |
return project.getconfigurationResource(words[1], words[2]) |
|
2137 |
return None |
|
1411 | 2138 |
|
814 | 2139 |
# Return edited element name |
2140 |
def GetEditedElementName(self, tagname): |
|
2141 |
words = tagname.split("::") |
|
2142 |
if words[0] in ["P","C","D"]: |
|
2143 |
return words[1] |
|
2144 |
else: |
|
2145 |
return words[2] |
|
2146 |
return None |
|
1411 | 2147 |
|
814 | 2148 |
# Return edited element name and type |
2149 |
def GetEditedElementType(self, tagname, debug = False): |
|
2150 |
words = tagname.split("::") |
|
2151 |
if words[0] in ["P","T","A"]: |
|
2152 |
return words[1], self.GetPouType(words[1], debug) |
|
2153 |
return None, None |
|
2154 |
||
2155 |
# Return language in which edited element is written |
|
2156 |
def GetEditedElementBodyType(self, tagname, debug = False): |
|
2157 |
words = tagname.split("::") |
|
2158 |
if words[0] == "P": |
|
2159 |
return self.GetPouBodyType(words[1], debug) |
|
2160 |
elif words[0] == 'T': |
|
2161 |
return self.GetTransitionBodyType(words[1], words[2], debug) |
|
2162 |
elif words[0] == 'A': |
|
2163 |
return self.GetActionBodyType(words[1], words[2], debug) |
|
2164 |
return None |
|
2165 |
||
2166 |
# Return the edited element variables |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2167 |
def GetEditedElementInterfaceVars(self, tagname, tree=False, debug = False): |
814 | 2168 |
words = tagname.split("::") |
2169 |
if words[0] in ["P","T","A"]: |
|
2170 |
project = self.GetProject(debug) |
|
2171 |
if project is not None: |
|
2172 |
pou = project.getpou(words[1]) |
|
2173 |
if pou is not None: |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2174 |
return self.GetPouInterfaceVars(pou, tree, debug) |
814 | 2175 |
return [] |
2176 |
||
2177 |
# Return the edited element return type |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2178 |
def GetEditedElementInterfaceReturnType(self, tagname, tree=False, debug = False): |
814 | 2179 |
words = tagname.split("::") |
2180 |
if words[0] == "P": |
|
2181 |
project = self.GetProject(debug) |
|
2182 |
if project is not None: |
|
2183 |
pou = self.Project.getpou(words[1]) |
|
2184 |
if pou is not None: |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2185 |
return self.GetPouInterfaceReturnType(pou, tree, debug) |
814 | 2186 |
elif words[0] == 'T': |
1616
3638463d6e02
fix issue with creating SFC transitions using ST and IL
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1581
diff
changeset
|
2187 |
return ["BOOL", ([], [])] |
814 | 2188 |
return None |
1411 | 2189 |
|
814 | 2190 |
# Change the edited element text |
2191 |
def SetEditedElementText(self, tagname, text): |
|
2192 |
if self.Project is not None: |
|
2193 |
element = self.GetEditedElement(tagname) |
|
2194 |
if element is not None: |
|
2195 |
element.settext(text) |
|
1411 | 2196 |
|
814 | 2197 |
# Return the edited element text |
2198 |
def GetEditedElementText(self, tagname, debug = False): |
|
2199 |
element = self.GetEditedElement(tagname, debug) |
|
2200 |
if element is not None: |
|
2201 |
return element.gettext() |
|
2202 |
return "" |
|
2203 |
||
2204 |
# Return the edited element transitions |
|
2205 |
def GetEditedElementTransitions(self, tagname, debug = False): |
|
2206 |
pou = self.GetEditedElement(tagname, debug) |
|
2207 |
if pou is not None and pou.getbodyType() == "SFC": |
|
2208 |
transitions = [] |
|
2209 |
for transition in pou.gettransitionList(): |
|
2210 |
transitions.append(transition.getname()) |
|
2211 |
return transitions |
|
2212 |
return [] |
|
2213 |
||
2214 |
# Return edited element transitions |
|
2215 |
def GetEditedElementActions(self, tagname, debug = False): |
|
2216 |
pou = self.GetEditedElement(tagname, debug) |
|
2217 |
if pou is not None and pou.getbodyType() == "SFC": |
|
2218 |
actions = [] |
|
2219 |
for action in pou.getactionList(): |
|
2220 |
actions.append(action.getname()) |
|
2221 |
return actions |
|
2222 |
return [] |
|
2223 |
||
2224 |
# Return the names of the pou elements |
|
2225 |
def GetEditedElementVariables(self, tagname, debug = False): |
|
2226 |
words = tagname.split("::") |
|
2227 |
if words[0] in ["P","T","A"]: |
|
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:
1127
diff
changeset
|
2228 |
return self.GetProjectPouVariableNames(words[1], debug) |
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:
1127
diff
changeset
|
2229 |
elif words[0] in ["C", "R"]: |
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:
1127
diff
changeset
|
2230 |
names = self.GetConfigurationVariableNames(words[1], debug) |
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:
1127
diff
changeset
|
2231 |
if words[0] == "R": |
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:
1127
diff
changeset
|
2232 |
names.extend(self.GetConfigurationResourceVariableNames( |
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:
1127
diff
changeset
|
2233 |
words[1], words[2], debug)) |
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:
1127
diff
changeset
|
2234 |
return names |
814 | 2235 |
return [] |
2236 |
||
2237 |
def GetEditedElementCopy(self, tagname, debug = False): |
|
2238 |
element = self.GetEditedElement(tagname, debug) |
|
2239 |
if element is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2240 |
return element.tostring() |
814 | 2241 |
return "" |
1411 | 2242 |
|
814 | 2243 |
def GetEditedElementInstancesCopy(self, tagname, blocks_id = None, wires = None, debug = False): |
2244 |
element = self.GetEditedElement(tagname, debug) |
|
2245 |
text = "" |
|
2246 |
if element is not None: |
|
1411 | 2247 |
wires = dict([(wire, True) |
2248 |
for wire in wires |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2249 |
if wire[0] in blocks_id and wire[1] in blocks_id]) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2250 |
copy_body = PLCOpenParser.CreateElement("body", "pou") |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2251 |
element.append(copy_body) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2252 |
copy_body.setcontent( |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2253 |
PLCOpenParser.CreateElement(element.getbodyType(), "body")) |
814 | 2254 |
for id in blocks_id: |
2255 |
instance = element.getinstance(id) |
|
2256 |
if instance is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2257 |
copy_body.appendcontentInstance(self.Copy(instance)) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2258 |
instance_copy = copy_body.getcontentInstance(id) |
814 | 2259 |
instance_copy.filterConnections(wires) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2260 |
text += instance_copy.tostring() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2261 |
element.remove(copy_body) |
814 | 2262 |
return text |
1411 | 2263 |
|
1122
84de51ab40d2
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
Laurent Bessard
parents:
1096
diff
changeset
|
2264 |
def GenerateNewName(self, tagname, name, format, start_idx=0, exclude={}, debug=False): |
814 | 2265 |
names = exclude.copy() |
2266 |
if tagname is not None: |
|
1411 | 2267 |
names.update(dict([(varname.upper(), True) |
1122
84de51ab40d2
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
Laurent Bessard
parents:
1096
diff
changeset
|
2268 |
for varname in self.GetEditedElementVariables(tagname, debug)])) |
1127
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2269 |
words = tagname.split("::") |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2270 |
if words[0] in ["P","T","A"]: |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2271 |
element = self.GetEditedElement(tagname, debug) |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2272 |
if element is not None and element.getbodyType() not in ["ST", "IL"]: |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2273 |
for instance in element.getinstances(): |
1411 | 2274 |
if isinstance(instance, |
2275 |
(PLCOpenParser.GetElementClass("step", "sfcObjects"), |
|
2276 |
PLCOpenParser.GetElementClass("connector", "commonObjects"), |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2277 |
PLCOpenParser.GetElementClass("continuation", "commonObjects"))): |
1127
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
2278 |
names[instance.getname().upper()] = True |
814 | 2279 |
else: |
2280 |
project = self.GetProject(debug) |
|
2281 |
if project is not None: |
|
2282 |
for datatype in project.getdataTypes(): |
|
2283 |
names[datatype.getname().upper()] = True |
|
2284 |
for pou in project.getpous(): |
|
2285 |
names[pou.getname().upper()] = True |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2286 |
for var in self.GetPouInterfaceVars(pou, debug=debug): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
2287 |
names[var.Name.upper()] = True |
814 | 2288 |
for transition in pou.gettransitionList(): |
2289 |
names[transition.getname().upper()] = True |
|
2290 |
for action in pou.getactionList(): |
|
2291 |
names[action.getname().upper()] = True |
|
2292 |
for config in project.getconfigurations(): |
|
2293 |
names[config.getname().upper()] = True |
|
2294 |
for resource in config.getresource(): |
|
2295 |
names[resource.getname().upper()] = True |
|
1411 | 2296 |
|
1122
84de51ab40d2
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
Laurent Bessard
parents:
1096
diff
changeset
|
2297 |
i = start_idx |
814 | 2298 |
while name is None or names.get(name.upper(), False): |
2299 |
name = (format%i) |
|
2300 |
i += 1 |
|
2301 |
return name |
|
1411 | 2302 |
|
814 | 2303 |
def PasteEditedElementInstances(self, tagname, text, new_pos, middle=False, debug=False): |
2304 |
element = self.GetEditedElement(tagname, debug) |
|
2305 |
element_name, element_type = self.GetEditedElementType(tagname, debug) |
|
2306 |
if element is not None: |
|
2307 |
bodytype = element.getbodyType() |
|
1411 | 2308 |
|
814 | 2309 |
# Get edited element type scaling |
2310 |
scaling = None |
|
2311 |
project = self.GetProject(debug) |
|
2312 |
if project is not None: |
|
2313 |
properties = project.getcontentHeader() |
|
2314 |
scaling = properties["scaling"][bodytype] |
|
1411 | 2315 |
|
814 | 2316 |
# Get ids already by all the instances in edited element |
2317 |
used_id = dict([(instance.getlocalId(), True) for instance in element.getinstances()]) |
|
2318 |
new_id = {} |
|
1411 | 2319 |
|
814 | 2320 |
try: |
1505
5ecb16be9a3c
fix copying elements with non-latin content like comment element, or
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1502
diff
changeset
|
2321 |
instances, error = LoadPouInstances(text, bodytype) |
814 | 2322 |
except: |
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:
1328
diff
changeset
|
2323 |
instances, error = [], "" |
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:
1328
diff
changeset
|
2324 |
if error is not None or len(instances) == 0: |
814 | 2325 |
return _("Invalid plcopen element(s)!!!") |
1411 | 2326 |
|
814 | 2327 |
exclude = {} |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2328 |
for instance in instances: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2329 |
element.addinstance(instance) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2330 |
instance_type = instance.getLocalTag() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2331 |
if instance_type == "block": |
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2332 |
blocktype = instance.gettypeName() |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2333 |
blocktype_infos = self.GetBlockType(blocktype) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2334 |
blockname = instance.getinstanceName() |
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2335 |
if blocktype_infos["type"] != "function" and blockname is not None: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2336 |
if element_type == "function": |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2337 |
return _("FunctionBlock \"%s\" can't be pasted in a Function!!!")%blocktype |
1411 | 2338 |
blockname = self.GenerateNewName(tagname, |
2339 |
blockname, |
|
2340 |
"%s%%d"%blocktype, |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2341 |
debug=debug) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2342 |
exclude[blockname] = True |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2343 |
instance.setinstanceName(blockname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2344 |
self.AddEditedElementPouVar(tagname, blocktype, blockname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2345 |
elif instance_type == "step": |
1411 | 2346 |
stepname = self.GenerateNewName(tagname, |
2347 |
instance.getname(), |
|
2348 |
"Step%d", |
|
2349 |
exclude=exclude, |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2350 |
debug=debug) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2351 |
exclude[stepname] = True |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2352 |
instance.setname(stepname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2353 |
localid = instance.getlocalId() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2354 |
if not used_id.has_key(localid): |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2355 |
new_id[localid] = True |
1411 | 2356 |
|
814 | 2357 |
idx = 1 |
2358 |
translate_id = {} |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2359 |
bbox = rect() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2360 |
for instance in instances: |
814 | 2361 |
localId = instance.getlocalId() |
2362 |
bbox.union(instance.getBoundingBox()) |
|
2363 |
if used_id.has_key(localId): |
|
2364 |
while used_id.has_key(idx) or new_id.has_key(idx): |
|
2365 |
idx += 1 |
|
2366 |
new_id[idx] = True |
|
2367 |
instance.setlocalId(idx) |
|
2368 |
translate_id[localId] = idx |
|
1411 | 2369 |
|
814 | 2370 |
x, y, width, height = bbox.bounding_box() |
2371 |
if middle: |
|
2372 |
new_pos[0] -= width / 2 |
|
2373 |
new_pos[1] -= height / 2 |
|
2374 |
else: |
|
2375 |
new_pos = map(lambda x: x + 30, new_pos) |
|
2376 |
if scaling[0] != 0 and scaling[1] != 0: |
|
2377 |
min_pos = map(lambda x: 30 / x, scaling) |
|
2378 |
minx = round(min_pos[0]) |
|
2379 |
if int(min_pos[0]) == round(min_pos[0]): |
|
2380 |
minx += 1 |
|
2381 |
miny = round(min_pos[1]) |
|
2382 |
if int(min_pos[1]) == round(min_pos[1]): |
|
2383 |
miny += 1 |
|
2384 |
minx *= scaling[0] |
|
2385 |
miny *= scaling[1] |
|
2386 |
new_pos = (max(minx, round(new_pos[0] / scaling[0]) * scaling[0]), |
|
2387 |
max(miny, round(new_pos[1] / scaling[1]) * scaling[1])) |
|
2388 |
else: |
|
2389 |
new_pos = (max(30, new_pos[0]), max(30, new_pos[1])) |
|
1367
324767a092dc
Fixed bug when pasting element with an odd width or height
Laurent Bessard
parents:
1361
diff
changeset
|
2390 |
diff = (int(new_pos[0] - x), int(new_pos[1] - y)) |
1411 | 2391 |
|
814 | 2392 |
connections = {} |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2393 |
for instance in instances: |
814 | 2394 |
connections.update(instance.updateConnectionsId(translate_id)) |
2395 |
if getattr(instance, "setexecutionOrderId", None) is not None: |
|
2396 |
instance.setexecutionOrderId(0) |
|
2397 |
instance.translate(*diff) |
|
1411 | 2398 |
|
814 | 2399 |
return new_id, connections |
1411 | 2400 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2401 |
def GetEditedElementInstancesInfos(self, tagname, debug = False): |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2402 |
element_instances = OrderedDict() |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
2403 |
element = self.GetEditedElement(tagname, debug) |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
2404 |
if element is not None: |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2405 |
factory = BlockInstanceFactory(element_instances) |
1411 | 2406 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2407 |
pou_block_instances_xslt_tree = etree.XSLT( |
1411 | 2408 |
pou_block_instances_xslt, |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2409 |
extensions = { |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2410 |
("pou_block_instances_ns", name): getattr(factory, name) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2411 |
for name in ["AddBlockInstance", "SetSpecificValues", |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2412 |
"AddInstanceConnection", "AddConnectionLink", |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2413 |
"AddLinkPoint", "AddAction"]}) |
1411 | 2414 |
|
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2415 |
pou_block_instances_xslt_tree(element) |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
2416 |
return element_instances |
1411 | 2417 |
|
814 | 2418 |
def ClearEditedElementExecutionOrder(self, tagname): |
2419 |
element = self.GetEditedElement(tagname) |
|
2420 |
if element is not None: |
|
2421 |
element.resetexecutionOrder() |
|
1411 | 2422 |
|
814 | 2423 |
def ResetEditedElementExecutionOrder(self, tagname): |
2424 |
element = self.GetEditedElement(tagname) |
|
2425 |
if element is not None: |
|
2426 |
element.compileexecutionOrder() |
|
1411 | 2427 |
|
814 | 2428 |
def SetConnectionWires(self, connection, connector): |
2429 |
wires = connector.GetWires() |
|
2430 |
idx = 0 |
|
2431 |
for wire, handle in wires: |
|
2432 |
points = wire.GetPoints(handle != 0) |
|
2433 |
if handle == 0: |
|
2434 |
result = wire.GetConnectedInfos(-1) |
|
2435 |
else: |
|
2436 |
result = wire.GetConnectedInfos(0) |
|
2437 |
if result != None: |
|
2438 |
refLocalId, formalParameter = result |
|
2439 |
connections = connection.getconnections() |
|
2440 |
if connections is None or len(connection.getconnections()) <= idx: |
|
2441 |
connection.addconnection() |
|
2442 |
connection.setconnectionId(idx, refLocalId) |
|
2443 |
connection.setconnectionPoints(idx, points) |
|
2444 |
if formalParameter != "": |
|
2445 |
connection.setconnectionParameter(idx, formalParameter) |
|
2446 |
else: |
|
2447 |
connection.setconnectionParameter(idx, None) |
|
2448 |
idx += 1 |
|
1411 | 2449 |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2450 |
def GetVarTypeObject(self, var_type): |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2451 |
var_type_obj = PLCOpenParser.CreateElement("type", "variable") |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2452 |
if not var_type.startswith("ANY") and TypeHierarchy.get(var_type): |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2453 |
var_type_obj.setcontent(PLCOpenParser.CreateElement( |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2454 |
var_type.lower() if var_type in ["STRING", "WSTRING"] |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2455 |
else var_type, "dataType")) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2456 |
else: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2457 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2458 |
derived_type.setname(var_type) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2459 |
var_type_obj.setcontent(derived_type) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2460 |
return var_type_obj |
1411 | 2461 |
|
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:
1390
diff
changeset
|
2462 |
def AddEditedElementPouVar(self, tagname, var_type, name,**args): |
814 | 2463 |
if self.Project is not None: |
2464 |
words = tagname.split("::") |
|
2465 |
if words[0] in ['P', 'T', 'A']: |
|
2466 |
pou = self.Project.getpou(words[1]) |
|
2467 |
if pou is not None: |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2468 |
pou.addpouLocalVar( |
1411 | 2469 |
self.GetVarTypeObject(var_type), |
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:
1390
diff
changeset
|
2470 |
name, **args) |
1411 | 2471 |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2472 |
def AddEditedElementPouExternalVar(self, tagname, var_type, name): |
814 | 2473 |
if self.Project is not None: |
2474 |
words = tagname.split("::") |
|
2475 |
if words[0] in ['P', 'T', 'A']: |
|
2476 |
pou = self.Project.getpou(words[1]) |
|
2477 |
if pou is not None: |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2478 |
pou.addpouExternalVar( |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2479 |
self.GetVarTypeObject(var_type), name) |
1411 | 2480 |
|
814 | 2481 |
def ChangeEditedElementPouVar(self, tagname, old_type, old_name, new_type, new_name): |
2482 |
if self.Project is not None: |
|
2483 |
words = tagname.split("::") |
|
2484 |
if words[0] in ['P', 'T', 'A']: |
|
2485 |
pou = self.Project.getpou(words[1]) |
|
2486 |
if pou is not None: |
|
2487 |
pou.changepouVar(old_type, old_name, new_type, new_name) |
|
1411 | 2488 |
|
814 | 2489 |
def RemoveEditedElementPouVar(self, tagname, type, name): |
2490 |
if self.Project is not None: |
|
2491 |
words = tagname.split("::") |
|
2492 |
if words[0] in ['P', 'T', 'A']: |
|
2493 |
pou = self.Project.getpou(words[1]) |
|
2494 |
if pou is not None: |
|
2495 |
pou.removepouVar(type, name) |
|
1411 | 2496 |
|
814 | 2497 |
def AddEditedElementBlock(self, tagname, id, blocktype, blockname = None): |
2498 |
element = self.GetEditedElement(tagname) |
|
2499 |
if element is not None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2500 |
block = PLCOpenParser.CreateElement("block", "fbdObjects") |
814 | 2501 |
block.setlocalId(id) |
2502 |
block.settypeName(blocktype) |
|
2503 |
blocktype_infos = self.GetBlockType(blocktype) |
|
2504 |
if blocktype_infos["type"] != "function" and blockname is not None: |
|
2505 |
block.setinstanceName(blockname) |
|
2506 |
self.AddEditedElementPouVar(tagname, blocktype, blockname) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2507 |
element.addinstance(block) |
1411 | 2508 |
|
814 | 2509 |
def SetEditedElementBlockInfos(self, tagname, id, infos): |
2510 |
element = self.GetEditedElement(tagname) |
|
2511 |
if element is not None: |
|
2512 |
block = element.getinstance(id) |
|
2513 |
if block is None: |
|
1411 | 2514 |
return |
814 | 2515 |
old_name = block.getinstanceName() |
2516 |
old_type = block.gettypeName() |
|
2517 |
new_name = infos.get("name", old_name) |
|
2518 |
new_type = infos.get("type", old_type) |
|
2519 |
if new_type != old_type: |
|
2520 |
old_typeinfos = self.GetBlockType(old_type) |
|
2521 |
new_typeinfos = self.GetBlockType(new_type) |
|
2522 |
if old_typeinfos is None or new_typeinfos is None: |
|
2523 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2524 |
elif new_typeinfos["type"] != old_typeinfos["type"]: |
|
2525 |
if new_typeinfos["type"] == "function": |
|
2526 |
self.RemoveEditedElementPouVar(tagname, old_type, old_name) |
|
2527 |
else: |
|
2528 |
self.AddEditedElementPouVar(tagname, new_type, new_name) |
|
2529 |
elif new_typeinfos["type"] != "function": |
|
2530 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2531 |
elif new_name != old_name: |
|
2532 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2533 |
for param, value in infos.items(): |
|
2534 |
if param == "name": |
|
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2535 |
if value != "": |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2536 |
block.setinstanceName(value) |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2537 |
else: |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2538 |
block.attrib.pop("instanceName", None) |
814 | 2539 |
elif param == "type": |
2540 |
block.settypeName(value) |
|
2541 |
elif param == "executionOrder" and block.getexecutionOrderId() != value: |
|
2542 |
element.setelementExecutionOrder(block, value) |
|
2543 |
elif param == "height": |
|
2544 |
block.setheight(value) |
|
2545 |
elif param == "width": |
|
2546 |
block.setwidth(value) |
|
2547 |
elif param == "x": |
|
2548 |
block.setx(value) |
|
2549 |
elif param == "y": |
|
2550 |
block.sety(value) |
|
2551 |
elif param == "connectors": |
|
2552 |
block.inputVariables.setvariable([]) |
|
2553 |
block.outputVariables.setvariable([]) |
|
2554 |
for connector in value["inputs"]: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2555 |
variable = PLCOpenParser.CreateElement("variable", "inputVariables") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2556 |
block.inputVariables.appendvariable(variable) |
814 | 2557 |
variable.setformalParameter(connector.GetName()) |
2558 |
if connector.IsNegated(): |
|
2559 |
variable.setnegated(True) |
|
2560 |
if connector.GetEdge() != "none": |
|
2561 |
variable.setedge(connector.GetEdge()) |
|
2562 |
position = connector.GetRelPosition() |
|
2563 |
variable.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2564 |
self.SetConnectionWires(variable.connectionPointIn, connector) |
|
2565 |
for connector in value["outputs"]: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2566 |
variable = PLCOpenParser.CreateElement("variable", "outputVariables") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2567 |
block.outputVariables.appendvariable(variable) |
814 | 2568 |
variable.setformalParameter(connector.GetName()) |
2569 |
if connector.IsNegated(): |
|
2570 |
variable.setnegated(True) |
|
2571 |
if connector.GetEdge() != "none": |
|
2572 |
variable.setedge(connector.GetEdge()) |
|
2573 |
position = connector.GetRelPosition() |
|
2574 |
variable.addconnectionPointOut() |
|
2575 |
variable.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2576 |
block.tostring() |
1411 | 2577 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2578 |
def AddEditedElementVariable(self, tagname, id, var_type): |
814 | 2579 |
element = self.GetEditedElement(tagname) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2580 |
if element is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2581 |
variable = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2582 |
{INPUT: "inVariable", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2583 |
OUTPUT: "outVariable", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2584 |
INOUT: "inOutVariable"}[var_type], "fbdObjects") |
814 | 2585 |
variable.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2586 |
element.addinstance(variable) |
1411 | 2587 |
|
814 | 2588 |
def SetEditedElementVariableInfos(self, tagname, id, infos): |
2589 |
element = self.GetEditedElement(tagname) |
|
2590 |
if element is not None: |
|
2591 |
variable = element.getinstance(id) |
|
2592 |
if variable is None: |
|
1411 | 2593 |
return |
814 | 2594 |
for param, value in infos.items(): |
2595 |
if param == "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:
1321
diff
changeset
|
2596 |
variable.setexpression(value) |
814 | 2597 |
elif param == "executionOrder" and variable.getexecutionOrderId() != value: |
2598 |
element.setelementExecutionOrder(variable, value) |
|
2599 |
elif param == "height": |
|
2600 |
variable.setheight(value) |
|
2601 |
elif param == "width": |
|
2602 |
variable.setwidth(value) |
|
2603 |
elif param == "x": |
|
2604 |
variable.setx(value) |
|
2605 |
elif param == "y": |
|
2606 |
variable.sety(value) |
|
2607 |
elif param == "connectors": |
|
2608 |
if len(value["outputs"]) > 0: |
|
2609 |
output = value["outputs"][0] |
|
2610 |
if len(value["inputs"]) > 0: |
|
2611 |
variable.setnegatedOut(output.IsNegated()) |
|
2612 |
variable.setedgeOut(output.GetEdge()) |
|
2613 |
else: |
|
2614 |
variable.setnegated(output.IsNegated()) |
|
2615 |
variable.setedge(output.GetEdge()) |
|
2616 |
position = output.GetRelPosition() |
|
2617 |
variable.addconnectionPointOut() |
|
2618 |
variable.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2619 |
if len(value["inputs"]) > 0: |
|
2620 |
input = value["inputs"][0] |
|
2621 |
if len(value["outputs"]) > 0: |
|
2622 |
variable.setnegatedIn(input.IsNegated()) |
|
2623 |
variable.setedgeIn(input.GetEdge()) |
|
2624 |
else: |
|
2625 |
variable.setnegated(input.IsNegated()) |
|
2626 |
variable.setedge(input.GetEdge()) |
|
2627 |
position = input.GetRelPosition() |
|
2628 |
variable.addconnectionPointIn() |
|
2629 |
variable.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2630 |
self.SetConnectionWires(variable.connectionPointIn, input) |
|
2631 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2632 |
def AddEditedElementConnection(self, tagname, id, connection_type): |
814 | 2633 |
element = self.GetEditedElement(tagname) |
2634 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2635 |
connection = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2636 |
{CONNECTOR: "connector", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2637 |
CONTINUATION: "continuation"}[connection_type], "commonObjects") |
814 | 2638 |
connection.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2639 |
element.addinstance(connection) |
1411 | 2640 |
|
814 | 2641 |
def SetEditedElementConnectionInfos(self, tagname, id, infos): |
2642 |
element = self.GetEditedElement(tagname) |
|
2643 |
if element is not None: |
|
2644 |
connection = element.getinstance(id) |
|
2645 |
if connection is None: |
|
2646 |
return |
|
2647 |
for param, value in infos.items(): |
|
2648 |
if param == "name": |
|
1411 | 2649 |
connection.setname(value) |
814 | 2650 |
elif param == "height": |
2651 |
connection.setheight(value) |
|
2652 |
elif param == "width": |
|
2653 |
connection.setwidth(value) |
|
2654 |
elif param == "x": |
|
2655 |
connection.setx(value) |
|
2656 |
elif param == "y": |
|
2657 |
connection.sety(value) |
|
2658 |
elif param == "connector": |
|
2659 |
position = value.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2660 |
if isinstance(connection, PLCOpenParser.GetElementClass("continuation", "commonObjects")): |
814 | 2661 |
connection.addconnectionPointOut() |
2662 |
connection.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2663 |
elif isinstance(connection, PLCOpenParser.GetElementClass("connector", "commonObjects")): |
814 | 2664 |
connection.addconnectionPointIn() |
2665 |
connection.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2666 |
self.SetConnectionWires(connection.connectionPointIn, value) |
|
2667 |
||
2668 |
def AddEditedElementComment(self, tagname, id): |
|
2669 |
element = self.GetEditedElement(tagname) |
|
2670 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2671 |
comment = PLCOpenParser.CreateElement("comment", "commonObjects") |
814 | 2672 |
comment.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2673 |
element.addinstance(comment) |
1411 | 2674 |
|
814 | 2675 |
def SetEditedElementCommentInfos(self, tagname, id, infos): |
2676 |
element = self.GetEditedElement(tagname) |
|
2677 |
if element is not None: |
|
2678 |
comment = element.getinstance(id) |
|
2679 |
for param, value in infos.items(): |
|
2680 |
if param == "content": |
|
2681 |
comment.setcontentText(value) |
|
2682 |
elif param == "height": |
|
2683 |
comment.setheight(value) |
|
2684 |
elif param == "width": |
|
2685 |
comment.setwidth(value) |
|
2686 |
elif param == "x": |
|
2687 |
comment.setx(value) |
|
2688 |
elif param == "y": |
|
2689 |
comment.sety(value) |
|
2690 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2691 |
def AddEditedElementPowerRail(self, tagname, id, powerrail_type): |
814 | 2692 |
element = self.GetEditedElement(tagname) |
2693 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2694 |
powerrail = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2695 |
{LEFTRAIL: "leftPowerRail", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2696 |
RIGHTRAIL: "rightPowerRail"}[powerrail_type], "ldObjects") |
814 | 2697 |
powerrail.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2698 |
element.addinstance(powerrail) |
1411 | 2699 |
|
814 | 2700 |
def SetEditedElementPowerRailInfos(self, tagname, id, infos): |
2701 |
element = self.GetEditedElement(tagname) |
|
2702 |
if element is not None: |
|
2703 |
powerrail = element.getinstance(id) |
|
2704 |
if powerrail is None: |
|
2705 |
return |
|
2706 |
for param, value in infos.items(): |
|
2707 |
if param == "height": |
|
2708 |
powerrail.setheight(value) |
|
2709 |
elif param == "width": |
|
2710 |
powerrail.setwidth(value) |
|
2711 |
elif param == "x": |
|
2712 |
powerrail.setx(value) |
|
2713 |
elif param == "y": |
|
2714 |
powerrail.sety(value) |
|
2715 |
elif param == "connectors": |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2716 |
if isinstance(powerrail, PLCOpenParser.GetElementClass("leftPowerRail", "ldObjects")): |
814 | 2717 |
powerrail.setconnectionPointOut([]) |
2718 |
for connector in value["outputs"]: |
|
2719 |
position = connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2720 |
connection = PLCOpenParser.CreateElement("connectionPointOut", "leftPowerRail") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2721 |
powerrail.appendconnectionPointOut(connection) |
814 | 2722 |
connection.setrelPositionXY(position.x, position.y) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2723 |
elif isinstance(powerrail, PLCOpenParser.GetElementClass("rightPowerRail", "ldObjects")): |
814 | 2724 |
powerrail.setconnectionPointIn([]) |
2725 |
for connector in value["inputs"]: |
|
2726 |
position = connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2727 |
connection = PLCOpenParser.CreateElement("connectionPointIn", "rightPowerRail") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2728 |
powerrail.appendconnectionPointIn(connection) |
814 | 2729 |
connection.setrelPositionXY(position.x, position.y) |
2730 |
self.SetConnectionWires(connection, connector) |
|
1411 | 2731 |
|
814 | 2732 |
def AddEditedElementContact(self, tagname, id): |
2733 |
element = self.GetEditedElement(tagname) |
|
2734 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2735 |
contact = PLCOpenParser.CreateElement("contact", "ldObjects") |
814 | 2736 |
contact.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2737 |
element.addinstance(contact) |
814 | 2738 |
|
2739 |
def SetEditedElementContactInfos(self, tagname, id, infos): |
|
2740 |
element = self.GetEditedElement(tagname) |
|
2741 |
if element is not None: |
|
2742 |
contact = element.getinstance(id) |
|
2743 |
if contact is None: |
|
2744 |
return |
|
2745 |
for param, value in infos.items(): |
|
2746 |
if param == "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:
1321
diff
changeset
|
2747 |
contact.setvariable(value) |
814 | 2748 |
elif param == "type": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2749 |
negated, edge = { |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2750 |
CONTACT_NORMAL: (False, "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2751 |
CONTACT_REVERSE: (True, "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2752 |
CONTACT_RISING: (False, "rising"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2753 |
CONTACT_FALLING: (False, "falling")}[value] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2754 |
contact.setnegated(negated) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2755 |
contact.setedge(edge) |
814 | 2756 |
elif param == "height": |
2757 |
contact.setheight(value) |
|
2758 |
elif param == "width": |
|
2759 |
contact.setwidth(value) |
|
2760 |
elif param == "x": |
|
2761 |
contact.setx(value) |
|
2762 |
elif param == "y": |
|
2763 |
contact.sety(value) |
|
2764 |
elif param == "connectors": |
|
2765 |
input_connector = value["inputs"][0] |
|
2766 |
position = input_connector.GetRelPosition() |
|
2767 |
contact.addconnectionPointIn() |
|
2768 |
contact.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2769 |
self.SetConnectionWires(contact.connectionPointIn, input_connector) |
|
2770 |
output_connector = value["outputs"][0] |
|
2771 |
position = output_connector.GetRelPosition() |
|
2772 |
contact.addconnectionPointOut() |
|
2773 |
contact.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2774 |
||
2775 |
def AddEditedElementCoil(self, tagname, id): |
|
2776 |
element = self.GetEditedElement(tagname) |
|
2777 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2778 |
coil = PLCOpenParser.CreateElement("coil", "ldObjects") |
814 | 2779 |
coil.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2780 |
element.addinstance(coil) |
814 | 2781 |
|
2782 |
def SetEditedElementCoilInfos(self, tagname, id, infos): |
|
2783 |
element = self.GetEditedElement(tagname) |
|
2784 |
if element is not None: |
|
2785 |
coil = element.getinstance(id) |
|
2786 |
if coil is None: |
|
2787 |
return |
|
2788 |
for param, value in infos.items(): |
|
2789 |
if param == "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:
1321
diff
changeset
|
2790 |
coil.setvariable(value) |
814 | 2791 |
elif param == "type": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2792 |
negated, storage, edge = { |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2793 |
COIL_NORMAL: (False, "none", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2794 |
COIL_REVERSE: (True, "none", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2795 |
COIL_SET: (False, "set", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2796 |
COIL_RESET: (False, "reset", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2797 |
COIL_RISING: (False, "none", "rising"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2798 |
COIL_FALLING: (False, "none", "falling")}[value] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2799 |
coil.setnegated(negated) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2800 |
coil.setstorage(storage) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2801 |
coil.setedge(edge) |
814 | 2802 |
elif param == "height": |
2803 |
coil.setheight(value) |
|
2804 |
elif param == "width": |
|
2805 |
coil.setwidth(value) |
|
2806 |
elif param == "x": |
|
2807 |
coil.setx(value) |
|
2808 |
elif param == "y": |
|
2809 |
coil.sety(value) |
|
2810 |
elif param == "connectors": |
|
2811 |
input_connector = value["inputs"][0] |
|
2812 |
position = input_connector.GetRelPosition() |
|
2813 |
coil.addconnectionPointIn() |
|
2814 |
coil.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2815 |
self.SetConnectionWires(coil.connectionPointIn, input_connector) |
|
2816 |
output_connector = value["outputs"][0] |
|
2817 |
position = output_connector.GetRelPosition() |
|
2818 |
coil.addconnectionPointOut() |
|
2819 |
coil.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2820 |
||
2821 |
def AddEditedElementStep(self, tagname, id): |
|
2822 |
element = self.GetEditedElement(tagname) |
|
2823 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2824 |
step = PLCOpenParser.CreateElement("step", "sfcObjects") |
814 | 2825 |
step.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2826 |
element.addinstance(step) |
1411 | 2827 |
|
814 | 2828 |
def SetEditedElementStepInfos(self, tagname, id, infos): |
2829 |
element = self.GetEditedElement(tagname) |
|
2830 |
if element is not None: |
|
2831 |
step = element.getinstance(id) |
|
2832 |
if step is None: |
|
2833 |
return |
|
2834 |
for param, value in infos.items(): |
|
2835 |
if param == "name": |
|
2836 |
step.setname(value) |
|
2837 |
elif param == "initial": |
|
2838 |
step.setinitialStep(value) |
|
2839 |
elif param == "height": |
|
2840 |
step.setheight(value) |
|
2841 |
elif param == "width": |
|
2842 |
step.setwidth(value) |
|
2843 |
elif param == "x": |
|
2844 |
step.setx(value) |
|
2845 |
elif param == "y": |
|
2846 |
step.sety(value) |
|
2847 |
elif param == "connectors": |
|
2848 |
if len(value["inputs"]) > 0: |
|
2849 |
input_connector = value["inputs"][0] |
|
2850 |
position = input_connector.GetRelPosition() |
|
2851 |
step.addconnectionPointIn() |
|
2852 |
step.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2853 |
self.SetConnectionWires(step.connectionPointIn, input_connector) |
|
2854 |
else: |
|
2855 |
step.deleteconnectionPointIn() |
|
2856 |
if len(value["outputs"]) > 0: |
|
2857 |
output_connector = value["outputs"][0] |
|
2858 |
position = output_connector.GetRelPosition() |
|
2859 |
step.addconnectionPointOut() |
|
2860 |
step.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2861 |
else: |
|
2862 |
step.deleteconnectionPointOut() |
|
2863 |
elif param == "action": |
|
2864 |
if value: |
|
2865 |
position = value.GetRelPosition() |
|
2866 |
step.addconnectionPointOutAction() |
|
2867 |
step.connectionPointOutAction.setrelPositionXY(position.x, position.y) |
|
2868 |
else: |
|
2869 |
step.deleteconnectionPointOutAction() |
|
1411 | 2870 |
|
814 | 2871 |
def AddEditedElementTransition(self, tagname, id): |
2872 |
element = self.GetEditedElement(tagname) |
|
2873 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2874 |
transition = PLCOpenParser.CreateElement("transition", "sfcObjects") |
814 | 2875 |
transition.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2876 |
element.addinstance(transition) |
1411 | 2877 |
|
814 | 2878 |
def SetEditedElementTransitionInfos(self, tagname, id, infos): |
2879 |
element = self.GetEditedElement(tagname) |
|
2880 |
if element is not None: |
|
2881 |
transition = element.getinstance(id) |
|
2882 |
if transition is None: |
|
2883 |
return |
|
2884 |
for param, value in infos.items(): |
|
2885 |
if param == "type" and value != "connection": |
|
2886 |
transition.setconditionContent(value, infos["condition"]) |
|
2887 |
elif param == "height": |
|
2888 |
transition.setheight(value) |
|
2889 |
elif param == "width": |
|
2890 |
transition.setwidth(value) |
|
2891 |
elif param == "x": |
|
2892 |
transition.setx(value) |
|
2893 |
elif param == "y": |
|
2894 |
transition.sety(value) |
|
2895 |
elif param == "priority": |
|
2896 |
if value != 0: |
|
2897 |
transition.setpriority(value) |
|
2898 |
else: |
|
2899 |
transition.setpriority(None) |
|
2900 |
elif param == "connectors": |
|
2901 |
input_connector = value["inputs"][0] |
|
2902 |
position = input_connector.GetRelPosition() |
|
2903 |
transition.addconnectionPointIn() |
|
2904 |
transition.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2905 |
self.SetConnectionWires(transition.connectionPointIn, input_connector) |
|
2906 |
output_connector = value["outputs"][0] |
|
2907 |
position = output_connector.GetRelPosition() |
|
2908 |
transition.addconnectionPointOut() |
|
2909 |
transition.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2910 |
elif infos.get("type", None) == "connection" and param == "connection" and value: |
|
2911 |
transition.setconditionContent("connection", None) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2912 |
self.SetConnectionWires(transition.condition.content, value) |
1411 | 2913 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2914 |
def AddEditedElementDivergence(self, tagname, id, divergence_type): |
814 | 2915 |
element = self.GetEditedElement(tagname) |
2916 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2917 |
divergence = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2918 |
{SELECTION_DIVERGENCE: "selectionDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2919 |
SELECTION_CONVERGENCE: "selectionConvergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2920 |
SIMULTANEOUS_DIVERGENCE: "simultaneousDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2921 |
SIMULTANEOUS_CONVERGENCE: "simultaneousConvergence"}.get( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2922 |
divergence_type), "sfcObjects") |
814 | 2923 |
divergence.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2924 |
element.addinstance(divergence) |
1411 | 2925 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2926 |
DivergenceTypes = [ |
1411 | 2927 |
(divergence_type, |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2928 |
PLCOpenParser.GetElementClass(divergence_type, "sfcObjects")) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2929 |
for divergence_type in ["selectionDivergence", "simultaneousDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2930 |
"selectionConvergence", "simultaneousConvergence"]] |
1411 | 2931 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2932 |
def GetDivergenceType(self, divergence): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2933 |
for divergence_type, divergence_class in self.DivergenceTypes: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2934 |
if isinstance(divergence, divergence_class): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2935 |
return divergence_type |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2936 |
return None |
1411 | 2937 |
|
814 | 2938 |
def SetEditedElementDivergenceInfos(self, tagname, id, infos): |
2939 |
element = self.GetEditedElement(tagname) |
|
2940 |
if element is not None: |
|
2941 |
divergence = element.getinstance(id) |
|
2942 |
if divergence is None: |
|
2943 |
return |
|
2944 |
for param, value in infos.items(): |
|
2945 |
if param == "height": |
|
2946 |
divergence.setheight(value) |
|
2947 |
elif param == "width": |
|
2948 |
divergence.setwidth(value) |
|
2949 |
elif param == "x": |
|
2950 |
divergence.setx(value) |
|
2951 |
elif param == "y": |
|
2952 |
divergence.sety(value) |
|
2953 |
elif param == "connectors": |
|
2954 |
input_connectors = value["inputs"] |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2955 |
divergence_type = self.GetDivergenceType(divergence) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2956 |
if divergence_type in ["selectionDivergence", "simultaneousDivergence"]: |
814 | 2957 |
position = input_connectors[0].GetRelPosition() |
2958 |
divergence.addconnectionPointIn() |
|
2959 |
divergence.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2960 |
self.SetConnectionWires(divergence.connectionPointIn, input_connectors[0]) |
|
2961 |
else: |
|
2962 |
divergence.setconnectionPointIn([]) |
|
2963 |
for input_connector in input_connectors: |
|
2964 |
position = input_connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2965 |
connection = PLCOpenParser.CreateElement("connectionPointIn", divergence_type) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2966 |
divergence.appendconnectionPointIn(connection) |
814 | 2967 |
connection.setrelPositionXY(position.x, position.y) |
2968 |
self.SetConnectionWires(connection, input_connector) |
|
2969 |
output_connectors = value["outputs"] |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2970 |
if divergence_type in ["selectionConvergence", "simultaneousConvergence"]: |
814 | 2971 |
position = output_connectors[0].GetRelPosition() |
2972 |
divergence.addconnectionPointOut() |
|
2973 |
divergence.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2974 |
else: |
|
2975 |
divergence.setconnectionPointOut([]) |
|
2976 |
for output_connector in output_connectors: |
|
2977 |
position = output_connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2978 |
connection = PLCOpenParser.CreateElement("connectionPointOut", divergence_type) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2979 |
divergence.appendconnectionPointOut(connection) |
814 | 2980 |
connection.setrelPositionXY(position.x, position.y) |
1411 | 2981 |
|
814 | 2982 |
def AddEditedElementJump(self, tagname, id): |
2983 |
element = self.GetEditedElement(tagname) |
|
2984 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2985 |
jump = PLCOpenParser.CreateElement("jumpStep", "sfcObjects") |
814 | 2986 |
jump.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2987 |
element.addinstance(jump) |
1411 | 2988 |
|
814 | 2989 |
def SetEditedElementJumpInfos(self, tagname, id, infos): |
2990 |
element = self.GetEditedElement(tagname) |
|
2991 |
if element is not None: |
|
2992 |
jump = element.getinstance(id) |
|
2993 |
if jump is None: |
|
2994 |
return |
|
2995 |
for param, value in infos.items(): |
|
2996 |
if param == "target": |
|
2997 |
jump.settargetName(value) |
|
2998 |
elif param == "height": |
|
2999 |
jump.setheight(value) |
|
3000 |
elif param == "width": |
|
3001 |
jump.setwidth(value) |
|
3002 |
elif param == "x": |
|
3003 |
jump.setx(value) |
|
3004 |
elif param == "y": |
|
3005 |
jump.sety(value) |
|
3006 |
elif param == "connector": |
|
3007 |
position = value.GetRelPosition() |
|
3008 |
jump.addconnectionPointIn() |
|
3009 |
jump.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
3010 |
self.SetConnectionWires(jump.connectionPointIn, value) |
|
1411 | 3011 |
|
814 | 3012 |
def AddEditedElementActionBlock(self, tagname, id): |
3013 |
element = self.GetEditedElement(tagname) |
|
3014 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
3015 |
actionBlock = PLCOpenParser.CreateElement("actionBlock", "commonObjects") |
814 | 3016 |
actionBlock.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
3017 |
element.addinstance(actionBlock) |
1411 | 3018 |
|
814 | 3019 |
def SetEditedElementActionBlockInfos(self, tagname, id, infos): |
3020 |
element = self.GetEditedElement(tagname) |
|
3021 |
if element is not None: |
|
3022 |
actionBlock = element.getinstance(id) |
|
3023 |
if actionBlock is None: |
|
3024 |
return |
|
3025 |
for param, value in infos.items(): |
|
3026 |
if param == "actions": |
|
3027 |
actionBlock.setactions(value) |
|
3028 |
elif param == "height": |
|
3029 |
actionBlock.setheight(value) |
|
3030 |
elif param == "width": |
|
3031 |
actionBlock.setwidth(value) |
|
3032 |
elif param == "x": |
|
3033 |
actionBlock.setx(value) |
|
3034 |
elif param == "y": |
|
3035 |
actionBlock.sety(value) |
|
3036 |
elif param == "connector": |
|
3037 |
position = value.GetRelPosition() |
|
3038 |
actionBlock.addconnectionPointIn() |
|
3039 |
actionBlock.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
3040 |
self.SetConnectionWires(actionBlock.connectionPointIn, value) |
|
1411 | 3041 |
|
814 | 3042 |
def RemoveEditedElementInstance(self, tagname, id): |
3043 |
element = self.GetEditedElement(tagname) |
|
3044 |
if element is not None: |
|
3045 |
instance = element.getinstance(id) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
3046 |
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")): |
814 | 3047 |
self.RemoveEditedElementPouVar(tagname, instance.gettypeName(), instance.getinstanceName()) |
3048 |
element.removeinstance(id) |
|
3049 |
||
3050 |
def GetEditedResourceVariables(self, tagname, debug = False): |
|
3051 |
varlist = [] |
|
3052 |
words = tagname.split("::") |
|
3053 |
for var in self.GetConfigurationGlobalVars(words[1], debug): |
|
1361
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
3054 |
if var.Type == "BOOL": |
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
3055 |
varlist.append(var.Name) |
814 | 3056 |
for var in self.GetConfigurationResourceGlobalVars(words[1], words[2], debug): |
1361
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
3057 |
if var.Type == "BOOL": |
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
3058 |
varlist.append(var.Name) |
814 | 3059 |
return varlist |
3060 |
||
3061 |
def SetEditedResourceInfos(self, tagname, tasks, instances): |
|
3062 |
resource = self.GetEditedElement(tagname) |
|
3063 |
if resource is not None: |
|
3064 |
resource.settask([]) |
|
3065 |
resource.setpouInstance([]) |
|
3066 |
task_list = {} |
|
3067 |
for task in tasks: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3068 |
new_task = PLCOpenParser.CreateElement("task", "resource") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3069 |
resource.appendtask(new_task) |
814 | 3070 |
new_task.setname(task["Name"]) |
3071 |
if task["Triggering"] == "Interrupt": |
|
3072 |
new_task.setsingle(task["Single"]) |
|
3073 |
## result = duration_model.match(task["Interval"]).groups() |
|
3074 |
## if reduce(lambda x, y: x or y != None, result): |
|
3075 |
## values = [] |
|
3076 |
## for value in result[:-1]: |
|
3077 |
## if value != None: |
|
3078 |
## values.append(int(value)) |
|
3079 |
## else: |
|
3080 |
## values.append(0) |
|
3081 |
## if result[-1] is not None: |
|
3082 |
## values.append(int(float(result[-1]) * 1000)) |
|
3083 |
## new_task.setinterval(datetime.time(*values)) |
|
3084 |
if task["Triggering"] == "Cyclic": |
|
3085 |
new_task.setinterval(task["Interval"]) |
|
3086 |
new_task.setpriority(int(task["Priority"])) |
|
3087 |
if task["Name"] != "": |
|
3088 |
task_list[task["Name"]] = new_task |
|
3089 |
for instance in instances: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3090 |
task = task_list.get(instance["Task"]) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3091 |
if task is not None: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3092 |
new_instance = PLCOpenParser.CreateElement("pouInstance", "task") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3093 |
task.appendpouInstance(new_instance) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3094 |
else: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3095 |
new_instance = PLCOpenParser.CreateElement("pouInstance", "resource") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
3096 |
resource.appendpouInstance(new_instance) |
814 | 3097 |
new_instance.setname(instance["Name"]) |
3098 |
new_instance.settypeName(instance["Type"]) |
|
3099 |
||
3100 |
def GetEditedResourceInfos(self, tagname, debug = False): |
|
3101 |
resource = self.GetEditedElement(tagname, debug) |
|
3102 |
if resource is not None: |
|
3103 |
tasks = resource.gettask() |
|
3104 |
instances = resource.getpouInstance() |
|
3105 |
tasks_data = [] |
|
3106 |
instances_data = [] |
|
3107 |
for task in tasks: |
|
3108 |
new_task = {} |
|
3109 |
new_task["Name"] = task.getname() |
|
3110 |
single = task.getsingle() |
|
3111 |
if single is not None: |
|
3112 |
new_task["Single"] = single |
|
3113 |
else: |
|
3114 |
new_task["Single"] = "" |
|
3115 |
interval = task.getinterval() |
|
3116 |
if interval is not None: |
|
3117 |
## text = "" |
|
3118 |
## if interval.hour != 0: |
|
3119 |
## text += "%dh"%interval.hour |
|
3120 |
## if interval.minute != 0: |
|
3121 |
## text += "%dm"%interval.minute |
|
3122 |
## if interval.second != 0: |
|
3123 |
## text += "%ds"%interval.second |
|
3124 |
## if interval.microsecond != 0: |
|
3125 |
## if interval.microsecond % 1000 != 0: |
|
3126 |
## text += "%.3fms"%(float(interval.microsecond) / 1000) |
|
3127 |
## else: |
|
3128 |
## text += "%dms"%(interval.microsecond / 1000) |
|
3129 |
## new_task["Interval"] = text |
|
3130 |
new_task["Interval"] = interval |
|
3131 |
else: |
|
3132 |
new_task["Interval"] = "" |
|
3133 |
if single is not None and interval is None: |
|
3134 |
new_task["Triggering"] = "Interrupt" |
|
3135 |
elif interval is not None and single is None: |
|
3136 |
new_task["Triggering"] = "Cyclic" |
|
3137 |
else: |
|
3138 |
new_task["Triggering"] = "" |
|
3139 |
new_task["Priority"] = str(task.getpriority()) |
|
3140 |
tasks_data.append(new_task) |
|
3141 |
for instance in task.getpouInstance(): |
|
3142 |
new_instance = {} |
|
3143 |
new_instance["Name"] = instance.getname() |
|
3144 |
new_instance["Type"] = instance.gettypeName() |
|
3145 |
new_instance["Task"] = task.getname() |
|
3146 |
instances_data.append(new_instance) |
|
3147 |
for instance in instances: |
|
3148 |
new_instance = {} |
|
3149 |
new_instance["Name"] = instance.getname() |
|
3150 |
new_instance["Type"] = instance.gettypeName() |
|
3151 |
new_instance["Task"] = "" |
|
3152 |
instances_data.append(new_instance) |
|
3153 |
return tasks_data, instances_data |
|
3154 |
||
3155 |
def OpenXMLFile(self, filepath): |
|
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:
1328
diff
changeset
|
3156 |
self.Project, error = 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:
1328
diff
changeset
|
3157 |
if self.Project is None: |
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:
1328
diff
changeset
|
3158 |
return _("Project file syntax error:\n\n") + error |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3159 |
self.SetFilePath(filepath) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3160 |
self.CreateProjectBuffer(True) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3161 |
self.ProgramChunks = [] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3162 |
self.ProgramOffset = 0 |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
3163 |
self.NextCompiledProject = self.Copy(self.Project) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3164 |
self.CurrentCompiledProject = None |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3165 |
self.Buffering = False |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3166 |
self.CurrentElementEditing = None |
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:
1328
diff
changeset
|
3167 |
return error |
1411 | 3168 |
|
814 | 3169 |
def SaveXMLFile(self, filepath = None): |
3170 |
if not filepath and self.FilePath == "": |
|
3171 |
return False |
|
3172 |
else: |
|
3173 |
contentheader = {"modificationDateTime": datetime.datetime(*localtime()[:6])} |
|
3174 |
self.Project.setcontentHeader(contentheader) |
|
1411 | 3175 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3176 |
if filepath: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3177 |
SaveProject(self.Project, filepath) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3178 |
else: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
3179 |
SaveProject(self.Project, self.FilePath) |
1411 | 3180 |
|
814 | 3181 |
self.MarkProjectAsSaved() |
3182 |
if filepath: |
|
3183 |
self.SetFilePath(filepath) |
|
3184 |
return True |
|
3185 |
||
3186 |
#------------------------------------------------------------------------------- |
|
3187 |
# Search in Current Project Functions |
|
3188 |
#------------------------------------------------------------------------------- |
|
3189 |
||
3190 |
def SearchInProject(self, criteria): |
|
3191 |
return self.Project.Search(criteria) |
|
3192 |
||
3193 |
def SearchInPou(self, tagname, criteria, debug=False): |
|
3194 |
pou = self.GetEditedElement(tagname, debug) |
|
3195 |
if pou is not None: |
|
1619
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3196 |
search_results = pou.Search(criteria, [tagname]) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3197 |
if tagname.split("::")[0] in ['A', 'T']: |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3198 |
parent_pou_tagname = "P::%s" % (tagname.split("::")[-2]) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3199 |
parent_pou = self.GetEditedElement(parent_pou_tagname, debug) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3200 |
for infos, start, end, text in parent_pou.Search(criteria): |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3201 |
if infos[1] in ["var_local", "var_input", "var_output", "var_inout"]: |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3202 |
search_results.append((infos, start, end, text)) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
3203 |
return search_results |
814 | 3204 |
return [] |
3205 |
||
3206 |
#------------------------------------------------------------------------------- |
|
3207 |
# Current Buffering Management Functions |
|
3208 |
#------------------------------------------------------------------------------- |
|
3209 |
||
3210 |
""" |
|
3211 |
Return a copy of the project |
|
3212 |
""" |
|
3213 |
def Copy(self, model): |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
3214 |
return deepcopy(model) |
814 | 3215 |
|
3216 |
def CreateProjectBuffer(self, saved): |
|
3217 |
if self.ProjectBufferEnabled: |
|
1304 | 3218 |
self.ProjectBuffer = UndoBuffer(PLCOpenParser.Dumps(self.Project), saved) |
814 | 3219 |
else: |
3220 |
self.ProjectBuffer = None |
|
3221 |
self.ProjectSaved = saved |
|
3222 |
||
3223 |
def IsProjectBufferEnabled(self): |
|
3224 |
return self.ProjectBufferEnabled |
|
3225 |
||
3226 |
def EnableProjectBuffer(self, enable): |
|
3227 |
self.ProjectBufferEnabled = enable |
|
3228 |
if self.Project is not None: |
|
3229 |
if enable: |
|
3230 |
current_saved = self.ProjectSaved |
|
3231 |
else: |
|
3232 |
current_saved = self.ProjectBuffer.IsCurrentSaved() |
|
3233 |
self.CreateProjectBuffer(current_saved) |
|
3234 |
||
3235 |
def BufferProject(self): |
|
3236 |
if self.ProjectBuffer is not None: |
|
1304 | 3237 |
self.ProjectBuffer.Buffering(PLCOpenParser.Dumps(self.Project)) |
814 | 3238 |
else: |
3239 |
self.ProjectSaved = False |
|
3240 |
||
3241 |
def StartBuffering(self): |
|
3242 |
if self.ProjectBuffer is not None: |
|
3243 |
self.Buffering = True |
|
3244 |
else: |
|
3245 |
self.ProjectSaved = False |
|
1411 | 3246 |
|
814 | 3247 |
def EndBuffering(self): |
3248 |
if self.ProjectBuffer is not None and self.Buffering: |
|
1304 | 3249 |
self.ProjectBuffer.Buffering(PLCOpenParser.Dumps(self.Project)) |
814 | 3250 |
self.Buffering = False |
3251 |
||
3252 |
def MarkProjectAsSaved(self): |
|
3253 |
self.EndBuffering() |
|
3254 |
if self.ProjectBuffer is not None: |
|
3255 |
self.ProjectBuffer.CurrentSaved() |
|
3256 |
else: |
|
3257 |
self.ProjectSaved = True |
|
1411 | 3258 |
|
814 | 3259 |
# Return if project is saved |
3260 |
def ProjectIsSaved(self): |
|
3261 |
if self.ProjectBuffer is not None: |
|
3262 |
return self.ProjectBuffer.IsCurrentSaved() and not self.Buffering |
|
3263 |
else: |
|
3264 |
return self.ProjectSaved |
|
3265 |
||
3266 |
def LoadPrevious(self): |
|
3267 |
self.EndBuffering() |
|
3268 |
if self.ProjectBuffer is not None: |
|
1304 | 3269 |
self.Project = PLCOpenParser.Loads(self.ProjectBuffer.Previous()) |
1411 | 3270 |
|
814 | 3271 |
def LoadNext(self): |
3272 |
if self.ProjectBuffer is not None: |
|
1304 | 3273 |
self.Project = PLCOpenParser.Loads(self.ProjectBuffer.Next()) |
1411 | 3274 |
|
814 | 3275 |
def GetBufferState(self): |
3276 |
if self.ProjectBuffer is not None: |
|
3277 |
first = self.ProjectBuffer.IsFirst() and not self.Buffering |
|
3278 |
last = self.ProjectBuffer.IsLast() |
|
3279 |
return not first, not last |
|
3280 |
return False, False |