82 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, MAX_ZOOMIN)] |
82 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, MAX_ZOOMIN)] |
83 |
83 |
84 def GetVariableCreationFunction(variable_type): |
84 def GetVariableCreationFunction(variable_type): |
85 def variableCreationFunction(viewer, id, specific_values): |
85 def variableCreationFunction(viewer, id, specific_values): |
86 return FBD_Variable(viewer, variable_type, |
86 return FBD_Variable(viewer, variable_type, |
87 specific_values["name"], |
87 specific_values.name, |
88 specific_values["value_type"], |
88 specific_values.value_type, |
89 id, |
89 id, |
90 specific_values["executionOrder"]) |
90 specific_values.execution_order) |
91 return variableCreationFunction |
91 return variableCreationFunction |
92 |
92 |
93 def GetConnectorCreationFunction(connector_type): |
93 def GetConnectorCreationFunction(connector_type): |
94 def connectorCreationFunction(viewer, id, specific_values): |
94 def connectorCreationFunction(viewer, id, specific_values): |
95 return FBD_Connector(viewer, connector_type, |
95 return FBD_Connector(viewer, connector_type, |
96 specific_values["name"], id) |
96 specific_values.name, id) |
97 return connectorCreationFunction |
97 return connectorCreationFunction |
98 |
98 |
99 def commentCreationFunction(viewer, id, specific_values): |
99 def commentCreationFunction(viewer, id, specific_values): |
100 return Comment(viewer, specific_values["content"], id) |
100 return Comment(viewer, specific_values.content, id) |
101 |
101 |
102 def GetPowerRailCreationFunction(powerrail_type): |
102 def GetPowerRailCreationFunction(powerrail_type): |
103 def powerRailCreationFunction(viewer, id, specific_values): |
103 def powerRailCreationFunction(viewer, id, specific_values): |
104 return LD_PowerRail(viewer, powerrail_type, id, |
104 return LD_PowerRail(viewer, powerrail_type, id, |
105 specific_values["connectors"]) |
105 specific_values.connectors) |
106 return powerRailCreationFunction |
106 return powerRailCreationFunction |
|
107 |
|
108 MODIFIER_VALUE = lambda x: x if x is not None else 'none' |
107 |
109 |
108 CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE, |
110 CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE, |
109 (False, "rising"): CONTACT_RISING, |
111 (False, "rising"): CONTACT_RISING, |
110 (False, "falling"): CONTACT_FALLING} |
112 (False, "falling"): CONTACT_FALLING} |
111 |
113 |
112 def contactCreationFunction(viewer, id, specific_values): |
114 def contactCreationFunction(viewer, id, specific_values): |
113 contact_type = CONTACT_TYPES.get((specific_values.get("negated", False), |
115 contact_type = CONTACT_TYPES.get((specific_values.negated, |
114 specific_values.get("edge", "none")), |
116 MODIFIER_VALUE(specific_values.edge)), |
115 CONTACT_NORMAL) |
117 CONTACT_NORMAL) |
116 return LD_Contact(viewer, contact_type, specific_values["name"], id) |
118 return LD_Contact(viewer, contact_type, specific_values.name, id) |
117 |
119 |
118 COIL_TYPES = {(True, "none", "none"): COIL_REVERSE, |
120 COIL_TYPES = {(True, "none", "none"): COIL_REVERSE, |
119 (False, "none", "set"): COIL_SET, |
121 (False, "none", "set"): COIL_SET, |
120 (False, "none", "reset"): COIL_RESET, |
122 (False, "none", "reset"): COIL_RESET, |
121 (False, "rising", "none"): COIL_RISING, |
123 (False, "rising", "none"): COIL_RISING, |
122 (False, "falling", "none"): COIL_FALLING} |
124 (False, "falling", "none"): COIL_FALLING} |
123 |
125 |
124 def coilCreationFunction(viewer, id, specific_values): |
126 def coilCreationFunction(viewer, id, specific_values): |
125 coil_type = COIL_TYPES.get((specific_values.get("negated", False), |
127 coil_type = COIL_TYPES.get((specific_values.negated, |
126 specific_values.get("edge", "none"), |
128 MODIFIER_VALUE(specific_values.edge), |
127 specific_values.get("storage", "none")), |
129 MODIFIER_VALUE(specific_values.storage)), |
128 COIL_NORMAL) |
130 COIL_NORMAL) |
129 return LD_Coil(viewer, coil_type, specific_values["name"], id) |
131 return LD_Coil(viewer, coil_type, specific_values.name, id) |
130 |
132 |
131 def stepCreationFunction(viewer, id, specific_values): |
133 def stepCreationFunction(viewer, id, specific_values): |
132 step = SFC_Step(viewer, specific_values["name"], |
134 step = SFC_Step(viewer, specific_values.name, |
133 specific_values.get("initial", False), id) |
135 specific_values.initial, id) |
134 if specific_values.get("action", None): |
136 if specific_values.action is not None: |
135 step.AddAction() |
137 step.AddAction() |
136 connector = step.GetActionConnector() |
138 connector = step.GetActionConnector() |
137 connector.SetPosition(wx.Point(*specific_values["action"]["position"])) |
139 connector.SetPosition(wx.Point(*specific_values.action.position)) |
138 return step |
140 return step |
139 |
141 |
140 def transitionCreationFunction(viewer, id, specific_values): |
142 def transitionCreationFunction(viewer, id, specific_values): |
141 transition = SFC_Transition(viewer, specific_values["condition_type"], |
143 transition = SFC_Transition(viewer, specific_values.condition_type, |
142 specific_values.get("condition", None), |
144 specific_values.condition, |
143 specific_values["priority"], id) |
145 specific_values.priority, id) |
144 return transition |
146 return transition |
145 |
147 |
146 def GetDivergenceCreationFunction(divergence_type): |
148 def GetDivergenceCreationFunction(divergence_type): |
147 def divergenceCreationFunction(viewer, id, specific_values): |
149 def divergenceCreationFunction(viewer, id, specific_values): |
148 return SFC_Divergence(viewer, divergence_type, |
150 return SFC_Divergence(viewer, divergence_type, |
149 specific_values["connectors"], id) |
151 specific_values.connectors, id) |
150 return divergenceCreationFunction |
152 return divergenceCreationFunction |
151 |
153 |
152 def jumpCreationFunction(viewer, id, specific_values): |
154 def jumpCreationFunction(viewer, id, specific_values): |
153 return SFC_Jump(viewer, specific_values["target"], id) |
155 return SFC_Jump(viewer, specific_values.target, id) |
154 |
156 |
155 def actionBlockCreationFunction(viewer, id, specific_values): |
157 def actionBlockCreationFunction(viewer, id, specific_values): |
156 return SFC_ActionBlock(viewer, specific_values["actions"], id) |
158 return SFC_ActionBlock(viewer, specific_values.actions, id) |
157 |
159 |
158 ElementCreationFunctions = { |
160 ElementCreationFunctions = { |
159 "input": GetVariableCreationFunction(INPUT), |
161 "input": GetVariableCreationFunction(INPUT), |
160 "output": GetVariableCreationFunction(OUTPUT), |
162 "output": GetVariableCreationFunction(OUTPUT), |
161 "inout": GetVariableCreationFunction(INOUT), |
163 "inout": GetVariableCreationFunction(INOUT), |
1219 group.AddElement(self.SelectedElement) |
1218 group.AddElement(self.SelectedElement) |
1220 group.AddElement(element) |
1219 group.AddElement(element) |
1221 self.SelectedElement = group |
1220 self.SelectedElement = group |
1222 |
1221 |
1223 # Load instance from given informations |
1222 # Load instance from given informations |
1224 def loadInstance(self, instance, ids, selection): |
1223 def loadInstance(self, instance, remaining_instances, selection): |
1225 self.current_id = max(self.current_id, instance["id"]) |
1224 self.current_id = max(self.current_id, instance.id) |
1226 creation_function = ElementCreationFunctions.get(instance["type"], None) |
1225 creation_function = ElementCreationFunctions.get(instance.type, None) |
1227 connectors = {"inputs" : [], "outputs" : []} |
1226 connectors = {"inputs" : [], "outputs" : []} |
1228 specific_values = instance["specific_values"] |
1227 specific_values = instance.specific_values |
1229 if creation_function is not None: |
1228 if creation_function is not None: |
1230 element = creation_function(self, instance["id"], specific_values) |
1229 element = creation_function(self, instance.id, specific_values) |
1231 if isinstance(element, SFC_Step): |
1230 if isinstance(element, SFC_Step): |
1232 if len(instance["inputs"]) > 0: |
1231 if len(instance.inputs) > 0: |
1233 element.AddInput() |
1232 element.AddInput() |
1234 else: |
1233 else: |
1235 element.RemoveInput() |
1234 element.RemoveInput() |
1236 if len(instance["outputs"]) > 0: |
1235 if len(instance.outputs) > 0: |
1237 element.AddOutput() |
1236 element.AddOutput() |
1238 if isinstance(element, SFC_Transition) and specific_values["condition_type"] == "connection": |
1237 if isinstance(element, SFC_Transition) and specific_values.condition_type == "connection": |
1239 connector = element.GetConditionConnector() |
1238 connector = element.GetConditionConnector() |
1240 self.CreateWires(connector, instance["id"], specific_values["connection"]["links"], ids, selection) |
1239 self.CreateWires(connector, instance.id, specific_values.connection.links, remaining_instances, selection) |
1241 else: |
1240 else: |
1242 executionControl = False |
1241 executionControl = False |
1243 for input in instance["inputs"]: |
1242 for input in instance.inputs: |
1244 if input["negated"]: |
1243 input_edge = MODIFIER_VALUE(input.edge) |
1245 connectors["inputs"].append((input["name"], None, "negated")) |
1244 if input.negated: |
1246 elif input["edge"]: |
1245 connectors["inputs"].append((input.name, None, "negated")) |
1247 connectors["inputs"].append((input["name"], None, input["edge"])) |
1246 elif input_edge: |
|
1247 connectors["inputs"].append((input.name, None, input_edge)) |
1248 else: |
1248 else: |
1249 connectors["inputs"].append((input["name"], None, "none")) |
1249 connectors["inputs"].append((input.name, None, "none")) |
1250 for output in instance["outputs"]: |
1250 for output in instance.outputs: |
1251 if output["negated"]: |
1251 output_edge = MODIFIER_VALUE(output.edge) |
1252 connectors["outputs"].append((output["name"], None, "negated")) |
1252 if output.negated: |
1253 elif output["edge"]: |
1253 connectors["outputs"].append((output.name, None, "negated")) |
1254 connectors["outputs"].append((output["name"], None, output["edge"])) |
1254 elif output_edge: |
|
1255 connectors["outputs"].append((output.name, None, output_edge)) |
1255 else: |
1256 else: |
1256 connectors["outputs"].append((output["name"], None, "none")) |
1257 connectors["outputs"].append((output.name, None, "none")) |
1257 if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN": |
1258 if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN": |
1258 connectors["inputs"].pop(0) |
1259 connectors["inputs"].pop(0) |
1259 executionControl = True |
1260 executionControl = True |
1260 if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO": |
1261 if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO": |
1261 connectors["outputs"].pop(0) |
1262 connectors["outputs"].pop(0) |
1262 executionControl = True |
1263 executionControl = True |
1263 if specific_values["name"] is None: |
1264 block_name = specific_values.name if specific_values.name is not None else "" |
1264 specific_values["name"] = "" |
1265 element = FBD_Block(self, instance.type, block_name, |
1265 element = FBD_Block(self, instance["type"], specific_values["name"], |
1266 instance.id, len(connectors["inputs"]), |
1266 instance["id"], len(connectors["inputs"]), |
|
1267 connectors=connectors, executionControl=executionControl, |
1267 connectors=connectors, executionControl=executionControl, |
1268 executionOrder=specific_values["executionOrder"]) |
1268 executionOrder=specific_values.execution_order) |
1269 if isinstance(element, Comment): |
1269 if isinstance(element, Comment): |
1270 self.AddComment(element) |
1270 self.AddComment(element) |
1271 else: |
1271 else: |
1272 self.AddBlock(element) |
1272 self.AddBlock(element) |
1273 connectors = element.GetConnectors() |
1273 connectors = element.GetConnectors() |
1274 element.SetPosition(instance["x"], instance["y"]) |
1274 element.SetPosition(instance.x, instance.y) |
1275 element.SetSize(instance["width"], instance["height"]) |
1275 element.SetSize(instance.width, instance.height) |
1276 for i, output_connector in enumerate(instance["outputs"]): |
1276 for i, output_connector in enumerate(instance.outputs): |
|
1277 connector_pos = wx.Point(*output_connector.position) |
1277 if isinstance(element, FBD_Block): |
1278 if isinstance(element, FBD_Block): |
1278 connector = element.GetConnector( |
1279 connector = element.GetConnector(connector_pos, |
1279 wx.Point(*output_connector["position"]), |
1280 output_name = output_connector.name) |
1280 output_name = output_connector["name"]) |
|
1281 elif i < len(connectors["outputs"]): |
1281 elif i < len(connectors["outputs"]): |
1282 connector = connectors["outputs"][i] |
1282 connector = connectors["outputs"][i] |
1283 else: |
1283 else: |
1284 connector = None |
1284 connector = None |
1285 if connector is not None: |
1285 if connector is not None: |
1286 if output_connector.get("negated", False): |
1286 if output_connector.negated: |
1287 connector.SetNegated(True) |
1287 connector.SetNegated(True) |
1288 if output_connector.get("edge", "none") != "none": |
1288 if output_connector.edge is not None: |
1289 connector.SetEdge(output_connector["edge"]) |
1289 connector.SetEdge(output_connector.edge) |
1290 if connectors["outputs"].index(connector) == i: |
1290 if connectors["outputs"].index(connector) == i: |
1291 connector.SetPosition(wx.Point(*output_connector["position"])) |
1291 connector.SetPosition(connector_pos) |
1292 for i, input_connector in enumerate(instance["inputs"]): |
1292 for i, input_connector in enumerate(instance.inputs): |
|
1293 connector_pos = wx.Point(*input_connector.position) |
1293 if isinstance(element, FBD_Block): |
1294 if isinstance(element, FBD_Block): |
1294 connector = element.GetConnector( |
1295 connector = element.GetConnector(connector_pos, |
1295 wx.Point(*input_connector["position"]), |
1296 input_name = input_connector.name) |
1296 input_name = input_connector["name"]) |
|
1297 elif i < len(connectors["inputs"]): |
1297 elif i < len(connectors["inputs"]): |
1298 connector = connectors["inputs"][i] |
1298 connector = connectors["inputs"][i] |
1299 else: |
1299 else: |
1300 connector = None |
1300 connector = None |
1301 if connector is not None: |
1301 if connector is not None: |
1302 if connectors["inputs"].index(connector) == i: |
1302 if connectors["inputs"].index(connector) == i: |
1303 connector.SetPosition(wx.Point(*input_connector["position"])) |
1303 connector.SetPosition(connector_pos) |
1304 if input_connector.get("negated", False): |
1304 if input_connector.negated: |
1305 connector.SetNegated(True) |
1305 connector.SetNegated(True) |
1306 if input_connector.get("edge", "none") != "none": |
1306 if input_connector.edge is not None: |
1307 connector.SetEdge(input_connector["edge"]) |
1307 connector.SetEdge(input_connector.edge) |
1308 if not self.CreateWires(connector, instance["id"], input_connector["links"], ids, selection): |
1308 if not self.CreateWires(connector, instance.id, input_connector.links, remaining_instances, selection): |
1309 element.RefreshModel() |
1309 element.RefreshModel() |
1310 element.RefreshConnectors() |
1310 element.RefreshConnectors() |
1311 if selection is not None and selection[0].get(instance["id"], False): |
1311 if selection is not None and selection[0].get(instance.id, False): |
1312 self.SelectInGroup(element) |
1312 self.SelectInGroup(element) |
1313 |
1313 |
1314 def CreateWires(self, start_connector, id, links, ids, selection=None): |
1314 def CreateWires(self, start_connector, id, links, remaining_instances, selection=None): |
1315 links_connected = True |
1315 links_connected = True |
1316 for link in links: |
1316 for link in links: |
1317 refLocalId = link["refLocalId"] |
1317 refLocalId = link.refLocalId |
1318 if refLocalId is None: |
1318 if refLocalId is None: |
1319 links_connected = False |
1319 links_connected = False |
1320 continue |
1320 continue |
1321 |
1321 |
1322 if ids.pop(refLocalId, False): |
1322 new_instance = remaining_instances.pop(refLocalId, None) |
1323 new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug) |
1323 if new_instance is not None: |
1324 if new_instance is not None: |
1324 self.loadInstance(new_instance, remaining_instances, selection) |
1325 self.loadInstance(new_instance, ids, selection) |
|
1326 |
1325 |
1327 connected = self.FindElementById(refLocalId) |
1326 connected = self.FindElementById(refLocalId) |
1328 if connected is None: |
1327 if connected is None: |
1329 links_connected = False |
1328 links_connected = False |
1330 continue |
1329 continue |
1331 |
1330 |
1332 points = link["points"] |
1331 points = link.points |
1333 end_connector = connected.GetConnector( |
1332 end_connector = connected.GetConnector( |
1334 wx.Point(points[-1][0], points[-1][1]) |
1333 wx.Point(points[-1].x, points[-1].y) |
1335 if len(points) > 0 else wx.Point(0, 0), |
1334 if len(points) > 0 else wx.Point(0, 0), |
1336 link["formalParameter"]) |
1335 link.formalParameter) |
1337 if end_connector is not None: |
1336 if end_connector is not None: |
1338 if len(points) > 0: |
1337 if len(points) > 0: |
1339 wire = Wire(self) |
1338 wire = Wire(self) |
1340 wire.SetPoints(points) |
1339 wire.SetPoints(points) |
1341 else: |
1340 else: |