author | Edouard Tisserant |
Mon, 15 Oct 2018 15:27:47 +0200 | |
changeset 2311 | bef2b4b87370 |
parent 1973 | cc7a46953471 |
child 2418 | 5587c490a070 |
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 |
1850
614396cbffbf
fix pylint warning '(unused-import), Unused import connectors'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1847
diff
changeset
|
28 |
from types import TupleType |
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 |
|
1832
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
34 |
|
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
35 |
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
|
36 |
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
|
37 |
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
|
38 |
from plcopen.InstancesPathCollector import InstancesPathCollector |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
39 |
from plcopen.POUVariablesCollector import POUVariablesCollector |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
40 |
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
|
41 |
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
|
42 |
from plcopen.VariableInfoCollector import VariableInfoCollector |
814 | 43 |
from graphics.GraphicCommons import * |
44 |
from PLCGenerator import * |
|
45 |
||
46 |
duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?") |
|
1968
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
47 |
VARIABLE_NAME_SUFFIX_MODEL = re.compile('(\d+)$') |
814 | 48 |
|
1680
6db967480b7d
make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1619
diff
changeset
|
49 |
ScriptDirectory = paths.AbsDir(__file__) |
814 | 50 |
|
51 |
# Length of the buffer |
|
52 |
UNDO_BUFFER_LENGTH = 20 |
|
53 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
54 |
|
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
|
55 |
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
|
56 |
""" |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
57 |
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
|
58 |
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
|
59 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
60 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
61 |
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
|
62 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
63 |
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
|
64 |
""" |
814 | 65 |
self.Buffer = [] |
66 |
self.CurrentIndex = -1 |
|
67 |
self.MinIndex = -1 |
|
68 |
self.MaxIndex = -1 |
|
69 |
# if current state is defined |
|
70 |
if currentstate: |
|
71 |
self.CurrentIndex = 0 |
|
72 |
self.MinIndex = 0 |
|
73 |
self.MaxIndex = 0 |
|
74 |
# Initialising buffer with currentstate at the first place |
|
75 |
for i in xrange(UNDO_BUFFER_LENGTH): |
|
76 |
if i == 0: |
|
77 |
self.Buffer.append(currentstate) |
|
78 |
else: |
|
79 |
self.Buffer.append(None) |
|
80 |
# Initialising index of state saved |
|
81 |
if issaved: |
|
82 |
self.LastSave = 0 |
|
83 |
else: |
|
84 |
self.LastSave = -1 |
|
1411 | 85 |
|
814 | 86 |
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
|
87 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
88 |
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
|
89 |
""" |
814 | 90 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
91 |
self.Buffer[self.CurrentIndex] = currentstate |
|
92 |
# Actualising buffer limits |
|
93 |
self.MaxIndex = self.CurrentIndex |
|
94 |
if self.MinIndex == self.CurrentIndex: |
|
95 |
# If the removed state was the state saved, there is no state saved in the buffer |
|
96 |
if self.LastSave == self.MinIndex: |
|
97 |
self.LastSave = -1 |
|
98 |
self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH |
|
99 |
self.MinIndex = max(self.MinIndex, 0) |
|
1411 | 100 |
|
814 | 101 |
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
|
102 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1735
diff
changeset
|
103 |
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
|
104 |
""" |
814 | 105 |
return self.Buffer[self.CurrentIndex] |
1411 | 106 |
|
814 | 107 |
# Change current state to previous in buffer and return new current state |
108 |
def Previous(self): |
|
109 |
if self.CurrentIndex != self.MinIndex: |
|
110 |
self.CurrentIndex = (self.CurrentIndex - 1) % UNDO_BUFFER_LENGTH |
|
111 |
return self.Buffer[self.CurrentIndex] |
|
112 |
return None |
|
1411 | 113 |
|
814 | 114 |
# Change current state to next in buffer and return new current state |
115 |
def Next(self): |
|
116 |
if self.CurrentIndex != self.MaxIndex: |
|
117 |
self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH |
|
118 |
return self.Buffer[self.CurrentIndex] |
|
119 |
return None |
|
1411 | 120 |
|
814 | 121 |
# Return True if current state is the first in buffer |
122 |
def IsFirst(self): |
|
123 |
return self.CurrentIndex == self.MinIndex |
|
1411 | 124 |
|
814 | 125 |
# Return True if current state is the last in buffer |
126 |
def IsLast(self): |
|
127 |
return self.CurrentIndex == self.MaxIndex |
|
128 |
||
129 |
# Note that current state is saved |
|
130 |
def CurrentSaved(self): |
|
131 |
self.LastSave = self.CurrentIndex |
|
1411 | 132 |
|
814 | 133 |
# Return True if current state is saved |
134 |
def IsCurrentSaved(self): |
|
135 |
return self.LastSave == self.CurrentIndex |
|
136 |
||
137 |
||
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
|
138 |
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
|
139 |
""" |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
140 |
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
|
141 |
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
|
142 |
""" |
1411 | 143 |
|
814 | 144 |
# Create a new PLCControler |
145 |
def __init__(self): |
|
146 |
self.LastNewIndex = 0 |
|
147 |
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
|
148 |
self.InstancesPathCollector = InstancesPathCollector(self) |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
149 |
self.POUVariablesCollector = POUVariablesCollector(self) |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
150 |
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
|
151 |
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
|
152 |
self.VariableInfoCollector = VariableInfoCollector(self) |
1411 | 153 |
|
814 | 154 |
# Reset PLCControler internal variables |
155 |
def Reset(self): |
|
156 |
self.Project = None |
|
157 |
self.ProjectBufferEnabled = True |
|
158 |
self.ProjectBuffer = None |
|
159 |
self.ProjectSaved = True |
|
160 |
self.Buffering = False |
|
161 |
self.FilePath = "" |
|
162 |
self.FileName = "" |
|
163 |
self.ProgramChunks = [] |
|
164 |
self.ProgramOffset = 0 |
|
165 |
self.NextCompiledProject = None |
|
166 |
self.CurrentCompiledProject = None |
|
167 |
self.ConfNodeTypes = [] |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
168 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
169 |
self.TotalTypes = StdBlckLst[:] |
1284 | 170 |
self.ProgramFilePath = "" |
1411 | 171 |
|
814 | 172 |
def GetQualifierTypes(self): |
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
173 |
return QualifierList |
814 | 174 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
175 |
def GetProject(self, debug=False): |
814 | 176 |
if debug and self.CurrentCompiledProject is not None: |
177 |
return self.CurrentCompiledProject |
|
178 |
else: |
|
179 |
return self.Project |
|
180 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
181 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
182 |
# Project management functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
183 |
# ------------------------------------------------------------------------------- |
814 | 184 |
|
185 |
# Return if a project is opened |
|
186 |
def HasOpenedProject(self): |
|
187 |
return self.Project is not None |
|
188 |
||
189 |
# Create a new project by replacing the current one |
|
190 |
def CreateNewProject(self, properties): |
|
191 |
# Create the project |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
192 |
self.Project = PLCOpenParser.CreateRoot() |
814 | 193 |
properties["creationDateTime"] = datetime.datetime(*localtime()[:6]) |
194 |
self.Project.setfileHeader(properties) |
|
195 |
self.Project.setcontentHeader(properties) |
|
196 |
self.SetFilePath("") |
|
1411 | 197 |
|
814 | 198 |
# Initialize the project buffer |
199 |
self.CreateProjectBuffer(False) |
|
200 |
self.ProgramChunks = [] |
|
201 |
self.ProgramOffset = 0 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
202 |
self.NextCompiledProject = self.Copy(self.Project) |
814 | 203 |
self.CurrentCompiledProject = None |
204 |
self.Buffering = False |
|
1411 | 205 |
|
814 | 206 |
# 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
|
207 |
def GetProjectDataTypeNames(self, debug=False): |
814 | 208 |
project = self.GetProject(debug) |
209 |
if project is not None: |
|
210 |
return [datatype.getname() for datatype in project.getdataTypes()] |
|
211 |
return [] |
|
1411 | 212 |
|
814 | 213 |
# 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
|
214 |
def GetProjectPouNames(self, debug=False): |
814 | 215 |
project = self.GetProject(debug) |
216 |
if project is not None: |
|
217 |
return [pou.getname() for pou in project.getpous()] |
|
218 |
return [] |
|
1411 | 219 |
|
814 | 220 |
# 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
|
221 |
def GetProjectConfigNames(self, debug=False): |
814 | 222 |
project = self.GetProject(debug) |
223 |
if project is not None: |
|
224 |
return [config.getname() for config in project.getconfigurations()] |
|
225 |
return [] |
|
1411 | 226 |
|
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
|
227 |
# 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
|
228 |
def GetProjectPouVariableNames(self, pou_name=None, debug=False): |
814 | 229 |
variables = [] |
230 |
project = self.GetProject(debug) |
|
231 |
if project is not None: |
|
232 |
for pou in project.getpous(): |
|
233 |
if pou_name is None or pou_name == pou.getname(): |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
234 |
variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) |
814 | 235 |
for transition in pou.gettransitionList(): |
236 |
variables.append(transition.getname()) |
|
237 |
for action in pou.getactionList(): |
|
238 |
variables.append(action.getname()) |
|
239 |
return variables |
|
1411 | 240 |
|
814 | 241 |
# Return file path if project is an open file |
242 |
def GetFilePath(self): |
|
243 |
return self.FilePath |
|
1411 | 244 |
|
814 | 245 |
# Return file path if project is an open file |
246 |
def GetProgramFilePath(self): |
|
247 |
return self.ProgramFilePath |
|
1411 | 248 |
|
814 | 249 |
# Return file name and point out if file is up to date |
250 |
def GetFilename(self): |
|
251 |
if self.Project is not None: |
|
252 |
if self.ProjectIsSaved(): |
|
253 |
return self.FileName |
|
254 |
else: |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
255 |
return "~%s~" % self.FileName |
814 | 256 |
return "" |
1411 | 257 |
|
814 | 258 |
# Change file path and save file name or create a default one if file path not defined |
259 |
def SetFilePath(self, filepath): |
|
260 |
self.FilePath = filepath |
|
261 |
if filepath == "": |
|
262 |
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
|
263 |
self.FileName = _("Unnamed%d") % self.LastNewIndex |
814 | 264 |
else: |
265 |
self.FileName = os.path.splitext(os.path.basename(filepath))[0] |
|
1411 | 266 |
|
814 | 267 |
# 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
|
268 |
def SetProjectProperties(self, name=None, properties=None, buffer=True): |
814 | 269 |
if self.Project is not None: |
270 |
if name is not None: |
|
271 |
self.Project.setname(name) |
|
272 |
if properties is not None: |
|
273 |
self.Project.setfileHeader(properties) |
|
274 |
self.Project.setcontentHeader(properties) |
|
275 |
if buffer and (name is not None or properties is not None): |
|
276 |
self.BufferProject() |
|
1411 | 277 |
|
814 | 278 |
# Return project name |
279 |
def GetProjectName(self, debug=False): |
|
280 |
project = self.GetProject(debug) |
|
281 |
if project is not None: |
|
282 |
return project.getname() |
|
283 |
return None |
|
1411 | 284 |
|
814 | 285 |
# 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
|
286 |
def GetProjectProperties(self, debug=False): |
814 | 287 |
project = self.GetProject(debug) |
288 |
if project is not None: |
|
289 |
properties = project.getfileHeader() |
|
290 |
properties.update(project.getcontentHeader()) |
|
291 |
return properties |
|
292 |
return None |
|
1411 | 293 |
|
814 | 294 |
# 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
|
295 |
def GetProjectInfos(self, debug=False): |
814 | 296 |
project = self.GetProject(debug) |
297 |
if project is not None: |
|
298 |
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
|
299 |
datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values": []} |
814 | 300 |
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
|
301 |
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
|
302 |
"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
|
303 |
"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
|
304 |
"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
|
305 |
"values": []}) |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
306 |
pou_types = { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
307 |
"function": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
308 |
"name": FUNCTIONS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
309 |
"type": ITEM_FUNCTION, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
310 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
311 |
}, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
312 |
"functionBlock": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
313 |
"name": FUNCTION_BLOCKS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
314 |
"type": ITEM_FUNCTIONBLOCK, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
315 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
316 |
}, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
317 |
"program": { |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
318 |
"name": PROGRAMS, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
319 |
"type": ITEM_PROGRAM, |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
320 |
"values": [] |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
321 |
} |
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
322 |
} |
814 | 323 |
for pou in project.getpous(): |
324 |
pou_type = pou.getpouType() |
|
325 |
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
|
326 |
"tagname": ComputePouName(pou.getname())} |
814 | 327 |
pou_values = [] |
328 |
if pou.getbodyType() == "SFC": |
|
329 |
transitions = [] |
|
330 |
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
|
331 |
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
|
332 |
"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
|
333 |
"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
|
334 |
"tagname": ComputePouTransitionName(pou.getname(), transition.getname()), |
814 | 335 |
"values": []}) |
336 |
pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions}) |
|
337 |
actions = [] |
|
338 |
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
|
339 |
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
|
340 |
"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
|
341 |
"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
|
342 |
"tagname": ComputePouActionName(pou.getname(), action.getname()), |
814 | 343 |
"values": []}) |
344 |
pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions}) |
|
345 |
if pou_type in pou_types: |
|
346 |
pou_infos["values"] = pou_values |
|
347 |
pou_types[pou_type]["values"].append(pou_infos) |
|
348 |
configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []} |
|
349 |
for config in project.getconfigurations(): |
|
350 |
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
|
351 |
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
|
352 |
"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
|
353 |
"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
|
354 |
"tagname": ComputeConfigurationName(config.getname()), |
814 | 355 |
"values": []} |
356 |
resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []} |
|
357 |
for resource in config.getresource(): |
|
358 |
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
|
359 |
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
|
360 |
"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
|
361 |
"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
|
362 |
"tagname": ComputeConfigurationResourceName(config.getname(), resource.getname()), |
814 | 363 |
"values": []} |
364 |
resources["values"].append(resource_infos) |
|
365 |
config_infos["values"] = [resources] |
|
366 |
configurations["values"].append(config_infos) |
|
1411 | 367 |
infos["values"] = [datatypes, pou_types["function"], pou_types["functionBlock"], |
814 | 368 |
pou_types["program"], configurations] |
369 |
return infos |
|
370 |
return None |
|
371 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
372 |
def GetPouVariables(self, tagname, debug=False): |
814 | 373 |
project = self.GetProject(debug) |
374 |
if project is not None: |
|
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
375 |
obj = None |
814 | 376 |
words = tagname.split("::") |
377 |
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
|
378 |
obj = self.GetPou(words[1], debug) |
1348
aee0a7eb833a
Fixed pou variables instance information loading stylesheet
Laurent Bessard
parents:
1347
diff
changeset
|
379 |
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
|
380 |
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
|
381 |
if obj is not None: |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1942
diff
changeset
|
382 |
return self.POUVariablesCollector.Collect(obj, debug) |
1411 | 383 |
|
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
384 |
return None |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
385 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
386 |
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
|
387 |
return self.InstancesPathCollector.Collect(root, name, debug) |
1411 | 388 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
389 |
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
|
390 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
391 |
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
|
392 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
393 |
if words[0] == "P": |
1350
7280349a3375
Fixed pou instance path list computing stylesheet
Laurent Bessard
parents:
1348
diff
changeset
|
394 |
return self.GetInstanceList(project, words[1]) |
814 | 395 |
elif words[0] == 'C': |
396 |
return [words[1]] |
|
397 |
elif words[0] == 'R': |
|
398 |
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
|
399 |
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
|
400 |
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
|
401 |
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
|
402 |
ComputePouName(words[1]), debug)] |
814 | 403 |
return [] |
1411 | 404 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
405 |
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
|
406 |
project = self.GetProject(debug) |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
407 |
if project is not None: |
1950
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
408 |
return self.InstanceTagnameCollector.Collect(project, |
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
409 |
debug, |
752ec68da94d
GetPouInstanceTagName optimized with XSLTModelQuery.
Edouard Tisserant
parents:
1948
diff
changeset
|
410 |
instance_path) |
1411 | 411 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
412 |
def GetInstanceInfos(self, instance_path, debug=False): |
814 | 413 |
tagname = self.GetPouInstanceTagName(instance_path) |
414 |
if tagname is not None: |
|
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
415 |
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
|
416 |
infos.type = tagname |
827
a2ce084fb598
Fix restore project tab layout with transition and action debug tabs
laurent
parents:
826
diff
changeset
|
417 |
return infos |
814 | 418 |
else: |
419 |
pou_path, var_name = instance_path.rsplit(".", 1) |
|
420 |
tagname = self.GetPouInstanceTagName(pou_path) |
|
421 |
if tagname is not None: |
|
422 |
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
|
423 |
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
|
424 |
if var_infos.name == var_name: |
814 | 425 |
return var_infos |
426 |
return None |
|
1411 | 427 |
|
814 | 428 |
# 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
|
429 |
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
|
430 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
431 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
432 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 433 |
return False |
434 |
||
435 |
# 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
|
436 |
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
|
437 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
438 |
if project is not None: |
1354
241c19ea80da
Fixed bug when selecting pou that is not used in project
Laurent Bessard
parents:
1351
diff
changeset
|
439 |
return len(self.GetInstanceList(project, name, debug)) > 0 |
814 | 440 |
return False |
441 |
||
442 |
# 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
|
443 |
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
|
444 |
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
|
445 |
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
|
446 |
return len(self.GetInstanceList(pou_infos, name, debug)) > 0 |
814 | 447 |
return False |
448 |
||
449 |
def GenerateProgram(self, filepath=None): |
|
450 |
errors = [] |
|
451 |
warnings = [] |
|
452 |
if self.Project is not None: |
|
453 |
try: |
|
454 |
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings) |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
455 |
self.NextCompiledProject = self.Copy(self.Project) |
901
ab43f3e40b9d
Fix bug when compiling project containing non-ascii characters
Laurent Bessard
parents:
887
diff
changeset
|
456 |
program_text = "".join([item[0] for item in self.ProgramChunks]) |
814 | 457 |
if filepath is not None: |
458 |
programfile = open(filepath, "w") |
|
459 |
programfile.write(program_text.encode("utf-8")) |
|
460 |
programfile.close() |
|
461 |
self.ProgramFilePath = filepath |
|
462 |
return program_text, errors, warnings |
|
1875
62aaabbf8812
fix pylint warning '(redefine-in-handler) Redefining name 'X' from outer scope (line Y) in exception handler'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1872
diff
changeset
|
463 |
except PLCGenException, ex: |
62aaabbf8812
fix pylint warning '(redefine-in-handler) Redefining name 'X' from outer scope (line Y) in exception handler'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1872
diff
changeset
|
464 |
errors.append(ex.message) |
814 | 465 |
else: |
466 |
errors.append("No project opened") |
|
467 |
return "", errors, warnings |
|
468 |
||
469 |
def DebugAvailable(self): |
|
470 |
return self.CurrentCompiledProject is not None |
|
471 |
||
472 |
def ProgramTransferred(self): |
|
473 |
if self.NextCompiledProject is None: |
|
474 |
self.CurrentCompiledProject = self.NextCompiledProject |
|
475 |
else: |
|
476 |
self.CurrentCompiledProject = self.Copy(self.Project) |
|
477 |
||
478 |
def GetChunkInfos(self, from_location, to_location): |
|
479 |
row = self.ProgramOffset + 1 |
|
480 |
col = 1 |
|
481 |
infos = [] |
|
482 |
for chunk, chunk_infos in self.ProgramChunks: |
|
483 |
lines = chunk.split("\n") |
|
484 |
if len(lines) > 1: |
|
485 |
next_row = row + len(lines) - 1 |
|
486 |
next_col = len(lines[-1]) + 1 |
|
487 |
else: |
|
488 |
next_row = row |
|
489 |
next_col = col + len(chunk) |
|
490 |
if (next_row > from_location[0] or next_row == from_location[0] and next_col >= from_location[1]) and len(chunk_infos) > 0: |
|
491 |
infos.append((chunk_infos, (row, col))) |
|
492 |
if next_row == to_location[0] and next_col > to_location[1] or next_row > to_location[0]: |
|
493 |
return infos |
|
494 |
row, col = next_row, next_col |
|
495 |
return infos |
|
1411 | 496 |
|
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
497 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
498 |
# 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
|
499 |
# ------------------------------------------------------------------------------- |
1411 | 500 |
|
814 | 501 |
# Add a Data Type to Project |
502 |
def ProjectAddDataType(self, datatype_name=None): |
|
503 |
if self.Project is not None: |
|
504 |
if datatype_name is None: |
|
505 |
datatype_name = self.GenerateNewName(None, None, "datatype%d") |
|
506 |
# Add the datatype to project |
|
507 |
self.Project.appenddataType(datatype_name) |
|
508 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
509 |
return ComputeDataTypeName(datatype_name) |
814 | 510 |
return None |
1411 | 511 |
|
814 | 512 |
# Remove a Data Type from project |
513 |
def ProjectRemoveDataType(self, datatype_name): |
|
514 |
if self.Project is not None: |
|
515 |
self.Project.removedataType(datatype_name) |
|
516 |
self.BufferProject() |
|
1411 | 517 |
|
814 | 518 |
# Add a Pou to Project |
519 |
def ProjectAddPou(self, pou_name, pou_type, body_type): |
|
520 |
if self.Project is not None: |
|
521 |
# Add the pou to project |
|
522 |
self.Project.appendpou(pou_name, pou_type, body_type) |
|
523 |
if pou_type == "function": |
|
524 |
self.SetPouInterfaceReturnType(pou_name, "BOOL") |
|
525 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
526 |
return ComputePouName(pou_name) |
814 | 527 |
return None |
1411 | 528 |
|
814 | 529 |
def ProjectChangePouType(self, name, pou_type): |
530 |
if self.Project is not None: |
|
531 |
pou = self.Project.getpou(name) |
|
532 |
if pou is not None: |
|
533 |
pou.setpouType(pou_type) |
|
534 |
self.BufferProject() |
|
1411 | 535 |
|
814 | 536 |
def GetPouXml(self, pou_name): |
537 |
if self.Project is not None: |
|
538 |
pou = self.Project.getpou(pou_name) |
|
539 |
if pou is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
540 |
return pou.tostring() |
814 | 541 |
return None |
1411 | 542 |
|
814 | 543 |
def PastePou(self, pou_type, pou_xml): |
544 |
''' |
|
545 |
Adds the POU defined by 'pou_xml' to the current project with type 'pou_type' |
|
546 |
''' |
|
547 |
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
|
548 |
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
|
549 |
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
|
550 |
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
|
551 |
if error is not None: |
814 | 552 |
return _("Couldn't paste non-POU object.") |
1411 | 553 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
554 |
name = new_pou.getname() |
1411 | 555 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
556 |
idx = 0 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
557 |
new_name = name |
1411 | 558 |
while self.Project.getpou(new_name) is not None: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
559 |
# a POU with that name already exists. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
560 |
# 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
|
561 |
# append an incrementing numeric suffix to the POU name. |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
562 |
idx += 1 |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
563 |
new_name = "%s%d" % (name, idx) |
1411 | 564 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
565 |
# 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
|
566 |
new_pou.setname(new_name) |
1411 | 567 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
568 |
if pou_type is not None: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
569 |
orig_type = new_pou.getpouType() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
570 |
|
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
571 |
# prevent violations of POU content restrictions: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
572 |
# function blocks cannot be pasted as functions, |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
573 |
# programs cannot be pasted as functions or function blocks |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
574 |
if orig_type == 'functionBlock' and pou_type == 'function' or \ |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
575 |
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
|
576 |
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
|
577 |
return msg |
1411 | 578 |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
579 |
new_pou.setpouType(pou_type) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
580 |
|
1411 | 581 |
self.Project.insertpou(0, new_pou) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
582 |
self.BufferProject() |
1411 | 583 |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
584 |
return ComputePouName(new_name), |
814 | 585 |
|
586 |
# Remove a Pou from project |
|
587 |
def ProjectRemovePou(self, pou_name): |
|
588 |
if self.Project is not None: |
|
589 |
self.Project.removepou(pou_name) |
|
590 |
self.BufferProject() |
|
1411 | 591 |
|
814 | 592 |
# Return the name of the configuration if only one exist |
593 |
def GetProjectMainConfigurationName(self): |
|
594 |
if self.Project is not None: |
|
595 |
# Found the configuration corresponding to old name and change its name to new name |
|
596 |
configurations = self.Project.getconfigurations() |
|
597 |
if len(configurations) == 1: |
|
598 |
return configurations[0].getname() |
|
599 |
return None |
|
1411 | 600 |
|
814 | 601 |
# Add a configuration to Project |
602 |
def ProjectAddConfiguration(self, config_name=None): |
|
603 |
if self.Project is not None: |
|
604 |
if config_name is None: |
|
605 |
config_name = self.GenerateNewName(None, None, "configuration%d") |
|
606 |
self.Project.addconfiguration(config_name) |
|
607 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
608 |
return ComputeConfigurationName(config_name) |
814 | 609 |
return None |
1411 | 610 |
|
814 | 611 |
# Remove a configuration from project |
612 |
def ProjectRemoveConfiguration(self, config_name): |
|
613 |
if self.Project is not None: |
|
614 |
self.Project.removeconfiguration(config_name) |
|
615 |
self.BufferProject() |
|
1411 | 616 |
|
814 | 617 |
# Add a resource to a configuration of the Project |
618 |
def ProjectAddConfigurationResource(self, config_name, resource_name=None): |
|
619 |
if self.Project is not None: |
|
620 |
if resource_name is None: |
|
621 |
resource_name = self.GenerateNewName(None, None, "resource%d") |
|
622 |
self.Project.addconfigurationResource(config_name, resource_name) |
|
623 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
624 |
return ComputeConfigurationResourceName(config_name, resource_name) |
814 | 625 |
return None |
1411 | 626 |
|
814 | 627 |
# Remove a resource from a configuration of the project |
628 |
def ProjectRemoveConfigurationResource(self, config_name, resource_name): |
|
629 |
if self.Project is not None: |
|
630 |
self.Project.removeconfigurationResource(config_name, resource_name) |
|
631 |
self.BufferProject() |
|
1411 | 632 |
|
814 | 633 |
# Add a Transition to a Project Pou |
634 |
def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): |
|
635 |
if self.Project is not None: |
|
636 |
pou = self.Project.getpou(pou_name) |
|
637 |
if pou is not None: |
|
638 |
pou.addtransition(transition_name, transition_type) |
|
639 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
640 |
return ComputePouTransitionName(pou_name, transition_name) |
814 | 641 |
return None |
1411 | 642 |
|
814 | 643 |
# Remove a Transition from a Project Pou |
644 |
def ProjectRemovePouTransition(self, pou_name, transition_name): |
|
645 |
# Search if the pou removed is currently opened |
|
646 |
if self.Project is not None: |
|
647 |
pou = self.Project.getpou(pou_name) |
|
648 |
if pou is not None: |
|
649 |
pou.removetransition(transition_name) |
|
650 |
self.BufferProject() |
|
1411 | 651 |
|
814 | 652 |
# Add an Action to a Project Pou |
653 |
def ProjectAddPouAction(self, pou_name, action_name, action_type): |
|
654 |
if self.Project is not None: |
|
655 |
pou = self.Project.getpou(pou_name) |
|
656 |
if pou is not None: |
|
657 |
pou.addaction(action_name, action_type) |
|
658 |
self.BufferProject() |
|
1948
b9a3f771aaab
Moved some definitions away from controller class, and adaped references them through all code.
Edouard Tisserant
parents:
1944
diff
changeset
|
659 |
return ComputePouActionName(pou_name, action_name) |
814 | 660 |
return None |
1411 | 661 |
|
814 | 662 |
# Remove an Action from a Project Pou |
663 |
def ProjectRemovePouAction(self, pou_name, action_name): |
|
664 |
# Search if the pou removed is currently opened |
|
665 |
if self.Project is not None: |
|
666 |
pou = self.Project.getpou(pou_name) |
|
667 |
if pou is not None: |
|
668 |
pou.removeaction(action_name) |
|
669 |
self.BufferProject() |
|
1411 | 670 |
|
814 | 671 |
# Change the name of a pou |
672 |
def ChangeDataTypeName(self, old_name, new_name): |
|
673 |
if self.Project is not None: |
|
674 |
# Found the pou corresponding to old name and change its name to new name |
|
675 |
datatype = self.Project.getdataType(old_name) |
|
676 |
if datatype is not None: |
|
677 |
datatype.setname(new_name) |
|
678 |
self.Project.updateElementName(old_name, new_name) |
|
679 |
self.BufferProject() |
|
1411 | 680 |
|
814 | 681 |
# Change the name of a pou |
682 |
def ChangePouName(self, old_name, new_name): |
|
683 |
if self.Project is not None: |
|
684 |
# Found the pou corresponding to old name and change its name to new name |
|
685 |
pou = self.Project.getpou(old_name) |
|
686 |
if pou is not None: |
|
687 |
pou.setname(new_name) |
|
688 |
self.Project.updateElementName(old_name, new_name) |
|
689 |
self.BufferProject() |
|
1411 | 690 |
|
814 | 691 |
# Change the name of a pou transition |
692 |
def ChangePouTransitionName(self, pou_name, old_name, new_name): |
|
693 |
if self.Project is not None: |
|
694 |
# Found the pou transition corresponding to old name and change its name to new name |
|
695 |
pou = self.Project.getpou(pou_name) |
|
696 |
if pou is not None: |
|
697 |
transition = pou.gettransition(old_name) |
|
698 |
if transition is not None: |
|
699 |
transition.setname(new_name) |
|
700 |
pou.updateElementName(old_name, new_name) |
|
701 |
self.BufferProject() |
|
1411 | 702 |
|
814 | 703 |
# Change the name of a pou action |
704 |
def ChangePouActionName(self, pou_name, old_name, new_name): |
|
705 |
if self.Project is not None: |
|
706 |
# Found the pou action corresponding to old name and change its name to new name |
|
707 |
pou = self.Project.getpou(pou_name) |
|
708 |
if pou is not None: |
|
709 |
action = pou.getaction(old_name) |
|
710 |
if action is not None: |
|
711 |
action.setname(new_name) |
|
712 |
pou.updateElementName(old_name, new_name) |
|
713 |
self.BufferProject() |
|
1411 | 714 |
|
814 | 715 |
# Change the name of a pou variable |
716 |
def ChangePouVariableName(self, pou_name, old_name, new_name): |
|
717 |
if self.Project is not None: |
|
718 |
# Found the pou action corresponding to old name and change its name to new name |
|
719 |
pou = self.Project.getpou(pou_name) |
|
720 |
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
|
721 |
for _type, varlist in pou.getvars(): |
814 | 722 |
for var in varlist.getvariable(): |
723 |
if var.getname() == old_name: |
|
724 |
var.setname(new_name) |
|
725 |
self.BufferProject() |
|
1411 | 726 |
|
814 | 727 |
# Change the name of a configuration |
728 |
def ChangeConfigurationName(self, old_name, new_name): |
|
729 |
if self.Project is not None: |
|
730 |
# Found the configuration corresponding to old name and change its name to new name |
|
731 |
configuration = self.Project.getconfiguration(old_name) |
|
732 |
if configuration is not None: |
|
733 |
configuration.setname(new_name) |
|
734 |
self.BufferProject() |
|
1411 | 735 |
|
814 | 736 |
# Change the name of a configuration resource |
737 |
def ChangeConfigurationResourceName(self, config_name, old_name, new_name): |
|
738 |
if self.Project is not None: |
|
739 |
# Found the resource corresponding to old name and change its name to new name |
|
740 |
resource = self.Project.getconfigurationResource(config_name, old_name) |
|
741 |
if resource is not None: |
|
742 |
resource.setname(new_name) |
|
743 |
self.BufferProject() |
|
1411 | 744 |
|
814 | 745 |
# 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
|
746 |
def GetPouDescription(self, name, debug=False): |
814 | 747 |
project = self.GetProject(debug) |
748 |
if project is not None: |
|
749 |
# Found the pou correponding to name and return its type |
|
750 |
pou = project.getpou(name) |
|
751 |
if pou is not None: |
|
752 |
return pou.getdescription() |
|
753 |
return "" |
|
1411 | 754 |
|
814 | 755 |
# 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
|
756 |
def SetPouDescription(self, name, description, debug=False): |
814 | 757 |
project = self.GetProject(debug) |
758 |
if project is not None: |
|
759 |
# Found the pou correponding to name and return its type |
|
760 |
pou = project.getpou(name) |
|
761 |
if pou is not None: |
|
762 |
pou.setdescription(description) |
|
763 |
self.BufferProject() |
|
1411 | 764 |
|
814 | 765 |
# 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
|
766 |
def GetPouType(self, name, debug=False): |
814 | 767 |
project = self.GetProject(debug) |
768 |
if project is not None: |
|
769 |
# Found the pou correponding to name and return its type |
|
770 |
pou = project.getpou(name) |
|
771 |
if pou is not None: |
|
772 |
return pou.getpouType() |
|
773 |
return None |
|
1411 | 774 |
|
814 | 775 |
# 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
|
776 |
def GetSFCPous(self, debug=False): |
814 | 777 |
list = [] |
778 |
project = self.GetProject(debug) |
|
779 |
if project is not None: |
|
780 |
for pou in project.getpous(): |
|
781 |
if pou.getBodyType() == "SFC": |
|
782 |
list.append(pou.getname()) |
|
783 |
return list |
|
1411 | 784 |
|
814 | 785 |
# 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
|
786 |
def GetPouBodyType(self, name, debug=False): |
814 | 787 |
project = self.GetProject(debug) |
788 |
if project is not None: |
|
789 |
# Found the pou correponding to name and return its body language |
|
790 |
pou = project.getpou(name) |
|
791 |
if pou is not None: |
|
792 |
return pou.getbodyType() |
|
793 |
return None |
|
1411 | 794 |
|
814 | 795 |
# 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
|
796 |
def GetPouTransitions(self, pou_name, debug=False): |
814 | 797 |
transitions = [] |
798 |
project = self.GetProject(debug) |
|
799 |
if project is not None: |
|
800 |
# Found the pou correponding to name and return its transitions if SFC |
|
801 |
pou = project.getpou(pou_name) |
|
802 |
if pou is not None and pou.getbodyType() == "SFC": |
|
803 |
for transition in pou.gettransitionList(): |
|
804 |
transitions.append(transition.getname()) |
|
805 |
return transitions |
|
1411 | 806 |
|
814 | 807 |
# 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
|
808 |
def GetTransitionBodyType(self, pou_name, pou_transition, debug=False): |
814 | 809 |
project = self.GetProject(debug) |
810 |
if project is not None: |
|
811 |
# Found the pou correponding to name |
|
812 |
pou = project.getpou(pou_name) |
|
813 |
if pou is not None: |
|
814 |
# Found the pou transition correponding to name and return its body language |
|
815 |
transition = pou.gettransition(pou_transition) |
|
816 |
if transition is not None: |
|
817 |
return transition.getbodyType() |
|
818 |
return None |
|
1411 | 819 |
|
814 | 820 |
# 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
|
821 |
def GetPouActions(self, pou_name, debug=False): |
814 | 822 |
actions = [] |
823 |
project = self.GetProject(debug) |
|
824 |
if project is not None: |
|
825 |
# Found the pou correponding to name and return its actions if SFC |
|
826 |
pou = project.getpou(pou_name) |
|
827 |
if pou.getbodyType() == "SFC": |
|
828 |
for action in pou.getactionList(): |
|
829 |
actions.append(action.getname()) |
|
830 |
return actions |
|
1411 | 831 |
|
814 | 832 |
# 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
|
833 |
def GetActionBodyType(self, pou_name, pou_action, debug=False): |
814 | 834 |
project = self.GetProject(debug) |
835 |
if project is not None: |
|
836 |
# Found the pou correponding to name and return its body language |
|
837 |
pou = project.getpou(pou_name) |
|
838 |
if pou is not None: |
|
839 |
action = pou.getaction(pou_action) |
|
840 |
if action is not None: |
|
841 |
return action.getbodyType() |
|
842 |
return None |
|
1411 | 843 |
|
814 | 844 |
# Extract varlists from a list of vars |
845 |
def ExtractVarLists(self, vars): |
|
846 |
varlist_list = [] |
|
847 |
current_varlist = None |
|
848 |
current_type = None |
|
849 |
for var in vars: |
|
1411 | 850 |
next_type = (var.Class, |
851 |
var.Option, |
|
852 |
var.Location in ["", None] or |
|
853 |
# When declaring globals, located |
|
854 |
# and not located variables are |
|
814 | 855 |
# in the same declaration block |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
856 |
var.Class == "Global") |
814 | 857 |
if current_type != next_type: |
858 |
current_type = next_type |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
859 |
infos = VAR_CLASS_INFOS.get(var.Class, None) |
814 | 860 |
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
|
861 |
current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") |
814 | 862 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
863 |
current_varlist = PLCOpenParser.CreateElement("varList") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
864 |
varlist_list.append((var.Class, current_varlist)) |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
865 |
if var.Option == "Constant": |
814 | 866 |
current_varlist.setconstant(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
867 |
elif var.Option == "Retain": |
814 | 868 |
current_varlist.setretain(True) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
869 |
elif var.Option == "Non-Retain": |
814 | 870 |
current_varlist.setnonretain(True) |
871 |
# 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
|
872 |
tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
873 |
tempvar.setname(var.Name) |
1411 | 874 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
875 |
var_type = PLCOpenParser.CreateElement("type", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
876 |
if isinstance(var.Type, TupleType): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
877 |
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
|
878 |
_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
|
879 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
880 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
881 |
array.setbaseType(baseType) |
814 | 882 |
for i, dimension in enumerate(dimensions): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
883 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 884 |
if i == 0: |
885 |
array.setdimension([dimension_range]) |
|
886 |
else: |
|
887 |
array.appenddimension(dimension_range) |
|
1298
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
888 |
dimension_range.setlower(dimension[0]) |
f034fb2b1aab
Fixed SFC block edition and SFC to SFC_textual code generating
Laurent Bessard
parents:
1297
diff
changeset
|
889 |
dimension_range.setupper(dimension[1]) |
814 | 890 |
if base_type_name in self.GetBaseTypes(): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
891 |
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
|
892 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
893 |
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
|
894 |
else base_type_name, "dataType")) |
814 | 895 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
896 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 897 |
derived_datatype.setname(base_type_name) |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
898 |
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
|
899 |
var_type.setcontent(array) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
900 |
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
|
901 |
var_type.setcontent(PLCOpenParser.CreateElement( |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
902 |
var.Type.lower() |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
903 |
if var.Type in ["STRING", "WSTRING"] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
904 |
else var.Type, "dataType")) |
814 | 905 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
906 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
907 |
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
|
908 |
var_type.setcontent(derived_type) |
814 | 909 |
tempvar.settype(var_type) |
910 |
||
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
911 |
if var.InitialValue != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
912 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
913 |
value.setvalue(var.InitialValue) |
814 | 914 |
tempvar.setinitialValue(value) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
915 |
if var.Location != "": |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
916 |
tempvar.setaddress(var.Location) |
814 | 917 |
else: |
918 |
tempvar.setaddress(None) |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
919 |
if var.Documentation != "": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
920 |
ft = PLCOpenParser.CreateElement("documentation", "variable") |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
921 |
ft.setanyText(var.Documentation) |
814 | 922 |
tempvar.setdocumentation(ft) |
923 |
||
924 |
# Add variable to varList |
|
925 |
current_varlist.appendvariable(tempvar) |
|
926 |
return varlist_list |
|
1411 | 927 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
928 |
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
|
929 |
variables = [] |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
930 |
self.VariableInfoCollector.Collect(object_with_vars, |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
931 |
debug, variables, tree) |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
932 |
return variables |
1411 | 933 |
|
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
|
934 |
# Add a global var to configuration to configuration |
1411 | 935 |
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
|
936 |
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
|
937 |
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
|
938 |
# 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
|
939 |
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
|
940 |
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
|
941 |
# Set configuration global vars |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
942 |
configuration.addglobalVar( |
1411 | 943 |
self.GetVarTypeObject(var_type), |
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
944 |
var_name, location, description) |
814 | 945 |
|
946 |
# Replace the configuration globalvars by those given |
|
947 |
def SetConfigurationGlobalVars(self, name, vars): |
|
948 |
if self.Project is not None: |
|
949 |
# Found the configuration corresponding to name |
|
950 |
configuration = self.Project.getconfiguration(name) |
|
951 |
if configuration is not None: |
|
952 |
# 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
|
953 |
configuration.setglobalVars([ |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
954 |
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
|
955 |
in self.ExtractVarLists(vars)]) |
1411 | 956 |
|
814 | 957 |
# 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
|
958 |
def GetConfigurationGlobalVars(self, name, debug=False): |
814 | 959 |
project = self.GetProject(debug) |
960 |
if project is not None: |
|
961 |
# Found the configuration corresponding to name |
|
962 |
configuration = project.getconfiguration(name) |
|
963 |
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
|
964 |
# 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
|
965 |
return self.GetVariableDictionary(configuration, debug) |
1411 | 966 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
967 |
return [] |
814 | 968 |
|
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
|
969 |
# 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
|
970 |
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
|
971 |
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
|
972 |
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
|
973 |
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
|
974 |
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
|
975 |
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
|
976 |
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
|
977 |
[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
|
978 |
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
|
979 |
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
|
980 |
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
|
981 |
[])]) |
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
|
982 |
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
|
983 |
|
814 | 984 |
# Replace the resource globalvars by those given |
985 |
def SetConfigurationResourceGlobalVars(self, config_name, name, vars): |
|
986 |
if self.Project is not None: |
|
987 |
# Found the resource corresponding to name |
|
988 |
resource = self.Project.getconfigurationResource(config_name, name) |
|
989 |
# Set resource global vars |
|
990 |
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
|
991 |
resource.setglobalVars([ |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
992 |
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
|
993 |
in self.ExtractVarLists(vars)]) |
1411 | 994 |
|
814 | 995 |
# 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
|
996 |
def GetConfigurationResourceGlobalVars(self, config_name, name, debug=False): |
814 | 997 |
project = self.GetProject(debug) |
998 |
if project is not None: |
|
999 |
# Found the resource corresponding to name |
|
1000 |
resource = project.getconfigurationResource(config_name, name) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1001 |
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
|
1002 |
# 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
|
1003 |
return self.GetVariableDictionary(resource, debug) |
1411 | 1004 |
|
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1005 |
return [] |
1411 | 1006 |
|
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
|
1007 |
# 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
|
1008 |
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
|
1009 |
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
|
1010 |
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
|
1011 |
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
|
1012 |
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
|
1013 |
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
|
1014 |
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
|
1015 |
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
|
1016 |
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
|
1017 |
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
|
1018 |
[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
|
1019 |
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
|
1020 |
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
|
1021 |
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
|
1022 |
[])]) |
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
|
1023 |
return variables |
814 | 1024 |
|
1025 |
# 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
|
1026 |
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
|
1027 |
interface = pou.interface |
814 | 1028 |
# 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
|
1029 |
if interface is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1030 |
# Extract variables defined in interface |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1031 |
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
|
1032 |
return [] |
814 | 1033 |
|
1034 |
# Replace the Pou interface by the one given |
|
1035 |
def SetPouInterfaceVars(self, name, vars): |
|
1036 |
if self.Project is not None: |
|
1037 |
# Found the pou corresponding to name and add interface if there isn't one yet |
|
1038 |
pou = self.Project.getpou(name) |
|
1039 |
if pou is not None: |
|
1040 |
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
|
1041 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1042 |
# 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
|
1043 |
pou.setvars([varlist for _varlist_type, varlist in self.ExtractVarLists(vars)]) |
1411 | 1044 |
|
814 | 1045 |
# 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
|
1046 |
def SetPouInterfaceReturnType(self, name, return_type): |
814 | 1047 |
if self.Project is not None: |
1048 |
pou = self.Project.getpou(name) |
|
1049 |
if pou is not None: |
|
1050 |
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
|
1051 |
pou.interface = PLCOpenParser.CreateElement("interface", "pou") |
814 | 1052 |
# 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
|
1053 |
return_type_obj = pou.interface.getreturnType() |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1054 |
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
|
1055 |
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
|
1056 |
pou.interface.setreturnType(return_type_obj) |
814 | 1057 |
# Change return type |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1058 |
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
|
1059 |
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
|
1060 |
return_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1061 |
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
|
1062 |
else return_type, "dataType")) |
814 | 1063 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1064 |
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
|
1065 |
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
|
1066 |
return_type_obj.setcontent(derived_type) |
1411 | 1067 |
|
814 | 1068 |
def UpdateProjectUsedPous(self, old_name, new_name): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1069 |
if self.Project is not None: |
814 | 1070 |
self.Project.updateElementName(old_name, new_name) |
1411 | 1071 |
|
814 | 1072 |
def UpdateEditedElementUsedVariable(self, tagname, old_name, new_name): |
1073 |
pou = self.GetEditedElement(tagname) |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1074 |
if pou is not None: |
814 | 1075 |
pou.updateElementName(old_name, new_name) |
1411 | 1076 |
|
814 | 1077 |
# Return the return type of the given pou |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1078 |
def GetPouInterfaceReturnType(self, pou, tree=False, debug=False): |
814 | 1079 |
# Verify that the pou has an interface |
1080 |
if pou.interface is not None: |
|
1081 |
# Return the return type if there is one |
|
1082 |
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
|
1083 |
if return_type is not None: |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1951
diff
changeset
|
1084 |
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
|
1085 |
debug, [], tree) |
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1086 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1087 |
return [factory.GetType(), factory.GetTree()] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1088 |
return factory.GetType() |
1411 | 1089 |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1090 |
if tree: |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1091 |
return [None, ([], [])] |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1092 |
return None |
814 | 1093 |
|
1094 |
# Function that add a new confnode to the confnode list |
|
1095 |
def AddConfNodeTypesList(self, typeslist): |
|
1096 |
self.ConfNodeTypes.extend(typeslist) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1097 |
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
|
1098 |
"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
|
1099 |
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
|
1100 |
for confnodetypes in typeslist] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1101 |
self.TotalTypes.extend(addedcat) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1102 |
for cat in addedcat: |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1103 |
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
|
1104 |
BlkLst = self.TotalTypesDict.setdefault(desc["name"], []) |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1105 |
BlkLst.append((section["name"], desc)) |
1411 | 1106 |
|
814 | 1107 |
# Function that clear the confnode list |
1108 |
def ClearConfNodeTypes(self): |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1109 |
self.ConfNodeTypes = [] |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1110 |
self.TotalTypesDict = StdBlckDct.copy() |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1111 |
self.TotalTypes = StdBlckLst[:] |
814 | 1112 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1113 |
def GetConfNodeDataTypes(self, exclude=None, only_locatables=False): |
814 | 1114 |
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
|
1115 |
"list": [ |
1878
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
1116 |
datatype.getname() |
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
1117 |
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
|
1118 |
if not only_locatables or self.IsLocatableDataType(datatype)]} |
814 | 1119 |
for confnodetypes in self.ConfNodeTypes] |
1411 | 1120 |
|
814 | 1121 |
def GetVariableLocationTree(self): |
1122 |
return [] |
|
1123 |
||
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1124 |
def GetConfNodeGlobalInstances(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1125 |
return [] |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1126 |
|
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1127 |
def GetConfigurationExtraVariables(self): |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1128 |
global_vars = [] |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1129 |
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
|
1130 |
tempvar = PLCOpenParser.CreateElement("variable", "globalVars") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1131 |
tempvar.setname(var_name) |
1411 | 1132 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1133 |
tempvartype = PLCOpenParser.CreateElement("type", "variable") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1134 |
if var_type in self.GetBaseTypes(): |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1313
diff
changeset
|
1135 |
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
|
1136 |
var_type.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1137 |
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
|
1138 |
else var_type, "dataType")) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1139 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1140 |
tempderivedtype = PLCOpenParser.CreateElement("derived", "dataType") |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1141 |
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
|
1142 |
tempvartype.setcontent(tempderivedtype) |
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1143 |
tempvar.settype(tempvartype) |
1411 | 1144 |
|
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1145 |
if var_initial != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1146 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
1096
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1147 |
value.setvalue(var_initial) |
c9ace6a881c9
Fixed CFileEditor replacing folding panels by variable panel and STC
Laurent Bessard
parents:
901
diff
changeset
|
1148 |
tempvar.setinitialValue(value) |
1411 | 1149 |
|
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1150 |
global_vars.append(tempvar) |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1151 |
return global_vars |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1152 |
|
814 | 1153 |
# 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
|
1154 |
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
|
1155 |
result_blocktype = {} |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1156 |
for _sectioname, blocktype in self.TotalTypesDict.get(typename, []): |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1157 |
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
|
1158 |
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
|
1159 |
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
|
1160 |
return blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1161 |
else: |
1879
4d81c3bcac82
fix pylint error '(unsubscriptable-object) Value 'X' is unsubscriptable'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1878
diff
changeset
|
1162 |
if result_blocktype: |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1163 |
if inputs == "undefined": |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1164 |
return None |
814 | 1165 |
else: |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1166 |
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
|
1167 |
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
|
1168 |
return result_blocktype |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1169 |
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
|
1170 |
if result_blocktype: |
814 | 1171 |
return result_blocktype |
1172 |
project = self.GetProject(debug) |
|
1173 |
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
|
1174 |
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
|
1175 |
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
|
1176 |
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
|
1177 |
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
|
1178 |
return blocktype_infos |
1411 | 1179 |
|
1180 |
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
|
1181 |
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
|
1182 |
return blocktype_infos |
1411 | 1183 |
|
814 | 1184 |
return None |
1185 |
||
1186 |
# 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
|
1187 |
def GetBlockTypes(self, tagname="", debug=False): |
814 | 1188 |
words = tagname.split("::") |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1189 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1190 |
project = self.GetProject(debug) |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1191 |
if project is not None: |
1284 | 1192 |
pou_type = None |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1193 |
if words[0] in ["P", "T", "A"]: |
814 | 1194 |
name = words[1] |
1284 | 1195 |
pou_type = self.GetPouType(name, debug) |
1411 | 1196 |
filter = (["function"] |
1197 |
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
|
1198 |
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
|
1199 |
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
|
1200 |
{"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
|
1201 |
"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
|
1202 |
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
|
1203 |
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
|
1204 |
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
|
1205 |
"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
|
1206 |
"list": [pou.getblockInfos() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1207 |
for pou in project.getpous(name, filter) |
1411 | 1208 |
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
|
1209 |
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
|
1210 |
}) |
1284 | 1211 |
return blocktypes |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1212 |
return self.TotalTypes |
814 | 1213 |
|
1214 |
# 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
|
1215 |
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
|
1216 |
project = self.GetProject(debug) |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1217 |
words = tagname.split("::") |
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1218 |
name = None |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1219 |
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
|
1220 |
name = words[1] |
814 | 1221 |
blocktypes = [] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1222 |
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
|
1223 |
for _sectioname, block in blocks: |
814 | 1224 |
if block["type"] == "functionBlock": |
1225 |
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
|
1226 |
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
|
1227 |
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
|
1228 |
pou.getname() |
1319
748347102c97
Replaced old list of pou instance in project generating process by xslt stylesheet
Laurent Bessard
parents:
1316
diff
changeset
|
1229 |
for pou in project.getpous(name, ["functionBlock"]) |
1411 | 1230 |
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
|
1231 |
len(self.GetInstanceList(pou, name, debug)) == 0)]) |
814 | 1232 |
return blocktypes |
1233 |
||
1234 |
# 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
|
1235 |
def GetBlockResource(self, debug=False): |
814 | 1236 |
blocktypes = [] |
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1237 |
for category in StdBlckLst[:-1]: |
814 | 1238 |
for blocktype in category["list"]: |
1239 |
if blocktype["type"] == "program": |
|
1240 |
blocktypes.append(blocktype["name"]) |
|
1241 |
project = self.GetProject(debug) |
|
1242 |
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
|
1243 |
blocktypes.extend( |
1328
a2f2981df9b0
Fixed bug in Resource POU instance type selection
Laurent Bessard
parents:
1326
diff
changeset
|
1244 |
[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
|
1245 |
for pou in project.getpous(filter=["program"])]) |
814 | 1246 |
return blocktypes |
1247 |
||
1248 |
# 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
|
1249 |
def GetDataTypes(self, tagname="", basetypes=True, confnodetypes=True, only_locatables=False, debug=False): |
814 | 1250 |
if basetypes: |
1251 |
datatypes = self.GetBaseTypes() |
|
1252 |
else: |
|
1253 |
datatypes = [] |
|
1254 |
project = self.GetProject(debug) |
|
1283
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1255 |
name = None |
f3cfe1ff917e
More optimization attemps in type handling
Edouard Tisserant
parents:
1265
diff
changeset
|
1256 |
if project is not None: |
814 | 1257 |
words = tagname.split("::") |
1258 |
if words[0] in ["D"]: |
|
1259 |
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
|
1260 |
datatypes.extend([ |
1411 | 1261 |
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
|
1262 |
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
|
1263 |
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
|
1264 |
(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
|
1265 |
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
|
1266 |
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
|
1267 |
datatypes.extend(category["list"]) |
814 | 1268 |
return datatypes |
1269 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1270 |
# 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
|
1271 |
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
|
1272 |
project = self.GetProject(debug) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1273 |
if project is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1274 |
result = project.getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1275 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1276 |
return result |
1390 | 1277 |
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
|
1278 |
result = standardlibrary.getpou(typename) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1279 |
if result is not None: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
1280 |
return result |
1308
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1281 |
for confnodetype in self.ConfNodeTypes: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1282 |
result = confnodetype["types"].getpou(typename) |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1283 |
if result is not None: |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1284 |
return result |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1285 |
return None |
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1286 |
|
ad61268dbdb6
Replaced old pou variable list and variable tree generating by xslt stylesheet
Laurent Bessard
parents:
1306
diff
changeset
|
1287 |
# 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
|
1288 |
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
|
1289 |
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
|
1290 |
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
|
1291 |
result = project.getdataType(typename) |
814 | 1292 |
if result is not None: |
1293 |
return result |
|
1294 |
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
|
1295 |
result = confnodetype["types"].getdataType(typename) |
814 | 1296 |
if result is not None: |
1297 |
return result |
|
1298 |
return None |
|
1299 |
||
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1300 |
# 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
|
1301 |
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
|
1302 |
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
|
1303 |
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
|
1304 |
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
|
1305 |
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
|
1306 |
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
|
1307 |
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
|
1308 |
else basetype_type.upper()) |
1338
c1e6c712cc35
Replaced old graphic viewer blocks loading process by xslt stylesheet
Laurent Bessard
parents:
1337
diff
changeset
|
1309 |
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
|
1310 |
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
|
1311 |
|
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1312 |
# 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
|
1313 |
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
|
1314 |
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
|
1315 |
return typename |
1411 | 1316 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1317 |
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
|
1318 |
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
|
1319 |
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
|
1320 |
if basetype 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
|
1321 |
return self.GetBaseType(basetype, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1322 |
return typename |
1411 | 1323 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1324 |
return None |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1325 |
|
814 | 1326 |
def GetBaseTypes(self): |
1327 |
''' |
|
1328 |
return the list of datatypes defined in IEC 61131-3. |
|
1329 |
TypeHierarchy_list has a rough order to it (e.g. SINT, INT, DINT, ...), |
|
1330 |
which makes it easy for a user to find a type in a menu. |
|
1331 |
''' |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1332 |
return [x for x, _y in TypeHierarchy_list if not x.startswith("ANY")] |
814 | 1333 |
|
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 IsOfType(self, typename, reference, 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
|
1335 |
if reference is None or typename == reference: |
814 | 1336 |
return True |
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 |
basetype = TypeHierarchy.get(typename) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1339 |
if basetype 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 |
return self.IsOfType(basetype, reference) |
1411 | 1341 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1342 |
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
|
1343 |
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
|
1344 |
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
|
1345 |
if basetype 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
|
1346 |
return self.IsOfType(basetype, reference, debug) |
1411 | 1347 |
|
814 | 1348 |
return False |
1411 | 1349 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1350 |
def IsEndType(self, typename): |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1351 |
if typename 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
|
1352 |
return not typename.startswith("ANY") |
814 | 1353 |
return True |
1354 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1355 |
def IsLocatableDataType(self, datatype, debug=False): |
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
|
1356 |
basetype_content = datatype.baseType.getcontent() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1357 |
basetype_content_type = basetype_content.getLocalTag() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1358 |
if basetype_content_type in ["enum", "struct"]: |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1359 |
return False |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1360 |
elif basetype_content_type == "derived": |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1361 |
return self.IsLocatableType(basetype_content.getname()) |
1321
83f41ea00b97
Replaced old pou instance type tagname computing by xslt stylesheet
Laurent Bessard
parents:
1319
diff
changeset
|
1362 |
elif basetype_content_type == "array": |
1302
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1363 |
array_base_type = basetype_content.baseType.getcontent() |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1364 |
if array_base_type.getLocalTag() == "derived": |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1365 |
return self.IsLocatableType(array_base_type.getname(), debug) |
7856cd7767d6
Removed dictionaries storing datatypes and pous defined in project and pou and datatype using tree from model
Laurent Bessard
parents:
1301
diff
changeset
|
1366 |
return True |
1411 | 1367 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1368 |
def IsLocatableType(self, typename, debug=False): |
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
|
1369 |
if isinstance(typename, TupleType) or self.GetBlockType(typename) is not None: |
884
e12228fd8773
Add function block types as data types that are not locatable
Laurent Bessard
parents:
883
diff
changeset
|
1370 |
return False |
1411 | 1371 |
|
1686
85fdcc04da25
disallow setting IEC location addresses for TIME, DATE, DT and TOD variables
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1680
diff
changeset
|
1372 |
# the size of these types is implementation dependend |
85fdcc04da25
disallow setting IEC location addresses for TIME, DATE, DT and TOD variables
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1680
diff
changeset
|
1373 |
if typename in ["TIME", "DATE", "DT", "TOD"]: |
85fdcc04da25
disallow setting IEC location addresses for TIME, DATE, DT and TOD variables
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1680
diff
changeset
|
1374 |
return False |
1735
c02818d7e29f
clean-up: fix PEP8 W293 blank line contains whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1375 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1376 |
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
|
1377 |
if datatype 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
|
1378 |
return self.IsLocatableDataType(datatype) |
814 | 1379 |
return True |
1411 | 1380 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1381 |
def IsEnumeratedType(self, typename, debug=False): |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1382 |
if isinstance(typename, TupleType): |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1383 |
typename = typename[1] |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1384 |
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
|
1385 |
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
|
1386 |
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
|
1387 |
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
|
1388 |
if basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1389 |
return self.IsEnumeratedType(basetype_content_type, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1390 |
return basetype_content_type == "enum" |
814 | 1391 |
return False |
1392 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1393 |
def IsSubrangeType(self, typename, exclude=None, 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
|
1394 |
if typename == exclude: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1395 |
return False |
1306
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1396 |
if isinstance(typename, TupleType): |
1ff1cdf6c318
Fixed bug with direct array variable type definition
Laurent Bessard
parents:
1304
diff
changeset
|
1397 |
typename = typename[1] |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1398 |
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
|
1399 |
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
|
1400 |
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
|
1401 |
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
|
1402 |
if basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1403 |
return self.IsSubrangeType(basetype_content_type, exclude, debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1404 |
elif basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1405 |
return not self.IsOfType( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1406 |
self.GetDataTypeBaseType(datatype), exclude) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1407 |
return False |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1408 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1409 |
def IsNumType(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
|
1410 |
return self.IsOfType(typename, "ANY_NUM", debug) or\ |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1411 |
self.IsOfType(typename, "ANY_BIT", debug) |
1411 | 1412 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1413 |
def GetDataTypeRange(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
|
1414 |
range = DataTypeRange.get(typename) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1415 |
if range 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
|
1416 |
return range |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1417 |
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
|
1418 |
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
|
1419 |
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
|
1420 |
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
|
1421 |
if basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1422 |
return (basetype_content.range.getlower(), |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1423 |
basetype_content.range.getupper()) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1424 |
elif basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1425 |
return self.GetDataTypeRange(basetype_content.getname(), debug) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1426 |
return None |
1411 | 1427 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1428 |
# Return Subrange types |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1429 |
def GetSubrangeBaseTypes(self, exclude, 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
|
1430 |
subrange_basetypes = DataTypeRange.keys() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1431 |
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
|
1432 |
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
|
1433 |
subrange_basetypes.extend( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1434 |
[datatype.getname() for datatype in project.getdataTypes() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1435 |
if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1436 |
for confnodetype in self.ConfNodeTypes: |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1437 |
subrange_basetypes.extend( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1438 |
[datatype.getname() for datatype in confnodetype["types"].getdataTypes() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1439 |
if self.IsSubrangeType(datatype.getname(), exclude, debug)]) |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1440 |
return subrange_basetypes |
1411 | 1441 |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1442 |
# Return Enumerated Values |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1443 |
def GetEnumeratedDataValues(self, typename=None, 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
|
1444 |
values = [] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1445 |
if typename 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
|
1446 |
datatype_obj = 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
|
1447 |
if datatype_obj 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
|
1448 |
basetype_content = datatype_obj.baseType.getcontent() |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1449 |
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
|
1450 |
if basetype_content_type == "enum": |
1411 | 1451 |
return [value.getname() |
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1452 |
for value in basetype_content.xpath( |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1453 |
"ppx:values/ppx:value", |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1454 |
namespaces=PLCOpenParser.NSMAP)] |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1455 |
elif basetype_content_type == "derived": |
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1456 |
return self.GetEnumeratedDataValues(basetype_content.getname(), debug) |
814 | 1457 |
else: |
1458 |
project = self.GetProject(debug) |
|
1459 |
if project is not None: |
|
1301
fcca121a000f
Removed dictionaries storing enumerated datatypes values, subrange datatypes range and project datatype hierarchy from model
Laurent Bessard
parents:
1299
diff
changeset
|
1460 |
values.extend(project.GetEnumeratedDataTypeValues()) |
814 | 1461 |
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
|
1462 |
values.extend(confnodetype["types"].GetEnumeratedDataTypeValues()) |
814 | 1463 |
return values |
1464 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1465 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1466 |
# Project opened Data types management functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1467 |
# ------------------------------------------------------------------------------- |
814 | 1468 |
|
1469 |
# Return the data type informations |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1470 |
def GetDataTypeInfos(self, tagname, debug=False): |
814 | 1471 |
project = self.GetProject(debug) |
1472 |
if project is not None: |
|
1473 |
words = tagname.split("::") |
|
1474 |
if words[0] == "D": |
|
1475 |
infos = {} |
|
1476 |
datatype = project.getdataType(words[1]) |
|
883
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1477 |
if datatype is None: |
235a9ec83b95
Adding support for defining specific global variables for ConfTreeNodes
Laurent Bessard
parents:
864
diff
changeset
|
1478 |
return None |
814 | 1479 |
basetype_content = datatype.baseType.getcontent() |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1480 |
basetype_content_type = basetype_content.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1481 |
if basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
814 | 1482 |
infos["type"] = "Subrange" |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1483 |
infos["min"] = basetype_content.range.getlower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1484 |
infos["max"] = basetype_content.range.getupper() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1485 |
base_type = basetype_content.baseType.getcontent() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1486 |
base_type_type = base_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1487 |
infos["base_type"] = (base_type.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
|
1488 |
if base_type_type == "derived" |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1489 |
else base_type_type) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1490 |
elif basetype_content_type == "enum": |
814 | 1491 |
infos["type"] = "Enumerated" |
1492 |
infos["values"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1493 |
for value in basetype_content.xpath("ppx:values/ppx:value", namespaces=PLCOpenParser.NSMAP): |
814 | 1494 |
infos["values"].append(value.getname()) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1495 |
elif basetype_content_type == "array": |
814 | 1496 |
infos["type"] = "Array" |
1497 |
infos["dimensions"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1498 |
for dimension in basetype_content.getdimension(): |
814 | 1499 |
infos["dimensions"].append((dimension.getlower(), dimension.getupper())) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1500 |
base_type = basetype_content.baseType.getcontent() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1501 |
base_type_type = base_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1502 |
infos["base_type"] = (base_type.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
|
1503 |
if base_type_type == "derived" |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1504 |
else base_type_type.upper()) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1505 |
elif basetype_content_type == "struct": |
814 | 1506 |
infos["type"] = "Structure" |
1507 |
infos["elements"] = [] |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1508 |
for element in basetype_content.getvariable(): |
814 | 1509 |
element_infos = {} |
1510 |
element_infos["Name"] = element.getname() |
|
1511 |
element_type = element.type.getcontent() |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1512 |
element_type_type = element_type.getLocalTag() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1513 |
if element_type_type == "array": |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1514 |
dimensions = [] |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1515 |
for dimension in element_type.getdimension(): |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1516 |
dimensions.append((dimension.getlower(), dimension.getupper())) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1517 |
base_type = element_type.baseType.getcontent() |
1502
62eb21aab1fb
fix display of ARRAY fields inside of structure data types.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1477
diff
changeset
|
1518 |
base_type_type = base_type.getLocalTag() |
1411 | 1519 |
element_infos["Type"] = ("array", |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1520 |
base_type.getname() |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1521 |
if base_type_type == "derived" |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1522 |
else base_type_type.upper(), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1523 |
dimensions) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1524 |
elif element_type_type == "derived": |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1525 |
element_infos["Type"] = element_type.getname() |
814 | 1526 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1527 |
element_infos["Type"] = element_type_type.upper() |
814 | 1528 |
if element.initialValue is not None: |
1508
4c645e6b8c98
fix error if non-latin character was entered in initial value in
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1505
diff
changeset
|
1529 |
element_infos["Initial Value"] = element.initialValue.getvalue() |
814 | 1530 |
else: |
1531 |
element_infos["Initial Value"] = "" |
|
1532 |
infos["elements"].append(element_infos) |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1533 |
else: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1534 |
infos["type"] = "Directly" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1535 |
infos["base_type"] = (basetype_content.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
|
1536 |
if basetype_content_type == "derived" |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1537 |
else basetype_content_type.upper()) |
1411 | 1538 |
|
814 | 1539 |
if datatype.initialValue is not None: |
1508
4c645e6b8c98
fix error if non-latin character was entered in initial value in
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1505
diff
changeset
|
1540 |
infos["initial"] = datatype.initialValue.getvalue() |
814 | 1541 |
else: |
1542 |
infos["initial"] = "" |
|
1543 |
return infos |
|
1544 |
return None |
|
1411 | 1545 |
|
814 | 1546 |
# Change the data type informations |
1547 |
def SetDataTypeInfos(self, tagname, infos): |
|
1548 |
words = tagname.split("::") |
|
1549 |
if self.Project is not None and words[0] == "D": |
|
1550 |
datatype = self.Project.getdataType(words[1]) |
|
1551 |
if infos["type"] == "Directly": |
|
1552 |
if infos["base_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
|
1553 |
datatype.baseType.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1554 |
infos["base_type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1555 |
if infos["base_type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1556 |
else infos["base_type"], "dataType")) |
814 | 1557 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1558 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1559 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1560 |
datatype.baseType.setcontent(derived_datatype) |
814 | 1561 |
elif infos["type"] == "Subrange": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1562 |
subrange = PLCOpenParser.CreateElement( |
1411 | 1563 |
"subrangeUnsigned" |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1564 |
if infos["base_type"] in GetSubTypes("ANY_UINT") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1565 |
else "subrangeSigned", "dataType") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1566 |
datatype.baseType.setcontent(subrange) |
814 | 1567 |
subrange.range.setlower(infos["min"]) |
1568 |
subrange.range.setupper(infos["max"]) |
|
1569 |
if infos["base_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
|
1570 |
subrange.baseType.setcontent( |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1571 |
PLCOpenParser.CreateElement(infos["base_type"], "dataType")) |
814 | 1572 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1573 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1574 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1575 |
subrange.baseType.setcontent(derived_datatype) |
814 | 1576 |
elif infos["type"] == "Enumerated": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1577 |
enumerated = PLCOpenParser.CreateElement("enum", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1578 |
datatype.baseType.setcontent(enumerated) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1579 |
values = PLCOpenParser.CreateElement("values", "enum") |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1580 |
enumerated.setvalues(values) |
814 | 1581 |
for i, enum_value in enumerate(infos["values"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1582 |
value = PLCOpenParser.CreateElement("value", "values") |
814 | 1583 |
value.setname(enum_value) |
1584 |
if i == 0: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1585 |
values.setvalue([value]) |
814 | 1586 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1587 |
values.appendvalue(value) |
814 | 1588 |
elif infos["type"] == "Array": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1589 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1590 |
datatype.baseType.setcontent(array) |
814 | 1591 |
for i, dimension in enumerate(infos["dimensions"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1592 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
814 | 1593 |
dimension_range.setlower(dimension[0]) |
1594 |
dimension_range.setupper(dimension[1]) |
|
1595 |
if i == 0: |
|
1596 |
array.setdimension([dimension_range]) |
|
1597 |
else: |
|
1598 |
array.appenddimension(dimension_range) |
|
1599 |
if infos["base_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
|
1600 |
array.baseType.setcontent(PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1601 |
infos["base_type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1602 |
if infos["base_type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1603 |
else infos["base_type"], "dataType")) |
814 | 1604 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1605 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1606 |
derived_datatype.setname(infos["base_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1607 |
array.baseType.setcontent(derived_datatype) |
814 | 1608 |
elif infos["type"] == "Structure": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1609 |
struct = PLCOpenParser.CreateElement("struct", "dataType") |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1610 |
datatype.baseType.setcontent(struct) |
814 | 1611 |
for i, element_infos in enumerate(infos["elements"]): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1612 |
element = PLCOpenParser.CreateElement("variable", "struct") |
814 | 1613 |
element.setname(element_infos["Name"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1614 |
element_type = PLCOpenParser.CreateElement("type", "variable") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1615 |
if isinstance(element_infos["Type"], TupleType): |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1616 |
if element_infos["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
|
1617 |
_array_type, base_type_name, dimensions = element_infos["Type"] |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1618 |
array = PLCOpenParser.CreateElement("array", "dataType") |
1477
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
1619 |
baseType = PLCOpenParser.CreateElement("baseType", "array") |
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
1620 |
array.setbaseType(baseType) |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1621 |
element_type.setcontent(array) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1622 |
for j, dimension in enumerate(dimensions): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1623 |
dimension_range = PLCOpenParser.CreateElement("dimension", "array") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1624 |
dimension_range.setlower(dimension[0]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1625 |
dimension_range.setupper(dimension[1]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1626 |
if j == 0: |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1627 |
array.setdimension([dimension_range]) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1628 |
else: |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1629 |
array.appenddimension(dimension_range) |
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1630 |
if base_type_name in self.GetBaseTypes(): |
1477
270dba8bf87b
fix issue, when structure data type with array field is created
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1418
diff
changeset
|
1631 |
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
|
1632 |
base_type_name.lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1633 |
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
|
1634 |
else base_type_name, "dataType")) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1635 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1636 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1637 |
derived_datatype.setname(base_type_name) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1638 |
array.baseType.setcontent(derived_datatype) |
864
bf4f7f0801b9
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
863
diff
changeset
|
1639 |
elif element_infos["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
|
1640 |
element_type.setcontent( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1641 |
PLCOpenParser.CreateElement( |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1642 |
element_infos["Type"].lower() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1643 |
if element_infos["Type"] in ["STRING", "WSTRING"] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1644 |
else element_infos["Type"], "dataType")) |
814 | 1645 |
else: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1646 |
derived_datatype = PLCOpenParser.CreateElement("derived", "dataType") |
814 | 1647 |
derived_datatype.setname(element_infos["Type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1648 |
element_type.setcontent(derived_datatype) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1649 |
element.settype(element_type) |
814 | 1650 |
if element_infos["Initial Value"] != "": |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1651 |
value = PLCOpenParser.CreateElement("initialValue", "variable") |
814 | 1652 |
value.setvalue(element_infos["Initial Value"]) |
1653 |
element.setinitialValue(value) |
|
1654 |
if i == 0: |
|
1655 |
struct.setvariable([element]) |
|
1656 |
else: |
|
1657 |
struct.appendvariable(element) |
|
1658 |
if infos["initial"] != "": |
|
1659 |
if datatype.initialValue is None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1660 |
datatype.initialValue = PLCOpenParser.CreateElement("initialValue", "dataType") |
814 | 1661 |
datatype.initialValue.setvalue(infos["initial"]) |
1662 |
else: |
|
1663 |
datatype.initialValue = None |
|
1664 |
self.BufferProject() |
|
1411 | 1665 |
|
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1666 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1667 |
# Project opened Pous management functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
1668 |
# ------------------------------------------------------------------------------- |
814 | 1669 |
|
1670 |
# Return edited element |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1671 |
def GetEditedElement(self, tagname, debug=False): |
814 | 1672 |
project = self.GetProject(debug) |
1673 |
if project is not None: |
|
1674 |
words = tagname.split("::") |
|
1675 |
if words[0] == "D": |
|
1676 |
return project.getdataType(words[1]) |
|
1677 |
elif words[0] == "P": |
|
1678 |
return project.getpou(words[1]) |
|
1679 |
elif words[0] in ['T', 'A']: |
|
1680 |
pou = project.getpou(words[1]) |
|
1681 |
if pou is not None: |
|
1682 |
if words[0] == 'T': |
|
1683 |
return pou.gettransition(words[2]) |
|
1684 |
elif words[0] == 'A': |
|
1685 |
return pou.getaction(words[2]) |
|
1686 |
elif words[0] == 'C': |
|
1687 |
return project.getconfiguration(words[1]) |
|
1688 |
elif words[0] == 'R': |
|
1689 |
return project.getconfigurationResource(words[1], words[2]) |
|
1690 |
return None |
|
1411 | 1691 |
|
814 | 1692 |
# Return edited element name |
1693 |
def GetEditedElementName(self, tagname): |
|
1694 |
words = tagname.split("::") |
|
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1695 |
if words[0] in ["P", "C", "D"]: |
814 | 1696 |
return words[1] |
1697 |
else: |
|
1698 |
return words[2] |
|
1699 |
return None |
|
1411 | 1700 |
|
814 | 1701 |
# Return edited element name and type |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1702 |
def GetEditedElementType(self, tagname, debug=False): |
814 | 1703 |
words = tagname.split("::") |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1704 |
if words[0] in ["P", "T", "A"]: |
814 | 1705 |
return words[1], self.GetPouType(words[1], debug) |
1706 |
return None, None |
|
1707 |
||
1708 |
# Return language in which edited element is written |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1709 |
def GetEditedElementBodyType(self, tagname, debug=False): |
814 | 1710 |
words = tagname.split("::") |
1711 |
if words[0] == "P": |
|
1712 |
return self.GetPouBodyType(words[1], debug) |
|
1713 |
elif words[0] == 'T': |
|
1714 |
return self.GetTransitionBodyType(words[1], words[2], debug) |
|
1715 |
elif words[0] == 'A': |
|
1716 |
return self.GetActionBodyType(words[1], words[2], debug) |
|
1717 |
return None |
|
1718 |
||
1719 |
# Return the edited element variables |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1720 |
def GetEditedElementInterfaceVars(self, tagname, tree=False, debug=False): |
814 | 1721 |
words = tagname.split("::") |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1722 |
if words[0] in ["P", "T", "A"]: |
814 | 1723 |
project = self.GetProject(debug) |
1724 |
if project is not None: |
|
1725 |
pou = project.getpou(words[1]) |
|
1726 |
if pou is not None: |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1727 |
return self.GetPouInterfaceVars(pou, tree, debug) |
814 | 1728 |
return [] |
1729 |
||
1730 |
# Return the edited element return type |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1731 |
def GetEditedElementInterfaceReturnType(self, tagname, tree=False, debug=False): |
814 | 1732 |
words = tagname.split("::") |
1733 |
if words[0] == "P": |
|
1734 |
project = self.GetProject(debug) |
|
1735 |
if project is not None: |
|
1736 |
pou = self.Project.getpou(words[1]) |
|
1737 |
if pou is not None: |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1738 |
return self.GetPouInterfaceReturnType(pou, tree, debug) |
814 | 1739 |
elif words[0] == 'T': |
1616
3638463d6e02
fix issue with creating SFC transitions using ST and IL
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1581
diff
changeset
|
1740 |
return ["BOOL", ([], [])] |
814 | 1741 |
return None |
1411 | 1742 |
|
814 | 1743 |
# Change the edited element text |
1744 |
def SetEditedElementText(self, tagname, text): |
|
1745 |
if self.Project is not None: |
|
1746 |
element = self.GetEditedElement(tagname) |
|
1747 |
if element is not None: |
|
1748 |
element.settext(text) |
|
1411 | 1749 |
|
814 | 1750 |
# Return the edited element text |
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1751 |
def GetEditedElementText(self, tagname, debug=False): |
814 | 1752 |
element = self.GetEditedElement(tagname, debug) |
1753 |
if element is not None: |
|
1754 |
return element.gettext() |
|
1755 |
return "" |
|
1756 |
||
1757 |
# Return the edited element transitions |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1758 |
def GetEditedElementTransitions(self, tagname, debug=False): |
814 | 1759 |
pou = self.GetEditedElement(tagname, debug) |
1760 |
if pou is not None and pou.getbodyType() == "SFC": |
|
1761 |
transitions = [] |
|
1762 |
for transition in pou.gettransitionList(): |
|
1763 |
transitions.append(transition.getname()) |
|
1764 |
return transitions |
|
1765 |
return [] |
|
1766 |
||
1767 |
# Return edited element transitions |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1768 |
def GetEditedElementActions(self, tagname, debug=False): |
814 | 1769 |
pou = self.GetEditedElement(tagname, debug) |
1770 |
if pou is not None and pou.getbodyType() == "SFC": |
|
1771 |
actions = [] |
|
1772 |
for action in pou.getactionList(): |
|
1773 |
actions.append(action.getname()) |
|
1774 |
return actions |
|
1775 |
return [] |
|
1776 |
||
1777 |
# Return the names of the pou elements |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1778 |
def GetEditedElementVariables(self, tagname, debug=False): |
814 | 1779 |
words = tagname.split("::") |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1780 |
if words[0] in ["P", "T", "A"]: |
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
|
1781 |
return self.GetProjectPouVariableNames(words[1], 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
|
1782 |
elif words[0] in ["C", "R"]: |
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
|
1783 |
names = self.GetConfigurationVariableNames(words[1], 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
|
1784 |
if words[0] == "R": |
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
|
1785 |
names.extend(self.GetConfigurationResourceVariableNames( |
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
|
1786 |
words[1], words[2], 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
|
1787 |
return names |
814 | 1788 |
return [] |
1789 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1790 |
def GetEditedElementCopy(self, tagname, debug=False): |
814 | 1791 |
element = self.GetEditedElement(tagname, debug) |
1792 |
if element is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1793 |
return element.tostring() |
814 | 1794 |
return "" |
1411 | 1795 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1796 |
def GetEditedElementInstancesCopy(self, tagname, blocks_id=None, wires=None, debug=False): |
814 | 1797 |
element = self.GetEditedElement(tagname, debug) |
1798 |
text = "" |
|
1799 |
if element is not None: |
|
1411 | 1800 |
wires = dict([(wire, True) |
1801 |
for wire in wires |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1802 |
if wire[0] in blocks_id and wire[1] in blocks_id]) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1803 |
copy_body = PLCOpenParser.CreateElement("body", "pou") |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1804 |
element.append(copy_body) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1805 |
copy_body.setcontent( |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1806 |
PLCOpenParser.CreateElement(element.getbodyType(), "body")) |
814 | 1807 |
for id in blocks_id: |
1808 |
instance = element.getinstance(id) |
|
1809 |
if instance is not None: |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1810 |
copy_body.appendcontentInstance(self.Copy(instance)) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1811 |
instance_copy = copy_body.getcontentInstance(id) |
814 | 1812 |
instance_copy.filterConnections(wires) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1813 |
text += instance_copy.tostring() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1814 |
element.remove(copy_body) |
814 | 1815 |
return text |
1411 | 1816 |
|
1852
70c1cc354a8f
fix pylint warning '(dangerous-default-value) Dangerous default value {} as argument'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1850
diff
changeset
|
1817 |
def GenerateNewName(self, tagname, name, format, start_idx=0, exclude=None, debug=False): |
1968
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1818 |
if name is not None: |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1819 |
result = re.search(VARIABLE_NAME_SUFFIX_MODEL, name) |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1820 |
if result is not None: |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1821 |
format = name[:result.start(1)] + '%d' |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1822 |
start_idx = int(result.group(1)) |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1823 |
else: |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1824 |
format = name + '%d' |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1825 |
|
1852
70c1cc354a8f
fix pylint warning '(dangerous-default-value) Dangerous default value {} as argument'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1850
diff
changeset
|
1826 |
names = {} if exclude is None else exclude.copy() |
814 | 1827 |
if tagname is not None: |
1411 | 1828 |
names.update(dict([(varname.upper(), True) |
1122
84de51ab40d2
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
Laurent Bessard
parents:
1096
diff
changeset
|
1829 |
for varname in self.GetEditedElementVariables(tagname, debug)])) |
1127
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
1830 |
words = tagname.split("::") |
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1831 |
if words[0] in ["P", "T", "A"]: |
1127
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
1832 |
element = self.GetEditedElement(tagname, debug) |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
1833 |
if element is not None and element.getbodyType() not in ["ST", "IL"]: |
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
1834 |
for instance in element.getinstances(): |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1835 |
if isinstance( |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1836 |
instance, |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1837 |
(PLCOpenParser.GetElementClass("step", "sfcObjects"), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1838 |
PLCOpenParser.GetElementClass("connector", "commonObjects"), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1839 |
PLCOpenParser.GetElementClass("continuation", "commonObjects"))): |
1127
5315f26642e0
Fixed bug when generating new name for configuration and resource variable in VariablePanel
Laurent Bessard
parents:
1122
diff
changeset
|
1840 |
names[instance.getname().upper()] = True |
1968
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1841 |
elif words[0] == 'R': |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1842 |
element = self.GetEditedElement(tagname, debug) |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1843 |
for task in element.gettask(): |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1844 |
names[task.getname().upper()] = True |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1845 |
for instance in task.getpouInstance(): |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1846 |
names[instance.getname().upper()] = True |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1847 |
for instance in element.getpouInstance(): |
64827679f3f1
add fields autocomplete when adding task or instance in resources
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
1848 |
names[instance.getname().upper()] = True |
814 | 1849 |
else: |
1850 |
project = self.GetProject(debug) |
|
1851 |
if project is not None: |
|
1852 |
for datatype in project.getdataTypes(): |
|
1853 |
names[datatype.getname().upper()] = True |
|
1854 |
for pou in project.getpous(): |
|
1855 |
names[pou.getname().upper()] = True |
|
1347
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1856 |
for var in self.GetPouInterfaceVars(pou, debug=debug): |
533741e5075c
Fixed pou variables information loading stylesheet
Laurent Bessard
parents:
1341
diff
changeset
|
1857 |
names[var.Name.upper()] = True |
814 | 1858 |
for transition in pou.gettransitionList(): |
1859 |
names[transition.getname().upper()] = True |
|
1860 |
for action in pou.getactionList(): |
|
1861 |
names[action.getname().upper()] = True |
|
1862 |
for config in project.getconfigurations(): |
|
1863 |
names[config.getname().upper()] = True |
|
1864 |
for resource in config.getresource(): |
|
1865 |
names[resource.getname().upper()] = True |
|
1411 | 1866 |
|
1122
84de51ab40d2
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
Laurent Bessard
parents:
1096
diff
changeset
|
1867 |
i = start_idx |
814 | 1868 |
while name is None or names.get(name.upper(), False): |
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1869 |
name = (format % i) |
814 | 1870 |
i += 1 |
1871 |
return name |
|
1411 | 1872 |
|
814 | 1873 |
def PasteEditedElementInstances(self, tagname, text, new_pos, middle=False, debug=False): |
1874 |
element = self.GetEditedElement(tagname, debug) |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
1875 |
_element_name, element_type = self.GetEditedElementType(tagname, debug) |
814 | 1876 |
if element is not None: |
1877 |
bodytype = element.getbodyType() |
|
1411 | 1878 |
|
814 | 1879 |
# Get edited element type scaling |
1880 |
scaling = None |
|
1881 |
project = self.GetProject(debug) |
|
1882 |
if project is not None: |
|
1883 |
properties = project.getcontentHeader() |
|
1884 |
scaling = properties["scaling"][bodytype] |
|
1411 | 1885 |
|
814 | 1886 |
# Get ids already by all the instances in edited element |
1887 |
used_id = dict([(instance.getlocalId(), True) for instance in element.getinstances()]) |
|
1888 |
new_id = {} |
|
1411 | 1889 |
|
814 | 1890 |
try: |
1505
5ecb16be9a3c
fix copying elements with non-latin content like comment element, or
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1502
diff
changeset
|
1891 |
instances, error = LoadPouInstances(text, bodytype) |
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1779
diff
changeset
|
1892 |
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
|
1893 |
instances, 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
|
1894 |
if error is not None or len(instances) == 0: |
814 | 1895 |
return _("Invalid plcopen element(s)!!!") |
1411 | 1896 |
|
814 | 1897 |
exclude = {} |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1898 |
for instance in instances: |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1899 |
element.addinstance(instance) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1900 |
instance_type = instance.getLocalTag() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1901 |
if instance_type == "block": |
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
1902 |
blocktype = instance.gettypeName() |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
1903 |
blocktype_infos = self.GetBlockType(blocktype) |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1904 |
blockname = instance.getinstanceName() |
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
1905 |
if blocktype_infos["type"] != "function" and blockname is not None: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1906 |
if element_type == "function": |
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1907 |
return _("FunctionBlock \"%s\" can't be pasted in a Function!!!") % blocktype |
1411 | 1908 |
blockname = self.GenerateNewName(tagname, |
1909 |
blockname, |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1910 |
"%s%%d" % blocktype, |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1911 |
debug=debug) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1912 |
exclude[blockname] = True |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1913 |
instance.setinstanceName(blockname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1914 |
self.AddEditedElementPouVar(tagname, blocktype, blockname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1915 |
elif instance_type == "step": |
1411 | 1916 |
stepname = self.GenerateNewName(tagname, |
1917 |
instance.getname(), |
|
1918 |
"Step%d", |
|
1919 |
exclude=exclude, |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1920 |
debug=debug) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1921 |
exclude[stepname] = True |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1922 |
instance.setname(stepname) |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1923 |
localid = instance.getlocalId() |
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
1924 |
if localid not in used_id: |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1925 |
new_id[localid] = True |
1411 | 1926 |
|
814 | 1927 |
idx = 1 |
1928 |
translate_id = {} |
|
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1929 |
bbox = rect() |
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1930 |
for instance in instances: |
814 | 1931 |
localId = instance.getlocalId() |
1932 |
bbox.union(instance.getBoundingBox()) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1762
diff
changeset
|
1933 |
if localId in used_id: |
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1762
diff
changeset
|
1934 |
while (idx in used_id) or (idx in new_id): |
814 | 1935 |
idx += 1 |
1936 |
new_id[idx] = True |
|
1937 |
instance.setlocalId(idx) |
|
1938 |
translate_id[localId] = idx |
|
1411 | 1939 |
|
814 | 1940 |
x, y, width, height = bbox.bounding_box() |
1941 |
if middle: |
|
1942 |
new_pos[0] -= width / 2 |
|
1943 |
new_pos[1] -= height / 2 |
|
1944 |
else: |
|
1945 |
new_pos = map(lambda x: x + 30, new_pos) |
|
1946 |
if scaling[0] != 0 and scaling[1] != 0: |
|
1947 |
min_pos = map(lambda x: 30 / x, scaling) |
|
1948 |
minx = round(min_pos[0]) |
|
1949 |
if int(min_pos[0]) == round(min_pos[0]): |
|
1950 |
minx += 1 |
|
1951 |
miny = round(min_pos[1]) |
|
1952 |
if int(min_pos[1]) == round(min_pos[1]): |
|
1953 |
miny += 1 |
|
1954 |
minx *= scaling[0] |
|
1955 |
miny *= scaling[1] |
|
1956 |
new_pos = (max(minx, round(new_pos[0] / scaling[0]) * scaling[0]), |
|
1957 |
max(miny, round(new_pos[1] / scaling[1]) * scaling[1])) |
|
1958 |
else: |
|
1959 |
new_pos = (max(30, new_pos[0]), max(30, new_pos[1])) |
|
1367
324767a092dc
Fixed bug when pasting element with an odd width or height
Laurent Bessard
parents:
1361
diff
changeset
|
1960 |
diff = (int(new_pos[0] - x), int(new_pos[1] - y)) |
1411 | 1961 |
|
814 | 1962 |
connections = {} |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
1963 |
for instance in instances: |
814 | 1964 |
connections.update(instance.updateConnectionsId(translate_id)) |
1965 |
if getattr(instance, "setexecutionOrderId", None) is not None: |
|
1966 |
instance.setexecutionOrderId(0) |
|
1967 |
instance.translate(*diff) |
|
1411 | 1968 |
|
814 | 1969 |
return new_id, connections |
1411 | 1970 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1971 |
def GetEditedElementInstancesInfos(self, tagname, debug=False): |
1331
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1972 |
element = self.GetEditedElement(tagname, debug) |
38c5de794e62
Added support for speed-up loading of graphic POU tabs
Laurent Bessard
parents:
1330
diff
changeset
|
1973 |
if element is not None: |
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
|
1974 |
return self.BlockInstanceCollector.Collect(element, debug) |
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
|
1975 |
return {} |
1411 | 1976 |
|
814 | 1977 |
def ClearEditedElementExecutionOrder(self, tagname): |
1978 |
element = self.GetEditedElement(tagname) |
|
1979 |
if element is not None: |
|
1980 |
element.resetexecutionOrder() |
|
1411 | 1981 |
|
814 | 1982 |
def ResetEditedElementExecutionOrder(self, tagname): |
1983 |
element = self.GetEditedElement(tagname) |
|
1984 |
if element is not None: |
|
1985 |
element.compileexecutionOrder() |
|
1411 | 1986 |
|
814 | 1987 |
def SetConnectionWires(self, connection, connector): |
1988 |
wires = connector.GetWires() |
|
1989 |
idx = 0 |
|
1990 |
for wire, handle in wires: |
|
1991 |
points = wire.GetPoints(handle != 0) |
|
1992 |
if handle == 0: |
|
1993 |
result = wire.GetConnectedInfos(-1) |
|
1994 |
else: |
|
1995 |
result = wire.GetConnectedInfos(0) |
|
1743
c3c3d1318130
clean-up: fix PEP8 E711 comparison to None should be 'if cond is not None:'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1741
diff
changeset
|
1996 |
if result is not None: |
814 | 1997 |
refLocalId, formalParameter = result |
1998 |
connections = connection.getconnections() |
|
1999 |
if connections is None or len(connection.getconnections()) <= idx: |
|
2000 |
connection.addconnection() |
|
2001 |
connection.setconnectionId(idx, refLocalId) |
|
2002 |
connection.setconnectionPoints(idx, points) |
|
2003 |
if formalParameter != "": |
|
2004 |
connection.setconnectionParameter(idx, formalParameter) |
|
2005 |
else: |
|
2006 |
connection.setconnectionParameter(idx, None) |
|
2007 |
idx += 1 |
|
1411 | 2008 |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2009 |
def GetVarTypeObject(self, var_type): |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2010 |
var_type_obj = PLCOpenParser.CreateElement("type", "variable") |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2011 |
if not var_type.startswith("ANY") and TypeHierarchy.get(var_type): |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2012 |
var_type_obj.setcontent(PLCOpenParser.CreateElement( |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2013 |
var_type.lower() if var_type in ["STRING", "WSTRING"] |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2014 |
else var_type, "dataType")) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2015 |
else: |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2016 |
derived_type = PLCOpenParser.CreateElement("derived", "dataType") |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2017 |
derived_type.setname(var_type) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2018 |
var_type_obj.setcontent(derived_type) |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2019 |
return var_type_obj |
1411 | 2020 |
|
1740
b789b695b5c6
clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
2021 |
def AddEditedElementPouVar(self, tagname, var_type, name, **args): |
814 | 2022 |
if self.Project is not None: |
2023 |
words = tagname.split("::") |
|
2024 |
if words[0] in ['P', 'T', 'A']: |
|
2025 |
pou = self.Project.getpou(words[1]) |
|
2026 |
if pou is not None: |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2027 |
pou.addpouLocalVar( |
1411 | 2028 |
self.GetVarTypeObject(var_type), |
1406
82db84fe88ea
Added 'NamedConstant' drag'n'drop in programs. It does create a simple variable with initial value and is usefull for drag'n'drop constants from extensions while keeping a name associated with constant
Edouard Tisserant
parents:
1390
diff
changeset
|
2029 |
name, **args) |
1411 | 2030 |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2031 |
def AddEditedElementPouExternalVar(self, tagname, var_type, name): |
814 | 2032 |
if self.Project is not None: |
2033 |
words = tagname.split("::") |
|
2034 |
if words[0] in ['P', 'T', 'A']: |
|
2035 |
pou = self.Project.getpou(words[1]) |
|
2036 |
if pou is not None: |
|
1313
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2037 |
pou.addpouExternalVar( |
85c167bfff93
Replaced standard function blocks library definition from dictionary to plcopen xml files
Laurent Bessard
parents:
1311
diff
changeset
|
2038 |
self.GetVarTypeObject(var_type), name) |
1411 | 2039 |
|
814 | 2040 |
def ChangeEditedElementPouVar(self, tagname, old_type, old_name, new_type, new_name): |
2041 |
if self.Project is not None: |
|
2042 |
words = tagname.split("::") |
|
2043 |
if words[0] in ['P', 'T', 'A']: |
|
2044 |
pou = self.Project.getpou(words[1]) |
|
2045 |
if pou is not None: |
|
2046 |
pou.changepouVar(old_type, old_name, new_type, new_name) |
|
1411 | 2047 |
|
814 | 2048 |
def RemoveEditedElementPouVar(self, tagname, type, name): |
2049 |
if self.Project is not None: |
|
2050 |
words = tagname.split("::") |
|
2051 |
if words[0] in ['P', 'T', 'A']: |
|
2052 |
pou = self.Project.getpou(words[1]) |
|
2053 |
if pou is not None: |
|
2054 |
pou.removepouVar(type, name) |
|
1411 | 2055 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
2056 |
def AddEditedElementBlock(self, tagname, id, blocktype, blockname=None): |
814 | 2057 |
element = self.GetEditedElement(tagname) |
2058 |
if element is not None: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
2059 |
block = PLCOpenParser.CreateElement("block", "fbdObjects") |
814 | 2060 |
block.setlocalId(id) |
2061 |
block.settypeName(blocktype) |
|
2062 |
blocktype_infos = self.GetBlockType(blocktype) |
|
2063 |
if blocktype_infos["type"] != "function" and blockname is not None: |
|
2064 |
block.setinstanceName(blockname) |
|
2065 |
self.AddEditedElementPouVar(tagname, blocktype, blockname) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2066 |
element.addinstance(block) |
1411 | 2067 |
|
814 | 2068 |
def SetEditedElementBlockInfos(self, tagname, id, infos): |
2069 |
element = self.GetEditedElement(tagname) |
|
2070 |
if element is not None: |
|
2071 |
block = element.getinstance(id) |
|
2072 |
if block is None: |
|
1411 | 2073 |
return |
814 | 2074 |
old_name = block.getinstanceName() |
2075 |
old_type = block.gettypeName() |
|
2076 |
new_name = infos.get("name", old_name) |
|
2077 |
new_type = infos.get("type", old_type) |
|
2078 |
if new_type != old_type: |
|
2079 |
old_typeinfos = self.GetBlockType(old_type) |
|
2080 |
new_typeinfos = self.GetBlockType(new_type) |
|
2081 |
if old_typeinfos is None or new_typeinfos is None: |
|
2082 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2083 |
elif new_typeinfos["type"] != old_typeinfos["type"]: |
|
2084 |
if new_typeinfos["type"] == "function": |
|
2085 |
self.RemoveEditedElementPouVar(tagname, old_type, old_name) |
|
2086 |
else: |
|
2087 |
self.AddEditedElementPouVar(tagname, new_type, new_name) |
|
2088 |
elif new_typeinfos["type"] != "function": |
|
2089 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2090 |
elif new_name != old_name: |
|
2091 |
self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name) |
|
2092 |
for param, value in infos.items(): |
|
2093 |
if param == "name": |
|
1337
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2094 |
if value != "": |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2095 |
block.setinstanceName(value) |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2096 |
else: |
204ef2daa33c
Fixed bug with Copy/Paste function instance block when previously edited
Laurent Bessard
parents:
1331
diff
changeset
|
2097 |
block.attrib.pop("instanceName", None) |
814 | 2098 |
elif param == "type": |
2099 |
block.settypeName(value) |
|
2100 |
elif param == "executionOrder" and block.getexecutionOrderId() != value: |
|
2101 |
element.setelementExecutionOrder(block, value) |
|
2102 |
elif param == "height": |
|
2103 |
block.setheight(value) |
|
2104 |
elif param == "width": |
|
2105 |
block.setwidth(value) |
|
2106 |
elif param == "x": |
|
2107 |
block.setx(value) |
|
2108 |
elif param == "y": |
|
2109 |
block.sety(value) |
|
2110 |
elif param == "connectors": |
|
2111 |
block.inputVariables.setvariable([]) |
|
2112 |
block.outputVariables.setvariable([]) |
|
2113 |
for connector in value["inputs"]: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2114 |
variable = PLCOpenParser.CreateElement("variable", "inputVariables") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2115 |
block.inputVariables.appendvariable(variable) |
814 | 2116 |
variable.setformalParameter(connector.GetName()) |
2117 |
if connector.IsNegated(): |
|
2118 |
variable.setnegated(True) |
|
2119 |
if connector.GetEdge() != "none": |
|
2120 |
variable.setedge(connector.GetEdge()) |
|
2121 |
position = connector.GetRelPosition() |
|
2122 |
variable.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2123 |
self.SetConnectionWires(variable.connectionPointIn, connector) |
|
2124 |
for connector in value["outputs"]: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2125 |
variable = PLCOpenParser.CreateElement("variable", "outputVariables") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2126 |
block.outputVariables.appendvariable(variable) |
814 | 2127 |
variable.setformalParameter(connector.GetName()) |
2128 |
if connector.IsNegated(): |
|
2129 |
variable.setnegated(True) |
|
2130 |
if connector.GetEdge() != "none": |
|
2131 |
variable.setedge(connector.GetEdge()) |
|
2132 |
position = connector.GetRelPosition() |
|
2133 |
variable.addconnectionPointOut() |
|
2134 |
variable.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2135 |
block.tostring() |
1411 | 2136 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2137 |
def AddEditedElementVariable(self, tagname, id, var_type): |
814 | 2138 |
element = self.GetEditedElement(tagname) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2139 |
if element is not None: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2140 |
variable = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2141 |
{INPUT: "inVariable", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2142 |
OUTPUT: "outVariable", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2143 |
INOUT: "inOutVariable"}[var_type], "fbdObjects") |
814 | 2144 |
variable.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2145 |
element.addinstance(variable) |
1411 | 2146 |
|
814 | 2147 |
def SetEditedElementVariableInfos(self, tagname, id, infos): |
2148 |
element = self.GetEditedElement(tagname) |
|
2149 |
if element is not None: |
|
2150 |
variable = element.getinstance(id) |
|
2151 |
if variable is None: |
|
1411 | 2152 |
return |
814 | 2153 |
for param, value in infos.items(): |
2154 |
if param == "name": |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1321
diff
changeset
|
2155 |
variable.setexpression(value) |
814 | 2156 |
elif param == "executionOrder" and variable.getexecutionOrderId() != value: |
2157 |
element.setelementExecutionOrder(variable, value) |
|
2158 |
elif param == "height": |
|
2159 |
variable.setheight(value) |
|
2160 |
elif param == "width": |
|
2161 |
variable.setwidth(value) |
|
2162 |
elif param == "x": |
|
2163 |
variable.setx(value) |
|
2164 |
elif param == "y": |
|
2165 |
variable.sety(value) |
|
2166 |
elif param == "connectors": |
|
2167 |
if len(value["outputs"]) > 0: |
|
2168 |
output = value["outputs"][0] |
|
2169 |
if len(value["inputs"]) > 0: |
|
2170 |
variable.setnegatedOut(output.IsNegated()) |
|
2171 |
variable.setedgeOut(output.GetEdge()) |
|
2172 |
else: |
|
2173 |
variable.setnegated(output.IsNegated()) |
|
2174 |
variable.setedge(output.GetEdge()) |
|
2175 |
position = output.GetRelPosition() |
|
2176 |
variable.addconnectionPointOut() |
|
2177 |
variable.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2178 |
if len(value["inputs"]) > 0: |
|
2179 |
input = value["inputs"][0] |
|
2180 |
if len(value["outputs"]) > 0: |
|
2181 |
variable.setnegatedIn(input.IsNegated()) |
|
2182 |
variable.setedgeIn(input.GetEdge()) |
|
2183 |
else: |
|
2184 |
variable.setnegated(input.IsNegated()) |
|
2185 |
variable.setedge(input.GetEdge()) |
|
2186 |
position = input.GetRelPosition() |
|
2187 |
variable.addconnectionPointIn() |
|
2188 |
variable.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2189 |
self.SetConnectionWires(variable.connectionPointIn, input) |
|
2190 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2191 |
def AddEditedElementConnection(self, tagname, id, connection_type): |
814 | 2192 |
element = self.GetEditedElement(tagname) |
2193 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2194 |
connection = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2195 |
{CONNECTOR: "connector", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2196 |
CONTINUATION: "continuation"}[connection_type], "commonObjects") |
814 | 2197 |
connection.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2198 |
element.addinstance(connection) |
1411 | 2199 |
|
814 | 2200 |
def SetEditedElementConnectionInfos(self, tagname, id, infos): |
2201 |
element = self.GetEditedElement(tagname) |
|
2202 |
if element is not None: |
|
2203 |
connection = element.getinstance(id) |
|
2204 |
if connection is None: |
|
2205 |
return |
|
2206 |
for param, value in infos.items(): |
|
2207 |
if param == "name": |
|
1411 | 2208 |
connection.setname(value) |
814 | 2209 |
elif param == "height": |
2210 |
connection.setheight(value) |
|
2211 |
elif param == "width": |
|
2212 |
connection.setwidth(value) |
|
2213 |
elif param == "x": |
|
2214 |
connection.setx(value) |
|
2215 |
elif param == "y": |
|
2216 |
connection.sety(value) |
|
2217 |
elif param == "connector": |
|
2218 |
position = value.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2219 |
if isinstance(connection, PLCOpenParser.GetElementClass("continuation", "commonObjects")): |
814 | 2220 |
connection.addconnectionPointOut() |
2221 |
connection.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2222 |
elif isinstance(connection, PLCOpenParser.GetElementClass("connector", "commonObjects")): |
814 | 2223 |
connection.addconnectionPointIn() |
2224 |
connection.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2225 |
self.SetConnectionWires(connection.connectionPointIn, value) |
|
2226 |
||
2227 |
def AddEditedElementComment(self, tagname, id): |
|
2228 |
element = self.GetEditedElement(tagname) |
|
2229 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2230 |
comment = PLCOpenParser.CreateElement("comment", "commonObjects") |
814 | 2231 |
comment.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2232 |
element.addinstance(comment) |
1411 | 2233 |
|
814 | 2234 |
def SetEditedElementCommentInfos(self, tagname, id, infos): |
2235 |
element = self.GetEditedElement(tagname) |
|
2236 |
if element is not None: |
|
2237 |
comment = element.getinstance(id) |
|
2238 |
for param, value in infos.items(): |
|
2239 |
if param == "content": |
|
2240 |
comment.setcontentText(value) |
|
2241 |
elif param == "height": |
|
2242 |
comment.setheight(value) |
|
2243 |
elif param == "width": |
|
2244 |
comment.setwidth(value) |
|
2245 |
elif param == "x": |
|
2246 |
comment.setx(value) |
|
2247 |
elif param == "y": |
|
2248 |
comment.sety(value) |
|
2249 |
||
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2250 |
def AddEditedElementPowerRail(self, tagname, id, powerrail_type): |
814 | 2251 |
element = self.GetEditedElement(tagname) |
2252 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2253 |
powerrail = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2254 |
{LEFTRAIL: "leftPowerRail", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2255 |
RIGHTRAIL: "rightPowerRail"}[powerrail_type], "ldObjects") |
814 | 2256 |
powerrail.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2257 |
element.addinstance(powerrail) |
1411 | 2258 |
|
814 | 2259 |
def SetEditedElementPowerRailInfos(self, tagname, id, infos): |
2260 |
element = self.GetEditedElement(tagname) |
|
2261 |
if element is not None: |
|
2262 |
powerrail = element.getinstance(id) |
|
2263 |
if powerrail is None: |
|
2264 |
return |
|
2265 |
for param, value in infos.items(): |
|
2266 |
if param == "height": |
|
2267 |
powerrail.setheight(value) |
|
2268 |
elif param == "width": |
|
2269 |
powerrail.setwidth(value) |
|
2270 |
elif param == "x": |
|
2271 |
powerrail.setx(value) |
|
2272 |
elif param == "y": |
|
2273 |
powerrail.sety(value) |
|
2274 |
elif param == "connectors": |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2275 |
if isinstance(powerrail, PLCOpenParser.GetElementClass("leftPowerRail", "ldObjects")): |
814 | 2276 |
powerrail.setconnectionPointOut([]) |
2277 |
for connector in value["outputs"]: |
|
2278 |
position = connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2279 |
connection = PLCOpenParser.CreateElement("connectionPointOut", "leftPowerRail") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2280 |
powerrail.appendconnectionPointOut(connection) |
814 | 2281 |
connection.setrelPositionXY(position.x, position.y) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2282 |
elif isinstance(powerrail, PLCOpenParser.GetElementClass("rightPowerRail", "ldObjects")): |
814 | 2283 |
powerrail.setconnectionPointIn([]) |
2284 |
for connector in value["inputs"]: |
|
2285 |
position = connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2286 |
connection = PLCOpenParser.CreateElement("connectionPointIn", "rightPowerRail") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2287 |
powerrail.appendconnectionPointIn(connection) |
814 | 2288 |
connection.setrelPositionXY(position.x, position.y) |
2289 |
self.SetConnectionWires(connection, connector) |
|
1411 | 2290 |
|
814 | 2291 |
def AddEditedElementContact(self, tagname, id): |
2292 |
element = self.GetEditedElement(tagname) |
|
2293 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2294 |
contact = PLCOpenParser.CreateElement("contact", "ldObjects") |
814 | 2295 |
contact.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2296 |
element.addinstance(contact) |
814 | 2297 |
|
2298 |
def SetEditedElementContactInfos(self, tagname, id, infos): |
|
2299 |
element = self.GetEditedElement(tagname) |
|
2300 |
if element is not None: |
|
2301 |
contact = element.getinstance(id) |
|
2302 |
if contact is None: |
|
2303 |
return |
|
2304 |
for param, value in infos.items(): |
|
2305 |
if param == "name": |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1321
diff
changeset
|
2306 |
contact.setvariable(value) |
814 | 2307 |
elif param == "type": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2308 |
negated, edge = { |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2309 |
CONTACT_NORMAL: (False, "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2310 |
CONTACT_REVERSE: (True, "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2311 |
CONTACT_RISING: (False, "rising"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2312 |
CONTACT_FALLING: (False, "falling")}[value] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2313 |
contact.setnegated(negated) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2314 |
contact.setedge(edge) |
814 | 2315 |
elif param == "height": |
2316 |
contact.setheight(value) |
|
2317 |
elif param == "width": |
|
2318 |
contact.setwidth(value) |
|
2319 |
elif param == "x": |
|
2320 |
contact.setx(value) |
|
2321 |
elif param == "y": |
|
2322 |
contact.sety(value) |
|
2323 |
elif param == "connectors": |
|
2324 |
input_connector = value["inputs"][0] |
|
2325 |
position = input_connector.GetRelPosition() |
|
2326 |
contact.addconnectionPointIn() |
|
2327 |
contact.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2328 |
self.SetConnectionWires(contact.connectionPointIn, input_connector) |
|
2329 |
output_connector = value["outputs"][0] |
|
2330 |
position = output_connector.GetRelPosition() |
|
2331 |
contact.addconnectionPointOut() |
|
2332 |
contact.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2333 |
||
2334 |
def AddEditedElementCoil(self, tagname, id): |
|
2335 |
element = self.GetEditedElement(tagname) |
|
2336 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2337 |
coil = PLCOpenParser.CreateElement("coil", "ldObjects") |
814 | 2338 |
coil.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2339 |
element.addinstance(coil) |
814 | 2340 |
|
2341 |
def SetEditedElementCoilInfos(self, tagname, id, infos): |
|
2342 |
element = self.GetEditedElement(tagname) |
|
2343 |
if element is not None: |
|
2344 |
coil = element.getinstance(id) |
|
2345 |
if coil is None: |
|
2346 |
return |
|
2347 |
for param, value in infos.items(): |
|
2348 |
if param == "name": |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1321
diff
changeset
|
2349 |
coil.setvariable(value) |
814 | 2350 |
elif param == "type": |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2351 |
negated, storage, edge = { |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2352 |
COIL_NORMAL: (False, "none", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2353 |
COIL_REVERSE: (True, "none", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2354 |
COIL_SET: (False, "set", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2355 |
COIL_RESET: (False, "reset", "none"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2356 |
COIL_RISING: (False, "none", "rising"), |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2357 |
COIL_FALLING: (False, "none", "falling")}[value] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2358 |
coil.setnegated(negated) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2359 |
coil.setstorage(storage) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2360 |
coil.setedge(edge) |
814 | 2361 |
elif param == "height": |
2362 |
coil.setheight(value) |
|
2363 |
elif param == "width": |
|
2364 |
coil.setwidth(value) |
|
2365 |
elif param == "x": |
|
2366 |
coil.setx(value) |
|
2367 |
elif param == "y": |
|
2368 |
coil.sety(value) |
|
2369 |
elif param == "connectors": |
|
2370 |
input_connector = value["inputs"][0] |
|
2371 |
position = input_connector.GetRelPosition() |
|
2372 |
coil.addconnectionPointIn() |
|
2373 |
coil.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2374 |
self.SetConnectionWires(coil.connectionPointIn, input_connector) |
|
2375 |
output_connector = value["outputs"][0] |
|
2376 |
position = output_connector.GetRelPosition() |
|
2377 |
coil.addconnectionPointOut() |
|
2378 |
coil.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2379 |
||
2380 |
def AddEditedElementStep(self, tagname, id): |
|
2381 |
element = self.GetEditedElement(tagname) |
|
2382 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2383 |
step = PLCOpenParser.CreateElement("step", "sfcObjects") |
814 | 2384 |
step.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2385 |
element.addinstance(step) |
1411 | 2386 |
|
814 | 2387 |
def SetEditedElementStepInfos(self, tagname, id, infos): |
2388 |
element = self.GetEditedElement(tagname) |
|
2389 |
if element is not None: |
|
2390 |
step = element.getinstance(id) |
|
2391 |
if step is None: |
|
2392 |
return |
|
2393 |
for param, value in infos.items(): |
|
2394 |
if param == "name": |
|
2395 |
step.setname(value) |
|
2396 |
elif param == "initial": |
|
2397 |
step.setinitialStep(value) |
|
2398 |
elif param == "height": |
|
2399 |
step.setheight(value) |
|
2400 |
elif param == "width": |
|
2401 |
step.setwidth(value) |
|
2402 |
elif param == "x": |
|
2403 |
step.setx(value) |
|
2404 |
elif param == "y": |
|
2405 |
step.sety(value) |
|
2406 |
elif param == "connectors": |
|
2407 |
if len(value["inputs"]) > 0: |
|
2408 |
input_connector = value["inputs"][0] |
|
2409 |
position = input_connector.GetRelPosition() |
|
2410 |
step.addconnectionPointIn() |
|
2411 |
step.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2412 |
self.SetConnectionWires(step.connectionPointIn, input_connector) |
|
2413 |
else: |
|
2414 |
step.deleteconnectionPointIn() |
|
2415 |
if len(value["outputs"]) > 0: |
|
2416 |
output_connector = value["outputs"][0] |
|
2417 |
position = output_connector.GetRelPosition() |
|
2418 |
step.addconnectionPointOut() |
|
2419 |
step.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2420 |
else: |
|
2421 |
step.deleteconnectionPointOut() |
|
2422 |
elif param == "action": |
|
2423 |
if value: |
|
2424 |
position = value.GetRelPosition() |
|
2425 |
step.addconnectionPointOutAction() |
|
2426 |
step.connectionPointOutAction.setrelPositionXY(position.x, position.y) |
|
2427 |
else: |
|
2428 |
step.deleteconnectionPointOutAction() |
|
1411 | 2429 |
|
814 | 2430 |
def AddEditedElementTransition(self, tagname, id): |
2431 |
element = self.GetEditedElement(tagname) |
|
2432 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2433 |
transition = PLCOpenParser.CreateElement("transition", "sfcObjects") |
814 | 2434 |
transition.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2435 |
element.addinstance(transition) |
1411 | 2436 |
|
814 | 2437 |
def SetEditedElementTransitionInfos(self, tagname, id, infos): |
2438 |
element = self.GetEditedElement(tagname) |
|
2439 |
if element is not None: |
|
2440 |
transition = element.getinstance(id) |
|
2441 |
if transition is None: |
|
2442 |
return |
|
2443 |
for param, value in infos.items(): |
|
2444 |
if param == "type" and value != "connection": |
|
2445 |
transition.setconditionContent(value, infos["condition"]) |
|
2446 |
elif param == "height": |
|
2447 |
transition.setheight(value) |
|
2448 |
elif param == "width": |
|
2449 |
transition.setwidth(value) |
|
2450 |
elif param == "x": |
|
2451 |
transition.setx(value) |
|
2452 |
elif param == "y": |
|
2453 |
transition.sety(value) |
|
2454 |
elif param == "priority": |
|
2455 |
if value != 0: |
|
2456 |
transition.setpriority(value) |
|
2457 |
else: |
|
2458 |
transition.setpriority(None) |
|
2459 |
elif param == "connectors": |
|
2460 |
input_connector = value["inputs"][0] |
|
2461 |
position = input_connector.GetRelPosition() |
|
2462 |
transition.addconnectionPointIn() |
|
2463 |
transition.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2464 |
self.SetConnectionWires(transition.connectionPointIn, input_connector) |
|
2465 |
output_connector = value["outputs"][0] |
|
2466 |
position = output_connector.GetRelPosition() |
|
2467 |
transition.addconnectionPointOut() |
|
2468 |
transition.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2469 |
elif infos.get("type", None) == "connection" and param == "connection" and value: |
|
2470 |
transition.setconditionContent("connection", None) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2471 |
self.SetConnectionWires(transition.condition.content, value) |
1411 | 2472 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2473 |
def AddEditedElementDivergence(self, tagname, id, divergence_type): |
814 | 2474 |
element = self.GetEditedElement(tagname) |
2475 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2476 |
divergence = PLCOpenParser.CreateElement( |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2477 |
{SELECTION_DIVERGENCE: "selectionDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2478 |
SELECTION_CONVERGENCE: "selectionConvergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2479 |
SIMULTANEOUS_DIVERGENCE: "simultaneousDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2480 |
SIMULTANEOUS_CONVERGENCE: "simultaneousConvergence"}.get( |
1878
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1875
diff
changeset
|
2481 |
divergence_type), "sfcObjects") |
814 | 2482 |
divergence.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2483 |
element.addinstance(divergence) |
1411 | 2484 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2485 |
DivergenceTypes = [ |
1411 | 2486 |
(divergence_type, |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2487 |
PLCOpenParser.GetElementClass(divergence_type, "sfcObjects")) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2488 |
for divergence_type in ["selectionDivergence", "simultaneousDivergence", |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2489 |
"selectionConvergence", "simultaneousConvergence"]] |
1411 | 2490 |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2491 |
def GetDivergenceType(self, divergence): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2492 |
for divergence_type, divergence_class in self.DivergenceTypes: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2493 |
if isinstance(divergence, divergence_class): |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2494 |
return divergence_type |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2495 |
return None |
1411 | 2496 |
|
814 | 2497 |
def SetEditedElementDivergenceInfos(self, tagname, id, infos): |
2498 |
element = self.GetEditedElement(tagname) |
|
2499 |
if element is not None: |
|
2500 |
divergence = element.getinstance(id) |
|
2501 |
if divergence is None: |
|
2502 |
return |
|
2503 |
for param, value in infos.items(): |
|
2504 |
if param == "height": |
|
2505 |
divergence.setheight(value) |
|
2506 |
elif param == "width": |
|
2507 |
divergence.setwidth(value) |
|
2508 |
elif param == "x": |
|
2509 |
divergence.setx(value) |
|
2510 |
elif param == "y": |
|
2511 |
divergence.sety(value) |
|
2512 |
elif param == "connectors": |
|
2513 |
input_connectors = value["inputs"] |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2514 |
divergence_type = self.GetDivergenceType(divergence) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2515 |
if divergence_type in ["selectionDivergence", "simultaneousDivergence"]: |
814 | 2516 |
position = input_connectors[0].GetRelPosition() |
2517 |
divergence.addconnectionPointIn() |
|
2518 |
divergence.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2519 |
self.SetConnectionWires(divergence.connectionPointIn, input_connectors[0]) |
|
2520 |
else: |
|
2521 |
divergence.setconnectionPointIn([]) |
|
2522 |
for input_connector in input_connectors: |
|
2523 |
position = input_connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2524 |
connection = PLCOpenParser.CreateElement("connectionPointIn", divergence_type) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2525 |
divergence.appendconnectionPointIn(connection) |
814 | 2526 |
connection.setrelPositionXY(position.x, position.y) |
2527 |
self.SetConnectionWires(connection, input_connector) |
|
2528 |
output_connectors = value["outputs"] |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2529 |
if divergence_type in ["selectionConvergence", "simultaneousConvergence"]: |
814 | 2530 |
position = output_connectors[0].GetRelPosition() |
2531 |
divergence.addconnectionPointOut() |
|
2532 |
divergence.connectionPointOut.setrelPositionXY(position.x, position.y) |
|
2533 |
else: |
|
2534 |
divergence.setconnectionPointOut([]) |
|
2535 |
for output_connector in output_connectors: |
|
2536 |
position = output_connector.GetRelPosition() |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2537 |
connection = PLCOpenParser.CreateElement("connectionPointOut", divergence_type) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2538 |
divergence.appendconnectionPointOut(connection) |
814 | 2539 |
connection.setrelPositionXY(position.x, position.y) |
1411 | 2540 |
|
814 | 2541 |
def AddEditedElementJump(self, tagname, id): |
2542 |
element = self.GetEditedElement(tagname) |
|
2543 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2544 |
jump = PLCOpenParser.CreateElement("jumpStep", "sfcObjects") |
814 | 2545 |
jump.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2546 |
element.addinstance(jump) |
1411 | 2547 |
|
814 | 2548 |
def SetEditedElementJumpInfos(self, tagname, id, infos): |
2549 |
element = self.GetEditedElement(tagname) |
|
2550 |
if element is not None: |
|
2551 |
jump = element.getinstance(id) |
|
2552 |
if jump is None: |
|
2553 |
return |
|
2554 |
for param, value in infos.items(): |
|
2555 |
if param == "target": |
|
2556 |
jump.settargetName(value) |
|
2557 |
elif param == "height": |
|
2558 |
jump.setheight(value) |
|
2559 |
elif param == "width": |
|
2560 |
jump.setwidth(value) |
|
2561 |
elif param == "x": |
|
2562 |
jump.setx(value) |
|
2563 |
elif param == "y": |
|
2564 |
jump.sety(value) |
|
2565 |
elif param == "connector": |
|
2566 |
position = value.GetRelPosition() |
|
2567 |
jump.addconnectionPointIn() |
|
2568 |
jump.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2569 |
self.SetConnectionWires(jump.connectionPointIn, value) |
|
1411 | 2570 |
|
814 | 2571 |
def AddEditedElementActionBlock(self, tagname, id): |
2572 |
element = self.GetEditedElement(tagname) |
|
2573 |
if element is not None: |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2574 |
actionBlock = PLCOpenParser.CreateElement("actionBlock", "commonObjects") |
814 | 2575 |
actionBlock.setlocalId(id) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2576 |
element.addinstance(actionBlock) |
1411 | 2577 |
|
814 | 2578 |
def SetEditedElementActionBlockInfos(self, tagname, id, infos): |
2579 |
element = self.GetEditedElement(tagname) |
|
2580 |
if element is not None: |
|
2581 |
actionBlock = element.getinstance(id) |
|
2582 |
if actionBlock is None: |
|
2583 |
return |
|
2584 |
for param, value in infos.items(): |
|
2585 |
if param == "actions": |
|
2586 |
actionBlock.setactions(value) |
|
2587 |
elif param == "height": |
|
2588 |
actionBlock.setheight(value) |
|
2589 |
elif param == "width": |
|
2590 |
actionBlock.setwidth(value) |
|
2591 |
elif param == "x": |
|
2592 |
actionBlock.setx(value) |
|
2593 |
elif param == "y": |
|
2594 |
actionBlock.sety(value) |
|
2595 |
elif param == "connector": |
|
2596 |
position = value.GetRelPosition() |
|
2597 |
actionBlock.addconnectionPointIn() |
|
2598 |
actionBlock.connectionPointIn.setrelPositionXY(position.x, position.y) |
|
2599 |
self.SetConnectionWires(actionBlock.connectionPointIn, value) |
|
1411 | 2600 |
|
814 | 2601 |
def RemoveEditedElementInstance(self, tagname, id): |
2602 |
element = self.GetEditedElement(tagname) |
|
2603 |
if element is not None: |
|
2604 |
instance = element.getinstance(id) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
2605 |
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")): |
814 | 2606 |
self.RemoveEditedElementPouVar(tagname, instance.gettypeName(), instance.getinstanceName()) |
2607 |
element.removeinstance(id) |
|
2608 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
2609 |
def GetEditedResourceVariables(self, tagname, debug=False): |
814 | 2610 |
varlist = [] |
2611 |
words = tagname.split("::") |
|
2612 |
for var in self.GetConfigurationGlobalVars(words[1], debug): |
|
1361
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
2613 |
if var.Type == "BOOL": |
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
2614 |
varlist.append(var.Name) |
814 | 2615 |
for var in self.GetConfigurationResourceGlobalVars(words[1], words[2], debug): |
1361
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
2616 |
if var.Type == "BOOL": |
7158aa054226
Fixed bugs when editing resource variables and tasks
Laurent Bessard
parents:
1360
diff
changeset
|
2617 |
varlist.append(var.Name) |
814 | 2618 |
return varlist |
2619 |
||
2620 |
def SetEditedResourceInfos(self, tagname, tasks, instances): |
|
2621 |
resource = self.GetEditedElement(tagname) |
|
2622 |
if resource is not None: |
|
2623 |
resource.settask([]) |
|
2624 |
resource.setpouInstance([]) |
|
2625 |
task_list = {} |
|
2626 |
for task in tasks: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2627 |
new_task = PLCOpenParser.CreateElement("task", "resource") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2628 |
resource.appendtask(new_task) |
814 | 2629 |
new_task.setname(task["Name"]) |
2630 |
if task["Triggering"] == "Interrupt": |
|
2631 |
new_task.setsingle(task["Single"]) |
|
1753
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2632 |
# result = duration_model.match(task["Interval"]).groups() |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2633 |
# if reduce(lambda x, y: x or y != None, result): |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2634 |
# values = [] |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2635 |
# for value in result[:-1]: |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2636 |
# if value != None: |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2637 |
# values.append(int(value)) |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2638 |
# else: |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2639 |
# values.append(0) |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2640 |
# if result[-1] is not None: |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2641 |
# values.append(int(float(result[-1]) * 1000)) |
19f19c66b67e
clean-up: fix most PEP8 E266 too many leading '#' for block comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1751
diff
changeset
|
2642 |
# new_task.setinterval(datetime.time(*values)) |
814 | 2643 |
if task["Triggering"] == "Cyclic": |
2644 |
new_task.setinterval(task["Interval"]) |
|
2645 |
new_task.setpriority(int(task["Priority"])) |
|
2646 |
if task["Name"] != "": |
|
2647 |
task_list[task["Name"]] = new_task |
|
2648 |
for instance in instances: |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2649 |
task = task_list.get(instance["Task"]) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2650 |
if task is not None: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2651 |
new_instance = PLCOpenParser.CreateElement("pouInstance", "task") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2652 |
task.appendpouInstance(new_instance) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2653 |
else: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2654 |
new_instance = PLCOpenParser.CreateElement("pouInstance", "resource") |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
2655 |
resource.appendpouInstance(new_instance) |
814 | 2656 |
new_instance.setname(instance["Name"]) |
2657 |
new_instance.settypeName(instance["Type"]) |
|
2658 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
2659 |
def GetEditedResourceInfos(self, tagname, debug=False): |
814 | 2660 |
resource = self.GetEditedElement(tagname, debug) |
2661 |
if resource is not None: |
|
2662 |
tasks = resource.gettask() |
|
2663 |
instances = resource.getpouInstance() |
|
2664 |
tasks_data = [] |
|
2665 |
instances_data = [] |
|
2666 |
for task in tasks: |
|
2667 |
new_task = {} |
|
2668 |
new_task["Name"] = task.getname() |
|
2669 |
single = task.getsingle() |
|
2670 |
if single is not None: |
|
2671 |
new_task["Single"] = single |
|
2672 |
else: |
|
2673 |
new_task["Single"] = "" |
|
2674 |
interval = task.getinterval() |
|
2675 |
if interval is not None: |
|
1779
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2676 |
# text = "" |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2677 |
# if interval.hour != 0: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2678 |
# text += "%dh"%interval.hour |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2679 |
# if interval.minute != 0: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2680 |
# text += "%dm"%interval.minute |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2681 |
# if interval.second != 0: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2682 |
# text += "%ds"%interval.second |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2683 |
# if interval.microsecond != 0: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2684 |
# if interval.microsecond % 1000 != 0: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2685 |
# text += "%.3fms"%(float(interval.microsecond) / 1000) |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2686 |
# else: |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2687 |
# text += "%dms"%(interval.microsecond / 1000) |
6cf16e5bfbf9
clean-up: fix PEP8 E115 expected an indented block (comment)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
2688 |
# new_task["Interval"] = text |
814 | 2689 |
new_task["Interval"] = interval |
2690 |
else: |
|
2691 |
new_task["Interval"] = "" |
|
2692 |
if single is not None and interval is None: |
|
2693 |
new_task["Triggering"] = "Interrupt" |
|
2694 |
elif interval is not None and single is None: |
|
2695 |
new_task["Triggering"] = "Cyclic" |
|
2696 |
else: |
|
2697 |
new_task["Triggering"] = "" |
|
2698 |
new_task["Priority"] = str(task.getpriority()) |
|
2699 |
tasks_data.append(new_task) |
|
2700 |
for instance in task.getpouInstance(): |
|
2701 |
new_instance = {} |
|
2702 |
new_instance["Name"] = instance.getname() |
|
2703 |
new_instance["Type"] = instance.gettypeName() |
|
2704 |
new_instance["Task"] = task.getname() |
|
2705 |
instances_data.append(new_instance) |
|
2706 |
for instance in instances: |
|
2707 |
new_instance = {} |
|
2708 |
new_instance["Name"] = instance.getname() |
|
2709 |
new_instance["Type"] = instance.gettypeName() |
|
2710 |
new_instance["Task"] = "" |
|
2711 |
instances_data.append(new_instance) |
|
2712 |
return tasks_data, instances_data |
|
2713 |
||
2714 |
def OpenXMLFile(self, filepath): |
|
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
|
2715 |
self.Project, error = LoadProject(filepath) |
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
|
2716 |
if self.Project is None: |
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
|
2717 |
return _("Project file syntax error:\n\n") + error |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2718 |
self.SetFilePath(filepath) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2719 |
self.CreateProjectBuffer(True) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2720 |
self.ProgramChunks = [] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2721 |
self.ProgramOffset = 0 |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2722 |
self.NextCompiledProject = self.Copy(self.Project) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2723 |
self.CurrentCompiledProject = None |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2724 |
self.Buffering = False |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2725 |
self.CurrentElementEditing = None |
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
|
2726 |
return error |
1411 | 2727 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
2728 |
def SaveXMLFile(self, filepath=None): |
814 | 2729 |
if not filepath and self.FilePath == "": |
2730 |
return False |
|
2731 |
else: |
|
2732 |
contentheader = {"modificationDateTime": datetime.datetime(*localtime()[:6])} |
|
2733 |
self.Project.setcontentHeader(contentheader) |
|
1411 | 2734 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2735 |
if filepath: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2736 |
SaveProject(self.Project, filepath) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2737 |
else: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1284
diff
changeset
|
2738 |
SaveProject(self.Project, self.FilePath) |
1411 | 2739 |
|
814 | 2740 |
self.MarkProjectAsSaved() |
2741 |
if filepath: |
|
2742 |
self.SetFilePath(filepath) |
|
2743 |
return True |
|
2744 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2745 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2746 |
# Search in Current Project Functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2747 |
# ------------------------------------------------------------------------------- |
814 | 2748 |
|
2749 |
def SearchInProject(self, criteria): |
|
2750 |
return self.Project.Search(criteria) |
|
2751 |
||
2752 |
def SearchInPou(self, tagname, criteria, debug=False): |
|
2753 |
pou = self.GetEditedElement(tagname, debug) |
|
2754 |
if pou is not None: |
|
1619
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2755 |
search_results = pou.Search(criteria, [tagname]) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2756 |
if tagname.split("::")[0] in ['A', 'T']: |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2757 |
parent_pou_tagname = "P::%s" % (tagname.split("::")[-2]) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2758 |
parent_pou = self.GetEditedElement(parent_pou_tagname, debug) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2759 |
for infos, start, end, text in parent_pou.Search(criteria): |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2760 |
if infos[1] in ["var_local", "var_input", "var_output", "var_inout"]: |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2761 |
search_results.append((infos, start, end, text)) |
163d3a883575
fix local search in actions and transitions
Surkov Sergey <surkovsv93@gmail.com>
parents:
1616
diff
changeset
|
2762 |
return search_results |
814 | 2763 |
return [] |
2764 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2765 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2766 |
# Current Buffering Management Functions |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2767 |
# ------------------------------------------------------------------------------- |
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2768 |
|
814 | 2769 |
def Copy(self, model): |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
2770 |
"""Return a copy of the project""" |
1299
9ffc49bfdf9d
Fixed copy/paste with xmlclass refactoring
Laurent Bessard
parents:
1298
diff
changeset
|
2771 |
return deepcopy(model) |
814 | 2772 |
|
2773 |
def CreateProjectBuffer(self, saved): |
|
2774 |
if self.ProjectBufferEnabled: |
|
1304 | 2775 |
self.ProjectBuffer = UndoBuffer(PLCOpenParser.Dumps(self.Project), saved) |
814 | 2776 |
else: |
2777 |
self.ProjectBuffer = None |
|
2778 |
self.ProjectSaved = saved |
|
2779 |
||
2780 |
def IsProjectBufferEnabled(self): |
|
2781 |
return self.ProjectBufferEnabled |
|
2782 |
||
2783 |
def EnableProjectBuffer(self, enable): |
|
2784 |
self.ProjectBufferEnabled = enable |
|
2785 |
if self.Project is not None: |
|
2786 |
if enable: |
|
2787 |
current_saved = self.ProjectSaved |
|
2788 |
else: |
|
2789 |
current_saved = self.ProjectBuffer.IsCurrentSaved() |
|
2790 |
self.CreateProjectBuffer(current_saved) |
|
2791 |
||
2792 |
def BufferProject(self): |
|
2793 |
if self.ProjectBuffer is not None: |
|
1304 | 2794 |
self.ProjectBuffer.Buffering(PLCOpenParser.Dumps(self.Project)) |
814 | 2795 |
else: |
2796 |
self.ProjectSaved = False |
|
2797 |
||
2798 |
def StartBuffering(self): |
|
2799 |
if self.ProjectBuffer is not None: |
|
2800 |
self.Buffering = True |
|
2801 |
else: |
|
2802 |
self.ProjectSaved = False |
|
1411 | 2803 |
|
814 | 2804 |
def EndBuffering(self): |
2805 |
if self.ProjectBuffer is not None and self.Buffering: |
|
1304 | 2806 |
self.ProjectBuffer.Buffering(PLCOpenParser.Dumps(self.Project)) |
814 | 2807 |
self.Buffering = False |
2808 |
||
2809 |
def MarkProjectAsSaved(self): |
|
2810 |
self.EndBuffering() |
|
2811 |
if self.ProjectBuffer is not None: |
|
2812 |
self.ProjectBuffer.CurrentSaved() |
|
2813 |
else: |
|
2814 |
self.ProjectSaved = True |
|
1411 | 2815 |
|
814 | 2816 |
# Return if project is saved |
2817 |
def ProjectIsSaved(self): |
|
2818 |
if self.ProjectBuffer is not None: |
|
2819 |
return self.ProjectBuffer.IsCurrentSaved() and not self.Buffering |
|
2820 |
else: |
|
2821 |
return self.ProjectSaved |
|
2822 |
||
2823 |
def LoadPrevious(self): |
|
2824 |
self.EndBuffering() |
|
2825 |
if self.ProjectBuffer is not None: |
|
1304 | 2826 |
self.Project = PLCOpenParser.Loads(self.ProjectBuffer.Previous()) |
1411 | 2827 |
|
814 | 2828 |
def LoadNext(self): |
2829 |
if self.ProjectBuffer is not None: |
|
1304 | 2830 |
self.Project = PLCOpenParser.Loads(self.ProjectBuffer.Next()) |
1411 | 2831 |
|
814 | 2832 |
def GetBufferState(self): |
2833 |
if self.ProjectBuffer is not None: |
|
2834 |
first = self.ProjectBuffer.IsFirst() and not self.Buffering |
|
2835 |
last = self.ProjectBuffer.IsLast() |
|
2836 |
return not first, not last |
|
2837 |
return False, False |