Source code for fastpyxl.drawing.drawing


# Copyright (c) 2010-2024 fastpyxl

import math

from fastpyxl.utils.units import pixels_to_EMU


[docs] class Drawing: """ a drawing object - eg container for shapes or charts we assume user specifies dimensions in pixels; units are converted to EMU in the drawing part """ count = 0 def __init__(self): self.name = '' self.description = '' self.coordinates = ((1, 2), (16, 8)) self.left = 0 self.top = 0 self._width = 21 # default in px self._height = 192 #default in px self.resize_proportional = False self.rotation = 0 self.anchortype = "absolute" self.anchorcol = 0 # left cell self.anchorrow = 0 # top row @property def width(self): return self._width @width.setter def width(self, w): if self.resize_proportional and w: ratio = self._height / self._width self._height = round(ratio * w) self._width = w @property def height(self): return self._height @height.setter def height(self, h): if self.resize_proportional and h: ratio = self._width / self._height self._width = round(ratio * h) self._height = h
[docs] def set_dimension(self, w=0, h=0): xratio = w / self._width yratio = h / self._height if self.resize_proportional and w and h: if (xratio * self._height) < h: self._height = math.ceil(xratio * self._height) self._width = w else: self._width = math.ceil(yratio * self._width) self._height = h
@property def anchor(self): from .spreadsheet_drawing import ( OneCellAnchor, AbsoluteAnchor) if self.anchortype == "absolute": anchor = AbsoluteAnchor() pos = anchor.pos assert pos is not None pos.x = pixels_to_EMU(self.left) pos.y = pixels_to_EMU(self.top) elif self.anchortype == "oneCell": anchor = OneCellAnchor() frm = anchor._from assert frm is not None frm.col = self.anchorcol frm.row = self.anchorrow else: raise ValueError(f"unknown anchortype {self.anchortype!r}") ext = anchor.ext assert ext is not None ext.width = pixels_to_EMU(self._width) ext.height = pixels_to_EMU(self._height) return anchor