author  Laurent Bessard 
Fri, 11 Oct 2013 12:10:40 +0200  
changeset 1361  7158aa054226 
parent 1360  ebfe9c22af2a 
child 1367  324767a092dc 
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 

1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

192 
def class_extraction(value): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

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

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

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

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

197 
"transition": ITEM_TRANSITION, 
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

198 
"program": ITEM_PROGRAM}.get(value) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

199 
if class_type is not None: 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

200 
return class_type 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

201 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

202 
pou_type = POU_TYPES.get(value) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

203 
if pou_type is not None: 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

204 
return pou_type 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

205 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

206 
var_type = VAR_CLASS_INFOS.get(value) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

207 
if var_type is not None: 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

208 
return var_type[1] 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

209 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

210 
return None 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

211 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

212 
class _VariablesTreeItemInfos(object): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

213 
__slots__ = ["name", "var_class", "type", "edit", "debug", "variables"] 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

214 
def __init__(self, *args): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

215 
for attr, value in zip(self.__slots__, args): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

216 
setattr(self, attr, value if value is not None else "") 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

217 
def copy(self): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

218 
return _VariableTreeItem(*[getattr(self, attr) for attr in self.__slots__]) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

219 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

220 
class VariablesTreeInfosFactory: 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

221 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

222 
def __init__(self): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

223 
self.Root = None 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

224 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

225 
def GetRoot(self): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

226 
return self.Root 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

227 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

228 
def SetRoot(self, context, *args): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

229 
self.Root = _VariablesTreeItemInfos( 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

230 
*([''] + _translate_args( 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

231 
[class_extraction, str] + [_BoolValue] * 2, 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

232 
args) + [[]])) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

233 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

234 
def AddVariable(self, context, *args): 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

235 
if self.Root is not None: 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

236 
self.Root.variables.append(_VariablesTreeItemInfos( 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

237 
*(_translate_args( 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

238 
[str, class_extraction, str] + [_BoolValue] * 2, 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

239 
args) + [[]]))) 
1316
df9d02bd3eb7
Replaced old pou instance variable list generating process by xslt stylesheet
Laurent Bessard
parents:
1315
diff
changeset

240 

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

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

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

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

244 

1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

245 
class InstancesPathFactory: 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

246 

7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

247 
def __init__(self, instances): 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

248 
self.Instances = instances 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

249 

7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

250 
def AddInstance(self, context, *args): 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

251 
self.Instances.append(args[0][0]) 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

252 

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

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

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

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

256 

1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

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

258 

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

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

260 
self.Controller = controller 
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

261 
self.TagName = None 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

262 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

263 
def GetTagName(self): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

264 
return self.TagName 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

265 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

266 
def ConfigTagName(self, context, *args): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

267 
self.TagName = self.Controller.ComputeConfigurationName(args[0][0]) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

268 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

269 
def ResourceTagName(self, context, *args): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

270 
self.TagName = self.Controller.ComputeConfigurationResourceName(args[0][0], args[1][0]) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

271 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

272 
def PouTagName(self, context, *args): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

273 
#print "PouTagName", etree.tostring(args[0][0]) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

274 
self.TagName = self.Controller.ComputePouName(args[0][0]) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

275 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

276 
def ActionTagName(self, context, *args): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

277 
self.TagName = self.Controller.ComputePouActionName(args[0][0], args[0][1]) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

278 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

279 
def TransitionTagName(self, context, *args): 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

280 
self.TagName = self.Controller.ComputePouTransitionName(args[0][0], args[0][1]) 
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

281 

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

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

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

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

285 

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

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

287 

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

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

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

290 

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

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

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

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

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

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

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

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

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

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

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

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

302 

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

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

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

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

306 

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

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

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

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

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

311 

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

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

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

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

315 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

347 

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

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

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

350 

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

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

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

353 

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

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

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

359 
def copy(self): 

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

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

361 

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

362 
class BlockInstanceFactory: 
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 
def __init__(self, block_instances): 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

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

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

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

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

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

370 

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

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

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

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

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

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

376 

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

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

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

379 
_SpecificValuesTuples.get(args[0][0], _BlockSpecificValues) 
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 
if (args[0][0] == "step" and len(self.SpecificValues) < 3 or 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

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

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

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

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

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

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

388 
self.SpecificValues = None 
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 
self.CurrentInstance = _BlockInstanceInfos( 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

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

392 
[specific_values, [], []])) 
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 
self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance 
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset

395 

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

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

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

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

399 

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

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

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

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

403 

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

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

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

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

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

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

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

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

