22 # You should have received a copy of the GNU General Public License |
22 # You should have received a copy of the GNU General Public License |
23 # along with this program; if not, write to the Free Software |
23 # along with this program; if not, write to the Free Software |
24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
25 |
25 |
26 |
26 |
27 from __future__ import absolute_import |
27 |
28 from __future__ import division |
28 |
29 from copy import deepcopy |
29 from copy import deepcopy |
30 import os |
30 import os |
31 import re |
31 import re |
32 import datetime |
32 import datetime |
33 from time import localtime |
33 from time import localtime |
72 if currentstate: |
72 if currentstate: |
73 self.CurrentIndex = 0 |
73 self.CurrentIndex = 0 |
74 self.MinIndex = 0 |
74 self.MinIndex = 0 |
75 self.MaxIndex = 0 |
75 self.MaxIndex = 0 |
76 # Initialising buffer with currentstate at the first place |
76 # Initialising buffer with currentstate at the first place |
77 for i in xrange(UNDO_BUFFER_LENGTH): |
77 for i in range(UNDO_BUFFER_LENGTH): |
78 if i == 0: |
78 if i == 0: |
79 self.Buffer.append(currentstate) |
79 self.Buffer.append(currentstate) |
80 else: |
80 else: |
81 self.Buffer.append(None) |
81 self.Buffer.append(None) |
82 # Initialising index of state saved |
82 # Initialising index of state saved |
1182 def GetBlockType(self, typename, inputs=None, debug=False): |
1182 def GetBlockType(self, typename, inputs=None, debug=False): |
1183 result_blocktype = {} |
1183 result_blocktype = {} |
1184 for _sectioname, blocktype in self.TotalTypesDict.get(typename, []): |
1184 for _sectioname, blocktype in self.TotalTypesDict.get(typename, []): |
1185 if inputs is not None and inputs != "undefined": |
1185 if inputs is not None and inputs != "undefined": |
1186 block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]]) |
1186 block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]]) |
1187 if reduce(lambda x, y: x and y, map(lambda x: x[0] == "ANY" or self.IsOfType(*x), zip(inputs, block_inputs)), True): |
1187 if reduce(lambda x, y: x and y, [x[0] == "ANY" or self.IsOfType(*x) for x in zip(inputs, block_inputs)], True): |
1188 return blocktype |
1188 return blocktype |
1189 else: |
1189 else: |
1190 if result_blocktype: |
1190 if result_blocktype: |
1191 if inputs == "undefined": |
1191 if inputs == "undefined": |
1192 return None |
1192 return None |
1245 words = tagname.split("::") |
1245 words = tagname.split("::") |
1246 name = None |
1246 name = None |
1247 if project is not None and words[0] in ["P", "T", "A"]: |
1247 if project is not None and words[0] in ["P", "T", "A"]: |
1248 name = words[1] |
1248 name = words[1] |
1249 blocktypes = [] |
1249 blocktypes = [] |
1250 for blocks in self.TotalTypesDict.itervalues(): |
1250 for blocks in self.TotalTypesDict.values(): |
1251 for _sectioname, block in blocks: |
1251 for _sectioname, block in blocks: |
1252 if block["type"] == "functionBlock": |
1252 if block["type"] == "functionBlock": |
1253 blocktypes.append(block["name"]) |
1253 blocktypes.append(block["name"]) |
1254 if project is not None: |
1254 if project is not None: |
1255 blocktypes.extend([ |
1255 blocktypes.extend([ |
1300 project = self.GetProject(debug) |
1300 project = self.GetProject(debug) |
1301 if project is not None: |
1301 if project is not None: |
1302 result = project.getpou(typename) |
1302 result = project.getpou(typename) |
1303 if result is not None: |
1303 if result is not None: |
1304 return result |
1304 return result |
1305 for standardlibrary in StdBlckLibs.values(): |
1305 for standardlibrary in list(StdBlckLibs.values()): |
1306 result = standardlibrary.getpou(typename) |
1306 result = standardlibrary.getpou(typename) |
1307 if result is not None: |
1307 if result is not None: |
1308 return result |
1308 return result |
1309 for confnodetype in self.ConfNodeTypes: |
1309 for confnodetype in self.ConfNodeTypes: |
1310 result = confnodetype["types"].getpou(typename) |
1310 result = confnodetype["types"].getpou(typename) |
1453 return self.GetDataTypeRange(basetype_content.getname(), debug) |
1453 return self.GetDataTypeRange(basetype_content.getname(), debug) |
1454 return None |
1454 return None |
1455 |
1455 |
1456 # Return Subrange types |
1456 # Return Subrange types |
1457 def GetSubrangeBaseTypes(self, exclude, debug=False): |
1457 def GetSubrangeBaseTypes(self, exclude, debug=False): |
1458 subrange_basetypes = DataTypeRange.keys() |
1458 subrange_basetypes = list(DataTypeRange.keys()) |
1459 project = self.GetProject(debug) |
1459 project = self.GetProject(debug) |
1460 if project is not None: |
1460 if project is not None: |
1461 subrange_basetypes.extend( |
1461 subrange_basetypes.extend( |
1462 [datatype.getname() for datatype in project.getdataTypes() |
1462 [datatype.getname() for datatype in project.getdataTypes() |
1463 if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
1463 if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
1968 x, y, width, height = bbox.bounding_box() |
1968 x, y, width, height = bbox.bounding_box() |
1969 if middle: |
1969 if middle: |
1970 new_pos[0] -= width // 2 |
1970 new_pos[0] -= width // 2 |
1971 new_pos[1] -= height // 2 |
1971 new_pos[1] -= height // 2 |
1972 else: |
1972 else: |
1973 new_pos = map(lambda x: x + 30, new_pos) |
1973 new_pos = [x + 30 for x in new_pos] |
1974 if scaling[0] != 0 and scaling[1] != 0: |
1974 if scaling[0] != 0 and scaling[1] != 0: |
1975 min_pos = map(lambda x: 30 / x, scaling) |
1975 min_pos = [30 / x for x in scaling] |
1976 minx = round(min_pos[0]) |
1976 minx = round(min_pos[0]) |
1977 if int(min_pos[0]) == round(min_pos[0]): |
1977 if int(min_pos[0]) == round(min_pos[0]): |
1978 minx += 1 |
1978 minx += 1 |
1979 miny = round(min_pos[1]) |
1979 miny = round(min_pos[1]) |
1980 if int(min_pos[1]) == round(min_pos[1]): |
1980 if int(min_pos[1]) == round(min_pos[1]): |
2116 self.AddEditedElementPouVar(tagname, new_type, new_name) |
2116 self.AddEditedElementPouVar(tagname, new_type, new_name) |
2117 elif new_typeinfos["type"] != "function": |
2117 elif new_typeinfos["type"] != "function": |
2118 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
2118 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
2119 elif new_name != old_name: |
2119 elif new_name != old_name: |
2120 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
2120 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
2121 for param, value in infos.items(): |
2121 for param, value in list(infos.items()): |
2122 if param == "name": |
2122 if param == "name": |
2123 if value != "": |
2123 if value != "": |
2124 block.setinstanceName(value) |
2124 block.setinstanceName(value) |
2125 else: |
2125 else: |
2126 block.attrib.pop("instanceName", None) |
2126 block.attrib.pop("instanceName", None) |
2177 element = self.GetEditedElement(tagname) |
2177 element = self.GetEditedElement(tagname) |
2178 if element is not None: |
2178 if element is not None: |
2179 variable = element.getinstance(id) |
2179 variable = element.getinstance(id) |
2180 if variable is None: |
2180 if variable is None: |
2181 return |
2181 return |
2182 for param, value in infos.items(): |
2182 for param, value in list(infos.items()): |
2183 if param == "name": |
2183 if param == "name": |
2184 variable.setexpression(value) |
2184 variable.setexpression(value) |
2185 elif param == "executionOrder" and variable.getexecutionOrderId() != value: |
2185 elif param == "executionOrder" and variable.getexecutionOrderId() != value: |
2186 element.setelementExecutionOrder(variable, value) |
2186 element.setelementExecutionOrder(variable, value) |
2187 elif param == "height": |
2187 elif param == "height": |
2230 element = self.GetEditedElement(tagname) |
2230 element = self.GetEditedElement(tagname) |
2231 if element is not None: |
2231 if element is not None: |
2232 connection = element.getinstance(id) |
2232 connection = element.getinstance(id) |
2233 if connection is None: |
2233 if connection is None: |
2234 return |
2234 return |
2235 for param, value in infos.items(): |
2235 for param, value in list(infos.items()): |
2236 if param == "name": |
2236 if param == "name": |
2237 connection.setname(value) |
2237 connection.setname(value) |
2238 elif param == "height": |
2238 elif param == "height": |
2239 connection.setheight(value) |
2239 connection.setheight(value) |
2240 elif param == "width": |
2240 elif param == "width": |
2262 |
2262 |
2263 def SetEditedElementCommentInfos(self, tagname, id, infos): |
2263 def SetEditedElementCommentInfos(self, tagname, id, infos): |
2264 element = self.GetEditedElement(tagname) |
2264 element = self.GetEditedElement(tagname) |
2265 if element is not None: |
2265 if element is not None: |
2266 comment = element.getinstance(id) |
2266 comment = element.getinstance(id) |
2267 for param, value in infos.items(): |
2267 for param, value in list(infos.items()): |
2268 if param == "content": |
2268 if param == "content": |
2269 comment.setcontentText(value) |
2269 comment.setcontentText(value) |
2270 elif param == "height": |
2270 elif param == "height": |
2271 comment.setheight(value) |
2271 comment.setheight(value) |
2272 elif param == "width": |
2272 elif param == "width": |
2289 element = self.GetEditedElement(tagname) |
2289 element = self.GetEditedElement(tagname) |
2290 if element is not None: |
2290 if element is not None: |
2291 powerrail = element.getinstance(id) |
2291 powerrail = element.getinstance(id) |
2292 if powerrail is None: |
2292 if powerrail is None: |
2293 return |
2293 return |
2294 for param, value in infos.items(): |
2294 for param, value in list(infos.items()): |
2295 if param == "height": |
2295 if param == "height": |
2296 powerrail.setheight(value) |
2296 powerrail.setheight(value) |
2297 elif param == "width": |
2297 elif param == "width": |
2298 powerrail.setwidth(value) |
2298 powerrail.setwidth(value) |
2299 elif param == "x": |
2299 elif param == "x": |
2328 element = self.GetEditedElement(tagname) |
2328 element = self.GetEditedElement(tagname) |
2329 if element is not None: |
2329 if element is not None: |
2330 contact = element.getinstance(id) |
2330 contact = element.getinstance(id) |
2331 if contact is None: |
2331 if contact is None: |
2332 return |
2332 return |
2333 for param, value in infos.items(): |
2333 for param, value in list(infos.items()): |
2334 if param == "name": |
2334 if param == "name": |
2335 contact.setvariable(value) |
2335 contact.setvariable(value) |
2336 elif param == "type": |
2336 elif param == "type": |
2337 negated, edge = { |
2337 negated, edge = { |
2338 CONTACT_NORMAL: (False, "none"), |
2338 CONTACT_NORMAL: (False, "none"), |
2371 element = self.GetEditedElement(tagname) |
2371 element = self.GetEditedElement(tagname) |
2372 if element is not None: |
2372 if element is not None: |
2373 coil = element.getinstance(id) |
2373 coil = element.getinstance(id) |
2374 if coil is None: |
2374 if coil is None: |
2375 return |
2375 return |
2376 for param, value in infos.items(): |
2376 for param, value in list(infos.items()): |
2377 if param == "name": |
2377 if param == "name": |
2378 coil.setvariable(value) |
2378 coil.setvariable(value) |
2379 elif param == "type": |
2379 elif param == "type": |
2380 negated, storage, edge = { |
2380 negated, storage, edge = { |
2381 COIL_NORMAL: (False, "none", "none"), |
2381 COIL_NORMAL: (False, "none", "none"), |
2417 element = self.GetEditedElement(tagname) |
2417 element = self.GetEditedElement(tagname) |
2418 if element is not None: |
2418 if element is not None: |
2419 step = element.getinstance(id) |
2419 step = element.getinstance(id) |
2420 if step is None: |
2420 if step is None: |
2421 return |
2421 return |
2422 for param, value in infos.items(): |
2422 for param, value in list(infos.items()): |
2423 if param == "name": |
2423 if param == "name": |
2424 step.setname(value) |
2424 step.setname(value) |
2425 elif param == "initial": |
2425 elif param == "initial": |
2426 step.setinitialStep(value) |
2426 step.setinitialStep(value) |
2427 elif param == "height": |
2427 elif param == "height": |
2467 element = self.GetEditedElement(tagname) |
2467 element = self.GetEditedElement(tagname) |
2468 if element is not None: |
2468 if element is not None: |
2469 transition = element.getinstance(id) |
2469 transition = element.getinstance(id) |
2470 if transition is None: |
2470 if transition is None: |
2471 return |
2471 return |
2472 for param, value in infos.items(): |
2472 for param, value in list(infos.items()): |
2473 if param == "type" and value != "connection": |
2473 if param == "type" and value != "connection": |
2474 transition.setconditionContent(value, infos["condition"]) |
2474 transition.setconditionContent(value, infos["condition"]) |
2475 elif param == "height": |
2475 elif param == "height": |
2476 transition.setheight(value) |
2476 transition.setheight(value) |
2477 elif param == "width": |
2477 elif param == "width": |
2527 element = self.GetEditedElement(tagname) |
2527 element = self.GetEditedElement(tagname) |
2528 if element is not None: |
2528 if element is not None: |
2529 divergence = element.getinstance(id) |
2529 divergence = element.getinstance(id) |
2530 if divergence is None: |
2530 if divergence is None: |
2531 return |
2531 return |
2532 for param, value in infos.items(): |
2532 for param, value in list(infos.items()): |
2533 if param == "height": |
2533 if param == "height": |
2534 divergence.setheight(value) |
2534 divergence.setheight(value) |
2535 elif param == "width": |
2535 elif param == "width": |
2536 divergence.setwidth(value) |
2536 divergence.setwidth(value) |
2537 elif param == "x": |
2537 elif param == "x": |
2578 element = self.GetEditedElement(tagname) |
2578 element = self.GetEditedElement(tagname) |
2579 if element is not None: |
2579 if element is not None: |
2580 jump = element.getinstance(id) |
2580 jump = element.getinstance(id) |
2581 if jump is None: |
2581 if jump is None: |
2582 return |
2582 return |
2583 for param, value in infos.items(): |
2583 for param, value in list(infos.items()): |
2584 if param == "target": |
2584 if param == "target": |
2585 jump.settargetName(value) |
2585 jump.settargetName(value) |
2586 elif param == "height": |
2586 elif param == "height": |
2587 jump.setheight(value) |
2587 jump.setheight(value) |
2588 elif param == "width": |
2588 elif param == "width": |
2608 element = self.GetEditedElement(tagname) |
2608 element = self.GetEditedElement(tagname) |
2609 if element is not None: |
2609 if element is not None: |
2610 actionBlock = element.getinstance(id) |
2610 actionBlock = element.getinstance(id) |
2611 if actionBlock is None: |
2611 if actionBlock is None: |
2612 return |
2612 return |
2613 for param, value in infos.items(): |
2613 for param, value in list(infos.items()): |
2614 if param == "actions": |
2614 if param == "actions": |
2615 actionBlock.setactions(value) |
2615 actionBlock.setactions(value) |
2616 elif param == "height": |
2616 elif param == "height": |
2617 actionBlock.setheight(value) |
2617 actionBlock.setheight(value) |
2618 elif param == "width": |
2618 elif param == "width": |