author  Laurent Bessard 
Wed, 09 Oct 2013 10:57:20 +0200  
changeset 1347  533741e5075c 
parent 1341  0923e602c603 
child 1348  aee0a7eb833a 
permissions  rwrr 
814  1 
#!/usr/bin/env python 
2 
# * coding: utf8 * 

3 

4 
#This file is part of PLCOpenEditor, a library implementing an IEC 611313 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 021111307 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 

1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

32 
from collections import OrderedDict, namedtuple 
814  33 

1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset

34 
from plcopen import * 
814  35 
from graphics.GraphicCommons import * 
36 
from PLCGenerator import * 

37 

38 
duration_model = re.compile("(?:([09]{1,2})h)?(?:([09]{1,2})m(?!s))?(?:([09]{1,2})s)?(?:([09]{1,3}(?:\.[09]*)?)ms)?") 

39 

40 
ITEMS_EDITABLE = [ITEM_PROJECT, 

41 
ITEM_POU, 

42 
ITEM_VARIABLE, 

43 
ITEM_TRANSITION, 

44 
ITEM_ACTION, 

45 
ITEM_CONFIGURATION, 

46 
ITEM_RESOURCE, 

47 
ITEM_DATATYPE 

48 
] = range(8) 

49 

50 
ITEMS_UNEDITABLE = [ITEM_DATATYPES, 

51 
ITEM_FUNCTION, 

52 
ITEM_FUNCTIONBLOCK, 

53 
ITEM_PROGRAM, 

54 
ITEM_TRANSITIONS, 

55 
ITEM_ACTIONS, 

56 
ITEM_CONFIGURATIONS, 

57 
ITEM_RESOURCES, 

58 
ITEM_PROPERTIES 

59 
] = range(8, 17) 

60 

61 
ITEMS_VARIABLE = [ITEM_VAR_LOCAL, 

62 
ITEM_VAR_GLOBAL, 

63 
ITEM_VAR_EXTERNAL, 

64 
ITEM_VAR_TEMP, 

65 
ITEM_VAR_INPUT, 

66 
ITEM_VAR_OUTPUT, 

67 
ITEM_VAR_INOUT 

68 
] = range(17, 24) 

69 

1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

70 
VAR_CLASS_INFOS = { 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

71 
"Local": ("localVars", ITEM_VAR_LOCAL), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

72 
"Global": ("globalVars", ITEM_VAR_GLOBAL), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

73 
"External": ("externalVars", ITEM_VAR_EXTERNAL), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

74 
"Temp": ("tempVars", ITEM_VAR_TEMP), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

75 
"Input": ("inputVars", ITEM_VAR_INPUT), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

76 
"Output": ("outputVars", ITEM_VAR_OUTPUT), 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

77 
"InOut": ("inOutVars", ITEM_VAR_INOUT)} 
814  78 

79 
POU_TYPES = {"program": ITEM_PROGRAM, 

80 
"functionBlock": ITEM_FUNCTIONBLOCK, 

81 
"function": ITEM_FUNCTION, 

82 
} 

83 

84 
LOCATIONS_ITEMS = [LOCATION_CONFNODE, 

85 
LOCATION_MODULE, 

86 
LOCATION_GROUP, 

87 
LOCATION_VAR_INPUT, 

88 
LOCATION_VAR_OUTPUT, 

89 
LOCATION_VAR_MEMORY] = range(6) 

90 

91 
ScriptDirectory = os.path.split(os.path.realpath(__file__))[0] 

92 

93 
def GetUneditableNames(): 

94 
_ = lambda x:x 

95 
return [_("Userdefined POUs"), _("Functions"), _("Function Blocks"), 

96 
_("Programs"), _("Data Types"), _("Transitions"), _("Actions"), 

97 
_("Configurations"), _("Resources"), _("Properties")] 

98 
UNEDITABLE_NAMES = GetUneditableNames() 

99 
[USER_DEFINED_POUS, FUNCTIONS, FUNCTION_BLOCKS, PROGRAMS, 

100 
DATA_TYPES, TRANSITIONS, ACTIONS, CONFIGURATIONS, 

101 
RESOURCES, PROPERTIES] = UNEDITABLE_NAMES 

102 

103 
# 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

104 
# Helper object for loading library in xslt stylesheets 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

105 
# 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

106 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

107 
class LibraryResolver(etree.Resolver): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

108 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

109 
def __init__(self, controller, debug=False): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

110 
self.Controller = controller 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

111 
self.Debug = debug 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

112 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

113 
def resolve(self, url, pubid, context): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

114 
lib_name = os.path.basename(url) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

115 
if lib_name in ["project", "stdlib", "extensions"]: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

116 
lib_el = etree.Element(lib_name) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

117 
if lib_name == "project": 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

118 
lib_el.append(deepcopy(self.Controller.GetProject(self.Debug))) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

119 
elif lib_name == "stdlib": 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

120 
for lib in [StdBlockLibrary, AddnlBlockLibrary]: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

121 
lib_el.append(deepcopy(lib)) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

122 
else: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

123 
for ctn in self.Controller.ConfNodeTypes: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

124 
lib_el.append(deepcopy(ctn["types"])) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

125 
return self.resolve_string(etree.tostring(lib_el), context) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

126 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

127 
# 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

128 
# Helpers functions for translating list of arguments 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

129 
# from xslt to valid arguments 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

130 
# 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

131 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

132 
_BoolValue = lambda x: x in ["true", "0"] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

133 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