411 

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

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

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

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

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

416 

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

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

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

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

420 

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

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

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

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

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

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

426 

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

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

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

429 

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

430 
# 
814  431 
# Undo Buffer for PLCOpenEditor 
432 
# 

433 

434 
# Length of the buffer 

435 
UNDO_BUFFER_LENGTH = 20 

436 

437 
""" 

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

439 
""" 

440 
class UndoBuffer: 

441 

442 
# Constructor initialising buffer 

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

444 
self.Buffer = [] 

445 
self.CurrentIndex = 1 

446 
self.MinIndex = 1 

447 
self.MaxIndex = 1 

448 
# if current state is defined 

449 
if currentstate: 

450 
self.CurrentIndex = 0 

451 
self.MinIndex = 0 

452 
self.MaxIndex = 0 

453 
# Initialising buffer with currentstate at the first place 

454 
for i in xrange(UNDO_BUFFER_LENGTH): 

455 
if i == 0: 

456 
self.Buffer.append(currentstate) 

457 
else: 

458 
self.Buffer.append(None) 

459 
# Initialising index of state saved 

460 
if issaved: 

461 
self.LastSave = 0 

462 
else: 

463 
self.LastSave = 1 

464 

465 
# Add a new state in buffer 

466 
def Buffering(self, currentstate): 

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

468 
self.Buffer[self.CurrentIndex] = currentstate 

469 
# Actualising buffer limits 

470 
self.MaxIndex = self.CurrentIndex 

471 
if self.MinIndex == self.CurrentIndex: 

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

473 
if self.LastSave == self.MinIndex: 

474 
self.LastSave = 1 

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

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

477 

478 
# Return current state of buffer 

479 
def Current(self): 

480 
return self.Buffer[self.CurrentIndex] 

481 

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

483 
def Previous(self): 

484 
if self.CurrentIndex != self.MinIndex: 

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

486 
return self.Buffer[self.CurrentIndex] 

487 
return None 

488 

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

490 
def Next(self): 

491 
if self.CurrentIndex != self.MaxIndex: 

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

493 
return self.Buffer[self.CurrentIndex] 

494 
return None 

495 

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

497 
def IsFirst(self): 

498 
return self.CurrentIndex == self.MinIndex 

499 

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

501 
def IsLast(self): 

502 
return self.CurrentIndex == self.MaxIndex 

503 

504 
# Note that current state is saved 

505 
def CurrentSaved(self): 

506 
self.LastSave = self.CurrentIndex 

507 

508 
# Return True if current state is saved 

509 
def IsCurrentSaved(self): 

510 
return self.LastSave == self.CurrentIndex 

511 

512 

513 
# 

514 
# Controler for PLCOpenEditor 

515 
# 

516 

517 
""" 

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

519 
""" 

520 
class PLCControler: 

521 

522 
# Create a new PLCControler 

523 
def __init__(self): 

524 
self.LastNewIndex = 0 

525 
self.Reset() 

526 

527 
# Reset PLCControler internal variables 

528 
def Reset(self): 

529 
self.Project = None 

530 
self.ProjectBufferEnabled = True 

531 
self.ProjectBuffer = None 

532 
self.ProjectSaved = True 

533 
self.Buffering = False 

534 
self.FilePath = "" 

535 
self.FileName = "" 

536 
self.ProgramChunks = [] 

537 
self.ProgramOffset = 0 

538 
self.NextCompiledProject = None 

539 
self.CurrentCompiledProject = None 

540 
self.ConfNodeTypes = [] 

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

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

542 
self.TotalTypes = StdBlckLst[:] 
1284  543 
self.ProgramFilePath = "" 
544 

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

546 
return QualifierList 
814  547 

548 
def GetProject(self, debug = False): 

549 
if debug and self.CurrentCompiledProject is not None: 

550 
return self.CurrentCompiledProject 

551 
else: 

552 
return self.Project 

553 

554 
# 

555 
# Project management functions 

556 
# 

557 

558 
# Return if a project is opened 

559 
def HasOpenedProject(self): 

560 
return self.Project is not None 

561 

562 
# Create a new project by replacing the current one 

563 
def CreateNewProject(self, properties): 

564 
# Create the project 

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

565 
self.Project = PLCOpenParser.CreateRoot() 
814  566 
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) 
567 
self.Project.setfileHeader(properties) 

568 
self.Project.setcontentHeader(properties) 

569 
self.SetFilePath("") 

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

570 

814  571 
# Initialize the project buffer 
572 
self.CreateProjectBuffer(False) 

