LDViewer.py
changeset 42 4a8400732001
parent 28 fc23e1f415d8
child 45 42637f721b5b
--- a/LDViewer.py	Tue Jul 17 12:25:50 2007 +0200
+++ b/LDViewer.py	Wed Jul 18 11:51:30 2007 +0200
@@ -173,7 +173,7 @@
     def __init__(self, parent, window, controler):
         Viewer.__init__(self, parent, window, controler)
         self.Rungs = []
-        self.Comments = []
+        self.RungComments = []
 
 #-------------------------------------------------------------------------------
 #                          Refresh functions
@@ -183,12 +183,12 @@
         Viewer.RefreshView(self)
         for i, rung in enumerate(self.Rungs):
             bbox = rung.GetBoundingBox()
-            if i < len(self.Comments):
-                pos = self.Comments[i].GetPosition()
+            if i < len(self.RungComments):
+                pos = self.RungComments[i].GetPosition()
                 if pos[1] > bbox.y:
-                    self.Comment.insert(i, None)
+                    self.RungComments.insert(i, None)
             else:
-                self.Comment.insert(i, None)
+                self.RungComments.insert(i, None)
     
     def loadInstance(self, instance, ids):
         Viewer.loadInstance(self, instance, ids)
@@ -232,14 +232,14 @@
             pos = element.GetPosition()
             i = 0
             inserted = False
-            while i < len(self.Comments) and not inserted: 
-                ipos = self.Comments[i].GetPosition()
+            while i < len(self.RungComments) and not inserted: 
+                ipos = self.RungComments[i].GetPosition()
                 if pos[1] < ipos[1]:
-                    self.Comments.insert(i, element)
+                    self.RungComments.insert(i, element)
                     inserted = True
                 i += 1
             if not inserted:
-                self.Comments.append(element)
+                self.RungComments.append(element)
 
 #-------------------------------------------------------------------------------
 #                          Search Element functions
@@ -256,7 +256,7 @@
             return Viewer.FindElement(self, pos)
         
         elements = []
-        for element in self.Elements:
+        for element in self.GetElements(sort_wires=True):
             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
                 elements.append(element)
         if len(elements) == 1:
@@ -264,7 +264,7 @@
         elif len(elements) > 1:
             group = Graphic_Group(self)
             for element in elements:
-                if element in self.Blocks:
+                if self.IsBlock(element):
                     return element
                 group.SelectElement(element)
             return group
@@ -276,8 +276,7 @@
         
         elements = []
         for element in self.Blocks:
-            element_bbox = element.GetBoundingBox()
-            if element_bbox.x >= bbox.x and element_bbox.y >= bbox.y and element_bbox.x + element_bbox.width <= bbox.x + bbox.width and element_bbox.y + element_bbox.height <= bbox.y + bbox.height:
+            if element.IsInSelection(bbox):
                 elements.append(element)
         return elements
 
@@ -293,24 +292,24 @@
             pos = event.GetLogicalPosition(dc)
             element = self.FindElement(pos)
             if self.SelectedElement:
-                if self.SelectedElement in self.Elements:
+                if not isinstance(self.SelectedElement, Graphic_Group):
                     if self.SelectedElement != element:
-                        if self.SelectedElement in self.Wires:
+                        if self.IsWire(self.SelectedElement):
                             self.SelectedElement.SetSelectedSegment(None)
                         else:
                             self.SelectedElement.SetSelected(False)
                     else:
                         self.SelectedElement = None
-                elif element and element not in self.Elements:
+                elif element and isinstance(element, Graphic_Group):
                     if self.SelectedElement.GetElements() != element.GetElements():
                         for elt in self.SelectedElement.GetElements():
-                            if elt in self.Wires:
+                            if self.IsWire(elt):
                                 elt.SetSelectedSegment(None)
                         self.SelectedElement.SetSelected(False)
                         self.SelectedElement = None
                 else:
                     for elt in self.SelectedElement.GetElements():
-                        if elt in self.Wires:
+                        if self.IsWire(elt):
                             elt.SetSelectedSegment(None)
                     self.SelectedElement.SetSelected(False)
                     self.SelectedElement = None
@@ -338,8 +337,8 @@
                     self.Refresh()
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
             dc = self.GetLogicalDC() 
-            if self.SelectedElement in self.Elements:
-                if self.SelectedElement in self.Wires:
+            if not isinstance(self.SelectedElement, Graphic_Group):
+                if self.IsWire(self.SelectedElement):
                     result = self.SelectedElement.TestSegment(event.GetLogicalPosition(dc), True)
                     if result and result[1] in [EAST, WEST]:
                         self.SelectedElement.SetSelectedSegment(result[0])
