author | Mario de Sousa <msousa@fe.up.pt> |
Mon, 01 Jun 2020 08:54:26 +0100 | |
changeset 2654 | 7575050a80c5 |
parent 2625 | e5ce6c4a8672 |
permissions | -rw-r--r-- |
814 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
4 |
# This file is part of Beremiz, a Integrated Development Environment for |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
5 |
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival. |
814 | 6 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
7 |
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
1680
6db967480b7d
make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1619
diff
changeset
|
8 |
# Copyright (C) 2017: Andrey Skvortsov |
814 | 9 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
10 |
# See COPYING file for copyrights details. |
814 | 11 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
12 |
# This program is free software; you can redistribute it and/or |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
13 |
# modify it under the terms of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
14 |
# as published by the Free Software Foundation; either version 2 |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
15 |
# of the License, or (at your option) any later version. |
814 | 16 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
17 |
# This program is distributed in the hope that it will be useful, |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
18 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
19 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
20 |
# GNU General Public License for more details. |
814 | 21 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
22 |
# You should have received a copy of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
23 |
# along with this program; if not, write to the Free Software |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1508
diff
changeset
|
24 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
814 | 25 |
|
1850
614396cbffbf
fix pylint warning '(unused-import), Unused import connectors'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1847
diff
changeset
|
26 |
|
1881
091005ec69c4
fix pylint py3k conversion warning: "(no-absolute-import) import missing `from __future__ import absolute_import`"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1879
diff
changeset
|
27 |
from __future__ import absolute_import |
2437
105c20fdeb19
python3 support: pylint, W1619 #(old-division) division w/o __future__ statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2418
diff
changeset
|
28 |
from __future__ import division |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
29 |
from copy import deepcopy |
1732
94ffe74e6895
clean-up: fix PEP8 E401 multiple imports on one line
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1686
diff
changeset
|
30 |
import os |
94ffe74e6895
clean-up: fix PEP8 E401 multiple imports on one line
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1686
diff
changeset
|
31 |
import re |
814 | 32 |
import datetime |
33 |
from time import localtime |
|
2456
7373e3048167
python3 support: pylint,W1610 # (reduce-builtin) reduce built-in referenced
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2450
diff
changeset
|
34 |
from functools import reduce |
2457
9deec258ab1a
python3 support: pylint, W1633 # (round-builtin) round built-in referenced
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2456
diff
changeset
|
35 |
from future.builtins import round |
1832
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
36 |
|
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
37 |
import util.paths as paths |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
38 |
from plcopen import * |
1944
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
39 |
from plcopen.types_enums import * |
1942
a4382ae1ba82
Added /plcopen/InstancesPathCollector.py, to move more model xslt querying code away from PLCController.py.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1940
diff
changeset
|
40 |
from plcopen.InstancesPathCollector import InstancesPathCollector |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
41 |
from plcopen.POUVariablesCollector import POUVariablesCollector |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
42 |
from plcopen.InstanceTagnameCollector import InstanceTagnameCollector |
1957
2d1cc4f5e4ef
GetEditedElementInstancesInfos now optimized as well. Forgotten because not using [R.I.P]LibraryResolver, but still XSLT compiling was hapenning on each call.
Edouard Tisserant
parents:
1954
diff
changeset
|
43 |
from plcopen.BlockInstanceCollector import BlockInstanceCollector |
1951
bbd1e1744c91
GetVariableDictionary and GetPouInterfaceReturnType optimized with new VariableInfoCollector based on XSLTModelQuery. Moved corresponding definitions out of PLCControler.py.
Edouard Tisserant
parents:
1950
diff
changeset
|
44 |
from plcopen.VariableInfoCollector import VariableInfoCollector |
814 | 45 |
from graphics.GraphicCommons import * |
46 |
from PLCGenerator import * |
|
47 |
||
2439
f0a040f1de1b
Fix pep8 warning: W605 invalid escape sequence ?x?
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2437
diff
changeset
|
48 |
duration_model = re.compile(r"(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?") |
f0a040f1de1b
Fix pep8 warning: W605 invalid escape sequence ?x?
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2437
diff
changeset
|
49 |
VARIABLE_NAME_SUFFIX_MODEL = re.compile(r'(\d+)$') |
814 | 50 |
|
1680
6db967480b7d
make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1619
diff
changeset
|
51 |
ScriptDirectory = paths.AbsDir(__file__) |
814 | 52 |
|
53 |
# Length of the buffer |
|
54 |
UNDO_BUFFER_LENGTH = 20 |
|
55 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
56 |
|
1831
56b48961cc68
fix (old-style-class) Old-style class defined error for most parts of
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1785
diff
changeset
|
57 |
class UndoBuffer(object): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
58 |
""" |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
59 |
Undo Buffer for PLCOpenEditor |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
60 |
Class implementing a buffer of changes made on the current editing model |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
61 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
62 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
63 |
def __init__(self, currentstate, issaved=False): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
64 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
65 |
Constructor initialising buffer |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
66 |
""" |
814 | 67 |
self.Buffer = [] |
68 |
self.CurrentIndex = -1 |
|
69 |
self.MinIndex = -1 |
|
70 |
self.MaxIndex = -1 |
|
71 |
# if current state is defined |
|
72 |
if currentstate: |
|
73 |
self.CurrentIndex = 0 |
|
74 |
self.MinIndex = 0 |
|
75 |
self.MaxIndex = 0 |
|
76 |
# Initialising buffer with currentstate at the first place |
|
77 |
for i in xrange(UNDO_BUFFER_LENGTH): |
|
78 |
if i == 0: |
|
79 |
self.Buffer.append(currentstate) |
|
80 |
else: |
|
81 |
self.Buffer.append(None) |
|
82 |
# Initialising index of state saved |
|
83 |
if issaved: |
|
84 |
self.LastSave = 0 |
|
85 |
else: |
|
86 |
self.LastSave = -1 |
|
1411 | 87 |
|
814 | 88 |
def Buffering(self, currentstate): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
89 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
90 |
Add a new state in buffer |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
91 |
""" |
814 | 92 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
93 |
self.Buffer[self.CurrentIndex] = currentstate |
|
94 |
# Actualising buffer limits |
|
95 |
self.MaxIndex = self.CurrentIndex |
|
96 |
if self.MinIndex == self.CurrentIndex: |
|
97 |
# If the removed state was the state saved, there is no state saved in the buffer |
|
98 |
if self.LastSave == self.MinIndex: |
|
99 |
self.LastSave = -1 |
|
100 |
self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH |
|
101 |
self.MinIndex = max(self.MinIndex, 0) |
|
1411 | 102 |
|
814 | 103 |
def Current(self): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
104 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
105 |
Return current state of buffer |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
106 |
""" |
814 | 107 |
return self.Buffer[self.CurrentIndex] |
1411 | 108 |
|
814 | 109 |
# Change current state to previous in buffer and return new current state |
110 |
def Previous(self): |
|
111 |
if self.CurrentIndex != self.MinIndex: |
|
112 |
self.CurrentIndex = (self.CurrentIndex - 1) % UNDO_BUFFER_LENGTH |
|
113 |
return self.Buffer[self.CurrentIndex] |
|
114 |
return None |
|
1411 | 115 |
|
814 | 116 |
# Change current state to next in buffer and return new current state |
117 |
def Next(self): |
|
118 |
if self.CurrentIndex != self.MaxIndex: |
|
119 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
120 |
return self.Buffer[self.CurrentIndex] |
|
121 |
return None |
|
1411 | 122 |
|
814 | 123 |
# Return True if current state is the first in buffer |
124 |
def IsFirst(self): |
|
125 |
return self.CurrentIndex == self.MinIndex |
|
1411 | 126 |
|
814 | 127 |
# Return True if current state is the last in buffer |
128 |
def IsLast(self): |
|
129 |
return self.CurrentIndex == self.MaxIndex |
|
130 |
||
131 |
# Note that current state is saved |
|
132 |
def CurrentSaved(self): |
|
133 |
self.LastSave = self.CurrentIndex |
|
1411 | 134 |
|
814 | 135 |
# Return True if current state is saved |
136 |
def IsCurrentSaved(self): |
|
137 |
return self.LastSave == self.CurrentIndex |
|
138 |
||
139 |
||
1831
56b48961cc68
fix (old-style-class) Old-style class defined error for most parts of
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1785
diff
changeset
|
140 |
class PLCControler(object): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
141 |
""" |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
142 |
Controler for PLCOpenEditor |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
143 |
Class which controls the operations made on the plcopen model and answers to view requests |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
144 |
""" |
1411 | 145 |
|
814 | 146 |
# Create a new PLCControler |
147 |
def __init__(self): |
|
148 |
self.LastNewIndex = 0 |
|
149 |
self.Reset() |
|
1935
f2b0d849ea77
Prevent compiling XSLT on each call of GetInstanceList. To be continued. More optimization needed here. 100x would be fine...
Edouard Tisserant
parents:
1881
diff
changeset
|
150 |
self.InstancesPathCollector = InstancesPathCollector(self) |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
151 |
self.POUVariablesCollector = POUVariablesCollector(self) |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
152 |
self.InstanceTagnameCollector = InstanceTagnameCollector(self) |
1957
2d1cc4f5e4ef
GetEditedElementInstancesInfos now optimized as well. Forgotten because not using [R.I.P]LibraryResolver, but still XSLT compiling was hapenning on each call.
Edouard Tisserant
parents:
1954
diff
changeset
|
153 |
self.BlockInstanceCollector = BlockInstanceCollector(self) |
1951
bbd1e1744c91
GetVariableDictionary and GetPouInterfaceReturnType optimized with new VariableInfoCollector based on XSLTModelQuery. Moved corresponding definitions out of PLCControler.py.
Edouard Tisserant
parents:
1950
diff
changeset
|
154 |
self.VariableInfoCollector = VariableInfoCollector(self) |
1411 | 155 |
|
814 | 156 |
# Reset PLCControler internal variables |
157 |
def Reset(self): |
|
158 |
self.Project = None |
|
159 |
self.ProjectBufferEnabled = True |
|
160 |
self.ProjectBuffer = None |
|
161 |
self.ProjectSaved = True |
|
162 |
self.Buffering = False |
|
163 |
self.FilePath = "" |
|
164 |
self.FileName = "" |
|
165 |
self.ProgramChunks = [] |
|
166 |
self.ProgramOffset = 0 |
|
167 |
self.NextCompiledProject = None |
|
168 |
self.CurrentCompiledProject = None |
|
169 |
self.ConfNodeTypes = [] |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
170 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
171 |
self.TotalTypes = StdBlckLst[:] |
1284 | 172 |
self.ProgramFilePath = "" |
1411 | 173 |
|
814 | 174 |
def GetQualifierTypes(self): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
175 |
return QualifierList |
814 | 176 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
177 |
def GetProject(self, debug=False): |
814 | 178 |
if debug and self.CurrentCompiledProject is not None: |
179 |
return self.CurrentCompiledProject |
|
180 |
else: |
|
181 |
return self.Project |
|
182 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
183 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
184 |
# Project management functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
185 |
# ------------------------------------------------------------------------------- |
814 | 186 |
|
187 |
# Return if a project is opened |
|
188 |
def HasOpenedProject(self): |
|
189 |
return self.Project is not None |
|
190 |
||
191 |
# Create a new project by replacing the current one |
|
192 |
def CreateNewProject(self, properties): |
|
193 |
# Create the project |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
194 |
self.Project = PLCOpenParser.CreateRoot() |
814 | 195 |
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) |
196 |
self.Project.setfileHeader(properties) |
|
197 |
self.Project.setcontentHeader(properties) |
|
198 |
self.SetFilePath("") |
|
1411 | 199 |
|
814 | 200 |
# Initialize the project buffer |
201 |
self.CreateProjectBuffer(False) |
|
202 |
self.ProgramChunks = [] |
|
203 |
self.ProgramOffset = 0 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
204 |
self.NextCompiledProject = self.Copy(self.Project) |
814 | 205 |
self.CurrentCompiledProject = None |
206 |
self.Buffering = False |
|
1411 | 207 |
|
814 | 208 |
# Return project data type names |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
209 |
def GetProjectDataTypeNames(self, debug=False): |
814 | 210 |
project = self.GetProject(debug) |
211 |
if project is not None: |
|
212 |
return [datatype.getname() for datatype in project.getdataTypes()] |
|
213 |
return [] |
|
1411 | 214 |
|
814 | 215 |
# Return project pou names |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
216 |
def GetProjectPouNames(self, debug=False): |
814 | 217 |
project = self.GetProject(debug) |
218 |
if project is not None: |
|
219 |
return [pou.getname() for pou in project.getpous()] |
|
220 |
return [] |
|
1411 | 221 |
|
814 | 222 |
# Return project pou names |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
223 |
def GetProjectConfigNames(self, debug=False): |
814 | 224 |
project = self.GetProject(debug) |
225 |
if project is not None: |
|
226 |
return [config.getname() for config in project.getconfigurations()] |
|
227 |
return [] |
|
1411 | 228 |
|
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
|
229 |
# Return project pou variable names |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
230 |
def GetProjectPouVariableNames(self, pou_name=None, debug=False): |
814 | 231 |
variables = [] |
232 |
project = self.GetProject(debug) |
|
233 |
if project is not None: |
|
234 |
for pou in project.getpous(): |
|
235 |
if pou_name is None or pou_name == pou.getname(): |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
236 |
variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) |
814 | 237 |
for transition in pou.gettransitionList(): |
238 |
variables.append(transition.getname()) |
|
239 |
for action in pou.getactionList(): |
|
240 |
variables.append(action.getname()) |
|
241 |
return variables |
|
1411 | 242 |
|
814 | 243 |
# Return file path if project is an open file |
244 |
def GetFilePath(self): |
|
245 |
return self.FilePath |
|
1411 | 246 |
|
814 | 247 |
# Return file path if project is an open file |
248 |
def GetProgramFilePath(self): |
|
249 |
return self.ProgramFilePath |
|
1411 | 250 |
|
814 | 251 |
# Return file name and point out if file is up to date |
252 |
def GetFilename(self): |
|
253 |
if self.Project is not None: |
|
254 |
if self.ProjectIsSaved(): |
|
255 |
return self.FileName |
|
256 |
else: |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
257 |
return "~%s~" % self.FileName |
814 | 258 |
return "" |
1411 | 259 |
|
814 | 260 |
# Change file path and save file name or create a default one if file path not defined |
261 |
def SetFilePath(self, filepath): |
|
262 |
self.FilePath = filepath |
|
263 |
if filepath == "": |
|
264 |
self.LastNewIndex += 1 |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
265 |
self.FileName = _("Unnamed%d") % self.LastNewIndex |
814 | 266 |
else: |
267 |
self.FileName = os.path.splitext(os.path.basename(filepath))[0] |
|
1411 | 268 |
|
814 | 269 |
# Change project properties |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
270 |
def SetProjectProperties(self, name=None, properties=None, buffer=True): |
814 | 271 |
if self.Project is not None: |
272 |
if name is not None: |
|
273 |
self.Project.setname(name) |
|
274 |
if properties is not None: |
|
275 |
self.Project.setfileHeader(properties) |
|
276 |
self.Project.setcontentHeader(properties) |
|
277 |
if buffer and (name is not None or properties is not None): |
|
278 |
self.BufferProject() |
|
1411 | 279 |
|
814 | 280 |
# Return project name |
281 |
def GetProjectName(self, debug=False): |
|
282 |
project = self.GetProject(debug) |
|
283 |
if project is not None: |
|
284 |
return project.getname() |
|
285 |
return None |
|
1411 | 286 |
|
814 | 287 |
# Return project properties |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
288 |
def GetProjectProperties(self, debug=False): |
814 | 289 |
project = self.GetProject(debug) |
290 |
if project is not None: |
|
291 |
properties = project.getfileHeader() |
|
292 |
properties.update(project.getcontentHeader()) |
|
293 |
return properties |
|
294 |
return None |
|
1411 | 295 |
|
814 | 296 |
# Return project informations |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
297 |
def GetProjectInfos(self, debug=False): |
814 | 298 |
project = self.GetProject(debug) |
299 |
if project is not None: |
|
300 |
infos = {"name": project.getname(), "type": ITEM_PROJECT} |
|
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
301 |
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values": []} |
814 | 302 |
for datatype in project.getdataTypes(): |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
303 |
datatypes["values"].append({ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
304 |
"name": datatype.getname(), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
305 |
"type": ITEM_DATATYPE, |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
306 |
"tagname": ComputeDataTypeName(datatype.getname()), |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
307 |
"values": []}) |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
308 |
pou_types = { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
309 |
"function": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
310 |
"name": FUNCTIONS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
311 |
"type": ITEM_FUNCTION, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
312 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
313 |
}, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
314 |
"functionBlock": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
315 |
"name": FUNCTION_BLOCKS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
316 |
"type": ITEM_FUNCTIONBLOCK, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
317 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
318 |
}, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
319 |
"program": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
320 |
"name": PROGRAMS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
321 |
"type": ITEM_PROGRAM, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
322 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
323 |
} |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
324 |
} |
814 | 325 |
for pou in project.getpous(): |
326 |
pou_type = pou.getpouType() |
|
327 |
pou_infos = {"name": pou.getname(), "type": ITEM_POU, |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
328 |
"tagname": ComputePouName(pou.getname())} |
814 | 329 |
pou_values = [] |
330 |
if pou.getbodyType() == "SFC": |
|
331 |
transitions = [] |
|
332 |
for transition in pou.gettransitionList(): |
|
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
333 |
transitions.append({ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
334 |
"name": transition.getname(), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
335 |
"type": ITEM_TRANSITION, |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
336 |
"tagname": ComputePouTransitionName(pou.getname(), transition.getname()), |
814 | 337 |
"values": []}) |
338 |
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions}) |
|
339 |
actions = [] |
|
340 |
for action in pou.getactionList(): |
|
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
341 |
actions.append({ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
342 |
"name": action.getname(), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
343 |
"type": ITEM_ACTION, |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
344 |
"tagname": ComputePouActionName(pou.getname(), action.getname()), |
814 | 345 |
"values": []}) |
346 |
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions}) |
|
347 |
if pou_type in pou_types: |
|
348 |
pou_infos["values"] = pou_values |
|
349 |
pou_types[pou_type]["values"].append(pou_infos) |
|
350 |
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []} |
|
351 |
for config in project.getconfigurations(): |
|
352 |
config_name = config.getname() |
|
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
353 |
config_infos = { |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
354 |
"name": config_name, |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
355 |
"type": ITEM_CONFIGURATION, |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
356 |
"tagname": ComputeConfigurationName(config.getname()), |
814 | 357 |
"values": []} |
358 |
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []} |
|
359 |
for resource in config.getresource(): |
|
360 |
resource_name = resource.getname() |
|
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
361 |
resource_infos = { |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
362 |
"name": resource_name, |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
363 |
"type": ITEM_RESOURCE, |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
364 |
"tagname": ComputeConfigurationResourceName(config.getname(), resource.getname()), |
814 | 365 |
"values": []} |
366 |
resources["values"].append(resource_infos) |
|
367 |
config_infos["values"] = [resources] |
|
368 |
configurations["values"].append(config_infos) |
|
1411 | 369 |
infos["values"] = [datatypes, pou_types["function"], pou_types["functionBlock"], |
814 | 370 |
pou_types["program"], configurations] |
371 |
return infos |
|
372 |
return None |
|
373 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
374 |
def GetPouVariables(self, tagname, debug=False): |
814 | 375 |
project = self.GetProject(debug) |
376 |
if project is not None: |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
377 |
obj = None |
814 | 378 |
words = tagname.split("::") |
379 |
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
|
380 |
obj = self.GetPou(words[1], debug) |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
381 |
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
|
382 |
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
|
383 |
if obj is not None: |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
384 |
return self.POUVariablesCollector.Collect(obj, debug) |
1411 | 385 |
|
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
386 |
return None |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
387 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
388 |
def GetInstanceList(self, root, name, debug=False): |
1939
db478d17bc3a
Added a class to speedup all XSLT queries. WIP, now only for instances_path.xslt / GetInstanceList()
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1937
diff
changeset
|
389 |
return self.InstancesPathCollector.Collect(root, name, debug) |
1411 | 390 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
391 |
def SearchPouInstances(self, tagname, debug=False): |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
392 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
393 |
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
|
394 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
395 |
if words[0] == "P": |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
396 |
return self.GetInstanceList(project, words[1]) |
814 | 397 |
elif words[0] == 'C': |
398 |
return [words[1]] |
|
399 |
elif words[0] == 'R': |
|
400 |
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
|
401 |
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
|
402 |
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
|
403 |
for instance in self.SearchPouInstances( |
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
404 |
ComputePouName(words[1]), debug)] |
814 | 405 |
return [] |
1411 | 406 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
407 |
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
|
408 |
project = self.GetProject(debug) |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
409 |
if project is not None: |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
410 |
return self.InstanceTagnameCollector.Collect(project, |
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
411 |
debug, |
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
412 |
instance_path) |
1411 | 413 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
414 |
def GetInstanceInfos(self, instance_path, debug=False): |
814 | 415 |
tagname = self.GetPouInstanceTagName(instance_path) |
416 |
if tagname is not None: |
|
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
417 |
infos = self.GetPouVariables(tagname, debug) |
1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
418 |
infos.type = tagname |
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
419 |
return infos |
814 | 420 |
else: |
421 |
pou_path, var_name = instance_path.rsplit(".", 1) |
|
422 |
tagname = self.GetPouInstanceTagName(pou_path) |
|
423 |
if tagname is not None: |
|
424 |
pou_infos = self.GetPouVariables(tagname, debug) |
|
1360
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
425 |
for var_infos in pou_infos.variables: |
ebfe9c22af2a
Fixed bug when debugging PLC with Graphic Viewer in debug open and re-transfer PLC
Laurent Bessard
parents:
1354
diff
changeset
|
426 |
if var_infos.name == var_name: |
814 | 427 |
return var_infos |
428 |
return None |
|
1411 | 429 |
|
814 | 430 |
# Return if data type given by name is used by another data type or pou |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
431 |
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
|
432 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
433 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
434 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 435 |
return False |
436 |
||
437 |
# Return if pou given by name is used by another pou |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
438 |
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
|
439 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
440 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
441 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 442 |
return False |
443 |
||
444 |
# Return if pou given by name is directly or undirectly used by the reference pou |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
445 |
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
|
446 |
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
|
447 |
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
|
448 |
return len(self.GetInstanceList(pou_infos, name, debug)) > 0 |
814 | 449 |
return False |
450 |
||
451 |
def GenerateProgram(self, filepath=None): |
|
452 |
errors = [] |
|
453 |
warnings = [] |
|
454 |
if self.Project is not None: |
|
455 |
try: |
|
456 |
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings) |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
457 |
self.NextCompiledProject = self.Copy(self.Project) |
901
ab43f3e40b9d
Fix bug when compiling project containing non-ascii characters
Laurent Bessard
parents:
887
diff
changeset
|
458 |
program_text = "".join([item[0] for item in self.ProgramChunks]) |
814 | 459 |
if filepath is not None: |
460 |
programfile = open(filepath, "w") |
|
461 |
programfile.write(program_text.encode("utf-8")) |
|
462 |
programfile.close() |
|
463 |
self.ProgramFilePath = filepath |
|
464 |
return program_text, errors, warnings |
|
2418
5587c490a070
Use python 3 compatible exception syntax everywhere
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1973
diff
changeset
|
465 |
except PLCGenException as ex: |
2520
3a1c0c161f80
Fix backtrace on printing localized (non-ascii) error message in PLCGenerator.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2457
diff
changeset
|
466 |
errors.append(ex) |
814 | 467 |
else: |
468 |
errors.append("No project opened") |
|
469 |
return "", errors, warnings |
|
470 |
||
471 |
def DebugAvailable(self): |
|
472 |
return self.CurrentCompiledProject is not None |
|
473 |
||
474 |
def ProgramTransferred(self): |
|
475 |
if self.NextCompiledProject is None: |
|
476 |
self.CurrentCompiledProject = self.NextCompiledProject |
|
477 |
else: |
|
478 |
self.CurrentCompiledProject = self.Copy(self.Project) |
|
479 |
||
480 |
def GetChunkInfos(self, from_location, to_location): |
|
481 |
row = self.ProgramOffset + 1 |
|
482 |
col = 1 |
|
483 |
infos = [] |
|
484 |
for chunk, chunk_infos in self.ProgramChunks: |
|
485 |
lines = chunk.split("\n") |
|
486 |
if len(lines) > 1: |
|
487 |
next_row = row + len(lines) - 1 |
|
488 |
next_col = len(lines[-1]) + 1 |
|
489 |
else: |
|
490 |
next_row = row |
|
491 |
next_col = col + len(chunk) |
|
492 |
if (next_row > from_location[0] or next_row == from_location[0] and next_col >= from_location[1]) and len(chunk_infos) > 0: |
|
493 |
infos.append((chunk_infos, (row, col))) |
|
494 |
if next_row == to_location[0] and next_col > to_location[1] or next_row > to_location[0]: |
|
495 |
return infos |
|
496 |
row, col = next_row, next_col |
|
497 |
return infos |
|
1411 | 498 |
|
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
499 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
500 |
# Project Pous management functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
501 |
# ------------------------------------------------------------------------------- |
1411 | 502 |
|
814 | 503 |
# Add a Data Type to Project |
504 |
def ProjectAddDataType(self, datatype_name=None): |
|
505 |
if self.Project is not None: |
|
506 |
if datatype_name is None: |
|
507 |
datatype_name = self.GenerateNewName(None, None, "datatype%d") |
|
508 |
# Add the datatype to project |
|
509 |
self.Project.appenddataType(datatype_name) |
|
510 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
511 |
return ComputeDataTypeName(datatype_name) |
814 | 512 |
return None |
1411 | 513 |
|
814 | 514 |
# Remove a Data Type from project |
515 |
def ProjectRemoveDataType(self, datatype_name): |
|
516 |
if self.Project is not None: |
|
517 |
self.Project.removedataType(datatype_name) |
|
518 |
self.BufferProject() |
|
1411 | 519 |
|
814 | 520 |
# Add a Pou to Project |
521 |
def ProjectAddPou(self, pou_name, pou_type, body_type): |
|
522 |
if self.Project is not None: |
|
523 |
# Add the pou to project |
|
524 |
self.Project.appendpou(pou_name, pou_type, body_type) |
|
525 |
if pou_type == "function": |
|
526 |
self.SetPouInterfaceReturnType(pou_name, "BOOL") |
|
527 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
528 |
return ComputePouName(pou_name) |
814 | 529 |
return None |
1411 | 530 |
|
814 | 531 |
def ProjectChangePouType(self, name, pou_type): |
532 |
if self.Project is not None: |
|
533 |
pou = self.Project.getpou(name) |
|
534 |
if pou is not None: |
|
2614
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
535 |
new_pou = self.Copy(pou) |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
536 |
idx = 0 |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
537 |
new_name = name + "_" + pou_type |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
538 |
while self.Project.getpou(new_name) is not None: |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
539 |
idx += 1 |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
540 |
new_name = "%s%d" % (name, idx) |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
541 |
new_pou.setname(new_name) |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
542 |
|
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
543 |
orig_type = pou.getpouType() |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
544 |
if orig_type == 'function' and pou_type in ['functionBlock', 'program']: |
2625
e5ce6c4a8672
Fixed code quality according to pep8 and pylint.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2614
diff
changeset
|
545 |
# delete return type |
2614
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
546 |
return_type_obj = new_pou.interface.getreturnType() |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
547 |
new_pou.interface.remove(return_type_obj) |
2625
e5ce6c4a8672
Fixed code quality according to pep8 and pylint.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2614
diff
changeset
|
548 |
# To be ultimately correct we could re-create an |
e5ce6c4a8672
Fixed code quality according to pep8 and pylint.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2614
diff
changeset
|
549 |
# output variable with same name+_out or so |
e5ce6c4a8672
Fixed code quality according to pep8 and pylint.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2614
diff
changeset
|
550 |
# but in any case user will have to connect/assign |
2614
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
551 |
# this output, so better leave it as-is |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
552 |
|
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
553 |
new_pou.setpouType(pou_type) |
6b4061f6ced6
'Change POU Type To' becomes 'Duplicate as...', avoiding side effects of type change when POU is already instanciated. Also remove leftover returType tag in ex-function POUs, triggering exceptions at build time.
Edouard Tisserant
parents:
2551
diff
changeset
|
554 |
self.Project.insertpou(0, new_pou) |
814 | 555 |
self.BufferProject() |
1411 | 556 |
|
814 | 557 |
def GetPouXml(self, pou_name): |
558 |
if self.Project is not None: |
|
559 |
pou = self.Project.getpou(pou_name) |
|
560 |
if pou is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
561 |
return pou.tostring() |
814 | 562 |
return None |
1411 | 563 |
|
814 | 564 |
def PastePou(self, pou_type, pou_xml): |
565 |
''' |
|
566 |
Adds the POU defined by 'pou_xml' to the current project with type 'pou_type' |
|
567 |
''' |
|
568 |
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
|
569 |
new_pou, error = LoadPou(pou_xml) |
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1779
diff
changeset
|
570 |
except Exception: |
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
|
571 |
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
|
572 |
if error is not None: |
814 | 573 |
return _("Couldn't paste non-POU object.") |
1411 | 574 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
575 |
name = new_pou.getname() |
1411 | 576 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
577 |
idx = 0 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
578 |
new_name = name |
1411 | 579 |
while self.Project.getpou(new_name) is not None: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
580 |
# a POU with that name already exists. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
581 |
# 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
|
582 |
# append an incrementing numeric suffix to the POU name. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
583 |
idx += 1 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
584 |
new_name = "%s%d" % (name, idx) |
1411 | 585 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
586 |
# 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
|
587 |
new_pou.setname(new_name) |
1411 | 588 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
589 |
if pou_type is not None: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
590 |
orig_type = new_pou.getpouType() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
591 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
592 |
# prevent violations of POU content restrictions: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
593 |
# function blocks cannot be pasted as functions, |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
594 |
# programs cannot be pasted as functions or function blocks |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
595 |
if orig_type == 'functionBlock' and pou_type == 'function' or \ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
596 |
orig_type == 'program' and pou_type in ['function', 'functionBlock']: |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
597 |
msg = _('''{a1} "{a2}" can't be pasted as a {a3}.''').format(a1=orig_type, a2=name, a3=pou_type) |
1581
2295fdc5c271
fix translation strings with multiple parameters
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
598 |
return msg |
1411 | 599 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
600 |
new_pou.setpouType(pou_type) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
601 |
|
1411 | 602 |
self.Project.insertpou(0, new_pou) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
603 |
self.BufferProject() |
1411 | 604 |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
605 |
return ComputePouName(new_name), |
814 | 606 |
|
607 |
# Remove a Pou from project |
|
608 |
def ProjectRemovePou(self, pou_name): |
|
609 |
if self.Project is not None: |
|
610 |
self.Project.removepou(pou_name) |
|
611 |
self.BufferProject() |
|
1411 | 612 |
|
814 | 613 |
# Return the name of the configuration if only one exist |
614 |
def GetProjectMainConfigurationName(self): |
|
615 |
if self.Project is not None: |
|
616 |
# Found the configuration corresponding to old name and change its name to new name |
|
617 |
configurations = self.Project.getconfigurations() |
|
618 |
if len(configurations) == 1: |
|
619 |
return configurations[0].getname() |
|
620 |
return None |
|
1411 | 621 |
|
814 | 622 |
# Add a configuration to Project |
623 |
def ProjectAddConfiguration(self, config_name=None): |
|
624 |
if self.Project is not None: |
|
625 |
if config_name is None: |
|
626 |
config_name = self.GenerateNewName(None, None, "configuration%d") |
|
627 |
self.Project.addconfiguration(config_name) |
|
628 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
629 |
return ComputeConfigurationName(config_name) |
814 | 630 |
return None |
1411 | 631 |
|
814 | 632 |
# Remove a configuration from project |
633 |
def ProjectRemoveConfiguration(self, config_name): |
|
634 |
if self.Project is not None: |
|
635 |
self.Project.removeconfiguration(config_name) |
|
636 |
self.BufferProject() |
|
1411 | 637 |
|
814 | 638 |
# Add a resource to a configuration of the Project |
639 |
def ProjectAddConfigurationResource(self, config_name, resource_name=None): |
|
640 |
if self.Project is not None: |
|
641 |
if resource_name is None: |
|
642 |
resource_name = self.GenerateNewName(None, None, "resource%d") |
|
643 |
self.Project.addconfigurationResource(config_name, resource_name) |
|
644 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
645 |
return ComputeConfigurationResourceName(config_name, resource_name) |
814 | 646 |
return None |
1411 | 647 |
|
814 | 648 |
# Remove a resource from a configuration of the project |
649 |
def ProjectRemoveConfigurationResource(self, config_name, resource_name): |
|
650 |
if self.Project is not None: |
|
651 |
self.Project.removeconfigurationResource(config_name, resource_name) |
|
652 |
self.BufferProject() |
|
1411 | 653 |
|
814 | 654 |
# Add a Transition to a Project Pou |
655 |
def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): |
|
656 |
if self.Project is not None: |
|
657 |
pou = self.Project.getpou(pou_name) |
|
658 |
if pou is not None: |
|
659 |
pou.addtransition(transition_name, transition_type) |
|
660 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
661 |
return ComputePouTransitionName(pou_name, transition_name) |
814 | 662 |
return None |
1411 | 663 |
|
814 | 664 |
# Remove a Transition from a Project Pou |
665 |
def ProjectRemovePouTransition(self, pou_name, transition_name): |
|
666 |
# Search if the pou removed is currently opened |
|
667 |
if self.Project is not None: |
|
668 |
pou = self.Project.getpou(pou_name) |
|
669 |
if pou is not None: |
|
670 |
pou.removetransition(transition_name) |
|
671 |
self.BufferProject() |
|
1411 | 672 |
|
814 | 673 |
# Add an Action to a Project Pou |
674 |
def ProjectAddPouAction(self, pou_name, action_name, action_type): |
|
675 |
if self.Project is not None: |
|
676 |
pou = self.Project.getpou(pou_name) |
|
677 |
if pou is not None: |
|
678 |
pou.addaction(action_name, action_type) |
|
679 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
680 |
return ComputePouActionName(pou_name, action_name) |
814 | 681 |
return None |
1411 | 682 |
|
814 | 683 |
# Remove an Action from a Project Pou |
684 |
def ProjectRemovePouAction(self, pou_name, action_name): |
|
685 |
# Search if the pou removed is currently opened |
|
686 |
if self.Project is not None: |
|
687 |
pou = self.Project.getpou(pou_name) |
|
688 |
if pou is not None: |
|
689 |
pou.removeaction(action_name) |
|
690 |
self.BufferProject() |
|
1411 | 691 |
|
814 | 692 |
# Change the name of a pou |
693 |
def ChangeDataTypeName(self, old_name, new_name): |
|
694 |
if self.Project is not None: |
|
695 |
# Found the pou corresponding to old name and change its name to new name |
|
696 |
datatype = self.Project.getdataType(old_name) |
|
697 |
if datatype is not None: |
|
698 |
datatype.setname(new_name) |
|
699 |
self.Project.updateElementName(old_name, new_name) |
|
700 |
self.BufferProject() |
|
1411 | 701 |
|
814 | 702 |
# Change the name of a pou |
703 |
def ChangePouName(self, old_name, new_name): |
|
704 |
if self.Project is not None: |
|
705 |
# Found the pou corresponding to old name and change its name to new name |
|
706 |
pou = self.Project.getpou(old_name) |
|
707 |
if pou is not None: |
|
708 |
pou.setname(new_name) |
|
709 |
self.Project.updateElementName(old_name, new_name) |
|
710 |
self.BufferProject() |
|
1411 | 711 |
|
814 | 712 |
# Change the name of a pou transition |
713 |
def ChangePouTransitionName(self, pou_name, old_name, new_name): |
|
714 |
if self.Project is not None: |
|
715 |
# Found the pou transition corresponding to old name and change its name to new name |
|
716 |
pou = self.Project.getpou(pou_name) |
|
717 |
if pou is not None: |
|
718 |
transition = pou.gettransition(old_name) |
|
719 |
if transition is not None: |
|
720 |
transition.setname(new_name) |
|
721 |
pou.updateElementName(old_name, new_name) |
|
722 |
self.BufferProject() |
|
1411 | 723 |
|
814 | 724 |
# Change the name of a pou action |
725 |
def ChangePouActionName(self, pou_name, old_name, new_name): |
|
726 |
if self.Project is not None: |
|
727 |
# Found the pou action corresponding to old name and change its name to new name |
|
728 |
pou = self.Project.getpou(pou_name) |
|
729 |
if pou is not None: |
|
730 |
action = pou.getaction(old_name) |
|
731 |
if action is not None: |
|
732 |
action.setname(new_name) |
|
733 |
pou.updateElementName(old_name, new_name) |
|
734 |
self.BufferProject() |
|
1411 | 735 |
|
814 | 736 |
# Change the name of a pou variable |
737 |
def ChangePouVariableName(self, pou_name, old_name, new_name): |
|
738 |
if self.Project is not None: |
|
739 |
# Found the pou action corresponding to old name and change its name to new name |
|
740 |
pou = self.Project.getpou(pou_name) |
|
741 |
if pou is not None: |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
742 |
for _type, varlist in pou.getvars(): |
814 | 743 |
for var in varlist.getvariable(): |
744 |
if var.getname() == old_name: |
|
745 |
var.setname(new_name) |
|
746 |
self.BufferProject() |
|
1411 | 747 |
|
814 | 748 |
# Change the name of a configuration |
749 |
def ChangeConfigurationName(self, old_name, new_name): |
|
750 |
if self.Project is not None: |
|
751 |
# Found the configuration corresponding to old name and change its name to new name |
|
752 |
configuration = self.Project.getconfiguration(old_name) |
|
753 |
if configuration is not None: |
|
754 |
configuration.setname(new_name) |
|
755 |
self.BufferProject() |
|
1411 | 756 |
|
814 | 757 |
# Change the name of a configuration resource |
758 |
def ChangeConfigurationResourceName(self, config_name, old_name, new_name): |
|
759 |
if self.Project is not None: |
|
760 |
# Found the resource corresponding to old name and change its name to new name |
|
761 |
resource = self.Project.getconfigurationResource(config_name, old_name) |
|
762 |
if resource is not None: |
|
763 |
resource.setname(new_name) |
|
764 |
self.BufferProject() |
|
1411 | 765 |
|
814 | 766 |
# Return the description of the pou given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
767 |
def GetPouDescription(self, name, debug=False): |
814 | 768 |
project = self.GetProject(debug) |
769 |
if project is not None: |
|
770 |
# Found the pou correponding to name and return its type |
|
771 |
pou = project.getpou(name) |
|
772 |
if pou is not None: |
|
773 |
return pou.getdescription() |
|
774 |
return "" |
|
1411 | 775 |
|
814 | 776 |
# Return the description of the pou given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
777 |
def SetPouDescription(self, name, description, debug=False): |
814 | 778 |
project = self.GetProject(debug) |
779 |
if project is not None: |
|
780 |
# Found the pou correponding to name and return its type |
|
781 |
pou = project.getpou(name) |
|
782 |
if pou is not None: |
|
783 |
pou.setdescription(description) |
|
784 |
self.BufferProject() |
|
1411 | 785 |
|
814 | 786 |
# Return the type of the pou given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
787 |
def GetPouType(self, name, debug=False): |
814 | 788 |
project = self.GetProject(debug) |
789 |
if project is not None: |
|
790 |
# Found the pou correponding to name and return its type |
|
791 |
pou = project.getpou(name) |
|
792 |
if pou is not None: |
|
793 |
return pou.getpouType() |
|
794 |
return None |
|
1411 | 795 |
|
814 | 796 |
# Return pous with SFC language |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
797 |
def GetSFCPous(self, debug=False): |
814 | 798 |
list = [] |
799 |
project = self.GetProject(debug) |
|
800 |
if project is not None: |
|
801 |
for pou in project.getpous(): |
|
802 |
if pou.getBodyType() == "SFC": |
|
803 |
list.append(pou.getname()) |
|
804 |
return list |
|
1411 | 805 |
|
814 | 806 |
# Return the body language of the pou given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
807 |
def GetPouBodyType(self, name, debug=False): |
814 | 808 |
project = self.GetProject(debug) |
809 |
if project is not None: |
|
810 |
# Found the pou correponding to name and return its body language |
|
811 |
pou = project.getpou(name) |
|
812 |
if pou is not None: |
|
813 |
return pou.getbodyType() |
|
814 |
return None |
|
1411 | 815 |
|
814 | 816 |
# Return the actions of a pou |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
817 |
def GetPouTransitions(self, pou_name, debug=False): |
814 | 818 |
transitions = [] |
819 |
project = self.GetProject(debug) |
|
820 |
if project is not None: |
|
821 |
# Found the pou correponding to name and return its transitions if SFC |
|
822 |
pou = project.getpou(pou_name) |
|
823 |
if pou is not None and pou.getbodyType() == "SFC": |
|
824 |
for transition in pou.gettransitionList(): |
|
825 |
transitions.append(transition.getname()) |
|
826 |
return transitions |
|
1411 | 827 |
|
814 | 828 |
# Return the body language of the transition given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
829 |
def GetTransitionBodyType(self, pou_name, pou_transition, debug=False): |
814 | 830 |
project = self.GetProject(debug) |
831 |
if project is not None: |
|
832 |
# Found the pou correponding to name |
|
833 |
pou = project.getpou(pou_name) |
|
834 |
if pou is not None: |
|
835 |
# Found the pou transition correponding to name and return its body language |
|
836 |
transition = pou.gettransition(pou_transition) |
|
837 |
if transition is not None: |
|
838 |
return transition.getbodyType() |
|
839 |
return None |
|
1411 | 840 |
|
814 | 841 |
# Return the actions of a pou |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
842 |
def GetPouActions(self, pou_name, debug=False): |
814 | 843 |
actions = [] |
844 |
project = self.GetProject(debug) |
|
845 |
if project is not None: |
|
846 |
# Found the pou correponding to name and return its actions if SFC |
|
847 |
pou = project.getpou(pou_name) |
|
848 |
if pou.getbodyType() == "SFC": |
|
849 |
for action in pou.getactionList(): |
|
850 |
actions.append(action.getname()) |
|
851 |
return actions |
|
1411 | 852 |
|
814 | 853 |
# Return the body language of the pou given by its name |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
854 |
def GetActionBodyType(self, pou_name, pou_action, debug=False): |
814 | 855 |
project = self.GetProject(debug) |
856 |
if project is not None: |
|
857 |
# Found the pou correponding to name and return its body language |
|
858 |
pou = project.getpou(pou_name) |
|
859 |
if pou is not None: |
|
860 |
action = pou.getaction(pou_action) |
|
861 |
if action is not None: |
|
862 |
return action.getbodyType() |
|
863 |
return None |
|
1411 | 864 |
|
814 | 865 |
# Extract varlists from a list of vars |
866 |
def ExtractVarLists(self, vars): |
|
867 |
varlist_list = [] |
|
868 |
current_varlist = None |
|
869 |
current_type = None |
|
870 |
for var in vars: |
|
1411 | 871 |
next_type = (var.Class, |
872 |
var.Option, |
|
873 |
var.Location in ["", None] or |
|
874 |
# When declaring globals, located |
|
875 |
# and not located variables are |
|
814 | 876 |
# in the same declaration block |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
877 |
var.Class == "Global") |
814 | 878 |
if current_type != next_type: |
879 |
current_type = next_type |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
880 |
infos = VAR_CLASS_INFOS.get(var.Class, None) |
814 | 881 |
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
|
882 |
current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") |
814 | 883 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
884 |
current_varlist = PLCOpenParser.CreateElement("varList") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
885 |
varlist_list.append((var.Class, current_varlist)) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
886 |
if var.Option == "Constant": |
814 | 887 |
current_varlist.setconstant(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
888 |
elif var.Option == "Retain": |
814 | 889 |
current_varlist.setretain(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
890 |
elif var.Option == "Non-Retain": |
814 | 891 |
current_varlist.setnonretain(True) |
892 |
# 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
|
893 |
tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
894 |
tempvar.setname(var.Name) |
1411 | 895 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
896 |
var_type = PLCOpenParser.CreateElement("type", "variable") |
2450
5024c19ca8f0
python3 support: pylint, W1652 # (deprecated-types-field) Accessing a deprecated fields on the types module
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2447
diff
changeset
|
897 |
if isinstance(var.Type, tuple): |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
898 |
if var.Type[0] == "array": |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
899 |
_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
|
900 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
901 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
902 |
array.setbaseType(baseType) |
814 | 903 |
for i, dimension in enumerate(dimensions): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
904 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 905 |
if i == 0: |
906 |
array.setdimension([dimension_range]) |
|
907 |
else: |
|
908 |
array.appenddimension(dimension_range) |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
909 |
dimension_range.setlower(dimension[0]) |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
910 |
dimension_range.setupper(dimension[1]) |
814 | 911 |
if base_type_name in self.GetBaseTypes(): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
912 |
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
|
913 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
914 |
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
|
915 |
else base_type_name, "dataType")) |
814 | 916 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
917 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 918 |
derived_datatype.setname(base_type_name) |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
919 |
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
|
920 |
var_type.setcontent(array) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
921 |
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
|
922 |
var_type.setcontent(PLCOpenParser.CreateElement( |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
923 |
var.Type.lower() |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
924 |
if var.Type in ["STRING", "WSTRING"] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
925 |
else var.Type, "dataType")) |
814 | 926 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
927 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
928 |
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
|
929 |
var_type.setcontent(derived_type) |
814 | 930 |
tempvar.settype(var_type) |
931 |
||
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
932 |
if var.InitialValue != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
933 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
934 |
value.setvalue(var.InitialValue) |
814 | 935 |
tempvar.setinitialValue(value) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
936 |
if var.Location != "": |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
937 |
tempvar.setaddress(var.Location) |
814 | 938 |
else: |
939 |
tempvar.setaddress(None) |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
940 |
if var.Documentation != "": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
941 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
942 |
ft.setanyText(var.Documentation) |
814 | 943 |
tempvar.setdocumentation(ft) |
944 |
||
945 |
# Add variable to varList |
|
946 |
current_varlist.appendvariable(tempvar) |
|
947 |
return varlist_list |
|
1411 | 948 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
949 |
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
|
950 |
variables = [] |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
951 |
self.VariableInfoCollector.Collect(object_with_vars, |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
952 |
debug, variables, tree) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
953 |
return variables |
1411 | 954 |
|
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
|
955 |
# Add a global var to configuration to configuration |
1411 | 956 |
def AddConfigurationGlobalVar(self, config_name, var_type, var_name, |
1767
c74815729afd
clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1766
diff
changeset
|
957 |
location="", description=""): |
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
|
958 |
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
|
959 |
# 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
|
960 |
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
|
961 |
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
|
962 |
# Set configuration global vars |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
963 |
configuration.addglobalVar( |
1411 | 964 |
self.GetVarTypeObject(var_type), |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
965 |
var_name, location, description) |
814 | 966 |
|
967 |
# Replace the configuration globalvars by those given |
|
968 |
def SetConfigurationGlobalVars(self, name, vars): |
|
969 |
if self.Project is not None: |
|
970 |
# Found the configuration corresponding to name |
|
971 |
configuration = self.Project.getconfiguration(name) |
|
972 |
if configuration is not None: |
|
973 |
# 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
|
974 |
configuration.setglobalVars([ |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
975 |
varlist for _vartype, varlist |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
976 |
in self.ExtractVarLists(vars)]) |
1411 | 977 |
|
814 | 978 |
# Return the configuration globalvars |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
979 |
def GetConfigurationGlobalVars(self, name, debug=False): |
814 | 980 |
project = self.GetProject(debug) |
981 |
if project is not None: |
|
982 |
# Found the configuration corresponding to name |
|
983 |
configuration = project.getconfiguration(name) |
|
984 |
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
|
985 |
# 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
|
986 |
return self.GetVariableDictionary(configuration, debug) |
1411 | 987 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
988 |
return [] |
814 | 989 |
|
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
|
990 |
# Return configuration variable names |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
991 |
def GetConfigurationVariableNames(self, config_name=None, debug=False): |
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
|
992 |
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
|
993 |
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
|
994 |
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
|
995 |
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
|
996 |
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
|
997 |
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
|
998 |
[var.getname() for var in reduce( |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
999 |
lambda x, y: x + y, [ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1000 |
varlist.getvariable() |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset
|
1001 |
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
|
1002 |
[])]) |
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
|
1003 |
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
|
1004 |
|
814 | 1005 |
# Replace the resource globalvars by those given |
1006 |
def SetConfigurationResourceGlobalVars(self, config_name, name, vars): |
|
1007 |
if self.Project is not None: |
|
1008 |
# Found the resource corresponding to name |
|
1009 |
resource = self.Project.getconfigurationResource(config_name, name) |
|
1010 |
# Set resource global vars |
|
1011 |
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
|
1012 |
resource.setglobalVars([ |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1013 |
varlist for _vartype, varlist |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1014 |
in self.ExtractVarLists(vars)]) |
1411 | 1015 |
|
814 | 1016 |
# Return the resource globalvars |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1017 |
def GetConfigurationResourceGlobalVars(self, config_name, name, debug=False): |
814 | 1018 |
project = self.GetProject(debug) |
1019 |
if project is not None: |
|
1020 |
# Found the resource corresponding to name |
|
1021 |
resource = project.getconfigurationResource(config_name, name) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1022 |
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
|
1023 |
# 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
|
1024 |
return self.GetVariableDictionary(resource, debug) |
1411 | 1025 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1026 |
return [] |
1411 | 1027 |
|
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
|
1028 |
# Return resource variable names |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1029 |
def GetConfigurationResourceVariableNames( |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1030 |
self, config_name=None, resource_name=None, debug=False): |
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
|
1031 |
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
|
1032 |
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
|
1033 |
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
|
1034 |
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
|
1035 |
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
|
1036 |
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
|
1037 |
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
|
1038 |
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
|
1039 |
[var.getname() for var in reduce( |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1040 |
lambda x, y: x + y, [ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1041 |
varlist.getvariable() |
1171
a506e4de8f84
Add support for Drag'n dropping located variables to function block creating global located variable in configuration and external variable in function block
Laurent Bessard
parents:
1127
diff
changeset
|
1042 |
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
|
1043 |
[])]) |
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
|
1044 |
return variables |
814 | 1045 |
|
1046 |
# Return the interface for the given pou |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1047 |
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
|
1048 |
interface = pou.interface |
814 | 1049 |
# 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
|
1050 |
if interface is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1051 |
# Extract variables defined in interface |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1052 |
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
|
1053 |
return [] |
814 | 1054 |
|
1055 |
# Replace the Pou interface by the one given |
|
1056 |
def SetPouInterfaceVars(self, name, vars): |
|
1057 |
if self.Project is not None: |
|
1058 |
# Found the pou corresponding to name and add interface if there isn't one yet |
|
1059 |
pou = self.Project.getpou(name) |
|
1060 |
if pou is not None: |
|
1061 |
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
|
1062 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1063 |
# Set Pou interface |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1064 |
pou.setvars([varlist for _varlist_type, varlist in self.ExtractVarLists(vars)]) |
1411 | 1065 |
|
814 | 1066 |
# Replace the return type of the pou given by its name (only for functions) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1067 |
def SetPouInterfaceReturnType(self, name, return_type): |
814 | 1068 |
if self.Project is not None: |
1069 |
pou = self.Project.getpou(name) |
|
1070 |
if pou is not None: |
|
1071 |
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
|
1072 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1073 |
# If there isn't any return type yet, add it |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1074 |
return_type_obj = pou.interface.getreturnType() |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1075 |
if return_type_obj is None: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1076 |
return_type_obj = PLCOpenParser.CreateElement("returnType", "interface") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1077 |
pou.interface.setreturnType(return_type_obj) |
814 | 1078 |
# Change return type |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1079 |
if return_type in self.GetBaseTypes(): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1080 |
return_type_obj.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1081 |
return_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1082 |
if return_type in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1083 |
else return_type, "dataType")) |
814 | 1084 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1085 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1086 |
derived_type.setname(return_type) |
1418
c97dc5281419
Fixed declaration and ST code gen for IEC function that return derivated types
Edouard Tisserant
parents:
1411
diff
changeset
|
1087 |
return_type_obj.setcontent(derived_type) |
1411 | 1088 |
|
814 | 1089 |
def UpdateProjectUsedPous(self, old_name, new_name): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1090 |
if self.Project is not None: |
814 | 1091 |
self.Project.updateElementName(old_name, new_name) |
1411 | 1092 |
|
814 | 1093 |
def UpdateEditedElementUsedVariable(self, tagname, old_name, new_name): |
1094 |
pou = self.GetEditedElement(tagname) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1095 |
if pou is not None: |
814 | 1096 |
pou.updateElementName(old_name, new_name) |
1411 | 1097 |
|
814 | 1098 |
# Return the return type of the given pou |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1099 |
def GetPouInterfaceReturnType(self, pou, tree=False, debug=False): |
814 | 1100 |
# Verify that the pou has an interface |
1101 |
if pou.interface is not None: |
|
1102 |
# Return the return type if there is one |
|
1103 |
return_type = pou.interface.getreturnType() |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1104 |
if return_type is not None: |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
1105 |
factory = self.VariableInfoCollector.Collect(return_type, |
1951
bbd1e1744c91
GetVariableDictionary and GetPouInterfaceReturnType optimized with new VariableInfoCollector based on XSLTModelQuery. Moved corresponding definitions out of PLCControler.py.
Edouard Tisserant
parents:
1950
diff
changeset
|
1106 |
debug, [], tree) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1107 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1108 |
return [factory.GetType(), factory.GetTree()] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1109 |
return factory.GetType() |
1411 | 1110 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1111 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1112 |
return [None, ([], [])] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1113 |
return None |
814 | 1114 |
|
1115 |
# Function that add a new confnode to the confnode list |
|
1116 |
def AddConfNodeTypesList(self, typeslist): |
|
1117 |
self.ConfNodeTypes.extend(typeslist) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1118 |
addedcat = [{"name": _("%s POUs") % confnodetypes["name"], |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1119 |
"list": [pou.getblockInfos() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1120 |
for pou in confnodetypes["types"].getpous()]} |
1767
c74815729afd
clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1766
diff
changeset
|
1121 |
for confnodetypes in typeslist] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1122 |
self.TotalTypes.extend(addedcat) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1123 |
for cat in addedcat: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1124 |
for desc in cat["list"]: |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1125 |
BlkLst = self.TotalTypesDict.setdefault(desc["name"], []) |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1126 |
BlkLst.append((section["name"], desc)) |
1411 | 1127 |
|
814 | 1128 |
# Function that clear the confnode list |
1129 |
def ClearConfNodeTypes(self): |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1130 |
self.ConfNodeTypes = [] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1131 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1132 |
self.TotalTypes = StdBlckLst[:] |
814 | 1133 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1134 |
def GetConfNodeDataTypes(self, exclude=None, only_locatables=False): |
814 | 1135 |
return [{"name": _("%s Data Types") % confnodetypes["name"], |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1136 |
"list": [ |
1878
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
1137 |
datatype.getname() |
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
1138 |
for datatype in confnodetypes["types"].getdataTypes() |
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
1139 |
if not only_locatables or self.IsLocatableDataType(datatype)]} |
814 | 1140 |
for confnodetypes in self.ConfNodeTypes] |
1411 | 1141 |
|
814 | 1142 |
def GetVariableLocationTree(self): |
1143 |
return [] |
|
1144 |
||
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1145 |
def GetConfNodeGlobalInstances(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1146 |
return [] |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1147 |
|
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1148 |
def GetConfigurationExtraVariables(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1149 |
global_vars = [] |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1150 |
for var_name, var_type, var_initial in self.GetConfNodeGlobalInstances(): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1151 |
tempvar = PLCOpenParser.CreateElement("variable", "globalVars") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1152 |
tempvar.setname(var_name) |
1411 | 1153 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1154 |
tempvartype = PLCOpenParser.CreateElement("type", "variable") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1155 |
if var_type in self.GetBaseTypes(): |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1156 |
tempvartype.setcontent(PLCOpenParser.CreateElement( |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1157 |
var_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1158 |
if var_type in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1159 |
else var_type, "dataType")) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1160 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1161 |
tempderivedtype = PLCOpenParser.CreateElement("derived", "dataType") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1162 |
tempderivedtype.setname(var_type) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1163 |
tempvartype.setcontent(tempderivedtype) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1164 |
tempvar.settype(tempvartype) |
1411 | 1165 |
|
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1166 |
if var_initial != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1167 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1168 |
value.setvalue(var_initial) |
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1169 |
tempvar.setinitialValue(value) |
1411 | 1170 |
|
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1171 |
global_vars.append(tempvar) |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1172 |
return global_vars |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1173 |
|
814 | 1174 |
# Function that returns the block definition associated to the block type given |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1175 |
def GetBlockType(self, typename, inputs=None, debug=False): |
1879
4d81c3bcac82
fix pylint error '(unsubscriptable-object) Value 'X' is unsubscriptable'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1878
diff
changeset
|
1176 |
result_blocktype = {} |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1177 |
for _sectioname, blocktype in self.TotalTypesDict.get(typename, []): |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1178 |
if inputs is not None and inputs != "undefined": |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1179 |
block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]]) |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1180 |
if reduce(lambda x, y: x and y, map(lambda x: x[0] == "ANY" or self.IsOfType(*x), zip(inputs, block_inputs)), True): |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1181 |
return blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1182 |
else: |
1879
4d81c3bcac82
fix pylint error '(unsubscriptable-object) Value 'X' is unsubscriptable'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1878
diff
changeset
|
1183 |
if result_blocktype: |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1184 |
if inputs == "undefined": |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1185 |
return None |
814 | 1186 |
else: |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1187 |
result_blocktype["inputs"] = [(i[0], "ANY", i[2]) for i in result_blocktype["inputs"]] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1188 |
result_blocktype["outputs"] = [(o[0], "ANY", o[2]) for o in result_blocktype["outputs"]] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1189 |
return result_blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1190 |
result_blocktype = blocktype.copy() |
1879
4d81c3bcac82
fix pylint error '(unsubscriptable-object) Value 'X' is unsubscriptable'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1878
diff
changeset
|
1191 |
if result_blocktype: |
814 | 1192 |
return result_blocktype |
1193 |
project = self.GetProject(debug) |
|
1194 |
if project is not None: |
|
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1195 |
blocktype = project.getpou(typename) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1196 |
if blocktype is not None: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1197 |
blocktype_infos = blocktype.getblockInfos() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1198 |
if inputs in [None, "undefined"]: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1199 |
return blocktype_infos |
1411 | 1200 |
|
1201 |
if inputs == tuple([var_type |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1202 |
for _name, var_type, _modifier in blocktype_infos["inputs"]]): |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1203 |
return blocktype_infos |
1411 | 1204 |
|
814 | 1205 |
return None |
1206 |
||
1207 |
# Return Block types checking for recursion |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1208 |
def GetBlockTypes(self, tagname="", debug=False): |
814 | 1209 |
words = tagname.split("::") |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1210 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1211 |
project = self.GetProject(debug) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1212 |
if project is not None: |
1284 | 1213 |
pou_type = None |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1214 |
if words[0] in ["P", "T", "A"]: |
814 | 1215 |
name = words[1] |
1284 | 1216 |
pou_type = self.GetPouType(name, debug) |
1411 | 1217 |
filter = (["function"] |
1218 |
if pou_type == "function" or words[0] == "T" |
|
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1219 |
else ["functionBlock", "function"]) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1220 |
blocktypes = [ |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1221 |
{"name": category["name"], |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1222 |
"list": [block for block in category["list"] |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1223 |
if block["type"] in filter]} |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1224 |
for category in self.TotalTypes] |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1225 |
blocktypes.append({ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1226 |
"name": USER_DEFINED_POUS, |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1227 |
"list": [pou.getblockInfos() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1228 |
for pou in project.getpous(name, filter) |
1411 | 1229 |
if (name is None or |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1230 |
len(self.GetInstanceList(pou, name, debug)) == 0)] |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1231 |
}) |
1284 | 1232 |
return blocktypes |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1233 |
return self.TotalTypes |
814 | 1234 |
|
1235 |
# Return Function Block types checking for recursion |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1236 |
def GetFunctionBlockTypes(self, tagname="", debug=False): |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1237 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1238 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1239 |
name = None |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1240 |
if project is not None and words[0] in ["P", "T", "A"]: |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1241 |
name = words[1] |
814 | 1242 |
blocktypes = [] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1243 |
for blocks in self.TotalTypesDict.itervalues(): |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1244 |
for _sectioname, block in blocks: |
814 | 1245 |
if block["type"] == "functionBlock": |
1246 |
blocktypes.append(block["name"]) |
|
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1247 |
if project is not None: |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1248 |
blocktypes.extend([ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1249 |
pou.getname() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1250 |
for pou in project.getpous(name, ["functionBlock"]) |
1411 | 1251 |
if (name is None or |
1372
ef26fcb7f5d4
Fixed bug in test if block type is used by current edited pou
Laurent Bessard
parents:
1368
diff
changeset
|
1252 |
len(self.GetInstanceList(pou, name, debug)) == 0)]) |
814 | 1253 |
return blocktypes |
1254 |
||
1255 |
# Return Block types checking for recursion |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1256 |
def GetBlockResource(self, debug=False): |
814 | 1257 |
blocktypes = [] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1258 |
for category in StdBlckLst[:-1]: |
814 | 1259 |
for blocktype in category["list"]: |
1260 |
if blocktype["type"] == "program": |
|
1261 |
blocktypes.append(blocktype["name"]) |
|
1262 |
project = self.GetProject(debug) |
|
1263 |
if project is not None: |
|
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1264 |
blocktypes.extend( |
1328
a2f2981df9b0
Fixed bug in Resource POU instance type selection
Laurent Bessard
parents:
1326
diff
changeset
|
1265 |
[pou.getname() |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1266 |
for pou in project.getpous(filter=["program"])]) |
814 | 1267 |
return blocktypes |
1268 |
||
1269 |
# Return Data Types checking for recursion |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1270 |
def GetDataTypes(self, tagname="", basetypes=True, confnodetypes=True, only_locatables=False, debug=False): |
814 | 1271 |
if basetypes: |
1272 |
datatypes = self.GetBaseTypes() |
|
1273 |
else: |
|
1274 |
datatypes = [] |
|
1275 |
project = self.GetProject(debug) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1276 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1277 |
if project is not None: |
814 | 1278 |
words = tagname.split("::") |
1279 |
if words[0] in ["D"]: |
|
1280 |
name = words[1] |
|
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1281 |
datatypes.extend([ |
1411 | 1282 |
datatype.getname() |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1283 |
for datatype in project.getdataTypes(name) |
1785
0ff2a45dcefa
clean-up: fix PEP8 W503 line break before binary operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1284 |
if ((not only_locatables or self.IsLocatableDataType(datatype, debug)) and |
0ff2a45dcefa
clean-up: fix PEP8 W503 line break before binary operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1285 |
(name is None or len(self.GetInstanceList(datatype, name, debug)) == 0))]) |
863
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1286 |
if confnodetypes: |
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1287 |
for category in self.GetConfNodeDataTypes(name, only_locatables): |
b1ead41fbd3b
Fix bug in VariablePanel 'Type' cell editor menu entry 'User Data Types' containing ConfNodes data types
Laurent Bessard
parents:
853
diff
changeset
|
1288 |
datatypes.extend(category["list"]) |
814 | 1289 |
return datatypes |
1290 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1291 |
# Return Data Type Object |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1292 |
def GetPou(self, typename, debug=False): |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1293 |
project = self.GetProject(debug) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1294 |
if project is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1295 |
result = project.getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1296 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1297 |
return result |
1390 | 1298 |
for standardlibrary in StdBlckLibs.values(): |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1299 |
result = standardlibrary.getpou(typename) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1300 |
if result is not None: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1301 |
return result |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1302 |
for confnodetype in self.ConfNodeTypes: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1303 |
result = confnodetype["types"].getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1304 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1305 |
return result |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1306 |
return None |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1307 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1308 |
# Return Data Type Object |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1309 |
def GetDataType(self, typename, debug=False): |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1310 |
project = self.GetProject(debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1311 |
if project is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1312 |
result = project.getdataType(typename) |
814 | 1313 |
if result is not None: |
1314 |
return result |
|
1315 |
for confnodetype in self.ConfNodeTypes: |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1316 |
result = confnodetype["types"].getdataType(typename) |
814 | 1317 |
if result is not None: |
1318 |
return result |
|
1319 |
return None |
|
1320 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1321 |
# Return Data Type Object Base Type |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1322 |
def GetDataTypeBaseType(self, datatype): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1323 |
basetype_content = datatype.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1324 |
basetype_content_type = basetype_content.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1325 |
if basetype_content_type in ["array", "subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1326 |
basetype = basetype_content.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1327 |
basetype_type = basetype.getLocalTag() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1328 |
return (basetype.getname() if basetype_type == "derived" |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1329 |
else basetype_type.upper()) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
1330 |
return (basetype_content.getname() if basetype_content_type == "derived" |
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
1331 |
else basetype_content_type.upper()) |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1332 |
|
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1333 |
# Return Base Type of given possible derived type |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1334 |
def GetBaseType(self, typename, debug=False): |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1762
diff
changeset
|
1335 |
if typename in TypeHierarchy: |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1336 |
return typename |
1411 | 1337 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1338 |
datatype = self.GetDataType(typename, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1339 |
if datatype is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1340 |
basetype = self.GetDataTypeBaseType(datatype) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1341 |
if basetype is not None: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
L& |