573 
self.ProgramChunks = [] 

574 
self.ProgramOffset = 0 

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

575 
self.NextCompiledProject = self.Copy(self.Project) 
814  576 
self.CurrentCompiledProject = None 
577 
self.Buffering = False 

578 

579 
# Return project data type names 

580 
def GetProjectDataTypeNames(self, debug = False): 

581 
project = self.GetProject(debug) 

582 
if project is not None: 

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

584 
return [] 

585 

586 
# Return project pou names 

587 
def GetProjectPouNames(self, debug = False): 

588 
project = self.GetProject(debug) 

589 
if project is not None: 

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

591 
return [] 

592 

593 
# Return project pou names 

594 
def GetProjectConfigNames(self, debug = False): 

595 
project = self.GetProject(debug) 

596 
if project is not None: 

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

598 
return [] 

599 

1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

600 
# Return project pou variable names 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

601 
def GetProjectPouVariableNames(self, pou_name = None, debug = False): 
814  602 
variables = [] 
603 
project = self.GetProject(debug) 

604 
if project is not None: 

605 
for pou in project.getpous(): 

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

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

607 
variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) 
814  608 
for transition in pou.gettransitionList(): 
609 
variables.append(transition.getname()) 

610 
for action in pou.getactionList(): 

611 
variables.append(action.getname()) 

612 
return variables 

613 

614 
# Return file path if project is an open file 

615 
def GetFilePath(self): 

616 
return self.FilePath 

617 

618 
# Return file path if project is an open file 

619 
def GetProgramFilePath(self): 

620 
return self.ProgramFilePath 

621 

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

623 
def GetFilename(self): 

624 
if self.Project is not None: 

625 
if self.ProjectIsSaved(): 

626 
return self.FileName 

627 
else: 

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

629 
return "" 

630 

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

632 
def SetFilePath(self, filepath): 

633 
self.FilePath = filepath 

634 
if filepath == "": 

635 
self.LastNewIndex += 1 

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

637 
else: 

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

639 

640 
# Change project properties 

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

642 
if self.Project is not None: 

643 
if name is not None: 

644 
self.Project.setname(name) 

645 
if properties is not None: 

646 
self.Project.setfileHeader(properties) 

647 
self.Project.setcontentHeader(properties) 

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

649 
self.BufferProject() 

650 

651 
# Return project name 

652 
def GetProjectName(self, debug=False): 

653 
project = self.GetProject(debug) 

654 
if project is not None: 

655 
return project.getname() 

656 
return None 

657 

658 
# Return project properties 

659 
def GetProjectProperties(self, debug = False): 

660 
project = self.GetProject(debug) 

661 
if project is not None: 

662 
properties = project.getfileHeader() 

663 
properties.update(project.getcontentHeader()) 

664 
return properties 

665 
return None 

666 

667 
# Return project informations 

668 
def GetProjectInfos(self, debug = False): 

669 
project = self.GetProject(debug) 

670 
if project is not None: 

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

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

673 
for datatype in project.getdataTypes(): 

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

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

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

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

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

679 
for pou in project.getpous(): 

680 
pou_type = pou.getpouType() 

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

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

683 
pou_values = [] 

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

685 
transitions = [] 

686 
for transition in pou.gettransitionList(): 

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

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

689 
"values": []}) 

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

691 
actions = [] 

692 
for action in pou.getactionList(): 

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

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

695 
"values": []}) 

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

697 
if pou_type in pou_types: 

698 
pou_infos["values"] = pou_values 

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

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

701 
for config in project.getconfigurations(): 

702 
config_name = config.getname() 

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

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

705 
"values": []} 

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

707 
for resource in config.getresource(): 

708 
resource_name = resource.getname() 

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

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

711 
"values": []} 

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

713 
config_infos["values"] = [resources] 

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

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

716 
pou_types["program"], configurations] 

717 
return infos 

718 
return None 

719 

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

721 
pou_type = None 

722 
project = self.GetProject(debug) 

723 
if project is not None: 

1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

724 
factory = VariablesTreeInfosFactory() 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

725 

aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

726 
parser = etree.XMLParser() 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

727 
parser.resolvers.add(LibraryResolver(self, debug)) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

728 

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

729 
pou_variable_xslt_tree = etree.XSLT( 
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

730 
etree.parse( 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

731 
os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt"), 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

732 
parser), 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

733 
extensions = {("pou_vars_ns", name): getattr(factory, name) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

734 
for name in ["SetRoot", "AddVariable"]}) 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

735 

1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

