Spaces:
Paused
Paused
| """Objects related to shapes. | |
| A shape is a visual object that appears on the drawing layer of a document. | |
| """ | |
| from __future__ import annotations | |
| from typing import TYPE_CHECKING | |
| from docx.enum.shape import WD_INLINE_SHAPE | |
| from docx.oxml.ns import nsmap | |
| from docx.shared import Parented | |
| if TYPE_CHECKING: | |
| from docx.oxml.document import CT_Body | |
| from docx.oxml.shape import CT_Inline | |
| from docx.parts.story import StoryPart | |
| from docx.shared import Length | |
| class InlineShapes(Parented): | |
| """Sequence of |InlineShape| instances, supporting len(), iteration, and indexed access.""" | |
| def __init__(self, body_elm: CT_Body, parent: StoryPart): | |
| super(InlineShapes, self).__init__(parent) | |
| self._body = body_elm | |
| def __getitem__(self, idx: int): | |
| """Provide indexed access, e.g. 'inline_shapes[idx]'.""" | |
| try: | |
| inline = self._inline_lst[idx] | |
| except IndexError: | |
| msg = "inline shape index [%d] out of range" % idx | |
| raise IndexError(msg) | |
| return InlineShape(inline) | |
| def __iter__(self): | |
| return (InlineShape(inline) for inline in self._inline_lst) | |
| def __len__(self): | |
| return len(self._inline_lst) | |
| def _inline_lst(self): | |
| body = self._body | |
| xpath = "//w:p/w:r/w:drawing/wp:inline" | |
| return body.xpath(xpath) | |
| class InlineShape: | |
| """Proxy for an ``<wp:inline>`` element, representing the container for an inline | |
| graphical object.""" | |
| def __init__(self, inline: CT_Inline): | |
| super(InlineShape, self).__init__() | |
| self._inline = inline | |
| def height(self) -> Length: | |
| """Read/write. | |
| The display height of this inline shape as an |Emu| instance. | |
| """ | |
| return self._inline.extent.cy | |
| def height(self, cy: Length): | |
| self._inline.extent.cy = cy | |
| self._inline.graphic.graphicData.pic.spPr.cy = cy | |
| def type(self): | |
| """The type of this inline shape as a member of | |
| ``docx.enum.shape.WD_INLINE_SHAPE``, e.g. ``LINKED_PICTURE``. | |
| Read-only. | |
| """ | |
| graphicData = self._inline.graphic.graphicData | |
| uri = graphicData.uri | |
| if uri == nsmap["pic"]: | |
| blip = graphicData.pic.blipFill.blip | |
| if blip.link is not None: | |
| return WD_INLINE_SHAPE.LINKED_PICTURE | |
| return WD_INLINE_SHAPE.PICTURE | |
| if uri == nsmap["c"]: | |
| return WD_INLINE_SHAPE.CHART | |
| if uri == nsmap["dgm"]: | |
| return WD_INLINE_SHAPE.SMART_ART | |
| return WD_INLINE_SHAPE.NOT_IMPLEMENTED | |
| def width(self): | |
| """Read/write. | |
| The display width of this inline shape as an |Emu| instance. | |
| """ | |
| return self._inline.extent.cx | |
| def width(self, cx: Length): | |
| self._inline.extent.cx = cx | |
| self._inline.graphic.graphicData.pic.spPr.cx = cx | |