Skip to content

Commit da71b1e

Browse files
committed
fix usage of the VIEWPORT status attribute
Added "status" argument to the factory method, which should be 2 or greater for usual paperspace viewports. Until this fix, the status attribute had always the value "1" if not set by the user and indicated the "active" viewport, which has a total different purpose and should exist only once.
1 parent dbc3920 commit da71b1e

File tree

11 files changed

+51
-21
lines changed

11 files changed

+51
-21
lines changed

docs/source/dxfentities/viewport.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ Inherited DXF attributes :ref:`Common graphical DXF attributes`
4141
-1 On, but is fully off screen, or is one of the viewports that is not active because the $MAXACTVP count is
4242
currently being exceeded.
4343
0 Off
44-
>0 On and active. The value indicates the order of stacking for the viewports, where 1 is the
45-
active viewport, 2 is the next, and so forth
44+
>0 On and active. The value indicates the order of stacking for the viewports,
45+
where 1 is the active viewport, 2 is the next, and so forth.
4646
=== =====================================
4747

4848
.. attribute:: dxf.id

examples/paperspace_setup_R2000.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def setup_layout2(doc: Drawing):
138138
view_center_point=(60, 40),
139139
# how much modelspace area to show in viewport in drawing units
140140
view_height=20,
141+
status=2,
141142
)
142143
lower_left, upper_right = layout2.get_paper_limits()
143144
x1, y1 = lower_left
@@ -166,6 +167,7 @@ def setup_layout3(doc: Drawing):
166167
view_center_point=(60, 40),
167168
# how much model space area to show in viewport in drawing units
168169
view_height=20,
170+
status=2,
169171
)
170172
layout3.add_circle((0, 0), radius=250) # plot origin
171173

examples/viewport_frozen_layers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def create_viewports(paperspace: Paperspace):
5959
size=(vp_width, vp_height),
6060
view_center_point=(50, 30),
6161
view_height=70,
62+
status=2,
6263
)
6364
vp.frozen_layers = frozen_layers
6465
cx += vp_width + MARGIN

examples/viewports_in_paperspace.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def create_viewports(paperspace: Paperspace):
7474
size=(5, 5),
7575
view_center_point=(7.5, 7.5),
7676
view_height=10,
77+
status=2,
7778
)
7879
# scale is calculated by:
7980
# height of model space (view_height=10) / height of viewport (height=5)
@@ -86,6 +87,7 @@ def create_viewports(paperspace: Paperspace):
8687
size=(5, 5),
8788
view_center_point=(10, 5),
8889
view_height=25,
90+
status=3,
8991
)
9092
paperspace.add_text(
9193
"View of Circle Scale=1:5", height=0.18, dxfattribs=txt_attribs
@@ -96,6 +98,7 @@ def create_viewports(paperspace: Paperspace):
9698
size=(5, 5),
9799
view_center_point=(12.5, 7.5),
98100
view_height=5,
101+
status=4,
99102
)
100103
paperspace.add_text(
101104
"View of Triangle Scale=1:1", height=0.18, dxfattribs=txt_attribs
@@ -106,6 +109,7 @@ def create_viewports(paperspace: Paperspace):
106109
size=(15, 7.5),
107110
view_center_point=(10, 6.25),
108111
view_height=7.5,
112+
status=5,
109113
)
110114
paperspace.add_text(
111115
"Overall View Scale=1:1", height=0.18, dxfattribs=txt_attribs
@@ -116,14 +120,15 @@ def create_viewports(paperspace: Paperspace):
116120
size=(0.3, 0.15),
117121
view_center_point=(10, 6.25),
118122
view_height=7.5,
123+
status=6,
119124
)
120125
# scale = 7.5/0.15 = 50
121126
paperspace.add_text(
122127
"Scale=1:50", height=0.18, dxfattribs=txt_attribs
123128
).set_placement((16, 14), align=TextEntityAlignment.CENTER)
124129