736 
obj = None 
814  737 
words = tagname.split("::") 
738 
if words[0] == "P": 

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

739 
obj = self.GetPou(words[1], debug) 
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

740 
elif words[0] != "D": 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

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

742 
if obj is not None: 
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

743 
pou_variable_xslt_tree(obj) 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

744 
return factory.GetRoot() 
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset

745 

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

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

747 

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

748 
def GetInstanceList(self, root, name, debug = False): 
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

749 
instances = [] 
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

750 
project = self.GetProject(debug) 
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

751 
if project is not None: 
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

752 
factory = InstancesPathFactory(instances) 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

753 

7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

754 
parser = etree.XMLParser() 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

755 
parser.resolvers.add(LibraryResolver(self, debug)) 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

756 

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

757 
instances_path_xslt_tree = etree.XSLT( 
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

758 
etree.parse( 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

759 
os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"), 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

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

761 
extensions = { 
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

762 
("instances_ns", "AddInstance"): factory.AddInstance}) 
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

763 

1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

764 
instances_path_xslt_tree(root, 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

765 
instance_type=etree.XSLT.strparam(name)) 
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

766 

1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

767 
return instances 
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

768 

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

769 
def SearchPouInstances(self, tagname, debug = False): 
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset

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

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

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

773 
if words[0] == "P": 
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset

774 
return self.GetInstanceList(project, words[1]) 
814  775 
elif words[0] == 'C': 
776 
return [words[1]] 

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

778 
return ["%s.%s" % (words[1], words[2])] 

826
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset

779 
elif words[0] in ['T', 'A']: 
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset

780 
return ["%s.%s" % (instance, words[2]) 
098f822ef308
Adding transition and action in list of instances of SFC POU in PouInstanceVariablesPanel
laurent
parents:
823
diff
changeset

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

782 
self.ComputePouName(words[1]), debug)] 
814  783 
return [] 
784 

785 
def GetPouInstanceTagName(self, instance_path, debug = False): 

1254
ebc765355536
Fixed bug when trying to add a global function block instance variable to debug variable panel and not connected
Laurent Bessard
parents:
1223
diff
changeset

786 
project = self.GetProject(debug) 
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

787 
factory = InstanceTagName(self) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

788 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

789 
parser = etree.XMLParser() 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

790 
parser.resolvers.add(LibraryResolver(self, debug)) 
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset

791 

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

792 
instance_tagname_xslt_tree = etree.XSLT( 
1351
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

793 
etree.parse( 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

794 
os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"), 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

795 
parser), 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

796 
extensions = {("instance_tagname_ns", name): getattr(factory, name) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

797 
for name in ["ConfigTagName", "ResourceTagName", 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

798 
"PouTagName", "ActionTagName", 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

799 
"TransitionTagName"]}) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

800 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

801 
instance_tagname_xslt_tree(project, 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

802 
instance_path=etree.XSLT.strparam(instance_path)) 
a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

803 

a546a63ce1bf
Fixed pou tagname of instance path computing stylesheet
Laurent Bessard
parents:
1350
diff
changeset

804 
return factory.GetTagName() 
814  805 

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

807 
tagname = self.GetPouInstanceTagName(instance_path) 

808 
if tagname is not None: 

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

809 
infos = self.GetPouVariables(tagname, debug) 
1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and retransfer PLC
Laurent Bessard
parents:
1354
diff
changeset

810 
infos.type = tagname 
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset

811 
return infos 
814  812 
else: 
813 
pou_path, var_name = instance_path.rsplit(".", 1) 

814 
tagname = self.GetPouInstanceTagName(pou_path) 

815 
if tagname is not None: 

816 
pou_infos = self.GetPouVariables(tagname, debug) 

1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and retransfer PLC
Laurent Bessard
parents:
1354
diff
changeset

817 
for var_infos in pou_infos.variables: 
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and retransfer PLC
Laurent Bessard
parents:
1354
diff
changeset

818 
if var_infos.name == var_name: 
814  819 
return var_infos 
820 
return None 

821 

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

823 
def DataTypeIsUsed(self, name, debug = False): 

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

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

825 
if project is not None: 
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

826 
return len(self.GetInstanceList(project, name, debug)) > 0 
814  827 
return False 
828 

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

830 
def PouIsUsed(self, name, debug = False): 

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

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

832 
if project is not None: 
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

833 
return len(self.GetInstanceList(project, name, debug)) > 0 
814  834 
return False 
835 

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

837 
def PouIsUsedBy(self, name, reference, debug = False): 

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

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

839 
if pou_infos is not None: 
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset

