graphics/FBD_Objects.py
changeset 42 4a8400732001
parent 32 cf9efccff009
child 58 39cd981ff242
--- a/graphics/FBD_Objects.py	Tue Jul 17 12:25:50 2007 +0200
+++ b/graphics/FBD_Objects.py	Wed Jul 18 11:51:30 2007 +0200
@@ -48,6 +48,7 @@
         self.Id = id
         self.Inputs = []
         self.Outputs = []
+        self.RefreshNameSize()
         self.SetType(type, extension, inputs)
     
     # Destructor
@@ -66,11 +67,15 @@
         for output in self.Outputs:
             output.UnConnect(delete = True)
     
+    # Refresh the size of text for name
+    def RefreshNameSize(self):
+        dc = wxClientDC(self.Parent)
+        self.NameSize = dc.GetTextExtent(self.Name)
+    
     # Refresh the block bounding box
     def RefreshBoundingBox(self):
-        dc = wxClientDC(self.Parent)
         # Calculate the size of the name outside the block
-        text_width, text_height = dc.GetTextExtent(self.Name)
+        text_width, text_height = self.NameSize
         # Calculate the bounding box size
         bbx_x = self.Pos.x - max(min(1, len(self.Inputs)) * CONNECTOR_SIZE, (text_width - self.Size[0]) / 2)
         bbx_width = self.Size[0] + 1 + (min(1, len(self.Inputs)) + min(1, len(self.Outputs))) * CONNECTOR_SIZE
@@ -151,7 +156,10 @@
     # Changes the block type
     def SetType(self, type, extension, inputs = None):
         if type != self.Type or self.Extension != extension: 
-            self.Type = type
+            if type != self.Type:
+                self.Type = type
+                dc = wxClientDC(self.Parent)
+                self.TypeSize = dc.GetTextExtent(self.Type)
             self.Extension = extension
             # Find the block definition from type given and create the corresponding
             # inputs and outputs
@@ -185,6 +193,7 @@
                 elif output_modifier != "none":
                     connector.SetEdge(output_modifier)
                 self.Outputs.append(connector)
+            self.RefreshMinSize()
             self.RefreshConnectors()
             self.RefreshBoundingBox()
     
@@ -195,6 +204,7 @@
     # Changes the block name
     def SetName(self, name):
         self.Name = name
+        self.RefreshNameSize()
     
     # Returs the block name
     def GetName(self):
@@ -208,23 +218,25 @@
     def GetExtension(self):
         return self.Extension
     
-    # Returns the block minimum size
-    def GetMinSize(self):
-        dc = wxClientDC(self.Parent)
-        text_width, text_height = dc.GetTextExtent(self.Type)
+    # Refresh the block minimum size
+    def RefreshMinSize(self):
         # Calculate the inputs maximum width
         max_input = 0
         for input in self.Inputs:
-            w, h = dc.GetTextExtent(input.GetName())
+            w, h = input.GetNameSize()
             max_input = max(max_input, w)
         # Calculate the outputs maximum width
         max_output = 0
         for output in self.Outputs:
-            w, h = dc.GetTextExtent(output.GetName())
+            w, h = output.GetNameSize()
             max_output = max(max_output, w)
-        width = max(text_width + 10, max_input + max_output + 15)
+        width = max(self.TypeSize[0] + 10, max_input + max_output + 15)
         height = (max(len(self.Inputs), len(self.Outputs)) + 1) * BLOCK_LINE_SIZE
-        return width, height
+        self.MinSize = width, height
+    
+    # Returns the block minimum size
+    def GetMinSize(self):
+        return self.MinSize
     
     # Changes the negated property of the connector handled
     def SetConnectorNegated(self, negated):
@@ -271,11 +283,9 @@
         # Draw a rectangle with the block size
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         # Draw block name and block type
-        namewidth, nameheight = dc.GetTextExtent(self.Name)
-        dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - namewidth) / 2,
-                self.Pos.y - (nameheight + 2))
-        typewidth, typeheight = dc.GetTextExtent(self.Type)
-        dc.DrawText(self.Type, self.Pos.x + (self.Size[0] - typewidth) / 2,
+        dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - self.NameSize[0]) / 2,
+                self.Pos.y - (self.NameSize[1] + 2))
+        dc.DrawText(self.Type, self.Pos.x + (self.Size[0] - self.TypeSize[0]) / 2,
                 self.Pos.y + 5)
         # Draw inputs and outputs connectors
         for input in self.Inputs:
@@ -304,6 +314,7 @@
         self.Id = id
         self.Input = None
         self.Output = None
+        self.RefreshNameSize()
         self.SetType(type, value_type)
     
     # Destructor
@@ -322,9 +333,13 @@
     def Delete(self):
         self.Parent.DeleteVariable(self)
     
+    # Refresh the size of text for name
+    def RefreshNameSize(self):
+        dc = wxClientDC(self.Parent)
+        self.NameSize = dc.GetTextExtent(self.Name)
+    
     # Refresh the variable bounding box
     def RefreshBoundingBox(self):
-        dc = wxClientDC(self.Parent)
         if self.Type in (OUTPUT, INOUT):
             bbx_x = self.Pos.x - CONNECTOR_SIZE
         else:
@@ -417,6 +432,7 @@
     # Changes the variable name
     def SetName(self, name):
         self.Name = name
+        self.RefreshNameSize()
     
     # Returns the variable name
     def GetName(self):
@@ -424,9 +440,7 @@
     
     # Returns the variable minimum size
     def GetMinSize(self):
-        dc = wxClientDC(self.Parent)
-        text_width, text_height = dc.GetTextExtent(self.Name)
-        return text_width + 10, text_height + 10
+        return self.NameSize[0] + 10, self.NameSize[1] + 10
     
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
@@ -460,9 +474,8 @@
         # Draw a rectangle with the variable size
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         # Draw variable name
-        namewidth, nameheight = dc.GetTextExtent(self.Name)
-        dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - namewidth) / 2,
-                self.Pos.y + (self.Size[1] - nameheight) / 2)
+        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 connectors
         if self.Input:
             self.Input.Draw(dc)
@@ -495,6 +508,7 @@
         else:
             self.Connector = Connector(self, "", "ANY", wxPoint(0, 0), EAST)
         self.RefreshConnectors()
+        self.RefreshNameSize()
     
     # Destructor
     def __del__(self):
@@ -509,9 +523,13 @@
     def Delete(self):
         self.Parent.DeleteConnection(self)
     
+    # Refresh the size of text for name
+    def RefreshNameSize(self):
+        dc = wxClientDC(self.Parent)
+        self.NameSize = dc.GetTextExtent(self.Name)
+    
     # Refresh the connection bounding box
     def RefreshBoundingBox(self):
-        dc = wxClientDC(self.Parent)
         if self.Type == CONNECTOR:
             bbx_x = self.Pos.x - CONNECTOR_SIZE
         else:
@@ -561,6 +579,7 @@
     # Changes the connection name
     def SetName(self, name):
         self.Name = name
+        self.RefreshNameSize()
         
     # Returns the connection name
     def GetName(self):
@@ -568,8 +587,7 @@
     
     # Returns the connection minimum size
     def GetMinSize(self):
-        dc = wxClientDC(self.Parent)
-        text_width, text_height = dc.GetTextExtent(self.Name)
+        text_width, text_height = self.NameSize
         if text_height % 2 == 1:
             text_height += 1
         return text_width + text_height + 20, text_height + 10
@@ -599,8 +617,7 @@
         dc.SetBrush(wxWHITE_BRUSH)
         # Draw a rectangle with the connection size with arrows in 
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-        namewidth, nameheight = dc.GetTextExtent(self.Name)
-        arrowsize = min(self.Size[1] / 2, (self.Size[0] - namewidth - 10) / 2)
+        arrowsize = min(self.Size[1] / 2, (self.Size[0] - self.NameSize[0] - 10) / 2)
         dc.DrawLine(self.Pos.x, self.Pos.y, self.Pos.x + arrowsize, 
                 self.Pos.y + self.Size[1] / 2)
         dc.DrawLine(self.Pos.x + arrowsize, self.Pos.y + self.Size[1] / 2, 
@@ -610,8 +627,8 @@
         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
-        dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - namewidth) / 2,
-                self.Pos.y + (self.Size[1] - nameheight) / 2)
+        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
         if self.Connector:
             self.Connector.Draw(dc)