44import ezdxf
55from ezdxf .document import Drawing
66from ezdxf import zoom , transform
7- from ezdxf .math import Matrix44
7+ from ezdxf .math import Matrix44 , BoundingBox
8+
89from .tokenizer import hpgl2_commands
910from .plotter import Plotter
1011from .interpreter import Interpreter
@@ -18,9 +19,14 @@ def to_dxf(
1819 b : bytes ,
1920 scale : float = 1.0 ,
2021 * ,
22+ rotation : int = 0 ,
23+ flip_horizontal = False ,
24+ flip_vertical = False ,
2125 color_mode = ColorMode .RGB ,
2226 map_black_rgb_to_white_rgb = False ,
2327) -> Drawing :
28+ if rotation not in (0 , 90 , 180 , 270 ):
29+ raise ValueError ("invalid rotation angle: should be 0, 90, 180, or 270" )
2430 doc = ezdxf .new ()
2531 msp = doc .modelspace ()
2632 plotter = Plotter (
@@ -30,9 +36,16 @@ def to_dxf(
3036 map_black_rgb_to_white_rgb = map_black_rgb_to_white_rgb ,
3137 )
3238 )
33- Interpreter (plotter ).run (hpgl2_commands (b ))
39+ plotter .set_page_rotation (rotation )
40+ interpreter = Interpreter (plotter )
41+ if flip_vertical or flip_horizontal :
42+ plotter .set_page_flip (vertical = flip_vertical , horizontal = flip_horizontal )
43+ # disable embedded scaling commands
44+ interpreter .disable_commands (["SC" , "IP" , "IR" ])
45+ interpreter .run (hpgl2_commands (b ))
3446 if plotter .bbox .has_data : # non-empty page
35- _scale_and_zoom (msp , scale , plotter .bbox )
47+ bbox = _scale_and_zoom (msp , scale , plotter .bbox )
48+ _reset_doc (doc , bbox )
3649 return doc
3750
3851
@@ -45,13 +58,35 @@ def _scale_and_zoom(layout, scale, bbox):
4558 extmin = m .transform (extmin )
4659 extmax = m .transform (extmax )
4760 zoom .window (layout , extmin , extmax )
61+ return BoundingBox ([extmin , extmax ])
62+
63+ def _reset_doc (doc , bbox ):
64+ doc .header ["$EXTMIN" ] = bbox .extmin
65+ doc .header ["$EXTMAX" ] = bbox .extmax
66+
67+ psp_size = bbox .size / 40.0 # plu to mm
68+ psp_center = psp_size * 0.5
69+ psp = doc .paperspace ()
70+ psp .page_setup (size = (psp_size .x , psp_size .y ), margins = (0 , 0 , 0 , 0 ), units = "mm" )
71+ psp .add_viewport (
72+ center = psp_center ,
73+ size = (psp_size .x , psp_size .y ),
74+ view_center_point = bbox .center ,
75+ view_height = bbox .size .y ,
76+ )
4877
4978
50- def to_svg (b : bytes ) -> str :
79+ def to_svg (b : bytes , * , rotation : int = 0 , flip_horizontal = False , flip_vertical = False ) -> str :
5180 # 1st pass records the plotting commands and detects the bounding box
5281 recorder = Recorder ()
5382 plotter = Plotter (recorder )
54- Interpreter (plotter ).run (hpgl2_commands (b ))
83+ plotter .set_page_rotation (rotation )
84+ interpreter = Interpreter (plotter )
85+ if flip_vertical or flip_horizontal :
86+ plotter .set_page_flip (vertical = flip_vertical , horizontal = flip_horizontal )
87+ # disable embedded scaling commands
88+ interpreter .disable_commands (["SC" , "IP" , "IR" ])
89+ interpreter .run (hpgl2_commands (b ))
5590 if not plotter .bbox .has_data :
5691 return ""
5792
0 commit comments