840 
return len(self.GetInstanceList(pou_infos, name, debug)) > 0 
814  841 
return False 
842 

843 
def GenerateProgram(self, filepath=None): 

844 
errors = [] 

845 
warnings = [] 

846 
if self.Project is not None: 

847 
try: 

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

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

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

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

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

854 
programfile.close() 

855 
self.ProgramFilePath = filepath 

856 
return program_text, errors, warnings 

857 
except PLCGenException, e: 

858 
errors.append(e.message) 

859 
else: 

860 
errors.append("No project opened") 

861 
return "", errors, warnings 

862 

863 
def DebugAvailable(self): 

864 
return self.CurrentCompiledProject is not None 

865 

866 
def ProgramTransferred(self): 

867 
if self.NextCompiledProject is None: 

868 
self.CurrentCompiledProject = self.NextCompiledProject 

869 
else: 

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

871 

872 
def GetChunkInfos(self, from_location, to_location): 

873 
row = self.ProgramOffset + 1 

874 
col = 1 

875 
infos = [] 

876 
for chunk, chunk_infos in self.ProgramChunks: 

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

878 
if len(lines) > 1: 

879 
next_row = row + len(lines)  1 

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

881 
else: 

882 
next_row = row 

883 
next_col = col + len(chunk) 

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

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

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

887 
return infos 

888 
row, col = next_row, next_col 

889 
return infos 

890 

891 
# 

892 
# Project Pous management functions 

893 
# 

894 

895 
# Add a Data Type to Project 

896 
def ProjectAddDataType(self, datatype_name=None): 

897 
if self.Project is not None: 

898 
if datatype_name is None: 

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

900 
# Add the datatype to project 

901 
self.Project.appenddataType(datatype_name) 

902 
self.BufferProject() 

903 
return self.ComputeDataTypeName(datatype_name) 

904 
return None 

905 

906 
# Remove a Data Type from project 

907 
def ProjectRemoveDataType(self, datatype_name): 

908 
if self.Project is not None: 

909 
self.Project.removedataType(datatype_name) 

910 
self.BufferProject() 

911 

912 
# Add a Pou to Project 

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

914 
if self.Project is not None: 

915 
# Add the pou to project 

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

917 
if pou_type == "function": 

918 
self.SetPouInterfaceReturnType(pou_name, "BOOL") 

919 
self.BufferProject() 

920 
return self.ComputePouName(pou_name) 

921 
return None 

922 

923 
def ProjectChangePouType(self, name, pou_type): 

924 
if self.Project is not None: 

925 
pou = self.Project.getpou(name) 

926 
if pou is not None: 

927 
pou.setpouType(pou_type) 

928 
self.BufferProject() 

929 

930 
def GetPouXml(self, pou_name): 

931 
if self.Project is not None: 

932 
pou = self.Project.getpou(pou_name) 

933 
if pou is not None: 

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

934 
return pou.tostring() 
814  935 
return None 
936 

937 
def PastePou(self, pou_type, pou_xml): 

938 
''' 

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

940 
''' 

941 
try: 

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

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

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

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

947 

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

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

949 

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

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

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

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

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

954 
# make a new name and test if a POU with that name exists. 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

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

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

957 
new_name = "%s%d" % (name, idx) 
814  958 

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

959 
# we've found a name that does not already exist, use it 
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset

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

961 

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

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

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

964 

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

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

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

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

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

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

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

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

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

973 

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

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

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

976 

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

977 
return self.ComputePouName(new_name), 
814  978 

979 
# Remove a Pou from project 

980 
def ProjectRemovePou(self, pou_name): 

981 
if self.Project is not None: 

982 
self.Project.removepou(pou_name) 

983 
self.BufferProject() 

984 

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

986 
def GetProjectMainConfigurationName(self): 

987 
if self.Project is not None: 

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

989 
configurations = self.Project.getconfigurations() 

990 
if len(configurations) == 1: 

991 
return configurations[0].getname() 

992 
return None 

993 

994 
# Add a configuration to Project 

995 
def ProjectAddConfiguration(self, config_name=None): 

996 
if self.Project is not None: 

997 
if config_name is None: 

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

999 
self.Project.addconfiguration(config_name) 

1000 
self.BufferProject() 

1001 
return self.ComputeConfigurationName(config_name) 

1002 
return None 

1003 

1004 
# Remove a configuration from project 

1005 
def ProjectRemoveConfiguration(self, config_name): 

1006 
if self.Project is not None: 

1007 
self.Project.removeconfiguration(config_name) 