@@ -347,7 +346,7 @@
                     self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
             else:
                 for element in self.SelectedElement.GetElements():
-                    if element in self.Wires:
+                    if self.IsWire(element):
                         result = element.TestSegment(event.GetLogicalPosition(dc), True)
                         if result and result[1] in [EAST, WEST]:
                             element.SetSelectedSegment(result[0])
@@ -369,7 +368,7 @@
                 if self.SelectedElement and self.SelectedElement != element:
                     self.SelectedElement.SetSelected(False)
                 self.SelectedElement = element
-                if self.SelectedElement in self.Wires:
+                if self.IsWire(self.SelectedElement):
                     self.SelectedElement.SetSelectedSegment(0)
                 else:
                     self.SelectedElement.SetSelected(True)
@@ -390,6 +389,8 @@
     def OnViewerMotion(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.OnViewerMotion(self, event)
+        elif self.rubberBand.IsShown():
+            self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
         event.Skip()
 
 #-------------------------------------------------------------------------------
@@ -402,14 +403,14 @@
         else:
             keycode = event.GetKeyCode()
             if keycode == WXK_DELETE and self.SelectedElement:
-                if self.SelectedElement in self.Blocks:
+                if self.IsBlock(self.SelectedElement):
                     self.SelectedElement.Delete()
-                elif self.SelectedElement in self.Wires:
+                elif self.IsWire(self.SelectedElement):
                     self.DeleteWire(self.SelectedElement)
-                elif self.SelectedElement not in self.Elements:
+                elif isinstance(self.SelectedElement, Graphic_Group):
                     all_wires = True
                     for element in self.SelectedElement.GetElements():
-                        all_wires &= element in self.Wires
+                        all_wires &= self.IsWire(element)
                     if all_wires:
                         self.DeleteWire(self.SelectedElement)
                     else:
@@ -421,7 +422,7 @@
 #                          Adding element functions
 #-------------------------------------------------------------------------------
 
-    def AddRung(self):
+    def AddLadderRung(self):
         dialog = LDElementDialog(self.Parent, "coil")
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
@@ -447,8 +448,8 @@
             comment = Comment(self, "Commentaire", id)
             comment.SetPosition(startx, starty)
             comment.SetSize(LD_COMMENT_DEFAULTSIZE[0], LD_COMMENT_DEFAULTSIZE[1])
-            self.Elements.append(comment)
-            self.Comments.append(comment)
+            self.AddComment(comment)
+            self.RungComments.append(comment)
             self.Controler.AddCurrentElementEditingComment(id)
             self.RefreshCommentModel(comment)
             starty += LD_COMMENT_DEFAULTSIZE[1] + LD_OFFSET[1]
@@ -456,8 +457,7 @@
             id = self.GetNewId()
             leftpowerrail = LD_PowerRail(self, LEFTRAIL, id)
             leftpowerrail.SetPosition(startx, starty)
-            self.Elements.append(leftpowerrail)
-            self.Blocks.append(leftpowerrail)
+            self.AddBlock(leftpowerrail)
             rung.SelectElement(leftpowerrail)
             self.Controler.AddCurrentElementEditingPowerRail(id, LEFTRAIL)
             self.RefreshPowerRailModel(leftpowerrail)
@@ -465,8 +465,7 @@
             id = self.GetNewId()
             coil = LD_Coil(self, values["type"], values["name"], id)
             coil.SetPosition(startx, starty + (LD_LINE_SIZE - LD_ELEMENT_SIZE[1]) / 2)
-            self.Elements.append(coil)
-            self.Blocks.append(coil)
+            self.AddBlock(coil)
             rung.SelectElement(coil)
             self.Controler.AddCurrentElementEditingCoil(id)
             # Create Wire between LeftPowerRail and Coil
@@ -477,15 +476,13 @@
             end_connector.Connect((wire, -1), False)
             wire.ConnectStartPoint(None, start_connector)
             wire.ConnectEndPoint(None, end_connector)
-            self.Wires.append(wire)
-            self.Elements.append(wire)
+            self.AddWires(wire)
             rung.SelectElement(wire)
             # Create RightPowerRail
             id = self.GetNewId()
             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, id)
             rightpowerrail.SetPosition(startx, starty)
-            self.Elements.append(rightpowerrail)
-            self.Blocks.append(rightpowerrail)
+            self.AddBlock(rightpowerrail)
             rung.SelectElement(rightpowerrail)
             self.Controler.AddCurrentElementEditingPowerRail(id, RIGHTRAIL)
             # Create Wire between LeftPowerRail and Coil
