forked from python-openxml/python-docx
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathshape.py
103 lines (87 loc) · 2.75 KB
/
shape.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# encoding: utf-8
"""
Objects related to shapes, visual objects that appear on the drawing layer of
a document.
"""
from __future__ import (
absolute_import, division, print_function, unicode_literals
)
from .enum.shape import WD_INLINE_SHAPE
from .oxml.ns import nsmap
from .shared import Parented
class InlineShapes(Parented):
"""
Sequence of |InlineShape| instances, supporting len(), iteration, and
indexed access.
"""
def __init__(self, body_elm, parent):
super(InlineShapes, self).__init__(parent)
self._body = body_elm
def __getitem__(self, idx):
"""
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)
@property
def _inline_lst(self):
body = self._body
xpath = '//w:p/w:r/w:drawing/wp:inline'
return body.xpath(xpath)
class InlineShape(object):
"""
Proxy for an ``<wp:inline>`` element, representing the container for an
inline graphical object.
"""
def __init__(self, inline):
super(InlineShape, self).__init__()
self._inline = inline
@property
def height(self):
"""
Read/write. The display height of this inline shape as an |Emu|
instance.
"""
return self._inline.extent.cy
@height.setter
def height(self, cy):
self._inline.extent.cy = cy
self._inline.graphic.graphicData.pic.spPr.cy = cy
@property
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
@property
def width(self):
"""
Read/write. The display width of this inline shape as an |Emu|
instance.
"""
return self._inline.extent.cx
@width.setter
def width(self, cx):
self._inline.extent.cx = cx
self._inline.graphic.graphicData.pic.spPr.cx = cx