125130
vp = paperspace.add_viewport(
126-
center=(16, 10), size=(4, 4), view_center_point=(0, 0), view_height=30
131+
center=(16, 10), size=(4, 4), view_center_point=(0, 0), view_height=30, status=7
127132
)
128133
vp.dxf.view_target_point = (40, 40, 0)
129134
vp.dxf.view_direction_vector = (-1, -1, 1)
@@ -161,13 +166,9 @@ def make_dxf(dxfversion: str):
161166
width, height = 24, 18
162167
m = 1
163168
if dxfversion == "R12":
164-
layout.page_setup_r12(
165-
size=(width, height), margins=(m, m, m, m), units="inch"
166-
)
169+
layout.page_setup_r12(size=(width, height), margins=(m, m, m, m), units="inch")
167170
else:
168-
layout.page_setup(
169-
size=(width, height), margins=(m, m, m, m), units="inch"
170-
)
171+
layout.page_setup(size=(width, height), margins=(m, m, m, m), units="inch")
171172
# The canvas is defined by the page size minus the margins:
172173
canvas_width = width - 2 * m
173174
canvas_height = height - 2 * m

examples/viewports_override_layer_attributes.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def create_viewports(paperspace: Paperspace):
110110
vp_width = 3
111111
cx = vp_width / 2
112112
cy = (PAPER_HEIGHT - 2 * MARGIN) / 2
113+
status = 2
113114
for func in (
114115
original,
115116
override_aci,
@@ -122,9 +123,11 @@ def create_viewports(paperspace: Paperspace):
122123
size=(vp_width, vp_height),
123124
view_center_point=(50, 30),
124125
view_height=70,
126+
status=status,
125127
)
126128
func(vp.dxf.handle, doc)
127129
cx += vp_width + MARGIN
130+
status += 1
128131

129132

130133
def main():

exploration/render_viewport_to_modelspace.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def create_viewports(paperspace: Paperspace):
4141
size=(5, 5),
4242
view_center_point=(10.0, 7.5),
4343
view_height=10,
44+
status=2,
4445
)
4546
# scale is calculated by:
4647
# height of model space (view_height=10) / height of viewport (height=5)
@@ -53,6 +54,7 @@ def create_viewports(paperspace: Paperspace):
5354
size=(5, 5),
5455
view_center_point=(10, 5),
5556
view_height=25,
57+
status=3,
5658
)
5759
psp.dxf.view_twist_angle = 45
5860
paperspace.add_text(
@@ -64,6 +66,7 @@ def create_viewports(paperspace: Paperspace):
6466
size=(15, 7.5),
6567
view_center_point=(10, 6.25),
6668
view_height=7.5,
69+
status=4,
6770
)
6871
paperspace.add_text(
6972
"View Scale=1:1", height=0.18, dxfattribs=txt_attribs

src/ezdxf/addons/drawing/dxf.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,13 @@ def setup_paperspace(doc: Drawing, bbox: BoundingBox2d):
198198
size=(psp_size.x, psp_size.y),
199199
view_center_point=bbox.center,
200200
view_height=bbox.size.y,
201+
status=2,
201202
)
202203

203204

204205
def add_background(msp: BaseLayout, bbox: BoundingBox2d, color: colors.RGB) -> Solid:
205206
v = bbox.rect_vertices()
206-
bg = msp.add_solid([v[0], v[1], v[3], v[2]], dxfattribs={
207-
"true_color": colors.rgb2int(color)
208-
})
207+
bg = msp.add_solid(
208+
[v[0], v[1], v[3], v[2]], dxfattribs={"true_color": colors.rgb2int(color)}
209+
)
209210
return bg