134 
def _translate_args(translations, args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

135 
return [translate(arg[0]) if len(arg) > 0 else None 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

136 
for translate, arg in 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

137 
zip(translations, args)] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

138 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

139 
# 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

140 
# 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

141 
# 
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

142 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

143 
class _VariableInfos(object): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

144 
__slots__ = ["Name", "Class", "Option", "Location", "InitialValue", 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

145 
"Edit", "Documentation", "Type", "Tree", "Number"] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

146 
def __init__(self, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

147 
for attr, value in zip(self.__slots__, args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

148 
setattr(self, attr, value if value is not None else "") 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

149 
def copy(self): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

150 
return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__]) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

151 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

152 
class VariablesInfosFactory: 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

153 

ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

154 
def __init__(self, variables): 
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

155 
self.Variables = variables 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

156 
self.TreeStack = [] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

157 
self.Type = None 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

158 
self.Dimensions = None 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

159 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

160 
def SetType(self, context, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

161 
self.Type = args[0][0] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

162 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

163 
def GetType(self): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

164 
if len(self.Dimensions) > 0: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

165 
return ("array", self.Type, self.Dimensions) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

166 
return self.Type 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

167 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

168 
def GetTree(self): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

169 
return (self.TreeStack.pop(1), self.Dimensions) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

170 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

171 
def AddDimension(self, context, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

172 
self.Dimensions.append(tuple( 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

173 
_translate_args([str] * 2, args))) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

174 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

175 
def AddTree(self, context, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

176 
self.TreeStack.append([]) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

177 
self.Dimensions = [] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

178 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

179 
def AddVarToTree(self, context, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

180 
var = (args[0][0], self.Type, self.GetTree()) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

181 
self.TreeStack[1].append(var) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

182 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

183 
def AddVariable(self, context, *args): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

184 
self.Variables.append(_VariableInfos(*(_translate_args( 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

185 
[str] * 5 + [_BoolValue] + [str], args) + 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

186 
[self.GetType(), self.GetTree()]))) 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

187 

ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

188 
# 
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

189 
# 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

190 
# 
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 
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

193 
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

194 
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

195 
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

196 
return pou_type 
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

197 
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

198 
return { 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

199 
"configuration": ITEM_CONFIGURATION, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

200 
"resource": ITEM_RESOURCE, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

201 
"action": ITEM_ACTION, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

202 
"transition": ITEM_TRANSITION, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

203 
"program": ITEM_PROGRAM}.get(prt) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

204 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

205 
PARAM_VALUE_EXTRACTION = { 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

206 
"name": lambda el, prt: el.text, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

207 
"class": class_extraction, 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

208 
"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

209 
"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

210 
"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

211 
"variables": lambda el, prt: [ 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

212 
compute_instance_tree(chld) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

213 
for chld in el]} 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

214 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

215 
def compute_instance_tree(tree): 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

216 
return {el.tag: 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

217 
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

218 
for el in tree} 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

219 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

220 
class IsEdited(etree.XSLTExtension): 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

221 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

222 
def __init__(self, controller, debug): 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

223 
etree.XSLTExtension.__init__(self) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

224 
self.Controller = controller 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

225 
self.Debug = debug 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

226 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

227 
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

228 
typename = input_node.get("name") 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

229 
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

230 
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

231 

1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

232 
class IsDebugged(etree.XSLTExtension): 
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 
def __init__(self, controller, debug): 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

235 
etree.XSLTExtension.__init__(self) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

236 
self.Controller = controller 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

237 
self.Debug = debug 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

238 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

239 
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

240 
typename = input_node.get("name") 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

241 
project = self.Controller.GetProject(self.Debug) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

242 
pou_infos = project.getpou(typename) 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

243 
if pou_infos is not None: 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

244 
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

245 
return 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

246 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

247 
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

248 
if datatype_infos is not None: 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

249 
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

250 
return 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

251 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

252 
output_parent.text = "False" 
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 
class PouVariableClass(etree.XSLTExtension): 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

255 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

256 
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

257 
etree.XSLTExtension.__init__(self) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

258 
self.Controller = controller 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

259 
self.Debug = debug 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

260 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

261 
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

262 
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

263 
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

264 
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

265 
return 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

266 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

267 
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

268 

1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

269 
pou_variables_xslt = etree.parse( 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

270 
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

271 

df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

272 
# 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

273 
# 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

274 
# 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

275 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

276 
class InstanceDefinition(etree.XSLTExtension): 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

277 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

278 
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

279 
etree.XSLTExtension.__init__(self) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

280 
self.Controller = controller 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

281 
self.Debug = debug 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

282 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

283 
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

284 
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

285 
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

286 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

287 
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

288 
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

289 
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

290 
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

291 
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

292 
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

293 
return 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

294 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

295 
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

296 
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

297 
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

298 
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

299 
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

300 
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

301 
return 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

302 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

303 
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

304 
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

305 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

306 
# 
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

307 
# Helpers object for generating instance tagname 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

308 
# 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

309 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

310 
class InstanceTagName(etree.XSLTExtension): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

311 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

312 
def __init__(self, controller): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

313 
etree.XSLTExtension.__init__(self) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

314 
self.Controller = controller 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

315 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

316 
def GetTagName(self, infos): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

317 
return "" 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

318 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

319 
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

320 
tagname_infos = etree.Element('infos') 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

321 
self.process_children(context, tagname_infos) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

322 
tagname = etree.Element('tagname') 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

323 
tagname.text = self.GetTagName(tagname_infos) 
1326
e2c11668addf
Fixed instance type tagname computing xslt stylesheet
Laurent Bessard
parents:
1324
diff
changeset

324 
try: 
e2c11668addf
Fixed instance type tagname computing xslt stylesheet
Laurent Bessard
parents:
1324
diff
changeset

325 
output_parent.append(tagname) 
e2c11668addf
Fixed instance type tagname computing xslt stylesheet
Laurent Bessard
parents:
1324
diff
changeset

326 
except: 
e2c11668addf
Fixed instance type tagname computing xslt stylesheet
Laurent Bessard
parents:
1324
diff
changeset

327 
pass 
1321
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 ConfigTagName(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.ComputeConfigurationName(infos.get("name")) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

333 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

334 
class ResourceTagName(InstanceTagName): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

335 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

336 
def GetTagName(self, infos): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

337 
return self.Controller.ComputeConfigurationResourceName( 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

338 
infos.get("config_name"), infos.get("name")) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

339 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

340 
class PouTagName(InstanceTagName): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

341 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

342 
def GetTagName(self, infos): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

343 
return self.Controller.ComputePouName(infos.get("name")) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

344 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

345 
class ActionTagName(InstanceTagName): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

346 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

347 
def GetTagName(self, infos): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

348 
return self.Controller.ComputePouActionName( 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

349 
infos.get("pou_name"), infos.get("name")) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

350 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

351 
class TransitionTagName(InstanceTagName): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

352 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

353 
def GetTagName(self, infos): 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

354 
return self.Controller.ComputePouTransitionName( 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

355 
infos.get("pou_name"), infos.get("name")) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

356 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

357 
instance_tagname_xslt = etree.parse( 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

358 
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

359 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

360 
# 
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

361 
# Helpers object for generating pou block instances list 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

362 
# 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

363 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

364 
_Point = namedtuple("Point", ["x", "y"]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

365 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

366 
_BlockInstanceInfos = namedtuple("BlockInstanceInfos", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

367 
["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

368 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

369 
_BlockSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

370 
namedtuple("BlockSpecificValues", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

371 
["name", "execution_order"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

372 
[str, int]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

373 
_VariableSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

374 
namedtuple("VariableSpecificValues", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

375 
["name", "value_type", "execution_order"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

376 
[str, str, int]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

377 
_ConnectionSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

378 
namedtuple("ConnectionSpecificValues", ["name"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

379 
[str]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

380 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

381 
_PowerRailSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

382 
namedtuple("PowerRailSpecificValues", ["connectors"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

383 
[int]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

384 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

385 
_LDElementSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

386 
namedtuple("LDElementSpecificValues", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

387 
["name", "negated", "edge", "storage", "execution_order"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

388 
[str, _BoolValue, str, str, int]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

389 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

390 
_DivergenceSpecificValues = ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

391 
namedtuple("DivergenceSpecificValues", ["connectors"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

392 
[int]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

393 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

394 
_SpecificValuesTuples = { 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

395 
"comment": ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

396 
namedtuple("CommentSpecificValues", ["content"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

397 
[str]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

398 
"input": _VariableSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

399 
"output": _VariableSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

400 
"inout": _VariableSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

401 
"connector": _ConnectionSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

402 
"continuation": _ConnectionSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

403 
"leftPowerRail": _PowerRailSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

404 
"rightPowerRail": _PowerRailSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

405 
"contact": _LDElementSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

406 
"coil": _LDElementSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

407 
"step": ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

408 
namedtuple("StepSpecificValues", ["name", "initial", "action"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

409 
[str, _BoolValue, lambda x: x]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

410 
"transition": ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

411 
namedtuple("TransitionSpecificValues", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

412 
["priority", "condition_type", "condition", "connection"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

413 
[int, str, str, lambda x: x]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

414 
"selectionDivergence": _DivergenceSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

415 
"selectionConvergence": _DivergenceSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

416 
"simultaneousDivergence": _DivergenceSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

417 
"simultaneousConvergence": _DivergenceSpecificValues, 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

418 
"jump": ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

419 
namedtuple("JumpSpecificValues", ["target"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

420 
[str]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

421 
"actionBlock": ( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

422 
namedtuple("ActionBlockSpecificValues", ["actions"]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

423 
[lambda x: x]), 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

424 
} 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

425 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

426 
_InstanceConnectionInfos = namedtuple("InstanceConnectionInfos", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

427 
["name", "negated", "edge", "position", "links"]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

428 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

429 
_ConnectionLinkInfos = namedtuple("ConnectionLinkInfos", 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

430 
["refLocalId", "formalParameter", "points"]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

431 

1341  432 
class _ActionInfos(object): 
1339  433 
__slots__ = ["qualifier", "type", "value", "duration", "indicator"] 
434 
def __init__(self, *args): 

435 
for attr, value in zip(self.__slots__, args): 

436 
setattr(self, attr, value if value is not None else "") 

437 
def copy(self): 

438 
return _ActionInfos(*[getattr(self, attr) for attr in self.__slots__]) 

1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

439 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

440 
class BlockInstanceFactory: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

441 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

442 
def __init__(self, block_instances): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

443 
self.BlockInstances = block_instances 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

444 
self.CurrentInstance = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

445 
self.SpecificValues = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

446 
self.CurrentConnection = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

447 
self.CurrentLink = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

448 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

449 
def SetSpecificValues(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

450 
self.SpecificValues = list(args) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

451 
self.CurrentInstance = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

452 
self.CurrentConnection = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

453 
self.CurrentLink = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

454 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

455 
def AddBlockInstance(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

456 
specific_values_tuple, specific_values_translation = \ 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

457 
_SpecificValuesTuples.get(args[0][0], _BlockSpecificValues) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

458 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

459 
if (args[0][0] == "step" and len(self.SpecificValues) < 3 or 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

460 
args[0][0] == "transition" and len(self.SpecificValues) < 4): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

461 
self.SpecificValues.append([None]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

462 
elif args[0][0] == "actionBlock" and len(self.SpecificValues) < 1: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

463 
self.SpecificValues.append([[]]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

464 
specific_values = specific_values_tuple(*_translate_args( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

465 
specific_values_translation, self.SpecificValues)) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

466 
self.SpecificValues = None 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

467 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

468 
self.CurrentInstance = _BlockInstanceInfos( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

469 
*(_translate_args([str] + [int] * 5, args) + 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

470 
[specific_values, [], []])) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

471 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

472 
self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

473 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

474 
def AddInstanceConnection(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

475 
connection_args = _translate_args( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

476 
[str, str, _BoolValue, str, int, int], args) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

477 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

478 
self.CurrentConnection = _InstanceConnectionInfos( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

479 
*(connection_args[1:4] + [ 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

480 
_Point(*connection_args[4:6]), []])) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

481 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

482 
if self.CurrentInstance is not None: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

483 
if connection_args[0] == "input": 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

484 
self.CurrentInstance.inputs.append(self.CurrentConnection) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

485 
else: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

486 
self.CurrentInstance.outputs.append(self.CurrentConnection) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

487 
else: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

488 
self.SpecificValues.append([self.CurrentConnection]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

489 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

490 
def AddConnectionLink(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

491 
self.CurrentLink = _ConnectionLinkInfos( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

492 
*(_translate_args([int, str], args) + [[]])) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

493 
self.CurrentConnection.links.append(self.CurrentLink) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

494 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

495 
def AddLinkPoint(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

496 
self.CurrentLink.points.append(_Point( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

497 
*_translate_args([int, int], args))) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

498 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

499 
def AddAction(self, context, *args): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

500 
if len(self.SpecificValues) == 0: 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

501 
self.SpecificValues.append([[]]) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

502 
translated_args = _translate_args([str] * 5, args) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

503 
self.SpecificValues[0][0].append(_ActionInfos(*translated_args)) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

504 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

505 
pou_block_instances_xslt = etree.parse( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

506 
os.path.join(ScriptDirectory, "plcopen", "pou_block_instances.xslt")) 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

507 

c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

508 
# 
814  509 
# Undo Buffer for PLCOpenEditor 
510 
# 

511 

512 
# Length of the buffer 

513 
UNDO_BUFFER_LENGTH = 20 

514 

515 
""" 

516 
Class implementing a buffer of changes made on the current editing model 

517 
""" 

518 
class UndoBuffer: 

519 

520 
# Constructor initialising buffer 

521 
def __init__(self, currentstate, issaved = False): 

522 
self.Buffer = [] 

523 
self.CurrentIndex = 1 

524 
self.MinIndex = 1 

525 
self.MaxIndex = 1 

526 
# if current state is defined 

527 
if currentstate: 

528 
self.CurrentIndex = 0 

529 
self.MinIndex = 0 

530 
self.MaxIndex = 0 

531 
# Initialising buffer with currentstate at the first place 

532 
for i in xrange(UNDO_BUFFER_LENGTH): 

533 
if i == 0: 

534 
self.Buffer.append(currentstate) 

535 
else: 

536 
self.Buffer.append(None) 

537 
# Initialising index of state saved 

538 
if issaved: 

539 
self.LastSave = 0 

540 
else: 

541 
self.LastSave = 1 

542 

543 
# Add a new state in buffer 

544 
def Buffering(self, currentstate): 

545 
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH 

546 
self.Buffer[self.CurrentIndex] = currentstate 

547 
# Actualising buffer limits 

548 
self.MaxIndex = self.CurrentIndex 

549 
if self.MinIndex == self.CurrentIndex: 

550 
# If the removed state was the state saved, there is no state saved in the buffer 

551 
if self.LastSave == self.MinIndex: 

552 
self.LastSave = 1 

553 
self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH 

554 
self.MinIndex = max(self.MinIndex, 0) 

555 

556 
# Return current state of buffer 

557 
def Current(self): 

558 
return self.Buffer[self.CurrentIndex] 

559 

560 
# Change current state to previous in buffer and return new current state 

561 
def Previous(self): 

562 
if self.CurrentIndex != self.MinIndex: 

563 
self.CurrentIndex = (self.CurrentIndex  1) % UNDO_BUFFER_LENGTH 

564 
return self.Buffer[self.CurrentIndex] 

565 
return None 

566 

567 
# Change current state to next in buffer and return new current state 

568 
def Next(self): 

569 
if self.CurrentIndex != self.MaxIndex: 

570 
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH 

571 
return self.Buffer[self.CurrentIndex] 

572 
return None 

573 

574 
# Return True if current state is the first in buffer 

575 
def IsFirst(self): 

576 
return self.CurrentIndex == self.MinIndex 

577 

578 
# Return True if current state is the last in buffer 

579 
def IsLast(self): 

580 
return self.CurrentIndex == self.MaxIndex 

581 

582 
# Note that current state is saved 

583 
def CurrentSaved(self): 

584 
self.LastSave = self.CurrentIndex 

585 

586 
# Return True if current state is saved 

587 
def IsCurrentSaved(self): 

588 
return self.LastSave == self.CurrentIndex 

589 

590 

591 
# 

592 
# Controler for PLCOpenEditor 

593 
# 

594 

595 
""" 

596 
Class which controls the operations made on the plcopen model and answers to view requests 

597 
""" 

598 
class PLCControler: 

599 

600 
# Create a new PLCControler 

601 
def __init__(self): 

602 
self.LastNewIndex = 0 

603 
self.Reset() 

604 

605 
# Reset PLCControler internal variables 

606 
def Reset(self): 

607 
self.Project = None 

608 
self.ProjectBufferEnabled = True 

609 
self.ProjectBuffer = None 

610 
self.ProjectSaved = True 

611 
self.Buffering = False 

612 
self.FilePath = "" 

613 
self.FileName = "" 

614 
self.ProgramChunks = [] 

615 
self.ProgramOffset = 0 

616 
self.NextCompiledProject = None 

617 
self.CurrentCompiledProject = None 

618 
self.ConfNodeTypes = [] 

1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset

619 
self.TotalTypesDict = StdBlckDct.copy() 
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset

620 
self.TotalTypes = StdBlckLst[:] 
1284  621 
self.ProgramFilePath = "" 
622 

814  623 
def GetQualifierTypes(self): 
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset

624 
return QualifierList 
814  625 

626 
def GetProject(self, debug = False): 

627 
if debug and self.CurrentCompiledProject is not None: 

628 
return self.CurrentCompiledProject 

629 
else: 

630 
return self.Project 

631 

632 
# 

633 
# Project management functions 

634 
# 

635 

636 
# Return if a project is opened 

637 
def HasOpenedProject(self): 

638 
return self.Project is not None 

639 

640 
# Create a new project by replacing the current one 

641 
def CreateNewProject(self, properties): 

642 
# Create the project 

1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset

643 
self.Project = PLCOpenParser.CreateRoot() 
814  644 
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) 
645 
self.Project.setfileHeader(properties) 

646 
self.Project.setcontentHeader(properties) 

647 
self.SetFilePath("") 

1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

648 

814  649 
# Initialize the project buffer 
650 
self.CreateProjectBuffer(False) 

651 
self.ProgramChunks = [] 

652 
self.ProgramOffset = 0 

1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

653 
self.NextCompiledProject = self.Copy(self.Project) 
814  654 
self.CurrentCompiledProject = None 
655 
self.Buffering = False 

656 

657 
# Return project data type names 

658 
def GetProjectDataTypeNames(self, debug = False): 

659 
project = self.GetProject(debug) 

660 
if project is not None: 

661 
return [datatype.getname() for datatype in project.getdataTypes()] 

662 
return [] 

663 

664 
# Return project pou names 

665 
def GetProjectPouNames(self, debug = False): 

666 
project = self.GetProject(debug) 

667 
if project is not None: 

668 
return [pou.getname() for pou in project.getpous()] 

669 
return [] 

670 

671 
# Return project pou names 

672 
def GetProjectConfigNames(self, debug = False): 

673 
project = self.GetProject(debug) 

674 
if project is not None: 

675 
return [config.getname() for config in project.getconfigurations()] 

676 
return [] 

677 

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

678 
# 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

679 
def GetProjectPouVariableNames(self, pou_name = None, debug = False): 
814  680 
variables = [] 
681 
project = self.GetProject(debug) 

682 
if project is not None: 

683 
for pou in project.getpous(): 

684 
if pou_name is None or pou_name == pou.getname(): 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

685 
variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) 
814  686 
for transition in pou.gettransitionList(): 
687 
variables.append(transition.getname()) 

688 
for action in pou.getactionList(): 

689 
variables.append(action.getname()) 

690 
return variables 

691 

692 
# Return file path if project is an open file 

693 
def GetFilePath(self): 

694 
return self.FilePath 

695 

696 
# Return file path if project is an open file 

697 
def GetProgramFilePath(self): 

698 
return self.ProgramFilePath 

699 

700 
# Return file name and point out if file is up to date 

701 
def GetFilename(self): 

702 
if self.Project is not None: 

703 
if self.ProjectIsSaved(): 

704 
return self.FileName 

705 
else: 

706 
return "~%s~"%self.FileName 

707 
return "" 

708 

709 
# Change file path and save file name or create a default one if file path not defined 

710 
def SetFilePath(self, filepath): 

711 
self.FilePath = filepath 

712 
if filepath == "": 

713 
self.LastNewIndex += 1 

714 
self.FileName = _("Unnamed%d")%self.LastNewIndex 

715 
else: 

716 
self.FileName = os.path.splitext(os.path.basename(filepath))[0] 

717 

718 
# Change project properties 

719 
def SetProjectProperties(self, name = None, properties = None, buffer = True): 

720 
if self.Project is not None: 

721 
if name is not None: 

722 
self.Project.setname(name) 

723 
if properties is not None: 

724 
self.Project.setfileHeader(properties) 

725 
self.Project.setcontentHeader(properties) 

726 
if buffer and (name is not None or properties is not None): 

727 
self.BufferProject() 

728 

729 
# Return project name 

730 
def GetProjectName(self, debug=False): 

731 
project = self.GetProject(debug) 

732 
if project is not None: 

733 
return project.getname() 

734 
return None 

735 

736 
# Return project properties 

737 
def GetProjectProperties(self, debug = False): 

738 
project = self.GetProject(debug) 

739 
if project is not None: 

740 
properties = project.getfileHeader() 

741 
properties.update(project.getcontentHeader()) 

742 
return properties 

743 
return None 

744 

745 
# Return project informations 

746 
def GetProjectInfos(self, debug = False): 

747 
project = self.GetProject(debug) 

748 
if project is not None: 

749 
infos = {"name": project.getname(), "type": ITEM_PROJECT} 

750 
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values":[]} 

751 
for datatype in project.getdataTypes(): 

752 
datatypes["values"].append({"name": datatype.getname(), "type": ITEM_DATATYPE, 

753 
"tagname": self.ComputeDataTypeName(datatype.getname()), "values": []}) 

754 
pou_types = {"function": {"name": FUNCTIONS, "type": ITEM_FUNCTION, "values":[]}, 

755 
"functionBlock": {"name": FUNCTION_BLOCKS, "type": ITEM_FUNCTIONBLOCK, "values":[]}, 

756 
"program": {"name": PROGRAMS, "type": ITEM_PROGRAM, "values":[]}} 

757 
for pou in project.getpous(): 

758 
pou_type = pou.getpouType() 

759 
pou_infos = {"name": pou.getname(), "type": ITEM_POU, 

760 
"tagname": self.ComputePouName(pou.getname())} 

761 
pou_values = [] 

762 
if pou.getbodyType() == "SFC": 

763 
transitions = [] 

764 
for transition in pou.gettransitionList(): 

765 
transitions.append({"name": transition.getname(), "type": ITEM_TRANSITION, 

766 
"tagname": self.ComputePouTransitionName(pou.getname(), transition.getname()), 

767 
"values": []}) 

768 
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions}) 

769 
actions = [] 

770 
for action in pou.getactionList(): 

771 
actions.append({"name": action.getname(), "type": ITEM_ACTION, 

772 
"tagname": self.ComputePouActionName(pou.getname(), action.getname()), 

773 
"values": []}) 

774 
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions}) 

775 
if pou_type in pou_types: 

776 
pou_infos["values"] = pou_values 

777 
pou_types[pou_type]["values"].append(pou_infos) 

778 
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []} 

779 
for config in project.getconfigurations(): 

780 
config_name = config.getname() 

781 
config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, 

782 
"tagname": self.ComputeConfigurationName(config.getname()), 

783 
"values": []} 

784 
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []} 

785 
for resource in config.getresource(): 

786 
resource_name = resource.getname() 

787 
resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, 

788 
"tagname": self.ComputeConfigurationResourceName(config.getname(), resource.getname()), 

789 
"values": []} 

790 
resources["values"].append(resource_infos) 

791 
config_infos["values"] = [resources] 

792 
configurations["values"].append(config_infos) 

793 
infos["values"] = [datatypes, pou_types["function"], pou_types["functionBlock"], 

794 
pou_types["program"], configurations] 

795 
return infos 

796 
return None 

797 

798 
def GetPouVariables(self, tagname, debug = False): 

799 
pou_type = None 

800 
project = self.GetProject(debug) 

801 
if project is not None: 

1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

802 
pou_variable_xslt_tree = etree.XSLT( 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

803 
pou_variables_xslt, extensions = { 
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

804 
("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

805 
("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

806 
("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

807 

814  808 
words = tagname.split("::") 
809 
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

810 
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

811 
else: 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

812 
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

813 
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

814 
return compute_instance_tree( 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

815 
pou_variable_xslt_tree(obj).getroot()) 
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

816 
return None 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

817 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

818 
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

819 
project = self.GetProject(debug) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

820 
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

821 
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

822 
instances_path_xslt, 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

823 
extensions = { 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

824 
("instances_ns", "instance_definition"): 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

825 
InstanceDefinition(self, debug)}) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

826 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

827 
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

828 
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

829 
return None 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

830 

748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

831 
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

832 
project = self.GetProject(debug) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

833 
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

834 
words = tagname.split("::") 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

835 
if words[0] == "P": 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

836 
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

837 
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

838 
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

839 
return [] 
814  840 
elif words[0] == 'C': 
841 
return [words[1]] 

842 
elif words[0] == 'R': 

843 
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

844 
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

845 
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

846 
for instance in self.SearchPouInstances( 
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset

847 
self.ComputePouName(words[1]), debug)] 
814  848 
return [] 
849 

850 
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

851 
project = self.GetProject(debug) 
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

852 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

853 
instance_tagname_xslt_tree = etree.XSLT( 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

854 
instance_tagname_xslt, 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

855 
extensions = { 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

856 
("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

857 
("instance_tagname_ns", "config_tagname"): ConfigTagName(self), 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

858 
("instance_tagname_ns", "resource_tagname"): ResourceTagName(self), 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

859 
("instance_tagname_ns", "pou_tagname"): PouTagName(self), 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

860 
("instance_tagname_ns", "action_tagname"): ActionTagName(self), 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

861 
("instance_tagname_ns", "transition_tagname"): TransitionTagName(self)}) 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

862 

83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

863 
result = instance_tagname_xslt_tree(project, 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

864 
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

865 
if result is not None: 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

866 
return result.text 
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

867 

814  868 
return None 
869 

870 
def GetInstanceInfos(self, instance_path, debug = False): 

871 
tagname = self.GetPouInstanceTagName(instance_path) 

872 
if tagname is not None: 

827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset

873 
infos = self.GetPouVariables(tagname, debug) 
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset

874 
infos["type"] = tagname 
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset

875 
return infos 
814  876 
else: 
877 
pou_path, var_name = instance_path.rsplit(".", 1) 

878 
tagname = self.GetPouInstanceTagName(pou_path) 

879 
if tagname is not None: 

880 
pou_infos = self.GetPouVariables(tagname, debug) 

881 
for var_infos in pou_infos["variables"]: 

882 
if var_infos["name"] == var_name: 

883 
return var_infos 

884 
return None 

885 

886 
# Return if data type given by name is used by another data type or pou 

887 
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

888 
project = self.GetProject(debug) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

889 
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

890 
return self.GetInstanceList(project, name, debug) is not None 
814  891 
return False 
892 

893 
# Return if pou given by name is used by another pou 

894 
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

895 
project = self.GetProject(debug) 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

896 
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

897 
return self.GetInstanceList(project, name, debug) is not None 
814  898 
return False 
899 

900 
# Return if pou given by name is directly or undirectly used by the reference pou 

901 
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

902 
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

903 
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

904 
return self.GetInstanceList(pou_infos, name, debug) is not None 
814  905 
return False 
906 

907 
def GenerateProgram(self, filepath=None): 

908 
errors = [] 

909 
warnings = [] 

910 
if self.Project is not None: 

911 
try: 

912 
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings) 

1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

913 
self.NextCompiledProject = self.Copy(self.Project) 
901
ab43f3e40b9d
Fix bug when compiling project containing nonascii characters
Laurent Bessard
parents:
887
diff
changeset

914 
program_text = "".join([item[0] for item in self.ProgramChunks]) 
814  915 
if filepath is not None: 
916 
programfile = open(filepath, "w") 

917 
programfile.write(program_text.encode("utf8")) 

918 
programfile.close() 

919 
self.ProgramFilePath = filepath 

920 
return program_text, errors, warnings 

921 
except PLCGenException, e: 

922 
errors.append(e.message) 

923 
else: 

924 
errors.append("No project opened") 

925 
return "", errors, warnings 

926 

927 
def DebugAvailable(self): 

928 
return self.CurrentCompiledProject is not None 

929 

930 
def ProgramTransferred(self): 

931 
if self.NextCompiledProject is None: 

932 
self.CurrentCompiledProject = self.NextCompiledProject 

933 
else: 

934 
self.CurrentCompiledProject = self.Copy(self.Project) 

935 

936 
def GetChunkInfos(self, from_location, to_location): 

937 
row = self.ProgramOffset + 1 

938 
col = 1 

939 
infos = [] 

940 
for chunk, chunk_infos in self.ProgramChunks: 

941 
lines = chunk.split("\n") 

942 
if len(lines) > 1: 

943 
next_row = row + len(lines)  1 

944 
next_col = len(lines[1]) + 1 

945 
else: 

946 
next_row = row 

947 
next_col = col + len(chunk) 

948 
if (next_row > from_location[0] or next_row == from_location[0] and next_col >= from_location[1]) and len(chunk_infos) > 0: 

949 
infos.append((chunk_infos, (row, col))) 

950 
if next_row == to_location[0] and next_col > to_location[1] or next_row > to_location[0]: 

951 
return infos 

952 
row, col = next_row, next_col 

953 
return infos 

954 

955 
# 

956 
# Project Pous management functions 

957 
# 

958 

959 
# Add a Data Type to Project 

960 
def ProjectAddDataType(self, datatype_name=None): 

961 
if self.Project is not None: 

962 
if datatype_name is None: 

963 
datatype_name = self.GenerateNewName(None, None, "datatype%d") 

964 
# Add the datatype to project 

965 
self.Project.appenddataType(datatype_name) 

966 
self.BufferProject() 

967 
return self.ComputeDataTypeName(datatype_name) 

968 
return None 

969 

970 
# Remove a Data Type from project 

971 
def ProjectRemoveDataType(self, datatype_name): 

972 
if self.Project is not None: 

973 
self.Project.removedataType(datatype_name) 

974 
self.BufferProject() 

975 

976 
# Add a Pou to Project 

977 
def ProjectAddPou(self, pou_name, pou_type, body_type): 

978 
if self.Project is not None: 

979 
# Add the pou to project 

980 
self.Project.appendpou(pou_name, pou_type, body_type) 

981 
if pou_type == "function": 

982 
self.SetPouInterfaceReturnType(pou_name, "BOOL") 

983 
self.BufferProject() 

984 
return self.ComputePouName(pou_name) 

985 
return None 

986 

987 
def ProjectChangePouType(self, name, pou_type): 

988 
if self.Project is not None: 

989 
pou = self.Project.getpou(name) 

990 
if pou is not None: 

991 
pou.setpouType(pou_type) 

992 
self.BufferProject() 

993 

994 
def GetPouXml(self, pou_name): 

995 
if self.Project is not None: 

996 
pou = self.Project.getpou(pou_name) 

997 
if pou is not None: 

1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

998 
return pou.tostring() 
814  999 
return None 
1000 

1001 
def PastePou(self, pou_type, pou_xml): 

1002 
''' 

1003 
Adds the POU defined by 'pou_xml' to the current project with type 'pou_type' 

1004 
''' 

1005 
try: 

1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1328
diff
changeset

1006 
new_pou, error = LoadPou(pou_xml) 
814  1007 
except: 
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1328
diff
changeset

1008 
error = "" 
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1328
diff
changeset

1009 
if error is not None: 
814  1010 
return _("Couldn't paste nonPOU object.") 
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1011 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1012 
name = new_pou.getname() 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1013 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1014 
idx = 0 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1015 
new_name = name 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1016 
while self.Project.getpou(new_name): 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1017 
# a POU with that name already exists. 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1018 
# 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

1019 
# append an incrementing numeric suffix to the POU name. 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1020 
idx += 1 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1021 
new_name = "%s%d" % (name, idx) 
814  1022 

1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1023 
# 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

1024 
new_pou.setname(new_name) 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1025 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1026 
if pou_type is not None: 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1027 
orig_type = new_pou.getpouType() 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1028 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1029 
# prevent violations of POU content restrictions: 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1030 
# function blocks cannot be pasted as functions, 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1031 
# programs cannot be pasted as functions or function blocks 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1032 
if orig_type == 'functionBlock' and pou_type == 'function' or \ 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1033 
orig_type == 'program' and pou_type in ['function', 'functionBlock']: 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1034 
return _('''%s "%s" can't be pasted as a %s.''') % (orig_type, name, pou_type) 
814  1035 

1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1036 
new_pou.setpouType(pou_type) 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1037 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1038 
self.Project.insertpou(1, new_pou) 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1039 
self.BufferProject() 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1040 

9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

1041 
return self.ComputePouName(new_name), 
814  1042 

1043 
# Remove a Pou from project 

1044 
def ProjectRemovePou(self, pou_name): 

1045 
if self.Project is not None: 

1046 
self.Project.removepou(pou_name) 

1047 
self.BufferProject() 

1048 

1049 
# Return the name of the configuration if only one exist 

1050 
def GetProjectMainConfigurationName(self): 

1051 
if self.Project is not None: 

1052 
# Found the configuration corresponding to old name and change its name to new name 

1053 
configurations = self.Project.getconfigurations() 

1054 
if len(configurations) == 1: 

1055 
return configurations[0].getname() 

1056 
return None 

1057 

1058 
# Add a configuration to Project 

1059 
def ProjectAddConfiguration(self, config_name=None): 

1060 
if self.Project is not None: 

1061 
if config_name is None: 

1062 
config_name = self.GenerateNewName(None, None, "configuration%d") 

1063 
self.Project.addconfiguration(config_name) 

1064 
self.BufferProject() 

1065 
return self.ComputeConfigurationName(config_name) 

1066 
return None 

1067 

1068 
# Remove a configuration from project 

1069 
def ProjectRemoveConfiguration(self, config_name): 

1070 
if self.Project is not None: 

1071 
self.Project.removeconfiguration(config_name) 

1072 
self.BufferProject() 

1073 

1074 
# Add a resource to a configuration of the Project 

1075 
def ProjectAddConfigurationResource(self, config_name, resource_name=None): 

1076 
if self.Project is not None: 

1077 
if resource_name is None: 

1078 
resource_name = self.GenerateNewName(None, None, "resource%d") 

1079 
self.Project.addconfigurationResource(config_name, resource_name) 

1080 
self.BufferProject() 

1081 
return self.ComputeConfigurationResourceName(config_name, resource_name) 

1082 
return None 

1083 

1084 
# Remove a resource from a configuration of the project 

1085 
def ProjectRemoveConfigurationResource(self, config_name, resource_name): 

1086 
if self.Project is not None: 

1087 
self.Project.removeconfigurationResource(config_name, resource_name) 

1088 
self.BufferProject() 

1089 

1090 
# Add a Transition to a Project Pou 

1091 
def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): 

1092 
if self.Project is not None: 

1093 
pou = self.Project.getpou(pou_name) 

1094 
if pou is not None: 

1095 
pou.addtransition(transition_name, transition_type) 

1096 
self.BufferProject() 

1097 
return self.ComputePouTransitionName(pou_name, transition_name) 

1098 
return None 

1099 

1100 
# Remove a Transition from a Project Pou 

1101 
def ProjectRemovePouTransition(self, pou_name, transition_name): 

1102 
# Search if the pou removed is currently opened 

1103 
if self.Project is not None: 

1104 
pou = self.Project.getpou(pou_name) 

1105 
if pou is not None: 

1106 
pou.removetransition(transition_name) 

1107 
self.BufferProject() 

1108 

1109 
# Add an Action to a Project Pou 

1110 
def ProjectAddPouAction(self, pou_name, action_name, action_type): 

1111 
if self.Project is not None: 

1112 
pou = self.Project.getpou(pou_name) 

1113 
if pou is not None: 

1114 
pou.addaction(action_name, action_type) 

1115 
self.BufferProject() 

1116 
return self.ComputePouActionName(pou_name, action_name) 

1117 
return None 

1118 

1119 
# Remove an Action from a Project Pou 

1120 
def ProjectRemovePouAction(self, pou_name, action_name): 

1121 
# Search if the pou removed is currently opened 

1122 
if self.Project is not None: 

1123 
pou = self.Project.getpou(pou_name) 

1124 
if pou is not None: 

1125 
pou.removeaction(action_name) 

1126 
self.BufferProject() 

1127 

1128 
# Change the name of a pou 

1129 
def ChangeDataTypeName(self, old_name, new_name): 

1130 
if self.Project is not None: 

1131 
# Found the pou corresponding to old name and change its name to new name 

1132 
datatype = self.Project.getdataType(old_name) 

1133 
if datatype is not None: 

1134 
datatype.setname(new_name) 

1135 
self.Project.updateElementName(old_name, new_name) 

1136 
self.BufferProject() 

1137 

1138 
# Change the name of a pou 

1139 
def ChangePouName(self, old_name, new_name): 

1140 
if self.Project is not None: 

1141 
# Found the pou corresponding to old name and change its name to new name 

1142 
pou = self.Project.getpou(old_name) 

1143 
if pou is not None: 

1144 
pou.setname(new_name) 

1145 
self.Project.updateElementName(old_name, new_name) 

1146 
self.BufferProject() 

1147 

1148 
# Change the name of a pou transition 

1149 
def ChangePouTransitionName(self, pou_name, old_name, new_name): 

1150 
if self.Project is not None: 

1151 
# Found the pou transition corresponding to old name and change its name to new name 

1152 
pou = self.Project.getpou(pou_name) 

1153 
if pou is not None: 

1154 
transition = pou.gettransition(old_name) 

1155 
if transition is not None: 

1156 
transition.setname(new_name) 

1157 
pou.updateElementName(old_name, new_name) 

1158 
self.BufferProject() 

1159 

1160 
# Change the name of a pou action 

1161 
def ChangePouActionName(self, pou_name, old_name, new_name): 

1162 
if self.Project is not None: 

1163 
# Found the pou action corresponding to old name and change its name to new name 

1164 
pou = self.Project.getpou(pou_name) 

1165 
if pou is not None: 

1166 
action = pou.getaction(old_name) 

1167 
if action is not None: 

1168 
action.setname(new_name) 

1169 
pou.updateElementName(old_name, new_name) 

1170 
self.BufferProject() 

1171 

1172 
# Change the name of a pou variable 

1173 
def ChangePouVariableName(self, pou_name, old_name, new_name): 

1174 
if self.Project is not None: 

1175 
# Found the pou action corresponding to old name and change its name to new name 

1176 
pou = self.Project.getpou(pou_name) 

1177 
if pou is not None: 

1178 
for type, varlist in pou.getvars(): 

1179 
for var in varlist.getvariable(): 

1180 
if var.getname() == old_name: 

1181 
var.setname(new_name) 

1182 
self.BufferProject() 

1183 

1184 
# Change the name of a configuration 

1185 
def ChangeConfigurationName(self, old_name, new_name): 

1186 
if self.Project is not None: 

1187 
# Found the configuration corresponding to old name and change its name to new name 

1188 
configuration = self.Project.getconfiguration(old_name) 

1189 
if configuration is not None: 

1190 
configuration.setname(new_name) 

1191 
self.BufferProject() 

1192 

1193 
# Change the name of a configuration resource 

1194 
def ChangeConfigurationResourceName(self, config_name, old_name, new_name): 

1195 
if self.Project is not None: 

1196 
# Found the resource corresponding to old name and change its name to new name 

1197 
resource = self.Project.getconfigurationResource(config_name, old_name) 

1198 
if resource is not None: 

1199 
resource.setname(new_name) 

1200 
self.BufferProject() 

1201 

1202 
# Return the description of the pou given by its name 

1203 
def GetPouDescription(self, name, debug = False): 

1204 
project = self.GetProject(debug) 

1205 
if project is not None: 

1206 
# Found the pou correponding to name and return its type 

1207 
pou = project.getpou(name) 

1208 
if pou is not None: 

1209 
return pou.getdescription() 

1210 
return "" 

1211 

1212 
# Return the description of the pou given by its name 

1213 
def SetPouDescription(self, name, description, debug = False): 

1214 
project = self.GetProject(debug) 

1215 
if project is not None: 

1216 
# Found the pou correponding to name and return its type 

1217 
pou = project.getpou(name) 

1218 
if pou is not None: 

1219 
pou.setdescription(description) 

1220 
self.BufferProject() 

1221 

1222 
# Return the type of the pou given by its name 

1223 
def GetPouType(self, name, debug = False): 

1224 
project = self.GetProject(debug) 

1225 
if project is not None: 

1226 
# Found the pou correponding to name and return its type 

1227 
pou = project.getpou(name) 

1228 
if pou is not None: 

1229 
return pou.getpouType() 

1230 
return None 

1231 

1232 
# Return pous with SFC language 

1233 
def GetSFCPous(self, debug = False): 

1234 
list = [] 

1235 
project = self.GetProject(debug) 

1236 
if project is not None: 

1237 
for pou in project.getpous(): 

1238 
if pou.getBodyType() == "SFC": 

1239 
list.append(pou.getname()) 

1240 
return list 

1241 

1242 
# Return the body language of the pou given by its name 

1243 
def GetPouBodyType(self, name, debug = False): 

1244 
project = self.GetProject(debug) 

1245 
if project is not None: 

1246 
# Found the pou correponding to name and return its body language 

1247 
pou = project.getpou(name) 

1248 
if pou is not None: 

1249 
return pou.getbodyType() 

1250 
return None 

1251 

1252 
# Return the actions of a pou 

1253 
def GetPouTransitions(self, pou_name, debug = False): 

1254 
transitions = [] 

1255 
project = self.GetProject(debug) 

1256 
if project is not None: 

1257 
# Found the pou correponding to name and return its transitions if SFC 

1258 
pou = project.getpou(pou_name) 

1259 
if pou is not None and pou.getbodyType() == "SFC": 

1260 
for transition in pou.gettransitionList(): 

1261 
transitions.append(transition.getname()) 

1262 
return transitions 

1263 

1264 
# Return the body language of the transition given by its name 

1265 
def GetTransitionBodyType(self, pou_name, pou_transition, debug = False): 

1266 
project = self.GetProject(debug) 

1267 
if project is not None: 

1268 
# Found the pou correponding to name 

1269 
pou = project.getpou(pou_name) 

1270 
if pou is not None: 

1271 
# Found the pou transition correponding to name and return its body language 

1272 
transition = pou.gettransition(pou_transition) 

1273 
if transition is not None: 

1274 
return transition.getbodyType() 

1275 
return None 

1276 

1277 
# Return the actions of a pou 

1278 
def GetPouActions(self, pou_name, debug = False): 

1279 
actions = [] 

1280 
project = self.GetProject(debug) 

1281 
if project is not None: 

1282 
# Found the pou correponding to name and return its actions if SFC 

1283 
pou = project.getpou(pou_name) 

1284 
if pou.getbodyType() == "SFC": 

1285 
for action in pou.getactionList(): 

1286 
actions.append(action.getname()) 

1287 
return actions 

1288 

1289 
# Return the body language of the pou given by its name 

1290 
def GetActionBodyType(self, pou_name, pou_action, debug = False): 

1291 
project = self.GetProject(debug) 

1292 
if project is not None: 

1293 
# Found the pou correponding to name and return its body language 

1294 
pou = project.getpou(pou_name) 

1295 
if pou is not None: 

1296 
action = pou.getaction(pou_action) 

1297 
if action is not None: 

1298 
return action.getbodyType() 

1299 
return None 

1300 

1301 
# Extract varlists from a list of vars 

1302 
def ExtractVarLists(self, vars): 

1303 
varlist_list = [] 

1304 
current_varlist = None 

1305 
current_type = None 

1306 
for var in vars: 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1307 
next_type = (var.Class, 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1308 
var.Option, 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1309 
var.Location in ["", None] or 
814  1310 
# When declaring globals, located 
1311 
# and not located variables are 

1312 
# in the same declaration block 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1313 
var.Class == "Global") 
814  1314 
if current_type != next_type: 
1315 
current_type = next_type 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1316 
infos = VAR_CLASS_INFOS.get(var.Class, None) 
814  1317 
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

1318 
current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") 
814  1319 
else: 
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1320 
current_varlist = PLCOpenParser.CreateElement("varList") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1321 
varlist_list.append((var.Class, current_varlist)) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1322 
if var.Option == "Constant": 
814  1323 
current_varlist.setconstant(True) 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1324 
elif var.Option == "Retain": 
814  1325 
current_varlist.setretain(True) 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1326 
elif var.Option == "NonRetain": 
814  1327 
current_varlist.setnonretain(True) 
1328 
# 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

1329 
tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1330 
tempvar.setname(var.Name) 
814  1331 

1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1332 
var_type = PLCOpenParser.CreateElement("type", "variable") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1333 
if isinstance(var.Type, TupleType): 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1334 
if var.Type[0] == "array": 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1335 
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

1336 
array = PLCOpenParser.CreateElement("array", "dataType") 
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset

1337 
baseType = PLCOpenParser.CreateElement("baseType", "array") 
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset

1338 
array.setbaseType(baseType) 
814  1339 
for i, dimension in enumerate(dimensions): 
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset

1340 
dimension_range = PLCOpenParser.CreateElement("dimension", "array") 
814  1341 
if i == 0: 
1342 
array.setdimension([dimension_range]) 

1343 
else: 

1344 
array.appenddimension(dimension_range) 

1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset

1345 
dimension_range.setlower(dimension[0]) 
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset

1346 
dimension_range.setupper(dimension[1]) 
814  1347 
if base_type_name in self.GetBaseTypes(): 
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset

1348 
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

1349 
base_type_name.lower() 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1350 
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

1351 
else base_type_name, "dataType")) 
814  1352 
else: 
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1353 
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") 
814  1354 
derived_datatype.setname(base_type_name) 
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset

1355 
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

1356 
var_type.setcontent(array) 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1357 
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

1358 
var_type.setcontent(PLCOpenParser.CreateElement( 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1359 
var.Type.lower() 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1360 
if var.Type in ["STRING", "WSTRING"] 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1361 
else var.Type, "dataType")) 
814  1362 
else: 
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1363 
derived_type = PLCOpenParser.CreateElement("derived", "dataType") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1364 
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

1365 
var_type.setcontent(derived_type) 
814  1366 
tempvar.settype(var_type) 
1367 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1368 
if var.InitialValue != "": 
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1369 
value = PLCOpenParser.CreateElement("initialValue", "variable") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1370 
value.setvalue(var.InitialValue) 
814  1371 
tempvar.setinitialValue(value) 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1372 
if var.Location != "": 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1373 
tempvar.setaddress(var.Location) 
814  1374 
else: 
1375 
tempvar.setaddress(None) 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1376 
if var.Documentation != "": 
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset

1377 
ft = PLCOpenParser.CreateElement("documentation", "variable") 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1378 
ft.setanyText(var.Documentation) 
814  1379 
tempvar.setdocumentation(ft) 
1380 

1381 
# Add variable to varList 

1382 
current_varlist.appendvariable(tempvar) 

1383 
return varlist_list 

1384 

1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1385 
def GetVariableDictionary(self, object_with_vars, tree=False, debug=False): 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1386 
variables = [] 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1387 
factory = VariablesInfosFactory(variables) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1388 

533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1389 
parser = etree.XMLParser() 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1390 
if tree: 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1391 
parser.resolvers.add(LibraryResolver(self, debug)) 
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1392 

1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1393 
variables_infos_xslt_tree = etree.XSLT( 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1394 
etree.parse( 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1395 
os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1396 
parser), 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1397 
extensions = {("var_infos_ns", name): getattr(factory, name) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1398 
for name in ["SetType", "AddDimension", "AddTree", 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1399 
"AddVarToTree", "AddVariable"]}) 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1400 
variables_infos_xslt_tree(object_with_vars, 
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1401 
tree=etree.XSLT.strparam(str(tree))) 
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset

1402 

1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1403 
return variables 
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1404 

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

1405 
# 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

1406 
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

1407 
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

1408 
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

1409 
# 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

1410 
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

1411 
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

1412 
# Set configuration global vars 
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset

1413 
configuration.addglobalVar( 
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset

1414 
self.GetVarTypeObject(var_type), 
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset

1415 
var_name, location, description) 
814  1416 

1417 
# Replace the configuration globalvars by those given 

1418 
def SetConfigurationGlobalVars(self, name, vars): 

1419 
if self.Project is not None: 

1420 
# Found the configuration corresponding to name 

1421 
configuration = self.Project.getconfiguration(name) 

1422 
if configuration is not None: 

1423 
# 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

1424 
configuration.setglobalVars([ 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1425 
varlist for vartype, varlist 
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset

1426 
in self.ExtractVarLists(vars)]) 
814  1427 

1428 
# Return the configuration globalvars 

1429 
def GetConfigurationGlobalVars(self, name, debug = False): 

1430 
project = self.GetProject(debug) 

1431 
if project is not None: 

1432 
# Found the configuration corresponding to name 

1433 
configuration = project.getconfiguration(name) 

1434 
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

1435 
# 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

1436 
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

1437 

ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1438 
return [] 
814  1439 

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

1440 
# 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

1441 
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

1442 
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

1443 
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

1444 
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

1445 
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

1446 
if config_name is None or config_name == configuration.getname(): 