1008 
self.BufferProject() 

1009 

1010 
# Add a resource to a configuration of the Project 

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

1012 
if self.Project is not None: 

1013 
if resource_name is None: 

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

1015 
self.Project.addconfigurationResource(config_name, resource_name) 

1016 
self.BufferProject() 

1017 
return self.ComputeConfigurationResourceName(config_name, resource_name) 

1018 
return None 

1019 

1020 
# Remove a resource from a configuration of the project 

1021 
def ProjectRemoveConfigurationResource(self, config_name, resource_name): 

1022 
if self.Project is not None: 

1023 
self.Project.removeconfigurationResource(config_name, resource_name) 

1024 
self.BufferProject() 

1025 

1026 
# Add a Transition to a Project Pou 

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

1028 
if self.Project is not None: 

1029 
pou = self.Project.getpou(pou_name) 

1030 
if pou is not None: 

1031 
pou.addtransition(transition_name, transition_type) 

1032 
self.BufferProject() 

1033 
return self.ComputePouTransitionName(pou_name, transition_name) 

1034 
return None 

1035 

1036 
# Remove a Transition from a Project Pou 

1037 
def ProjectRemovePouTransition(self, pou_name, transition_name): 

1038 
# Search if the pou removed is currently opened 

1039 
if self.Project is not None: 

1040 
pou = self.Project.getpou(pou_name) 

1041 
if pou is not None: 

1042 
pou.removetransition(transition_name) 

1043 
self.BufferProject() 

1044 

1045 
# Add an Action to a Project Pou 

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

1047 
if self.Project is not None: 

1048 
pou = self.Project.getpou(pou_name) 

1049 
if pou is not None: 

1050 
pou.addaction(action_name, action_type) 

1051 
self.BufferProject() 

1052 
return self.ComputePouActionName(pou_name, action_name) 

1053 
return None 

1054 

1055 
# Remove an Action from a Project Pou 

1056 
def ProjectRemovePouAction(self, pou_name, action_name): 

1057 
# Search if the pou removed is currently opened 

1058 
if self.Project is not None: 

1059 
pou = self.Project.getpou(pou_name) 

1060 
if pou is not None: 

1061 
pou.removeaction(action_name) 

1062 
self.BufferProject() 

1063 

1064 
# Change the name of a pou 

1065 
def ChangeDataTypeName(self, old_name, new_name): 

1066 
if self.Project is not None: 

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

1068 
datatype = self.Project.getdataType(old_name) 

1069 
if datatype is not None: 

1070 
datatype.setname(new_name) 

1071 
self.Project.updateElementName(old_name, new_name) 

1072 
self.BufferProject() 

1073 

1074 
# Change the name of a pou 

1075 
def ChangePouName(self, old_name, new_name): 

1076 
if self.Project is not None: 

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

1078 
pou = self.Project.getpou(old_name) 

1079 
if pou is not None: 

1080 
pou.setname(new_name) 

1081 
self.Project.updateElementName(old_name, new_name) 

1082 
self.BufferProject() 

1083 

1084 
# Change the name of a pou transition 

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

1086 
if self.Project is not None: 

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

1088 
pou = self.Project.getpou(pou_name) 

1089 
if pou is not None: 

1090 
transition = pou.gettransition(old_name) 

1091 
if transition is not None: 

1092 
transition.setname(new_name) 

1093 
pou.updateElementName(old_name, new_name) 

1094 
self.BufferProject() 

1095 

1096 
# Change the name of a pou action 

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

1098 
if self.Project is not None: 

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

1100 
pou = self.Project.getpou(pou_name) 

1101 
if pou is not None: 

1102 
action = pou.getaction(old_name) 

1103 
if action is not None: 

1104 
action.setname(new_name) 

1105 
pou.updateElementName(old_name, new_name) 

1106 
self.BufferProject() 

1107 

1108 
# Change the name of a pou variable 

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

1110 
if self.Project is not None: 

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

1112 
pou = self.Project.getpou(pou_name) 

1113 
if pou is not None: 

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

1115 
for var in varlist.getvariable(): 

1116 
if var.getname() == old_name: 

1117 
var.setname(new_name) 

1118 
self.BufferProject() 

1119 

1120 
# Change the name of a configuration 

1121 
def ChangeConfigurationName(self, old_name, new_name): 

1122 
if self.Project is not None: 

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

1124 
configuration = self.Project.getconfiguration(old_name) 

1125 
if configuration is not None: 

1126 
configuration.setname(new_name) 

1127 
self.BufferProject() 

1128 