src/ezdxf/entities/viewport.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,17 @@
6262
# active because the $MAXACTVP count is currently being exceeded.
6363
# 0 = Off
6464
# <positive value> = On and active. The value indicates the order of
65-
# stacking for the viewports, where 1 is the "active viewport", 2 is the
66-
# next, and so on:
65+
# stacking for the viewports, where 1 is the "active" viewport, 2 is the
66+
# next, and so on. The "active" viewport determines how the paperspace layout
67+
# is presented as a whole (location & zoom state)
6768
"status": DXFAttr(68, default=0),
6869
# Viewport id: (according to the DXF Reference)
6970
# Special VIEWPORT id == 1, this viewport defines the area of the layout
7071
# which is currently shown in the layout tab by the CAD application.
7172
# I guess this is meant by "active viewport" and therefore it is most likely
7273
# that this id is always 1.
7374
# This "active viewport" is mandatory for a valid DXF file.
74-
# BricsCAD set id to -1 if the viewport is off and 'status' (group code 68)
75+
# BricsCAD set this id to -1 if the viewport is off and 'status' (group code 68)
7576
# is not present.
7677
"id": DXFAttr(69, default=2),
7778
# DXF reference: View center point (in WCS):

src/ezdxf/layouts/layout.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,7 @@ def rename(self, name: str) -> None:
414414
self.dxf_layout.dxf.name = name
415415

416416
def viewports(self) -> list[Viewport]:
417-
"""Get all VIEWPORT entities defined in this paperspace layout.
418-
"""
417+
"""Get all VIEWPORT entities defined in this paperspace layout."""
419418
return [e for e in self if e.is_alive and e.dxftype() == "VIEWPORT"] # type: ignore
420419

421420
def main_viewport(self) -> Optional[Viewport]:
@@ -434,16 +433,28 @@ def add_viewport(
434433
size: tuple[float, float],
435434
view_center_point: UVec,
436435
view_height: float,
436+
status: int = 2,
437437
dxfattribs=None,
438438
) -> Viewport:
439-
"""Add a new :class:`~ezdxf.entities.Viewport` entity."""
439+
"""Add a new :class:`~ezdxf.entities.Viewport` entity.
440+
441+
Viewport :attr:`status`:
442+
443+
- -1 is on, but is fully off-screen, or is one of the viewports that is not
444+
active because the $MAXACTVP count is currently being exceeded.
445+
- 0 is off
446+
- any value>0 is on and active. The value indicates the order of
447+
stacking for the viewports, where 1 is the "active viewport", 2 is the
448+
next, ...
449+
450+
"""
440451
dxfattribs = dxfattribs or {}
441452
width, height = size
442453
attribs = {
443454
"center": center, # center in paperspace
444455
"width": width, # width in paperspace
445456
"height": height, # height in paperspace
446-
"status": 1, # has by default the highest priority (stack order)
457+
"status": status,
447458
"layer": "VIEWPORTS",
448459
# use separated layer to turn off for plotting
449460
"view_center_point": view_center_point, # in modelspace
@@ -546,6 +557,7 @@ def add_new_main_viewport(self) -> Viewport:
546557
size=size, # I don't get it, just use paper size!
547558
view_center_point=center, # same as center
548559
view_height=vp_height, # view height in paper space units
560+
status=1, # main viewport
549561
)
550562
if len(self.entity_space) > 1:
551563
# move main viewport to index 0 of entity space
@@ -770,9 +782,9 @@ def paper_units(value):
770782
size=(vp_width, vp_height), # I don't get it, just use paper size!
771783
view_center_point=center, # same as center
772784
view_height=vp_height, # view height in paper space units
785+
status=1, # main viewport
773786
)
774787
main_viewport.dxf.id = 1 # set as main viewport
775-
main_viewport.dxf.status = 2 # AutoCAD default value
776788
main_viewport.dxf.render_mode = 1000 # AutoDesk default (view mode?)
777789

778790
def get_paper_limits_r12(self) -> tuple[Vec2, Vec2]:

tests/test_01_dxf_entities/test_141_layer_vp_override.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def vp1(self, doc):
148148
size=(5, 5),
149149
view_center_point=(7.5, 7.5),
150150
view_height=10,
151+
status=2,
151152
)
152153

153154
@pytest.fixture(scope="class")
@@ -158,6 +159,7 @@ def vp2(self, doc):
158159
size=(5, 5),
159160
view_center_point=(7.5, 7.5),
160161
view_height=10,
162+
status=3,
161163
)
162164

163165
@staticmethod

0 commit comments

Comments
 (0)