@@ -496,21 +493,20 @@
             end_connector.Connect((wire, -1), False)
             wire.ConnectStartPoint(None, start_connector)
             wire.ConnectEndPoint(None, end_connector)
-            self.Wires.append(wire)
-            self.Elements.append(wire)
+            self.AddWires(wire)
             rung.SelectElement(wire)
             self.RefreshPosition(coil)
             self.Rungs.append(rung)
             self.Refresh()
 
-    def AddContact(self):
+    def AddLadderContact(self):
         wires = []
-        if self.SelectedElement in self.Wires:
+        if self.IsWire(self.SelectedElement):
             left_element = self.SelectedElement.EndConnected
             if not isinstance(left_element.GetParentBlock(), LD_Coil):
                 wires.append(self.SelectedElement)
-        elif self.SelectedElement and self.SelectedElement not in self.Elements:
-            if False not in [element in self.Wires for element in self.SelectedElement.GetElements()]:
+        elif self.SelectedElement and isinstance(self.SelectedElement,Graphic_Group):
+            if False not in [self.IsWire(element) for element in self.SelectedElement.GetElements()]:
                 for element in self.SelectedElement.GetElements():
                     wires.append(element)
         if len(wires) > 0:
@@ -529,8 +525,7 @@
                 id = self.GetNewId()
                 contact = LD_Contact(self, values["type"], values["name"], id)
                 contact.SetPosition(0, points[0].y - (LD_ELEMENT_SIZE[1] + 1) / 2)
-                self.Elements.append(contact)
-                self.Blocks.append(contact)
+                self.AddBlock(contact)
                 self.Controler.AddCurrentElementEditingContact(id)
                 rungindex = self.FindRung(wires[0])
                 rung = self.Rungs[rungindex]
@@ -557,8 +552,7 @@
                     wire.SetSelectedSegment(None)
                     wire.Clean()
                     rung.SelectElement(wire)
-                    self.Wires.remove(wire)
-                    self.Elements.remove(wire)
+                    self.RemoveWire(wire)
                 wires = []
                 right_wires = []
                 for i, left_element in enumerate(left_elements):
@@ -578,8 +572,7 @@
                     wire.ConnectEndPoint(None, connectors["output"])
                 right_wires.reverse()
                 for wire in wires:
-                    self.Wires.append(wire)
-                    self.Elements.append(wire)
+                    self.AddWire(wire)
                     rung.SelectElement(wire)
                 self.RefreshPosition(contact)
                 if len(right_wires) > 1:
@@ -601,11 +594,11 @@
             message.ShowModal()
             message.Destroy()
 
-    def AddBranch(self):
+    def AddLadderBranch(self):
         blocks = []
-        if self.SelectedElement in self.Blocks:
+        if self.IsBlock(self.SelectedElement):
             blocks = [self.SelectedElement]
-        elif self.SelectedElement not in self.Elements:
+        elif isinstance(self.SelectedElement, Graphic_Group):
             elements = self.SelectedElement.GetElements()
             for element in elements:
                 blocks.append(element)
@@ -764,8 +757,7 @@
                             coil = LD_Coil(self, values["type"], values["name"], id)
                             pos = blocks[0].GetPosition()
                             coil.SetPosition(pos[0], pos[1] + LD_LINE_SIZE)
-                            self.Elements.append(coil)
-                            self.Blocks.append(coil)
+                            self.AddBlock(coil)
                             rung.SelectElement(coil)
                             self.Controler.AddCurrentElementEditingCoil(id)
                             coil_connectors = coil.GetConnectors()
@@ -775,8 +767,7 @@
                             coil_connectors["output"].Connect((wire, -1), False)
                             wire.ConnectStartPoint(None, connectors[index + 1])
                             wire.ConnectEndPoint(None, coil_connectors["output"])
-                            self.Wires.append(wire)
-                            self.Elements.append(wire)
+                            self.AddWire(wire)
                             rung.SelectElement(wire)
                             left_elements.reverse()
                             for i, left_element in enumerate(left_elements):
@@ -805,8 +796,7 @@
                                     new_wire.ConnectEndPoint(None, left_element)
                     wires.reverse()
                     for wire in wires:
-                        self.Wires.append(wire)
-                        self.Elements.append(wire)
+                        self.AddWire(wire)
                         rung.SelectElement(wire)
                     right_elements.reverse()
                 for block in blocks:
@@ -827,7 +817,7 @@
             message.ShowModal()
             message.Destroy()
 
-    def AddBlock(self):
+    def AddLadderBlock(self):
         message = wxMessageDialog(self, "This option isn't available yet!", "Warning", wxOK|wxICON_EXCLAMATION)
         message.ShowModal()
         message.Destroy()
@@ -851,13 +841,11 @@
             for wire in input_wires:
                 wire.Clean()
                 rung.SelectElement(wire)
-                self.Wires.remove(wire)
-                self.Elements.remove(wire)
+                self.RemoveWire(wire)
             for wire in output_wires:
                 wire.Clean()
                 rung.SelectElement(wire)
-                self.Wires.remove(wire)
-                self.Elements.remove(wire)
+                self.RemoveWire(wire)
             rung.SelectElement(contact)
             contact.Clean()
             left_elements.reverse()
@@ -876,8 +864,7 @@
                             wire_removed.append(wire)
                     for wire in wire_removed:
                         wire.Clean()
-                        self.Wires.remove(wire)
-                        self.Elements.remove(wire)
+                        self.RemoveWire(wire)
                         rung.SelectElement(wire)
             wires = []
             for left_element, left_index in left_elements:
@@ -890,14 +877,12 @@
                     wire.ConnectEndPoint(None, left_element)
             wires.reverse()
             for wire in wires:
-                self.Wires.append(wire)
-                self.Elements.append(wire)
+                self.RemoveWire(wire)
                 rung.SelectElement(wire)
             right_elements.reverse()
             for right_element, right_index in right_elements:
                 self.RefreshPosition(right_element.GetParentBlock())
-            self.Blocks.remove(contact)
-            self.Elements.remove(contact)
+            self.RemoveBlock(contact)
             self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
             rung.RefreshBoundingBox()
             new_bbox = rung.GetBoundingBox()
@@ -912,11 +897,9 @@
         element.Clean()
         for wire in input_wires:
             wire.Clean()
-            self.Wires.remove(wire)
-            self.Elements.remove(wire)
+            self.RemoveWire(wire)
             rung.SelectElement(wire)
-        self.Blocks.remove(element)
-        self.Elements.remove(element)
+        self.RemoveBlock(element)
         self.Controler.RemoveCurrentElementEditingInstance(element.GetId())
         for left_element in left_elements:
             block = left_element.GetParentBlock()
@@ -962,18 +945,16 @@
                 self.RecursiveDeletion(coil, rung)
             else:
                 for element in rung.GetElements():
-                    if element in self.Wires:
+                    if self.IsWire(element):
                         element.Clean()
-                        self.Wires.remove(element)
-                        self.Elements.remove(element)
+                        self.RemoveWire(element)
                 for element in rung.GetElements():
-                    if element in self.Blocks:
+                    if self.IsBlock(element):
                         self.Controler.RemoveCurrentElementEditingInstance(element.GetId())
-                        self.Blocks.remove(element)
-                        self.Elements.remove(element)
+                        self.RemoveBlock(element)
                 self.Controler.RemoveCurrentElementEditingInstance(self.Comments[rungindex].GetId())
-                self.Elements.remove(self.Comments[rungindex])
-                self.Comments.pop(rungindex)
+                self.RemoveComment(self.RungComments[rungindex])
+                self.RungComments.pop(rungindex)
                 self.Rungs.pop(rungindex)
                 if rungindex < len(self.Rungs):
                     next_bbox = self.Rungs[rungindex].GetBoundingBox()
@@ -987,11 +968,11 @@
             wires = []
             left_elements = []
             right_elements = []
-            if wire in self.Wires:
+            if self.IsWire(wire):
                 wires = [wire]
-            elif wire not in self.Elements:
+            elif isinstance(wire, Graphic_Group):
                 for element in wire.GetElements():
-                    if element in self.Wires:
+                    if self.IsWire(element):
                         wires.append(element)
                     else:
                         wires = []
@@ -1009,8 +990,7 @@
                         right_elements.append(wire.StartConnected)
                     if connections == (False, False) or connections == (False, True) and isinstance(left_block, LD_PowerRail):
                         wire.Clean()
-                        self.Wires.remove(wire)
-                        self.Elements.remove(wire)
+                        self.RemoveWire(wire)
                         rung.SelectElement(wire)
                 for left_element in left_elements:
                     left_block = left_element.GetParentBlock()
@@ -1153,11 +1133,11 @@
     def RefreshRungs(self, movey, fromidx):
         if movey != 0:
             for i in xrange(fromidx, len(self.Rungs)):
-                self.Comments[i].Move(0, movey)
-                self.Comments[i].RefreshModel()
+                self.RungComments[i].Move(0, movey)
+                self.RungComments[i].RefreshModel()
                 self.Rungs[i].Move(0, movey)
                 for element in self.Rungs[i].GetElements():
-                    if element in self.Blocks:
+                    if self.IsBlock(element):
                         self.RefreshPosition(element)
 
 #-------------------------------------------------------------------------------