1129 
# Change the name of a configuration resource 

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

1131 
if self.Project is not None: 

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

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

1134 
if resource is not None: 

1135 
resource.setname(new_name) 

1136 
self.BufferProject() 

1137 

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

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

1140 
project = self.GetProject(debug) 

1141 
if project is not None: 

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

1143 
pou = project.getpou(name) 

1144 
if pou is not None: 

1145 
return pou.getdescription() 

1146 
return "" 

1147 

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

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

1150 
project = self.GetProject(debug) 

1151 
if project is not None: 

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

1153 
pou = project.getpou(name) 

1154 
if pou is not None: 

1155 
pou.setdescription(description) 

1156 
self.BufferProject() 

1157 

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

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

1160 
project = self.GetProject(debug) 

1161 
if project is not None: 

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

1163 
pou = project.getpou(name) 

1164 
if pou is not None: 

1165 
return pou.getpouType() 

1166 
return None 

1167 

1168 
# Return pous with SFC language 

1169 
def GetSFCPous(self, debug = False): 

1170 
list = [] 

1171 
project = self.GetProject(debug) 

1172 
if project is not None: 

1173 
for pou in project.getpous(): 

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

1175 
list.append(pou.getname()) 

1176 
return list 

1177 

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

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

1180 
project = self.GetProject(debug) 

1181 
if project is not None: 

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

1183 
pou = project.getpou(name) 

1184 
if pou is not None: 

1185 
return pou.getbodyType() 

1186 
return None 

1187 

1188 
# Return the actions of a pou 

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

1190 
transitions = [] 

1191 
project = self.GetProject(debug) 

1192 
if project is not None: 

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

1194 
pou = project.getpou(pou_name) 

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

1196 
for transition in pou.gettransitionList(): 

1197 
transitions.append(transition.getname()) 

1198 
return transitions 

1199 

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

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

1202 
project = self.GetProject(debug) 

1203 
if project is not None: 

1204 
# Found the pou correponding to name 

1205 
pou = project.getpou(pou_name) 

1206 
if pou is not None: 

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

1208 
transition = pou.gettransition(pou_transition) 

1209 
if transition is not None: 

1210 
return transition.getbodyType() 

1211 
return None 

1212 

1213 
# Return the actions of a pou 

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

1215 
actions = [] 

1216 
project = self.GetProject(debug) 

1217 
if project is not None: 

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

1219 
pou = project.getpou(pou_name) 

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

1221 
for action in pou.getactionList(): 

1222 
actions.append(action.getname()) 

1223 
return actions 

1224 

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

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

1227 
project = self.GetProject(debug) 

1228 
if project is not None: 

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

1230 
pou = project.getpou(pou_name) 

1231 
if pou is not None: 

1232 
action = pou.getaction(pou_action) 

1233 
if action is not None: 

1234 
return action.getbodyType() 

1235 
return None 

1236 

1237 
# Extract varlists from a list of vars 

1238 
def ExtractVarLists(self, vars): 

1239 
varlist_list = [] 

1240 
current_varlist = None 

1241 
current_type = None 

1242 
for var in vars: 

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

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

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

1245 
var.Location in ["", None] or 
814  1246 
# When declaring globals, located 
1247 
# and not located variables are 

1248 
# in the same declaration block 

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

1249 
var.Class == "Global") 
814  1250 
if current_type != next_type: 
1251 
current_type = next_type 

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

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

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

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

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

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

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

1262 
elif var.Option == "NonRetain": 
814  1263 
current_varlist.setnonretain(True) 
1264 
# 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

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

1266 
tempvar.setname(var.Name) 
814  1267 

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

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

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

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

1271 
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

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

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

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

1276 
dimension_range = PLCOpenParser.CreateElement("dimension", "array") 
814  1277 
if i == 0: 
1278 
array.setdimension([dimension_range]) 

1279 
else: 

1280 
array.appenddimension(dimension_range) 

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

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

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

1284 
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

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

1286 
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

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

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

1291 
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

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

1293 
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

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

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

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

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

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

1300 
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

1301 
var_type.setcontent(derived_type) 
814  1302 
tempvar.settype(var_type) 
1303 

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

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

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

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

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

1309 
tempvar.setaddress(var.Location) 
814  1310 
else: 
1311 
tempvar.setaddress(None) 

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

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

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

1314 
ft.setanyText(var.Documentation) 
814  1315 
tempvar.setdocumentation(ft) 
1316 

1317 
# Add variable to varList 

1318 
current_varlist.appendvariable(tempvar) 

