def page_setup(self, size=(297, 210), margins=(0, 0, 0, 0), units='mm', offset=(0, 0), rotation=0, scale=16): if self._paperspace == 0: raise DXFTypeError("No paper setup for model space.") # remove existing viewports for viewport in self.viewports(): self.delete_entity(viewport) if int(rotation) not in (0, 1, 2, 3): raise DXFValueError("valid rotation values: 0-3") if isinstance(scale, int): scale = STD_SCALES.get(scale, (1, 1)) if scale[0] == 0: raise DXFValueError("scale numerator can't be 0.") if scale[1] == 0: raise DXFValueError("scale denominator can't be 0.") scale_factor = scale[1] / scale[0] # TODO: don't know how to set inch or mm mode in R12 units = units.lower() if units.startswith('inch'): units = 'Inches' plot_paper_units = 0 unit_factor = 25.4 # inch to mm elif units == 'mm': units = 'MM' plot_paper_units = 1 unit_factor = 1.0 else: raise DXFValueError('Supported units: "mm" and "inch"') # all viewport parameters are scaled paper space units def paper_units(value): return value * scale_factor # TODO: don't know how paper setup in DXF R12 works paper_width, paper_height = size # TODO: don't know how margins setup in DXF R12 works margin_top, margin_right, margin_bottom, margin_left = margins paper_width = paper_units(size[0]) paper_height = paper_units(size[1]) plimmin = self.drawing.header['$PLIMMIN'] = (0, 0) plimmax = self.drawing.header['$PLIMMAX'] = (paper_width, paper_height) # TODO: don't know how paper setup in DXF R12 works pextmin = self.drawing.header['$PEXTMIN'] = (0, 0, 0) pextmax = self.drawing.header['$PEXTMAX'] = (paper_width, paper_height, 0) # printing area printable_width = paper_width - paper_units(margin_left) - paper_units( margin_right) printable_height = paper_height - paper_units( margin_bottom) - paper_units(margin_top) # AutoCAD viewport (window) size vp_width = paper_width * 1.1 vp_height = paper_height * 1.1 # center of printing area center = (printable_width / 2, printable_height / 2) # create 'main' viewport main_viewport = self.add_viewport( center=center, # no influence to 'main' viewport? size=(vp_width, vp_height), # I don't get it, just use paper size! view_center_point=center, # same as center view_height=vp_height, # view height in paper space units ) main_viewport.dxf.id = 1 # set as main viewport main_viewport.dxf.status = 2 # AutoCAD default value with main_viewport.edit_data() as vpdata: vpdata.view_mode = 1000 # AutoDesk default
def page_setup(self, size: Tuple[float, float] = (297, 210), margins: Tuple[float, float, float, float] = (10, 15, 10, 15), units: str = 'mm', offset: Tuple[float, float] = (0, 0), rotation: int = 0, scale: int = 16, name: str = 'ezdxf', device: str = 'DWG to PDF.pc3') -> None: """ Setup plot settings and paper size and reset viewports. All parameters in given `units` (mm or inch). Reset paper limits, extends and viewports. Args: size: paper size as (width, height) tuple margins: (top, right, bottom, left) hint: clockwise units: ``'mm'`` or ``'inch'`` offset: plot origin offset is 2D point rotation: see table Rotation scale: int 0-32 = standard scale type or tuple(numerator, denominator) e.g. ``(1, 50)`` for 1:50 name: paper name prefix ``'{name}_({width}_x_{height}_{unit})'`` device: device .pc3 configuration file or system printer name === ============ int Rotation === ============ 0 no rotation 1 90 degrees counter-clockwise 2 upside-down 3 90 degrees clockwise === ============ """ if int(rotation) not in (0, 1, 2, 3): raise DXFValueError("valid rotation values: 0-3") if isinstance(scale, tuple): standard_scale = 16 elif isinstance(scale, int): standard_scale = scale scale = STD_SCALES.get(standard_scale, (1, 1)) else: raise DXFTypeError("scale has to be an int or a tuple(numerator, denominator)") if scale[0] == 0: raise DXFValueError("scale numerator can't be 0.") if scale[1] == 0: raise DXFValueError("scale denominator can't be 0.") self.use_standard_scale(False) # works best, don't know why paper_width, paper_height = size margin_top, margin_right, margin_bottom, margin_left = margins units = units.lower() if units.startswith('inch'): units = 'Inches' plot_paper_units = 0 unit_factor = 25.4 # inch to mm elif units == 'mm': units = 'MM' plot_paper_units = 1 unit_factor = 1.0 else: raise DXFValueError('Supported units: "mm" and "inch"') # Setup PLOTSETTINGS # all paper sizes in mm dxf = self.dxf_layout.dxf dxf.page_setup_name = '' dxf.plot_configuration_file = device dxf.paper_size = '{0}_({1:.2f}_x_{2:.2f}_{3})'.format(name, paper_width, paper_height, units) dxf.left_margin = margin_left * unit_factor dxf.bottom_margin = margin_bottom * unit_factor dxf.right_margin = margin_right * unit_factor dxf.top_margin = margin_top * unit_factor dxf.paper_width = paper_width * unit_factor dxf.paper_height = paper_height * unit_factor dxf.scale_numerator = scale[0] dxf.scale_denominator = scale[1] dxf.plot_paper_units = plot_paper_units dxf.plot_rotation = rotation x_offset, y_offset = offset dxf.plot_origin_x_offset = x_offset * unit_factor # conversion to mm dxf.plot_origin_y_offset = y_offset * unit_factor # conversion to mm dxf.standard_scale_type = standard_scale dxf.unit_factor = 1. / unit_factor # 1/1 for mm; 1/25.4 ... for inch # Setup Layout self.reset_paper_limits() self.reset_extends() self.reset_viewports()