1# -*- coding: utf-8 -*-2# Copyright 2011 Takeshi KOMIYA3#4# Licensed under the Apache License, Version 2.0 (the "License");5# you may not use this file except in compliance with the License.6# You may obtain a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing, software11# distributed under the License is distributed on an "AS IS" BASIS,12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13# See the License for the specific language governing permissions and14# limitations under the License.1516from __future__ import division1718from collections import defaultdict1920import blockdiag.metrics21from blockdiag.utils import XY, Box2223from rackdiag import elements242526class DiagramMetrics(blockdiag.metrics.DiagramMetrics):27 def __init__(self, diagram, **kwargs):28 span_height = self.span_height29 span_width = self.span_width30 self.span_height = 031 self.span_width = 032 super(DiagramMetrics, self).__init__(diagram, **kwargs)3334 labelsize = [self.textsize(r.display_label, font=self.font_for(r))35 for r in diagram.racks if r.display_label]36 if labelsize:37 labelheight = (max(size.height for size in labelsize) +38 self.line_spacing * 2)39 else:40 labelheight = 04142 # reset node_width FORCE43 self.spreadsheet.node_width = defaultdict(lambda: self.node_width)4445 self.spreadsheet.set_span_height(0, span_height + labelheight)46 self.spreadsheet.set_span_height(diagram.colheight, span_height)47 self.spreadsheet.set_span_width(0, span_width)4849 for rack in diagram.racks:50 x = rack.xy.x + rack.colwidth51 self.spreadsheet.set_span_width(x, span_width)5253 if rack.colwidth > 1:54 node_width = self.node_width // rack.colwidth55 for i in range(rack.colwidth):56 self.spreadsheet.set_node_width(rack.xy.x + i, node_width)5758 def racklabel(self, rack):59 cell = self.cell(rack)60 textsize = self.textsize(rack.display_label, font=self.font_for(rack))61 y1 = cell.y1 - textsize.height - self.line_spacing * 262 return Box(cell.x1, y1, cell.x2, cell.y1)6364 def racknumber(self, rack, number):65 if rack.descending:66 y = rack.colheight - number - 167 else:68 y = number6970 dummy = elements.DiagramNode(None)71 dummy.xy = XY(rack.xy.x, y)72 dummy.colwidth = 173 dummy.colheight = 17475 box = self.cell(dummy, use_padding=False).box76 return Box(0, box[1], box[0], box[3])