1319 
return varlist_list 

1320 

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

1321 
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

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

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

1324 

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

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

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

1327 
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

1328 

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

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

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

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

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

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

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

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

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

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

1338 

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

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

1340 

1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1341 
# Add a global var to configuration to configuration 
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset

1342 
def AddConfigurationGlobalVar(self, config_name, var_type, var_name, 
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1343 
location="", description=""): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1344 
if self.Project is not None: 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1345 
# Found the configuration corresponding to name 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1346 
configuration = self.Project.getconfiguration(config_name) 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1347 
if configuration is not None: 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

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

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

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

1351 
var_name, location, description) 
814  1352 

1353 
# Replace the configuration globalvars by those given 

1354 
def SetConfigurationGlobalVars(self, name, vars): 

1355 
if self.Project is not None: 

1356 
# Found the configuration corresponding to name 

1357 
configuration = self.Project.getconfiguration(name) 

1358 
if configuration is not None: 

1359 
# Set configuration global vars 

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

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

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

1362 
in self.ExtractVarLists(vars)]) 
814  1363 

1364 
# Return the configuration globalvars 

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

1366 
project = self.GetProject(debug) 

1367 
if project is not None: 

1368 
# Found the configuration corresponding to name 

1369 
configuration = project.getconfiguration(name) 

1370 
if configuration is not None: 

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

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

1372 
return self.GetVariableDictionary(configuration, debug) 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1373 

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

1374 
return [] 
814  1375 

1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1376 
# Return configuration variable names 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1377 
def GetConfigurationVariableNames(self, config_name = None, debug = False): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1378 
variables = [] 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1379 
project = self.GetProject(debug) 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1380 
if project is not None: 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1381 
for configuration in self.Project.getconfigurations(): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1382 
if config_name is None or config_name == configuration.getname(): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1383 
variables.extend( 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1384 
[var.getname() for var in reduce( 
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

1385 
lambda x, y: x + y, [varlist.getvariable() 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1386 
for varlist in configuration.globalVars], 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1387 
[])]) 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1388 
return variables 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1389 

814  1390 
# Replace the resource globalvars by those given 
1391 
def SetConfigurationResourceGlobalVars(self, config_name, name, vars): 

1392 
if self.Project is not None: 

1393 
# Found the resource corresponding to name 

1394 
resource = self.Project.getconfigurationResource(config_name, name) 

1395 
# Set resource global vars 

1396 
if resource is not None: 

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

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

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

1399 
in self.ExtractVarLists(vars)]) 
814  1400 

1401 
# Return the resource globalvars 

1402 
def GetConfigurationResourceGlobalVars(self, config_name, name, debug = False): 

1403 
project = self.GetProject(debug) 

1404 
if project is not None: 

1405 
# Found the resource corresponding to name 

1406 
resource = project.getconfigurationResource(config_name, name) 

1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset

1407 
if resource is not None: 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

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

1409 
return self.GetVariableDictionary(resource, debug) 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1410 

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

1411 
return [] 
814  1412 

1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1413 
# Return resource variable names 
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

1414 
def GetConfigurationResourceVariableNames(self, 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1415 
config_name = None, resource_name = None, debug = False): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1416 
variables = [] 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1417 
project = self.GetProject(debug) 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1418 
if project is not None: 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1419 
for configuration in self.Project.getconfigurations(): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1420 
if config_name is None or config_name == configuration.getname(): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1421 
for resource in configuration.getresource(): 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1422 
if resource_name is None or resource.getname() == resource_name: 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1423 
variables.extend( 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1424 
[var.getname() for var in reduce( 
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

1425 
lambda x, y: x + y, [varlist.getvariable() 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1426 
for varlist in resource.globalVars], 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1427 
[])]) 
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset

1428 
return variables 
814  1429 

1430 
# Return the interface for the given pou 

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

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

1432 
interface = pou.interface 
814  1433 
# Verify that the pou has an interface 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1434 
if interface is not None: 
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1435 
# Extract variables defined in interface 
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset

1436 
return self.GetVariableDictionary(interface, tree, debug) 
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset

1437 
return [] 
814  1438 

1439 
# Replace the Pou interface by the one given 

1440 
def SetPouInterfaceVars(self, name, vars): 

1441 
if self.Project is not None: 

1442 
# Found the pou corresponding to name and add interface if there isn't one yet 

1443 
pou = self.Project.getpou(name) 

1444 
if pou is not None: 

1445 
if pou.interface is None: 

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

1446 
pou.interface = PLCOpenParser.CreateElement("interface", "pou") 
814
