--- a/LDViewer.py Tue Apr 10 18:02:40 2007 +0200
+++ b/LDViewer.py Wed Apr 11 17:26:07 2007 +0200
@@ -562,8 +562,6 @@
elif self.SelectedElement not in self.Elements:
elements = self.SelectedElement.GetElements()
for element in elements:
- if isinstance(element, (LD_PowerRail, LD_Coil)):
- return
blocks.append(element)
if len(blocks) > 0:
blocks_infos = []
@@ -861,27 +859,77 @@
self.RefreshRungs(new_bbox.height - old_bbox.height, rungindex + 1)
self.SelectedElement = None
+ def RecursiveDeletion(self, element, rung):
+ connectors = element.GetConnectors()
+ input_wires = [wire for wire, handle in connectors["input"].GetWires()]
+ left_elements = [wire.EndConnected for wire in input_wires]
+ rung.SelectElement(element)
+ element.Clean()
+ for wire in input_wires:
+ wire.Clean()
+ self.Wires.remove(wire)
+ self.Elements.remove(wire)
+ rung.SelectElement(wire)
+ self.Blocks.remove(element)
+ self.Elements.remove(element)
+ self.Controler.RemoveCurrentElementEditingInstance(element.GetId())
+ for left_element in left_elements:
+ block = left_element.GetParentBlock()
+ if len(left_element.GetWires()) == 0:
+ self.RecursiveDeletion(block, rung)
+ else:
+ self.RefreshPosition(block)
+
def DeleteCoil(self, coil):
rungindex = self.FindRung(coil)
rung = self.Rungs[rungindex]
- bbox = rung.GetBoundingBox()
+ old_bbox = rung.GetBoundingBox()
+ nbcoils = 0
for element in rung.GetElements():
- if element in self.Wires:
- element.Clean()
- self.Wires.remove(element)
- self.Elements.remove(element)
- for element in rung.GetElements():
- if element in self.Blocks:
- self.Controler.RemoveCurrentElementEditingInstance(element.GetId())
- self.Blocks.remove(element)
- self.Elements.remove(element)
- self.Controler.RemoveCurrentElementEditingInstance(self.Comments[rungindex].GetId())
- self.Elements.remove(self.Comments[rungindex])
- self.Comments.pop(rungindex)
- self.Rungs.pop(rungindex)
- if rungindex < len(self.Rungs):
- next_bbox = self.Rungs[rungindex].GetBoundingBox()
- self.RefreshRungs(bbox.y - next_bbox.y, rungindex)
+ if isinstance(element, LD_Coil):
+ nbcoils += 1
+ if nbcoils > 1:
+ connectors = coil.GetConnectors()
+ output_wires = [wire for wire, handle in connectors["output"].GetWires()]
+ right_elements = [wire.StartConnected for wire in output_wires]
+ for wire in output_wires:
+ wire.Clean()
+ self.Wires.remove(wire)
+ self.Elements.remove(wire)
+ rung.SelectElement(wire)
+ for right_element in right_elements:
+ right_block = right_element.GetParentBlock()
+ if isinstance(right_block, LD_PowerRail):
+ if len(right_element.GetWires()) == 0:
+ index = right_block.GetConnectorIndex(right_element)
+ right_block.DeleteConnector(index)
+ powerrail_connectors = right_block.GetConnectors()
+ for connector in powerrail_connectors:
+ for wire, handle in connector.GetWires():
+ block = wire.EndConnected.GetParentBlock()
+ endpoint = wire.EndConnected.GetPosition(False)
+ startpoint = connector.GetPosition(False)
+ block.Move(0, startpoint.y - endpoint.y)
+ self.RefreshPosition(block)
+ self.RecursiveDeletion(coil, rung)
+ else:
+ for element in rung.GetElements():
+ if element in self.Wires:
+ element.Clean()
+ self.Wires.remove(element)
+ self.Elements.remove(element)
+ for element in rung.GetElements():
+ if element in self.Blocks:
+ self.Controler.RemoveCurrentElementEditingInstance(element.GetId())
+ self.Blocks.remove(element)
+ self.Elements.remove(element)
+ self.Controler.RemoveCurrentElementEditingInstance(self.Comments[rungindex].GetId())
+ self.Elements.remove(self.Comments[rungindex])
+ self.Comments.pop(rungindex)
+ self.Rungs.pop(rungindex)
+ if rungindex < len(self.Rungs):
+ next_bbox = self.Rungs[rungindex].GetBoundingBox()
+ self.RefreshRungs(old_bbox.y - next_bbox.y, rungindex)
self.SelectedElement = None
def DeleteWire(self, wire):
@@ -940,7 +988,7 @@
# Refresh element position functions
#-------------------------------------------------------------------------------
- def RefreshPosition(self, element):
+ def RefreshPosition(self, element, recursive=True):
if isinstance(element, LD_PowerRail) and element.GetType() == LEFTRAIL:
element.RefreshModel()
return
@@ -949,6 +997,10 @@
output_connectors = []
if isinstance(element, LD_PowerRail) and element.GetType() == RIGHTRAIL:
input_connectors = connectors
+ for i, connector in enumerate(input_connectors):
+ for j, (wire, handle) in enumerate(connector.GetWires()):
+ block = wire.EndConnected.GetParentBlock()
+ self.RefreshPosition(block, False)
else:
if "inputs" in connectors:
input_connectors = connectors["inputs"]
@@ -977,6 +1029,7 @@
interval += LD_WIRE_SIZE
movex = minx + interval - position[0]
element.Move(movex, 0)
+ position = element.GetPosition()
for i, connector in enumerate(input_connectors):
startpoint = connector.GetPosition(False)
previous_blocks = []
@@ -986,6 +1039,11 @@
middlepoint = minx + LD_WIRE_SIZE
for j, (wire, handle) in enumerate(connector.GetWires()):
block = wire.EndConnected.GetParentBlock()
+ if isinstance(element, LD_PowerRail):
+ pos = block.GetPosition()
+ size = leftblock.GetSize()
+ movex = position[0] - LD_WIRE_SIZE - size[0] - pos[0]
+ block.Move(movex, 0)
endpoint = wire.EndConnected.GetPosition(False)
if j == 0:
if not onlyone[i] and wire.EndConnected.GetWireIndex(wire) > 0:
@@ -1002,7 +1060,14 @@
wxPoint(endmiddlepoint, endpoint.y), endpoint]
else:
if startpoint.y + offset != endpoint.y:
- if isinstance(block, LD_PowerRail):
+ if isinstance(element, LD_PowerRail):
+ diff = (startpoint.y - endpoint.y) / LD_LINE_SIZE
+ for k in xrange(abs(diff)):
+ if diff < 0:
+ element.DeleteConnector(i - 1 - k)
+ else:
+ element.InsertConnector(i + k, False)
+ elif isinstance(block, LD_PowerRail):
index = block.GetConnectorIndex(wire.EndConnected)
if index:
diff = (startpoint.y - endpoint.y) / LD_LINE_SIZE
@@ -1013,7 +1078,7 @@
block.InsertConnector(index + k, False)
else:
block.Move(0, startpoint.y + offset - endpoint.y)
- self.RefreshPosition(block)
+ self.RefreshPosition(block, False)
endpoint = wire.EndConnected.GetPosition(False)
if not onlyone[i]:
points = [startpoint, wxPoint(middlepoint, startpoint.y),
@@ -1024,9 +1089,10 @@
previous_blocks.append(block)
ExtractNextBlocks(block, block_list)
element.RefreshModel(False)
- for connector in output_connectors:
- for wire, handle in connector.GetWires():
- self.RefreshPosition(wire.StartConnected.GetParentBlock())
+ if recursive:
+ for connector in output_connectors:
+ for wire, handle in connector.GetWires():
+ self.RefreshPosition(wire.StartConnected.GetParentBlock())
def RefreshRungs(self, movey, fromidx):
if movey != 0: