graphics/FBD_Objects.py
changeset 118 0c53d6a36013
parent 112 317148fc1225
child 140 06d28f03f6f4
--- a/graphics/FBD_Objects.py	Fri Oct 26 17:04:18 2007 +0200
+++ b/graphics/FBD_Objects.py	Tue Oct 30 16:53:08 2007 +0100
@@ -39,15 +39,15 @@
 class FBD_Block(Graphic_Element):
     
     # Create a new block
-    def __init__(self, parent, type, name, id = None, extension = 0, inputs = None, connectors = {}):
+    def __init__(self, parent, type, name, id = None, extension = 0, inputs = None, connectors = {}, executionOrder = 0):
         Graphic_Element.__init__(self, parent)
         self.Type = None
         self.Extension = None
-        self.Name = name
         self.Id = id
+        self.SetName(name)
+        self.SetExecutionOrder(executionOrder)
         self.Inputs = []
         self.Outputs = []
-        self.RefreshNameSize()
         self.Colour = wx.BLACK
         self.Pen = wx.BLACK_PEN
         self.SetType(type, extension, inputs, connectors)
@@ -83,6 +83,11 @@
         dc = wx.ClientDC(self.Parent)
         self.NameSize = dc.GetTextExtent(self.Name)
     
+    # Refresh the size of text for execution order
+    def RefreshExecutionOrderSize(self):
+        dc = wx.ClientDC(self.Parent)
+        self.ExecutionOrderSize = dc.GetTextExtent(str(self.ExecutionOrder))
+    
     # Refresh the block bounding box
     def RefreshBoundingBox(self):
         # Calculate the size of the name outside the block
@@ -96,6 +101,10 @@
         else:
             bbx_y = self.Pos.y
             bbx_height = self.Size[1]
+        if self.ExecutionOrder != 0:
+            bbx_x = min(bbx_x, self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0])
+            bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0])
+            bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2)
         self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1)
     
     # Refresh the positions of the block connectors
@@ -260,6 +269,15 @@
     def GetExtension(self):
         return self.Extension
     
+    # Changes the execution order
+    def SetExecutionOrder(self, executionOrder):
+        self.ExecutionOrder = executionOrder
+        self.RefreshExecutionOrderSize()
+    
+    # Returs the execution order
+    def GetExecutionOrder(self):
+        return self.ExecutionOrder
+    
     # Refresh the block minimum size
     def RefreshMinSize(self):
         # Calculate the inputs maximum width
@@ -335,6 +353,10 @@
             input.Draw(dc)
         for output in self.Outputs:
             output.Draw(dc)
+        if self.ExecutionOrder != 0:
+            # Draw block execution order
+            dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0],
+                    self.Pos.y + self.Size[1] + 2)
         Graphic_Element.Draw(self, dc)
         dc.SetTextForeground(wx.BLACK)
 
@@ -350,15 +372,15 @@
 class FBD_Variable(Graphic_Element):
 
     # Create a new variable
-    def __init__(self, parent, type, name, value_type, id = None):
+    def __init__(self, parent, type, name, value_type, id = None, executionOrder = 0):
         Graphic_Element.__init__(self, parent)
         self.Type = None
         self.ValueType = None
-        self.Name = name
         self.Id = id
+        self.SetName(name)
+        self.SetExecutionOrder(executionOrder)
         self.Input = None
         self.Output = None
-        self.RefreshNameSize()
         self.SetType(type, value_type)
     
     # Make a clone of this FBD_Variable
@@ -392,6 +414,11 @@
         dc = wx.ClientDC(self.Parent)
         self.NameSize = dc.GetTextExtent(self.Name)
     
+    # Refresh the size of text for execution order
+    def RefreshExecutionOrderSize(self):
+        dc = wx.ClientDC(self.Parent)
+        self.ExecutionOrderSize = dc.GetTextExtent(str(self.ExecutionOrder))
+    
     # Refresh the variable bounding box
     def RefreshBoundingBox(self):
         if self.Type in (OUTPUT, INOUT):
@@ -402,7 +429,12 @@
             bbx_width = self.Size[0] + 2 * CONNECTOR_SIZE
         else:
             bbx_width = self.Size[0] + CONNECTOR_SIZE
-        self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width + 1, self.Size[1] + 1)
+        bbx_height = self.Size[1]
+        if self.ExecutionOrder != 0:
+            bbx_x = min(bbx_x, self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0])
+            bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0])
+            bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2)
+        self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width + 1, bbx_height + 1)
     
     # Refresh the position of the variable connector
     def RefreshConnectors(self):
@@ -492,6 +524,15 @@
     def GetName(self):
         return self.Name
     
+    # Changes the execution order
+    def SetExecutionOrder(self, executionOrder):
+        self.ExecutionOrder = executionOrder
+        self.RefreshExecutionOrderSize()
+    
+    # Returs the execution order
+    def GetExecutionOrder(self):
+        return self.ExecutionOrder
+    
     # Returns the variable minimum size
     def GetMinSize(self):
         return self.NameSize[0] + 10, self.NameSize[1] + 10
@@ -528,6 +569,10 @@
             self.Input.Draw(dc)
         if self.Output:    
             self.Output.Draw(dc)
+        if self.ExecutionOrder != 0:
+            # Draw variable execution order
+            dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0],
+                    self.Pos.y + self.Size[1] + 2)
         Graphic_Element.Draw(self, dc)
 
 
@@ -545,8 +590,8 @@
     def __init__(self, parent, type, name, id = None):
         Graphic_Element.__init__(self, parent)
         self.Type = type
-        self.Name = name
         self.Id = id
+        self.SetName(name)
         self.Pos = wx.Point(0, 0)
         self.Size = wx.Size(0, 0)
         # Create an input or output connector according to connection type
@@ -682,7 +727,7 @@
                 self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2)
         dc.DrawLine(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2, 
                 self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1])
-        # Draw variable name
+        # Draw connection name
         dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - self.NameSize[0]) / 2,
                 self.Pos.y + (self.Size[1] - self.NameSize[1]) / 2)
         # Draw connector