author | Laurent Bessard |
Tue, 24 Sep 2013 12:40:36 +0200 | |
changeset 1324 | 884477877e53 |
parent 1322 | 0a9227f743b3 |
child 1326 | e2c11668addf |
permissions | -rw-r--r-- |
814 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
4 |
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor |
|
5 |
#based on the plcopen standard. |
|
6 |
# |
|
7 |
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
|
8 |
# |
|
9 |
#See COPYING file for copyrights details. |
|
10 |
# |
|
11 |
#This library is free software; you can redistribute it and/or |
|
12 |
#modify it under the terms of the GNU General Public |
|
13 |
#License as published by the Free Software Foundation; either |
|
14 |
#version 2.1 of the License, or (at your option) any later version. |
|
15 |
# |
|
16 |
#This library is distributed in the hope that it will be useful, |
|
17 |
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
18 |
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
19 |
#General Public License for more details. |
|
20 |
# |
|
21 |
#You should have received a copy of the GNU General Public |
|
22 |
#License along with this library; if not, write to the Free Software |
|
23 |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
24 |
||
25 |
from 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 |
|
32 |
||
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
33 |
from plcopen import * |
814 | 34 |
from graphics.GraphicCommons import * |
35 |
from PLCGenerator import * |
|
36 |
||
37 |
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)?") |
|
38 |
||
39 |
ITEMS_EDITABLE = [ITEM_PROJECT, |
|
40 |
ITEM_POU, |
|
41 |
ITEM_VARIABLE, |
|
42 |
ITEM_TRANSITION, |
|
43 |
ITEM_ACTION, |
|
44 |
ITEM_CONFIGURATION, |
|
45 |
ITEM_RESOURCE, |
|
46 |
ITEM_DATATYPE |
|
47 |
] = range(8) |
|
48 |
||
49 |
ITEMS_UNEDITABLE = [ITEM_DATATYPES, |
|
50 |
ITEM_FUNCTION, |
|
51 |
ITEM_FUNCTIONBLOCK, |
|
52 |
ITEM_PROGRAM, |
|
53 |
ITEM_TRANSITIONS, |
|
54 |
ITEM_ACTIONS, |
|
55 |
ITEM_CONFIGURATIONS, |
|
56 |
ITEM_RESOURCES, |
|
57 |
ITEM_PROPERTIES |
|
58 |
] = range(8, 17) |
|
59 |
||
60 |
ITEMS_VARIABLE = [ITEM_VAR_LOCAL, |
|
61 |
ITEM_VAR_GLOBAL, |
|
62 |
ITEM_VAR_EXTERNAL, |
|
63 |
ITEM_VAR_TEMP, |
|
64 |
ITEM_VAR_INPUT, |
|
65 |
ITEM_VAR_OUTPUT, |
|
66 |
ITEM_VAR_INOUT |
|
67 |
] = range(17, 24) |
|
68 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
69 |
VAR_CLASS_INFOS = { |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
70 |
"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
|
71 |
"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
|
72 |
"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
|
73 |
"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
|
74 |
"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
|
75 |
"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
|
76 |
"InOut": ("inOutVars", ITEM_VAR_INOUT)} |
814 | 77 |
|
78 |
POU_TYPES = {"program": ITEM_PROGRAM, |
|
79 |
"functionBlock": ITEM_FUNCTIONBLOCK, |
|
80 |
"function": ITEM_FUNCTION, |
|
81 |
} |
|
82 |
||
83 |
LOCATIONS_ITEMS = [LOCATION_CONFNODE, |
|
84 |
LOCATION_MODULE, |
|
85 |
LOCATION_GROUP, |
|
86 |
LOCATION_VAR_INPUT, |
|
87 |
LOCATION_VAR_OUTPUT, |
|
88 |
LOCATION_VAR_MEMORY] = range(6) |
|
89 |
||
90 |
ScriptDirectory = os.path.split(os.path.realpath(__file__))[0] |
|
91 |
||
92 |
def GetUneditableNames(): |
|
93 |
_ = lambda x:x |
|
94 |
return [_("User-defined POUs"), _("Functions"), _("Function Blocks"), |
|
95 |
_("Programs"), _("Data Types"), _("Transitions"), _("Actions"), |
|
96 |
_("Configurations"), _("Resources"), _("Properties")] |
|
97 |
UNEDITABLE_NAMES = GetUneditableNames() |
|
98 |
[USER_DEFINED_POUS, FUNCTIONS, FUNCTION_BLOCKS, PROGRAMS, |
|
99 |
DATA_TYPES, TRANSITIONS, ACTIONS, CONFIGURATIONS, |
|
100 |
RESOURCES, PROPERTIES] = UNEDITABLE_NAMES |
|
101 |
||
102 |
#------------------------------------------------------------------------------- |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
103 |
# 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
|
104 |
#------------------------------------------------------------------------------- |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
105 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
106 |
def compute_dimensions(el): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
107 |
return [ |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
108 |
(dimension.get("lower"), dimension.get("upper")) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
109 |
for dimension in el.findall("dimension")] |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
110 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
111 |
def extract_param(el): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
112 |
if el.tag == "Type" and el.text is None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
113 |
array = el.find("array") |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
114 |
return ('array', array.text, compute_dimensions(array)) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
115 |
elif el.tag == "Tree": |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
116 |
return generate_var_tree(el) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
117 |
elif el.tag == "Edit": |
1324
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
118 |
return el.text == "True" |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
119 |
elif el.text is None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
120 |
return '' |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
121 |
return el.text |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
122 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
123 |
def generate_var_tree(tree): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
124 |
return ([ |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
125 |
(var.get("name"), var.text, generate_var_tree(var)) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
126 |
for var in tree.findall("var")], |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
127 |
compute_dimensions(tree)) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
128 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
129 |
class AddVariable(etree.XSLTExtension): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
130 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
131 |
def __init__(self, variables): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
132 |
etree.XSLTExtension.__init__(self) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
133 |
self.Variables = variables |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
134 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
135 |
def execute(self, context, self_node, input_node, output_parent): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
136 |
infos = etree.Element('var_infos') |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
137 |
self.process_children(context, infos) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
138 |
self.Variables.append( |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
139 |
{el.tag.replace("_", " "): extract_param(el) for el in infos}) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
140 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
141 |
class VarTree(etree.XSLTExtension): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
142 |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
143 |
def __init__(self, controller, debug): |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
144 |
etree.XSLTExtension.__init__(self) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
145 |
self.Controller = controller |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
146 |
self.Debug = debug |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
147 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
148 |
def execute(self, context, self_node, input_node, output_parent): |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
149 |
typename = input_node.get("name") |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
150 |
pou_infos = self.Controller.GetPou(typename, self.Debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
151 |
if pou_infos is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
152 |
self.apply_templates(context, pou_infos, output_parent) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
153 |
return |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
154 |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
155 |
datatype_infos = self.Controller.GetDataType(typename, self.Debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
156 |
if datatype_infos is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
157 |
self.apply_templates(context, datatype_infos, output_parent) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
158 |
return |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
159 |
|
1324
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
160 |
class VarIsEdited(etree.XSLTExtension): |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
161 |
|
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
162 |
def __init__(self, controller, debug): |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
163 |
etree.XSLTExtension.__init__(self) |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
164 |
self.Controller = controller |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
165 |
self.Debug = debug |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
166 |
|
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
167 |
def execute(self, context, self_node, input_node, output_parent): |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
168 |
typename = input_node.get("name") |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
169 |
output_parent.text = str( |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
170 |
self.Controller.GetPou(typename, self.Debug) is None) |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
171 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
172 |
variables_infos_xslt = etree.parse( |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
173 |
os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt")) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
174 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
175 |
#------------------------------------------------------------------------------- |
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
176 |
# 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
|
177 |
#------------------------------------------------------------------------------- |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
178 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
179 |
def class_extraction(el, prt): |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
180 |
if prt in ["pou", "variable"]: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
181 |
pou_type = POU_TYPES.get(el.text) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
182 |
if pou_type is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
183 |
return pou_type |
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
184 |
return VAR_CLASS_INFOS[el.text][1] |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
185 |
return { |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
186 |
"configuration": ITEM_CONFIGURATION, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
187 |
"resource": ITEM_RESOURCE, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
188 |
"action": ITEM_ACTION, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
189 |
"transition": ITEM_TRANSITION, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
190 |
"program": ITEM_PROGRAM}.get(prt) |
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 |
PARAM_VALUE_EXTRACTION = { |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
193 |
"name": lambda el, prt: el.text, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
194 |
"class": class_extraction, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
195 |
"type": lambda el, prt: None if el.text == "None" else el.text, |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
196 |
"edit": lambda el, prt: el.text == "True", |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
197 |
"debug": lambda el, prt: el.text == "True", |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
198 |
"variables": lambda el, prt: [ |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
199 |
compute_instance_tree(chld) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
200 |
for chld in el]} |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
201 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
202 |
def compute_instance_tree(tree): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
203 |
return {el.tag: |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
204 |
PARAM_VALUE_EXTRACTION[el.tag](el, tree.tag) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
205 |
for el in tree} |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
206 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
207 |
class IsEdited(etree.XSLTExtension): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
208 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
209 |
def __init__(self, controller, debug): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
210 |
etree.XSLTExtension.__init__(self) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
211 |
self.Controller = controller |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
212 |
self.Debug = debug |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
213 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
214 |
def execute(self, context, self_node, input_node, output_parent): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
215 |
typename = input_node.get("name") |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
216 |
project = self.Controller.GetProject(self.Debug) |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
217 |
output_parent.text = str(project.getpou(typename) is not None) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
218 |
|
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
219 |
class IsDebugged(etree.XSLTExtension): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
220 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
221 |
def __init__(self, controller, debug): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
222 |
etree.XSLTExtension.__init__(self) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
223 |
self.Controller = controller |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
224 |
self.Debug = debug |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
225 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
226 |
def execute(self, context, self_node, input_node, output_parent): |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
227 |
typename = input_node.get("name") |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
228 |
project = self.Controller.GetProject(self.Debug) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
229 |
pou_infos = project.getpou(typename) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
230 |
if pou_infos is not None: |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
231 |
self.apply_templates(context, pou_infos, output_parent) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
232 |
return |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
233 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
234 |
datatype_infos = self.Controller.GetDataType(typename, self.Debug) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
235 |
if datatype_infos is not None: |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
236 |
self.apply_templates(context, datatype_infos, output_parent) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
237 |
return |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
238 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
239 |
output_parent.text = "False" |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
240 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
241 |
class PouVariableClass(etree.XSLTExtension): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
242 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
243 |
def __init__(self, controller, debug): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
244 |
etree.XSLTExtension.__init__(self) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
245 |
self.Controller = controller |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
246 |
self.Debug = debug |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
247 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
248 |
def execute(self, context, self_node, input_node, output_parent): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
249 |
pou_infos = self.Controller.GetPou(input_node.get("name"), self.Debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
250 |
if pou_infos is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
251 |
self.apply_templates(context, pou_infos, output_parent) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
252 |
return |
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 |
self.process_children(context, output_parent) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
255 |
|
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
256 |
pou_variables_xslt = etree.parse( |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
257 |
os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt")) |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
258 |
|
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
259 |
#------------------------------------------------------------------------------- |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
260 |
# 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
|
261 |
#------------------------------------------------------------------------------- |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
262 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
263 |
class InstanceDefinition(etree.XSLTExtension): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
264 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
265 |
def __init__(self, controller, debug): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
266 |
etree.XSLTExtension.__init__(self) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
267 |
self.Controller = controller |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
268 |
self.Debug = debug |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
269 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
270 |
def execute(self, context, self_node, input_node, output_parent): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
271 |
instance_infos = etree.Element('infos') |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
272 |
self.process_children(context, instance_infos) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
273 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
274 |
pou_infos = self.Controller.GetPou(instance_infos.get("name"), self.Debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
275 |
if pou_infos is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
276 |
pou_instance = etree.Element('pou_instance', |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
277 |
pou_path=instance_infos.get("path")) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
278 |
pou_instance.append(deepcopy(pou_infos)) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
279 |
self.apply_templates(context, pou_instance, output_parent) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
280 |
return |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
281 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
282 |
datatype_infos = self.Controller.GetDataType(instance_infos.get("name"), self.Debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
283 |
if datatype_infos is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
284 |
datatype_instance = etree.Element('datatype_instance', |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
285 |
datatype_path=instance_infos.get("path")) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
286 |
datatype_instance.append(deepcopy(datatype_infos)) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
287 |
self.apply_templates(context, datatype_instance, output_parent) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
288 |
return |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
289 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
290 |
instances_path_xslt = etree.parse( |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
291 |
os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt")) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
292 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
293 |
#------------------------------------------------------------------------------- |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
294 |
# Helpers object for generating instance tagname |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
295 |
#------------------------------------------------------------------------------- |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
296 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
297 |
class InstanceTagName(etree.XSLTExtension): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
298 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
299 |
def __init__(self, controller): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
300 |
etree.XSLTExtension.__init__(self) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
301 |
self.Controller = controller |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
302 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
303 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
304 |
return "" |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
305 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
306 |
def execute(self, context, self_node, input_node, output_parent): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
307 |
tagname_infos = etree.Element('infos') |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
308 |
self.process_children(context, tagname_infos) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
309 |
tagname = etree.Element('tagname') |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
310 |
tagname.text = self.GetTagName(tagname_infos) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
311 |
output_parent.append(tagname) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
312 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
313 |
class ConfigTagName(InstanceTagName): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
314 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
315 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
316 |
return self.Controller.ComputeConfigurationName(infos.get("name")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
317 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
318 |
class ResourceTagName(InstanceTagName): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
319 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
320 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
321 |
return self.Controller.ComputeConfigurationResourceName( |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
322 |
infos.get("config_name"), infos.get("name")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
323 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
324 |
class PouTagName(InstanceTagName): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
325 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
326 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
327 |
return self.Controller.ComputePouName(infos.get("name")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
328 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
329 |
class ActionTagName(InstanceTagName): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
330 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
331 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
332 |
return self.Controller.ComputePouActionName( |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
333 |
infos.get("pou_name"), infos.get("name")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
334 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
335 |
class TransitionTagName(InstanceTagName): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
336 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
337 |
def GetTagName(self, infos): |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
338 |
return self.Controller.ComputePouTransitionName( |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
339 |
infos.get("pou_name"), infos.get("name")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
340 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
341 |
instance_tagname_xslt = etree.parse( |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
342 |
os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt")) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
343 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
344 |
#------------------------------------------------------------------------------- |
814 | 345 |
# Undo Buffer for PLCOpenEditor |
346 |
#------------------------------------------------------------------------------- |
|
347 |
||
348 |
# Length of the buffer |
|
349 |
UNDO_BUFFER_LENGTH = 20 |
|
350 |
||
351 |
""" |
|
352 |
Class implementing a buffer of changes made on the current editing model |
|
353 |
""" |
|
354 |
class UndoBuffer: |
|
355 |
||
356 |
# Constructor initialising buffer |
|
357 |
def __init__(self, currentstate, issaved = False): |
|
358 |
self.Buffer = [] |
|
359 |
self.CurrentIndex = -1 |
|
360 |
self.MinIndex = -1 |
|
361 |
self.MaxIndex = -1 |
|
362 |
# if current state is defined |
|
363 |
if currentstate: |
|
364 |
self.CurrentIndex = 0 |
|
365 |
self.MinIndex = 0 |
|
366 |
self.MaxIndex = 0 |
|
367 |
# Initialising buffer with currentstate at the first place |
|
368 |
for i in xrange(UNDO_BUFFER_LENGTH): |
|
369 |
if i == 0: |
|
370 |
self.Buffer.append(currentstate) |
|
371 |
else: |
|
372 |
self.Buffer.append(None) |
|
373 |
# Initialising index of state saved |
|
374 |
if issaved: |
|
375 |
self.LastSave = 0 |
|
376 |
else: |
|
377 |
self.LastSave = -1 |
|
378 |
||
379 |
# Add a new state in buffer |
|
380 |
def Buffering(self, currentstate): |
|
381 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
382 |
self.Buffer[self.CurrentIndex] = currentstate |
|
383 |
# Actualising buffer limits |
|
384 |
self.MaxIndex = self.CurrentIndex |
|
385 |
if self.MinIndex == self.CurrentIndex: |
|
386 |
# If the removed state was the state saved, there is no state saved in the buffer |
|
387 |
if self.LastSave == self.MinIndex: |
|
388 |
self.LastSave = -1 |
|
389 |
self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH |
|
390 |
self.MinIndex = max(self.MinIndex, 0) |
|
391 |
||
392 |
# Return current state of buffer |
|
393 |
def Current(self): |
|
394 |
return self.Buffer[self.CurrentIndex] |
|
395 |
||
396 |
# Change current state to previous in buffer and return new current state |
|
397 |
def Previous(self): |
|
398 |
if self.CurrentIndex != self.MinIndex: |
|
399 |
self.CurrentIndex = (self.CurrentIndex - 1) % UNDO_BUFFER_LENGTH |
|
400 |
return self.Buffer[self.CurrentIndex] |
|
401 |
return None |
|
402 |
||
403 |
# Change current state to next in buffer and return new current state |
|
404 |
def Next(self): |
|
405 |
if self.CurrentIndex != self.MaxIndex: |
|
406 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
407 |
return self.Buffer[self.CurrentIndex] |
|
408 |
return None |
|
409 |
||
410 |
# Return True if current state is the first in buffer |
|
411 |
def IsFirst(self): |
|
412 |
return self.CurrentIndex == self.MinIndex |
|
413 |
||
414 |
# Return True if current state is the last in buffer |
|
415 |
def IsLast(self): |
|
416 |
return self.CurrentIndex == self.MaxIndex |
|
417 |
||
418 |
# Note that current state is saved |
|
419 |
def CurrentSaved(self): |
|
420 |
self.LastSave = self.CurrentIndex |
|
421 |
||
422 |
# Return True if current state is saved |
|
423 |
def IsCurrentSaved(self): |
|
424 |
return self.LastSave == self.CurrentIndex |
|
425 |
||
426 |
||
427 |
#------------------------------------------------------------------------------- |
|
428 |
# Controler for PLCOpenEditor |
|
429 |
#------------------------------------------------------------------------------- |
|
430 |
||
431 |
""" |
|
432 |
Class which controls the operations made on the plcopen model and answers to view requests |
|
433 |
""" |
|
434 |
class PLCControler: |
|
435 |
||
436 |
# Create a new PLCControler |
|
437 |
def __init__(self): |
|
438 |
self.LastNewIndex = 0 |
|
439 |
self.Reset() |
|
440 |
||
441 |
# Reset PLCControler internal variables |
|
442 |
def Reset(self): |
|
443 |
self.Project = None |
|
444 |
self.ProjectBufferEnabled = True |
|
445 |
self.ProjectBuffer = None |
|
446 |
self.ProjectSaved = True |
|
447 |
self.Buffering = False |
|
448 |
self.FilePath = "" |
|
449 |
self.FileName = "" |
|
450 |
self.ProgramChunks = [] |
|
451 |
self.ProgramOffset = 0 |
|
452 |
self.NextCompiledProject = None |
|
453 |
self.CurrentCompiledProject = None |
|
454 |
self.ConfNodeTypes = [] |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
455 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
456 |
self.TotalTypes = StdBlckLst[:] |
1284 | 457 |
self.ProgramFilePath = "" |
458 |
||
814 | 459 |
def GetQualifierTypes(self): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
460 |
return QualifierList |
814 | 461 |
|
462 |
def GetProject(self, debug = False): |
|
463 |
if debug and self.CurrentCompiledProject is not None: |
|
464 |
return self.CurrentCompiledProject |
|
465 |
else: |
|
466 |
return self.Project |
|
467 |
||
468 |
#------------------------------------------------------------------------------- |
|
469 |
# Project management functions |
|
470 |
#------------------------------------------------------------------------------- |
|
471 |
||
472 |
# Return if a project is opened |
|
473 |
def HasOpenedProject(self): |
|
474 |
return self.Project is not None |
|
475 |
||
476 |
# Create a new project by replacing the current one |
|
477 |
def CreateNewProject(self, properties): |
|
478 |
# Create the project |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
479 |
self.Project = PLCOpenParser.CreateRoot() |
814 | 480 |
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) |
481 |
self.Project.setfileHeader(properties) |
|
482 |
self.Project.setcontentHeader(properties) |
|
483 |
self.SetFilePath("") |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
484 |
|
814 | 485 |
# Initialize the project buffer |
486 |
self.CreateProjectBuffer(False) |
|
487 |
self.ProgramChunks = [] |
|
488 |
self.ProgramOffset = 0 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
489 |
self.NextCompiledProject = self.Copy(self.Project) |
814 | 490 |
self.CurrentCompiledProject = None |
491 |
self.Buffering = False |
|
492 |
||
493 |
# Return project data type names |
|
494 |
def GetProjectDataTypeNames(self, debug = False): |
|
495 |
project = self.GetProject(debug) |
|
496 |
if project is not None: |
|
497 |
return [datatype.getname() for datatype in project.getdataTypes()] |
|
498 |
return [] |
|
499 |
||
500 |
# Return project pou names |
|
501 |
def GetProjectPouNames(self, debug = False): |
|
502 |
project = self.GetProject(debug) |
|
503 |
if project is not None: |
|
504 |
return [pou.getname() for pou in project.getpous()] |
|
505 |
return [] |
|
506 |
||
507 |
# Return project pou names |
|
508 |
def GetProjectConfigNames(self, debug = False): |
|
509 |
project = self.GetProject(debug) |
|
510 |
if project is not None: |
|
511 |
return [config.getname() for config in project.getconfigurations()] |
|
512 |
return [] |
|
513 |
||
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
|
514 |
# 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
|
515 |
def GetProjectPouVariableNames(self, pou_name = None, debug = False): |
814 | 516 |
variables = [] |
517 |
project = self.GetProject(debug) |
|
518 |
if project is not None: |
|
519 |
for pou in project.getpous(): |
|
520 |
if pou_name is None or pou_name == pou.getname(): |
|
521 |
variables.extend([var["Name"] for var in self.GetPouInterfaceVars(pou, debug)]) |
|
522 |
for transition in pou.gettransitionList(): |
|
523 |
variables.append(transition.getname()) |
|
524 |
for action in pou.getactionList(): |
|
525 |
variables.append(action.getname()) |
|
526 |
return variables |
|
527 |
||
528 |
# Return file path if project is an open file |
|
529 |
def GetFilePath(self): |
|
530 |
return self.FilePath |
|
531 |
||
532 |
# Return file path if project is an open file |
|
533 |
def GetProgramFilePath(self): |
|
534 |
return self.ProgramFilePath |
|
535 |
||
536 |
# Return file name and point out if file is up to date |
|
537 |
def GetFilename(self): |
|
538 |
if self.Project is not None: |
|
539 |
if self.ProjectIsSaved(): |
|
540 |
return self.FileName |
|
541 |
else: |
|
542 |
return "~%s~"%self.FileName |
|
543 |
return "" |
|
544 |
||
545 |
# Change file path and save file name or create a default one if file path not defined |
|
546 |
def SetFilePath(self, filepath): |
|
547 |
self.FilePath = filepath |
|
548 |
if filepath == "": |
|
549 |
self.LastNewIndex += 1 |
|
550 |
self.FileName = _("Unnamed%d")%self.LastNewIndex |
|
551 |
else: |
|
552 |
self.FileName = os.path.splitext(os.path.basename(filepath))[0] |
|
553 |
||
554 |
# Change project properties |
|
555 |
def SetProjectProperties(self, name = None, properties = None, buffer = True): |
|
556 |
if self.Project is not None: |
|
557 |
if name is not None: |
|
558 |
self.Project.setname(name) |
|
559 |
if properties is not None: |
|
560 |
self.Project.setfileHeader(properties) |
|
561 |
self.Project.setcontentHeader(properties) |
|
562 |
if buffer and (name is not None or properties is not None): |
|
563 |
self.BufferProject() |
|
564 |
||
565 |
# Return project name |
|
566 |
def GetProjectName(self, debug=False): |
|
567 |
project = self.GetProject(debug) |
|
568 |
if project is not None: |
|
569 |
return project.getname() |
|
570 |
return None |
|
571 |
||
572 |
# Return project properties |
|
573 |
def GetProjectProperties(self, debug = False): |
|
574 |
project = self.GetProject(debug) |
|
575 |
if project is not None: |
|
576 |
properties = project.getfileHeader() |
|
577 |
properties.update(project.getcontentHeader()) |
|
578 |
return properties |
|
579 |
return None |
|
580 |
||
581 |
# Return project informations |
|
582 |
def GetProjectInfos(self, debug = False): |
|
583 |
project = self.GetProject(debug) |
|
584 |
if project is not None: |
|
585 |
infos = {"name": project.getname(), "type": ITEM_PROJECT} |
|
586 |
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values":[]} |
|
587 |
for datatype in project.getdataTypes(): |
|
588 |
datatypes["values"].append({"name": datatype.getname(), "type": ITEM_DATATYPE, |
|
589 |
"tagname": self.ComputeDataTypeName(datatype.getname()), "values": []}) |
|
590 |
pou_types = {"function": {"name": FUNCTIONS, "type": ITEM_FUNCTION, "values":[]}, |
|
591 |
"functionBlock": {"name": FUNCTION_BLOCKS, "type": ITEM_FUNCTIONBLOCK, "values":[]}, |
|
592 |
"program": {"name": PROGRAMS, "type": ITEM_PROGRAM, "values":[]}} |
|
593 |
for pou in project.getpous(): |
|
594 |
pou_type = pou.getpouType() |
|
595 |
pou_infos = {"name": pou.getname(), "type": ITEM_POU, |
|
596 |
"tagname": self.ComputePouName(pou.getname())} |
|
597 |
pou_values = [] |
|
598 |
if pou.getbodyType() == "SFC": |
|
599 |
transitions = [] |
|
600 |
for transition in pou.gettransitionList(): |
|
601 |
transitions.append({"name": transition.getname(), "type": ITEM_TRANSITION, |
|
602 |
"tagname": self.ComputePouTransitionName(pou.getname(), transition.getname()), |
|
603 |
"values": []}) |
|
604 |
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions}) |
|
605 |
actions = [] |
|
606 |
for action in pou.getactionList(): |
|
607 |
actions.append({"name": action.getname(), "type": ITEM_ACTION, |
|
608 |
"tagname": self.ComputePouActionName(pou.getname(), action.getname()), |
|
609 |
"values": []}) |
|
610 |
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions}) |
|
611 |
if pou_type in pou_types: |
|
612 |
pou_infos["values"] = pou_values |
|
613 |
pou_types[pou_type]["values"].append(pou_infos) |
|
614 |
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []} |
|
615 |
for config in project.getconfigurations(): |
|
616 |
config_name = config.getname() |
|
617 |
config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, |
|
618 |
"tagname": self.ComputeConfigurationName(config.getname()), |
|
619 |
"values": []} |
|
620 |
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []} |
|
621 |
for resource in config.getresource(): |
|
622 |
resource_name = resource.getname() |
|
623 |
resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, |
|
624 |
"tagname": self.ComputeConfigurationResourceName(config.getname(), resource.getname()), |
|
625 |
"values": []} |
|
626 |
resources["values"].append(resource_infos) |
|
627 |
config_infos["values"] = [resources] |
|
628 |
configurations["values"].append(config_infos) |
|
629 |
infos["values"] = [datatypes, pou_types["function"], pou_types["functionBlock"], |
|
630 |
pou_types["program"], configurations] |
|
631 |
return infos |
|
632 |
return None |
|
633 |
||
634 |
def GetPouVariables(self, tagname, debug = False): |
|
635 |
vars = [] |
|
636 |
pou_type = None |
|
637 |
project = self.GetProject(debug) |
|
638 |
if project is not None: |
|
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
639 |
pou_variable_xslt_tree = etree.XSLT( |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
640 |
pou_variables_xslt, extensions = { |
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset
|
641 |
("pou_vars_ns", "is_edited"): IsEdited(self, debug), |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
642 |
("pou_vars_ns", "is_debugged"): IsDebugged(self, debug), |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
643 |
("pou_vars_ns", "pou_class"): PouVariableClass(self, debug)}) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
644 |
|
814 | 645 |
words = tagname.split("::") |
646 |
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
|
647 |
obj = self.GetPou(words[1], debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
648 |
else: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
649 |
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
|
650 |
if obj is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
651 |
return compute_instance_tree( |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
652 |
pou_variable_xslt_tree(obj).getroot()) |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
653 |
return None |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
654 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
655 |
def GetInstanceList(self, root, name, debug = False): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
656 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
657 |
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
|
658 |
instances_path_xslt_tree = etree.XSLT( |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
659 |
instances_path_xslt, |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
660 |
extensions = { |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
661 |
("instances_ns", "instance_definition"): |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
662 |
InstanceDefinition(self, debug)}) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
663 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
664 |
return instances_path_xslt_tree(root, |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
665 |
instance_type=etree.XSLT.strparam(name)).getroot() |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
666 |
return None |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
667 |
|
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
668 |
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
|
669 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
670 |
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
|
671 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
672 |
if words[0] == "P": |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
673 |
result = self.GetInstanceList(project, words[1]) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
674 |
if result is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
675 |
return [instance.get("path") for instance in result] |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
676 |
return [] |
814 | 677 |
elif words[0] == 'C': |
678 |
return [words[1]] |
|
679 |
elif words[0] == 'R': |
|
680 |
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
|
681 |
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
|
682 |
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
|
683 |
for instance in self.SearchPouInstances( |
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset
|
684 |
self.ComputePouName(words[1]), debug)] |
814 | 685 |
return [] |
686 |
||
687 |
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
|
688 |
project = self.GetProject(debug) |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
689 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
690 |
instance_tagname_xslt_tree = etree.XSLT( |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
691 |
instance_tagname_xslt, |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
692 |
extensions = { |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
693 |
("instance_tagname_ns", "instance_definition"): InstanceDefinition(self, debug), |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
694 |
("instance_tagname_ns", "config_tagname"): ConfigTagName(self), |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
695 |
("instance_tagname_ns", "resource_tagname"): ResourceTagName(self), |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
696 |
("instance_tagname_ns", "pou_tagname"): PouTagName(self), |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
697 |
("instance_tagname_ns", "action_tagname"): ActionTagName(self), |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
698 |
("instance_tagname_ns", "transition_tagname"): TransitionTagName(self)}) |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
699 |
|
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
700 |
result = instance_tagname_xslt_tree(project, |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
701 |
instance_path=etree.XSLT.strparam(instance_path)).getroot() |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
702 |
if result is not None: |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
703 |
return result.text |
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
704 |
|
814 | 705 |
return None |
706 |
||
707 |
def GetInstanceInfos(self, instance_path, debug = False): |
|
708 |
tagname = self.GetPouInstanceTagName(instance_path) |
|
709 |
if tagname is not None: |
|
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
710 |
infos = self.GetPouVariables(tagname, debug) |
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
711 |
infos["type"] = tagname |
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
712 |
return infos |
814 | 713 |
else: |
714 |
pou_path, var_name = instance_path.rsplit(".", 1) |
|
715 |
tagname = self.GetPouInstanceTagName(pou_path) |
|
716 |
if tagname is not None: |
|
717 |
pou_infos = self.GetPouVariables(tagname, debug) |
|
718 |
for var_infos in pou_infos["variables"]: |
|
719 |
if var_infos["name"] == var_name: |
|
720 |
return var_infos |
|
721 |
return None |
|
722 |
||
723 |
# Return if data type given by name is used by another data type or pou |
|
724 |
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
|
725 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
726 |
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
|
727 |
return self.GetInstanceList(project, name, debug) is not None |
814 | 728 |
return False |
729 |
||
730 |
# Return if pou given by name is used by another pou |
|
731 |
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
|
732 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
733 |
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
|
734 |
return self.GetInstanceList(project, name, debug) is not None |
814 | 735 |
return False |
736 |
||
737 |
# Return if pou given by name is directly or undirectly used by the reference pou |
|
738 |
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
|
739 |
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
|
740 |
if pou_infos is not None: |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
741 |
return self.GetInstanceList(pou_infos, name, debug) is not None |
814 | 742 |
return False |
743 |
||
744 |
def GenerateProgram(self, filepath=None): |
|
745 |
errors = [] |
|
746 |
warnings = [] |
|
747 |
if self.Project is not None: |
|
748 |
try: |
|
749 |
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings) |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
750 |
self.NextCompiledProject = self.Copy(self.Project) |
901
ab43f3e40b9d
Fix bug when compiling project containing non-ascii characters
Laurent Bessard
parents:
887
diff
changeset
|
751 |
program_text = "".join([item[0] for item in self.ProgramChunks]) |
814 | 752 |
if filepath is not None: |
753 |
programfile = open(filepath, "w") |
|
754 |
programfile.write(program_text.encode("utf-8")) |
|
755 |
programfile.close() |
|
756 |
self.ProgramFilePath = filepath |
|
757 |
return program_text, errors, warnings |
|
758 |
except PLCGenException, e: |
|
759 |
errors.append(e.message) |
|
760 |
else: |
|
761 |
errors.append("No project opened") |
|
762 |
return "", errors, warnings |
|
763 |
||
764 |
def DebugAvailable(self): |
|
765 |
return self.CurrentCompiledProject is not None |
|
766 |
||
767 |
def ProgramTransferred(self): |
|
768 |
if self.NextCompiledProject is None: |
|
769 |
self.CurrentCompiledProject = self.NextCompiledProject |
|
770 |
else: |
|
771 |
self.CurrentCompiledProject = self.Copy(self.Project) |
|
772 |
||
773 |
def GetChunkInfos(self, from_location, to_location): |
|
774 |
row = self.ProgramOffset + 1 |
|
775 |
col = 1 |
|
776 |
infos = [] |
|
777 |
for chunk, chunk_infos in self.ProgramChunks: |
|
778 |
lines = chunk.split("\n") |
|
779 |
if len(lines) > 1: |
|
780 |
next_row = row + len(lines) - 1 |
|
781 |
next_col = len(lines[-1]) + 1 |
|
782 |
else: |
|
783 |
next_row = row |
|
784 |
next_col = col + len(chunk) |
|
785 |
if (next_row > from_location[0] or next_row == from_location[0] and next_col >= from_location[1]) and len(chunk_infos) > 0: |
|
786 |
infos.append((chunk_infos, (row, col))) |
|
787 |
if next_row == to_location[0] and next_col > to_location[1] or next_row > to_location[0]: |
|
788 |
return infos |
|
789 |
row, col = next_row, next_col |
|
790 |
return infos |
|
791 |
||
792 |
#------------------------------------------------------------------------------- |
|
793 |
# Project Pous management functions |
|
794 |
#------------------------------------------------------------------------------- |
|
795 |
||
796 |
# Add a Data Type to Project |
|
797 |
def ProjectAddDataType(self, datatype_name=None): |
|
798 |
if self.Project is not None: |
|
799 |
if datatype_name is None: |
|
800 |
datatype_name = self.GenerateNewName(None, None, "datatype%d") |
|
801 |
# Add the datatype to project |
|
802 |
self.Project.appenddataType(datatype_name) |
|
803 |
self.BufferProject() |
|
804 |
return self.ComputeDataTypeName(datatype_name) |
|
805 |
return None |
|
806 |
||
807 |
# Remove a Data Type from project |
|
808 |
def ProjectRemoveDataType(self, datatype_name): |
|
809 |
if self.Project is not None: |
|
810 |
self.Project.removedataType(datatype_name) |
|
811 |
self.BufferProject() |
|
812 |
||
813 |
# Add a Pou to Project |
|
814 |
def ProjectAddPou(self, pou_name, pou_type, body_type): |
|
815 |
if self.Project is not None: |
|
816 |
# Add the pou to project |
|
817 |
self.Project.appendpou(pou_name, pou_type, body_type) |
|
818 |
if pou_type == "function": |
|
819 |
self.SetPouInterfaceReturnType(pou_name, "BOOL") |
|
820 |
self.BufferProject() |
|
821 |
return self.ComputePouName(pou_name) |
|
822 |
return None |
|
823 |
||
824 |
def ProjectChangePouType(self, name, pou_type): |
|
825 |
if self.Project is not None: |
|
826 |
pou = self.Project.getpou(name) |
|
827 |
if pou is not None: |
|
828 |
pou.setpouType(pou_type) |
|
829 |
self.BufferProject() |
|
830 |
||
831 |
def GetPouXml(self, pou_name): |
|
832 |
if self.Project is not None: |
|
833 |
pou = self.Project.getpou(pou_name) |
|
834 |
if pou is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
835 |
return pou.tostring() |
814 | 836 |
return None |
837 |
||
838 |
def PastePou(self, pou_type, pou_xml): |
|
839 |
''' |
|
840 |
Adds the POU defined by 'pou_xml' to the current project with type 'pou_type' |
|
841 |
''' |
|
842 |
try: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
843 |
new_pou = LoadPou(pou_xml) |
814 | 844 |
except: |
845 |
return _("Couldn't paste non-POU object.") |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
846 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
847 |
name = new_pou.getname() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
848 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
849 |
idx = 0 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
850 |
new_name = name |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
851 |
while self.Project.getpou(new_name): |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
852 |
# a POU with that name already exists. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
853 |
# 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
|
854 |
# append an incrementing numeric suffix to the POU name. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
855 |
idx += 1 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
856 |
new_name = "%s%d" % (name, idx) |
814 | 857 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
858 |
# 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
|
859 |
new_pou.setname(new_name) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
860 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
861 |
if pou_type is not None: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
862 |
orig_type = new_pou.getpouType() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
863 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
864 |
# prevent violations of POU content restrictions: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
865 |
# function blocks cannot be pasted as functions, |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
866 |
# programs cannot be pasted as functions or function blocks |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
867 |
if orig_type == 'functionBlock' and pou_type == 'function' or \ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
868 |
orig_type == 'program' and pou_type in ['function', 'functionBlock']: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
869 |
return _('''%s "%s" can't be pasted as a %s.''') % (orig_type, name, pou_type) |
814 | 870 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
871 |
new_pou.setpouType(pou_type) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
872 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
873 |
self.Project.insertpou(-1, new_pou) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
874 |
self.BufferProject() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
875 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
876 |
return self.ComputePouName(new_name), |
814 | 877 |
|
878 |
# Remove a Pou from project |
|
879 |
def ProjectRemovePou(self, pou_name): |
|
880 |
if self.Project is not None: |
|
881 |
self.Project.removepou(pou_name) |
|
882 |
self.BufferProject() |
|
883 |
||
884 |
# Return the name of the configuration if only one exist |
|
885 |
def GetProjectMainConfigurationName(self): |
|
886 |
if self.Project is not None: |
|
887 |
# Found the configuration corresponding to old name and change its name to new name |
|
888 |
configurations = self.Project.getconfigurations() |
|
889 |
if len(configurations) == 1: |
|
890 |
return configurations[0].getname() |
|
891 |
return None |
|
892 |
||
893 |
# Add a configuration to Project |
|
894 |
def ProjectAddConfiguration(self, config_name=None): |
|
895 |
if self.Project is not None: |
|
896 |
if config_name is None: |
|
897 |
config_name = self.GenerateNewName(None, None, "configuration%d") |
|
898 |
self.Project.addconfiguration(config_name) |
|
899 |
self.BufferProject() |
|
900 |
return self.ComputeConfigurationName(config_name) |
|
901 |
return None |
|
902 |
||
903 |
# Remove a configuration from project |
|
904 |
def ProjectRemoveConfiguration(self, config_name): |
|
905 |
if self.Project is not None: |
|
906 |
self.Project.removeconfiguration(config_name) |
|
907 |
self.BufferProject() |
|
908 |
||
909 |
# Add a resource to a configuration of the Project |
|
910 |
def ProjectAddConfigurationResource(self, config_name, resource_name=None): |
|
911 |
if self.Project is not None: |
|
912 |
if resource_name is None: |
|
913 |
resource_name = self.GenerateNewName(None, None, "resource%d") |
|
914 |
self.Project.addconfigurationResource(config_name, resource_name) |
|
915 |
self.BufferProject() |
|
916 |
return self.ComputeConfigurationResourceName(config_name, resource_name) |
|
917 |
return None |
|
918 |
||
919 |
# Remove a resource from a configuration of the project |
|
920 |
def ProjectRemoveConfigurationResource(self, config_name, resource_name): |
|
921 |
if self.Project is not None: |
|
922 |
self.Project.removeconfigurationResource(config_name, resource_name) |
|
923 |
self.BufferProject() |
|
924 |
||
925 |
# Add a Transition to a Project Pou |
|
926 |
def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): |
|
927 |
if self.Project is not None: |
|
928 |
pou = self.Project.getpou(pou_name) |
|
929 |
if pou is not None: |
|
930 |
pou.addtransition(transition_name, transition_type) |
|
931 |
self.BufferProject() |
|
932 |
return self.ComputePouTransitionName(pou_name, transition_name) |
|
933 |
return None |
|
934 |
||
935 |
# Remove a Transition from a Project Pou |
|
936 |
def ProjectRemovePouTransition(self, pou_name, transition_name): |
|
937 |
# Search if the pou removed is currently opened |
|
938 |
if self.Project is not None: |
|
939 |
pou = self.Project.getpou(pou_name) |
|
940 |
if pou is not None: |
|
941 |
pou.removetransition(transition_name) |
|
942 |
self.BufferProject() |
|
943 |
||
944 |
# Add an Action to a Project Pou |
|
945 |
def ProjectAddPouAction(self, pou_name, action_name, action_type): |
|
946 |
if self.Project is not None: |
|
947 |
pou = self.Project.getpou(pou_name) |
|
948 |
if pou is not None: |
|
949 |
pou.addaction(action_name, action_type) |
|
950 |
self.BufferProject() |
|
951 |
return self.ComputePouActionName(pou_name, action_name) |
|
952 |
return None |
|
953 |
||
954 |
# Remove an Action from a Project Pou |
|
955 |
def ProjectRemovePouAction(self, pou_name, action_name): |
|
956 |
# Search if the pou removed is currently opened |
|
957 |
if self.Project is not None: |
|
958 |
pou = self.Project.getpou(pou_name) |
|
959 |
if pou is not None: |
|
960 |
pou.removeaction(action_name) |
|
961 |
self.BufferProject() |
|
962 |
||
963 |
# Change the name of a pou |
|
964 |
def ChangeDataTypeName(self, old_name, new_name): |
|
965 |
if self.Project is not None: |
|
966 |
# Found the pou corresponding to old name and change its name to new name |
|
967 |
datatype = self.Project.getdataType(old_name) |
|
968 |
if datatype is not None: |
|
969 |
datatype.setname(new_name) |
|
970 |
self.Project.updateElementName(old_name, new_name) |
|
971 |
self.BufferProject() |
|
972 |
||
973 |
# Change the name of a pou |
|
974 |
def ChangePouName(self, old_name, new_name): |
|
975 |
if self.Project is not None: |
|
976 |
# Found the pou corresponding to old name and change its name to new name |
|
977 |
pou = self.Project.getpou(old_name) |
|
978 |
if pou is not None: |
|
979 |
pou.setname(new_name) |
|
980 |
self.Project.updateElementName(old_name, new_name) |
|
981 |
self.BufferProject() |
|
982 |
||
983 |
# Change the name of a pou transition |
|
984 |
def ChangePouTransitionName(self, pou_name, old_name, new_name): |
|
985 |
if self.Project is not None: |
|
986 |
# Found the pou transition corresponding to old name and change its name to new name |
|
987 |
pou = self.Project.getpou(pou_name) |
|
988 |
if pou is not None: |
|
989 |
transition = pou.gettransition(old_name) |
|
990 |
if transition is not None: |
|
991 |
transition.setname(new_name) |
|
992 |
pou.updateElementName(old_name, new_name) |
|
993 |
self.BufferProject() |
|
994 |
||
995 |
# Change the name of a pou action |
|
996 |
def ChangePouActionName(self, pou_name, old_name, new_name): |
|
997 |
if self.Project is not None: |
|
998 |
# Found the pou action corresponding to old name and change its name to new name |
|
999 |
pou = self.Project.getpou(pou_name) |
|
1000 |
if pou is not None: |
|
1001 |
action = pou.getaction(old_name) |
|
1002 |
if action is not None: |
|
1003 |
action.setname(new_name) |
|
1004 |
pou.updateElementName(old_name, new_name) |
|
1005 |
self.BufferProject() |
|
1006 |
||
1007 |
# Change the name of a pou variable |
|
1008 |
def ChangePouVariableName(self, pou_name, old_name, new_name): |
|
1009 |
if self.Project is not None: |
|
1010 |
# Found the pou action corresponding to old name and change its name to new name |
|
1011 |
pou = self.Project.getpou(pou_name) |
|
1012 |
if pou is not None: |
|
1013 |
for type, varlist in pou.getvars(): |
|
1014 |
for var in varlist.getvariable(): |
|
1015 |
if var.getname() == old_name: |
|
1016 |
var.setname(new_name) |
|
1017 |
self.BufferProject() |
|
1018 |
||
1019 |
# Change the name of a configuration |
|
1020 |
def ChangeConfigurationName(self, old_name, new_name): |
|
1021 |
if self.Project is not None: |
|
1022 |
# Found the configuration corresponding to old name and change its name to new name |
|
1023 |
configuration = self.Project.getconfiguration(old_name) |
|
1024 |
if configuration is not None: |
|
1025 |
configuration.setname(new_name) |
|
1026 |
self.BufferProject() |
|
1027 |
||
1028 |
# Change the name of a configuration resource |
|
1029 |
def ChangeConfigurationResourceName(self, config_name, old_name, new_name): |
|
1030 |
if self.Project is not None: |
|
1031 |
# Found the resource corresponding to old name and change its name to new name |
|
1032 |
resource = self.Project.getconfigurationResource(config_name, old_name) |
|
1033 |
if resource is not None: |
|
1034 |
resource.setname(new_name) |
|
1035 |
self.BufferProject() |
|
1036 |
||
1037 |
# Return the description of the pou given by its name |
|
1038 |
def GetPouDescription(self, name, debug = False): |
|
1039 |
project = self.GetProject(debug) |
|
1040 |
if project is not None: |
|
1041 |
# Found the pou correponding to name and return its type |
|
1042 |
pou = project.getpou(name) |
|
1043 |
if pou is not None: |
|
1044 |
return pou.getdescription() |
|
1045 |
return "" |
|
1046 |
||
1047 |
# Return the description of the pou given by its name |
|
1048 |
def SetPouDescription(self, name, description, debug = False): |
|
1049 |
project = self.GetProject(debug) |
|
1050 |
if project is not None: |
|
1051 |
# Found the pou correponding to name and return its type |
|
1052 |
pou = project.getpou(name) |
|
1053 |
if pou is not None: |
|
1054 |
pou.setdescription(description) |
|
1055 |
self.BufferProject() |
|
1056 |
||
1057 |
# Return the type of the pou given by its name |
|
1058 |
def GetPouType(self, name, debug = False): |
|
1059 |
project = self.GetProject(debug) |
|
1060 |
if project is not None: |
|
1061 |
# Found the pou correponding to name and return its type |
|
1062 |
pou = project.getpou(name) |
|
1063 |
if pou is not None: |
|
1064 |
return pou.getpouType() |
|
1065 |
return None |
|
1066 |
||
1067 |
# Return pous with SFC language |
|
1068 |
def GetSFCPous(self, debug = False): |
|
1069 |
list = [] |
|
1070 |
project = self.GetProject(debug) |
|
1071 |
if project is not None: |
|
1072 |
for pou in project.getpous(): |
|
1073 |
if pou.getBodyType() == "SFC": |
|
1074 |
list.append(pou.getname()) |
|
1075 |
return list |
|
1076 |
||
1077 |
# Return the body language of the pou given by its name |
|
1078 |
def GetPouBodyType(self, name, debug = False): |
|
1079 |
project = self.GetProject(debug) |
|
1080 |
if project is not None: |
|
1081 |
# Found the pou correponding to name and return its body language |
|
1082 |
pou = project.getpou(name) |
|
1083 |
if pou is not None: |
|
1084 |
return pou.getbodyType() |
|
1085 |
return None |
|
1086 |
||
1087 |
# Return the actions of a pou |
|
1088 |
def GetPouTransitions(self, pou_name, debug = False): |
|
1089 |
transitions = [] |
|
1090 |
project = self.GetProject(debug) |
|
1091 |
if project is not None: |
|
1092 |
# Found the pou correponding to name and return its transitions if SFC |
|
1093 |
pou = project.getpou(pou_name) |
|
1094 |
if pou is not None and pou.getbodyType() == "SFC": |
|
1095 |
for transition in pou.gettransitionList(): |
|
1096 |
transitions.append(transition.getname()) |
|
1097 |
return transitions |
|
1098 |
||
1099 |
# Return the body language of the transition given by its name |
|
1100 |
def GetTransitionBodyType(self, pou_name, pou_transition, debug = False): |
|
1101 |
project = self.GetProject(debug) |
|
1102 |
if project is not None: |
|
1103 |
# Found the pou correponding to name |
|
1104 |
pou = project.getpou(pou_name) |
|
1105 |
if pou is not None: |
|
1106 |
# Found the pou transition correponding to name and return its body language |
|
1107 |
transition = pou.gettransition(pou_transition) |
|
1108 |
if transition is not None: |
|
1109 |
return transition.getbodyType() |
|
1110 |
return None |
|
1111 |
||
1112 |
# Return the actions of a pou |
|
1113 |
def GetPouActions(self, pou_name, debug = False): |
|
1114 |
actions = [] |
|
1115 |
project = self.GetProject(debug) |
|
1116 |
if project is not None: |
|
1117 |
# Found the pou correponding to name and return its actions if SFC |
|
1118 |
pou = project.getpou(pou_name) |
|
1119 |
if pou.getbodyType() == "SFC": |
|
1120 |
for action in pou.getactionList(): |
|
1121 |
actions.append(action.getname()) |
|
1122 |
return actions |
|
1123 |
||
1124 |
# Return the body language of the pou given by its name |
|
1125 |
def GetActionBodyType(self, pou_name, pou_action, debug = False): |
|
1126 |
project = self.GetProject(debug) |
|
1127 |
if project is not None: |
|
1128 |
# Found the pou correponding to name and return its body language |
|
1129 |
pou = project.getpou(pou_name) |
|
1130 |
if pou is not None: |
|
1131 |
action = pou.getaction(pou_action) |
|
1132 |
if action is not None: |
|
1133 |
return action.getbodyType() |
|
1134 |
return None |
|
1135 |
||
1136 |
# Extract varlists from a list of vars |
|
1137 |
def ExtractVarLists(self, vars): |
|
1138 |
varlist_list = [] |
|
1139 |
current_varlist = None |
|
1140 |
current_type = None |
|
1141 |
for var in vars: |
|
1142 |
next_type = (var["Class"], |
|
1143 |
var["Option"], |
|
1144 |
var["Location"] in ["", None] or |
|
1145 |
# When declaring globals, located |
|
1146 |
# and not located variables are |
|
1147 |
# in the same declaration block |
|
1148 |
var["Class"] == "Global") |
|
1149 |
if current_type != next_type: |
|
1150 |
current_type = next_type |
|
1151 |
infos = VAR_CLASS_INFOS.get(var["Class"], None) |
|
1152 |
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
|
1153 |
current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") |
814 | 1154 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1155 |
current_varlist = PLCOpenParser.CreateElement("varList") |
814 | 1156 |
varlist_list.append((var["Class"], current_varlist)) |
1157 |
if var["Option"] == "Constant": |
|
1158 |
current_varlist.setconstant(True) |
|
1159 |
elif var["Option"] == "Retain": |
|
1160 |
current_varlist.setretain(True) |
|
1161 |
elif var["Option"] == "Non-Retain": |
|
1162 |
current_varlist.setnonretain(True) |
|
1163 |
# 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
|
1164 |
tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") |
814 | 1165 |
tempvar.setname(var["Name"]) |
1166 |
||
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1167 |
var_type = PLCOpenParser.CreateElement("type", "variable") |
814 | 1168 |
if isinstance(var["Type"], TupleType): |
1169 |
if var["Type"][0] == "array": |
|
1170 |
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
|
1171 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1172 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1173 |
array.setbaseType(baseType) |
814 | 1174 |
for i, dimension in enumerate(dimensions): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1175 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 1176 |
if i == 0: |
1177 |
array.setdimension([dimension_range]) |
|
1178 |
else: |
|
1179 |
array.appenddimension(dimension_range) |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
1180 |
dimension_range.setlower(dimension[0]) |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
1181 |
dimension_range.setupper(dimension[1]) |
814 | 1182 |
if base_type_name in self.GetBaseTypes(): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1183 |
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
|
1184 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1185 |
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
|
1186 |
else base_type_name, "dataType")) |
814 | 1187 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1188 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1189 |
derived_datatype.setname(base_type_name) |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1190 |
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
|
1191 |
var_type.setcontent(array) |
814 | 1192 |
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
|
1193 |
var_type.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1194 |
var["Type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1195 |
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
|
1196 |
else var["Type"], "dataType")) |
814 | 1197 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1198 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1199 |
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
|
1200 |
var_type.setcontent(derived_type) |
814 | 1201 |
tempvar.settype(var_type) |
1202 |
||
1203 |
if var["Initial Value"] != "": |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1204 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
814 | 1205 |
value.setvalue(var["Initial Value"]) |
1206 |
tempvar.setinitialValue(value) |
|
1207 |
if var["Location"] != "": |
|
1208 |
tempvar.setaddress(var["Location"]) |
|
1209 |
else: |
|
1210 |
tempvar.setaddress(None) |
|
1211 |
if var['Documentation'] != "": |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1212 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1213 |
ft.setanyText(var['Documentation']) |
814 | 1214 |
tempvar.setdocumentation(ft) |
1215 |
||
1216 |
# Add variable to varList |
|
1217 |
current_varlist.appendvariable(tempvar) |
|
1218 |
return varlist_list |
|
1219 |
||
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1220 |
def GetVariableDictionary(self, object_with_vars, debug=False): |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1221 |
variables = [] |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1222 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1223 |
variables_infos_xslt_tree = etree.XSLT( |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1224 |
variables_infos_xslt, extensions = { |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1225 |
("var_infos_ns", "add_variable"): AddVariable(variables), |
1324
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
1226 |
("var_infos_ns", "var_tree"): VarTree(self, debug), |
884477877e53
Fixed bug in VariablePanel, function block variables in graphic viewers could be modified
Laurent Bessard
parents:
1322
diff
changeset
|
1227 |
("var_infos_ns", "is_edited"): VarIsEdited(self, debug)}) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1228 |
variables_infos_xslt_tree(object_with_vars) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1229 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1230 |
return variables |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1231 |
|
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
|
1232 |
# Add a global var to configuration to configuration |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1233 |
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
|
1234 |
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
|
1235 |
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
|
1236 |
# 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
|
1237 |
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
|
1238 |
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
|
1239 |
# Set configuration global vars |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1240 |
configuration.addglobalVar( |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1241 |
self.GetVarTypeObject(var_type), |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1242 |
var_name, location, description) |
814 | 1243 |
|
1244 |
# Replace the configuration globalvars by those given |
|
1245 |
def SetConfigurationGlobalVars(self, name, vars): |
|
1246 |
if self.Project is not None: |
|
1247 |
# Found the configuration corresponding to name |
|
1248 |
configuration = self.Project.getconfiguration(name) |
|
1249 |
if configuration is not None: |
|
1250 |
# 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
|
1251 |
configuration.setglobalVars([ |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1252 |
varlist for vartype, varlist |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1253 |
in self.ExtractVarLists(vars)]) |
814 | 1254 |
|
1255 |
# Return the configuration globalvars |
|
1256 |
def GetConfigurationGlobalVars(self, name, debug = False): |
|
1257 |
project = self.GetProject(debug) |
|
1258 |
if project is not None: |
|
1259 |
# Found the configuration corresponding to name |
|
1260 |
configuration = project.getconfiguration(name) |
|
1261 |
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
|
1262 |
# 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
|
1263 |
return self.GetVariableDictionary(configuration, debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1264 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1265 |
return [] |
814 | 1266 |
|
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
|
1267 |
# 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
|
1268 |
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
|
1269 |
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
|
1270 |
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
|
1271 |
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
|
1272 |
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
|
1273 |
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
|
1274 |
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
|
1275 |
[var.getname() for var in reduce( |
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
|
1276 |
lambda x, y: x + y, [varlist.getvariable() |
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
|
1277 |
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
|
1278 |
[])]) |
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
|
1279 |
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
|
1280 |
|
814 | 1281 |
# Replace the resource globalvars by those given |
1282 |
def SetConfigurationResourceGlobalVars(self, config_name, name, vars): |
|
1283 |
if self.Project is not None: |
|
1284 |
# Found the resource corresponding to name |
|
1285 |
resource = self.Project.getconfigurationResource(config_name, name) |
|
1286 |
# Set resource global vars |
|
1287 |
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
|
1288 |
resource.setglobalVars([ |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1289 |
varlist for vartype, varlist |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1290 |
in self.ExtractVarLists(vars)]) |
814 | 1291 |
|
1292 |
# Return the resource globalvars |
|
1293 |
def GetConfigurationResourceGlobalVars(self, config_name, name, debug = False): |
|
1294 |
project = self.GetProject(debug) |
|
1295 |
if project is not None: |
|
1296 |
# Found the resource corresponding to name |
|
1297 |
resource = project.getconfigurationResource(config_name, name) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1298 |
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
|
1299 |
# 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
|
1300 |
return self.GetVariableDictionary(resource, debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1301 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1302 |
return [] |
814 | 1303 |
|
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
|
1304 |
# Return resource 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
|
1305 |
def GetConfigurationResourceVariableNames(self, |
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
|
1306 |
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
|
1307 |
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
|
1308 |
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
|
1309 |
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
|
1310 |
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
|
1311 |
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
|
1312 |
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
|
1313 |
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
|
1314 |
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
|
1315 |
[var.getname() for var in reduce( |
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
|
1316 |
lambda x, y: x + y, [varlist.getvariable() |
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
|
1317 |
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
|
1318 |
[])]) |
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
|
1319 |
return variables |
814 | 1320 |
|
1321 |
# Return the interface for the given pou |
|
1322 |
def GetPouInterfaceVars(self, pou, debug = False): |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1323 |
interface = pou.interface |
814 | 1324 |
# 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
|
1325 |
if interface is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1326 |
# Extract variables defined in interface |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1327 |
return self.GetVariableDictionary(interface, debug) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1328 |
return [] |
814 | 1329 |
|
1330 |
# Replace the Pou interface by the one given |
|
1331 |
def SetPouInterfaceVars(self, name, vars): |
|
1332 |
if self.Project is not None: |
|
1333 |
# Found the pou corresponding to name and add interface if there isn't one yet |
|
1334 |
pou = self.Project.getpou(name) |
|
1335 |
if pou is not None: |
|
1336 |
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
|
1337 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1338 |
# Set Pou interface |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1339 |
pou.setvars([varlist for varlist_type, varlist in self.ExtractVarLists(vars)]) |
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
|
1340 |
|
814 | 1341 |
# 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
|
1342 |
def SetPouInterfaceReturnType(self, name, return_type): |
814 | 1343 |
if self.Project is not None: |
1344 |
pou = self.Project.getpou(name) |
|
1345 |
if pou is not None: |
|
1346 |
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
|
1347 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1348 |
# 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
|
1349 |
return_type_obj = pou.interface.getreturnType() |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1350 |
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
|
1351 |
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
|
1352 |
pou.interface.setreturnType(return_type_obj) |
814 | 1353 |
# Change return type |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1354 |
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
|
1355 |
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
|
1356 |
return_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1357 |
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
|
1358 |
else return_type, "dataType")) |
814 | 1359 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1360 |
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
|
1361 |
derived_type.setname(return_type) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1362 |
return_type.setcontent(derived_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
|
1363 |
|
814 | 1364 |
def UpdateProjectUsedPous(self, old_name, new_name): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1365 |
if self.Project is not None: |
814 | 1366 |
self.Project.updateElementName(old_name, new_name) |
1367 |
||
1368 |
def UpdateEditedElementUsedVariable(self, tagname, old_name, new_name): |
|
1369 |
pou = self.GetEditedElement(tagname) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1370 |
if pou is not None: |
814 | 1371 |
pou.updateElementName(old_name, new_name) |
1372 |
||
1373 |
# Return the return type of the pou given by its name |
|
1374 |
def GetPouInterfaceReturnTypeByName(self, name): |
|
1375 |
project = self.GetProject(debug) |
|
1376 |
if project is not None: |
|
1377 |
# Found the pou correponding to name and return the return type |
|
1378 |
pou = project.getpou(name) |
|
1379 |
if pou is not None: |
|
1380 |
return self.GetPouInterfaceReturnType(pou) |
|
1381 |
return False |
|
1382 |
||
1383 |
# Return the return type of the given pou |
|
1384 |
def GetPouInterfaceReturnType(self, pou): |
|
1385 |
# Verify that the pou has an interface |
|
1386 |
if pou.interface is not None: |
|
1387 |
# Return the return type if there is one |
|
1388 |
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
|
1389 |
if return_type is not None: |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1390 |
return_type_infos_xslt_tree = etree.XSLT( |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1391 |
variables_infos_xslt, extensions = { |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1392 |
("var_infos_ns", "var_tree"): VarTree(self)}) |
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
|
1393 |
return [extract_param(el) |
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
|
1394 |
for el in return_type_infos_xslt_tree(return_type).getroot()] |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1395 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1396 |
return [None, ([], [])] |
814 | 1397 |
|
1398 |
# Function that add a new confnode to the confnode list |
|
1399 |
def AddConfNodeTypesList(self, typeslist): |
|
1400 |
self.ConfNodeTypes.extend(typeslist) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1401 |
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
|
1402 |
"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
|
1403 |
for pou in confnodetypes["types"].getpous()]} |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1404 |
for confnodetypes in typeslist] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1405 |
self.TotalTypes.extend(addedcat) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1406 |
for cat in addedcat: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1407 |
for desc in cat["list"]: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1408 |
BlkLst = self.TotalTypesDict.setdefault(desc["name"],[]) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1409 |
BlkLst.append((section["name"], desc)) |
814 | 1410 |
|
1411 |
# Function that clear the confnode list |
|
1412 |
def ClearConfNodeTypes(self): |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1413 |
self.ConfNodeTypes = [] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1414 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1415 |
self.TotalTypes = StdBlckLst[:] |
814 | 1416 |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1417 |
def GetConfNodeDataTypes(self, exclude = None, only_locatables = False): |
814 | 1418 |
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
|
1419 |
"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
|
1420 |
datatype.getname() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1421 |
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
|
1422 |
if not only_locatables or self.IsLocatableDataType(datatype, debug)]} |
814 | 1423 |
for confnodetypes in self.ConfNodeTypes] |
1424 |
||
1425 |
def GetVariableLocationTree(self): |
|
1426 |
return [] |
|
1427 |
||
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1428 |
def GetConfNodeGlobalInstances(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1429 |
return [] |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1430 |
|
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1431 |
def GetConfigurationExtraVariables(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1432 |
global_vars = [] |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1433 |
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
|
1434 |
tempvar = PLCOpenParser.CreateElement("variable", "globalVars") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1435 |
tempvar.setname(var_name) |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1436 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1437 |
tempvartype = PLCOpenParser.CreateElement("type", "variable") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1438 |
if var_type in self.GetBaseTypes(): |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1439 |
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
|
1440 |
var_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1441 |
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
|
1442 |
else var_type, "dataType")) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1443 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1444 |
tempderivedtype = PLCOpenParser.CreateElement("derived", "dataType") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1445 |
tempderivedtype.setname(var_type) |