--- 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)