diff -r 0688db995ddf -r 4a8400732001 graphics/FBD_Objects.py --- 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)