Added background image to pcb_print
- Enables the use of watermarks
This commit is contained in:
parent
0554742e86
commit
f4638fdc66
|
|
@ -11,7 +11,7 @@ import subprocess
|
|||
from pcbnew import B_Cu, F_Cu, FromMM, IsCopperLayer, PLOT_CONTROLLER, PLOT_FORMAT_SVG, wxSize, F_Mask, B_Mask
|
||||
from shutil import rmtree, which
|
||||
from tempfile import NamedTemporaryFile, mkdtemp
|
||||
from .svgutils.transform import fromstring, RectElement
|
||||
from .svgutils.transform import fromstring, RectElement, fromfile
|
||||
from .error import KiPlotConfigurationError
|
||||
from .gs import GS
|
||||
from .optionable import Optionable
|
||||
|
|
@ -314,6 +314,8 @@ class PCB_PrintOptions(VariantOptions):
|
|||
""" Add a background to the pages, see `background_color` """
|
||||
self.background_color = '#FFFFFF'
|
||||
""" Color for the background when `add_background` is enabled """
|
||||
self.background_image = ''
|
||||
""" Background image, must be an SVG, only when `add_background` is enabled """
|
||||
super().__init__()
|
||||
self._expand_id = 'assembly'
|
||||
|
||||
|
|
@ -359,6 +361,13 @@ class PCB_PrintOptions(VariantOptions):
|
|||
raise KiPlotConfigurationError("Missing page layout file: "+self.sheet_reference_layout)
|
||||
if self.add_background:
|
||||
self.validate_color('background_color')
|
||||
if self.background_image:
|
||||
if not os.path.isfile(self.background_image):
|
||||
raise KiPlotConfigurationError("Missing background image file: "+self.background_image)
|
||||
with open(self.background_image, 'rt') as f:
|
||||
ln = f.readline()
|
||||
if not ln.startswith('<?xml') and not ln.startswith('<!DOCTYPE svg'):
|
||||
raise KiPlotConfigurationError("Background image must be an SVG ({})".format(self.background_image))
|
||||
|
||||
def filter_components(self):
|
||||
if not self._comps:
|
||||
|
|
@ -706,6 +715,19 @@ class PCB_PrintOptions(VariantOptions):
|
|||
cnt = cnt+1
|
||||
logger.debug('- Filled {} polygons'.format(cnt))
|
||||
|
||||
def process_background(self, svg_out, width, height):
|
||||
""" Applies the background options """
|
||||
if not self.add_background:
|
||||
return
|
||||
if self.background_image:
|
||||
img = fromfile(self.background_image)
|
||||
w, h = get_size(img)
|
||||
root = img.getroot()
|
||||
root.moveto(0, 0)
|
||||
root.scale(width/w, height/h)
|
||||
svg_out.insert([root])
|
||||
svg_out.insert(RectElement(0, 0, width, height, color=self.background_color))
|
||||
|
||||
def merge_svg(self, input_folder, input_files, output_folder, output_file, p):
|
||||
""" Merge all pages into one """
|
||||
first = True
|
||||
|
|
@ -714,8 +736,8 @@ class PCB_PrintOptions(VariantOptions):
|
|||
file = os.path.join(input_folder, file)
|
||||
new_layer = fromstring(load_svg(file, color, p.colored_holes, p.holes_color, p.monochrome))
|
||||
width, height = get_size(new_layer)
|
||||
# Workaround for polygon fill on KiCad 5
|
||||
if GS.ki5() and file.endswith('frame.svg'):
|
||||
# Workaround for polygon fill on KiCad 5
|
||||
if p.monochrome:
|
||||
color = to_gray_hex(color)
|
||||
self.fill_polygons(new_layer, color)
|
||||
|
|
@ -724,8 +746,7 @@ class PCB_PrintOptions(VariantOptions):
|
|||
# This is the width declared at the beginning of the file
|
||||
base_width = width
|
||||
first = False
|
||||
if self.add_background:
|
||||
svg_out.append(RectElement(0, 0, width, height, color=self.background_color))
|
||||
self.process_background(svg_out, width, height)
|
||||
self.add_frame_images(svg_out, p.monochrome)
|
||||
else:
|
||||
root = new_layer.getroot()
|
||||
|
|
|
|||
|
|
@ -293,6 +293,13 @@ class SVGFigure(object):
|
|||
except AttributeError:
|
||||
self.root.append(GroupElement(element).root)
|
||||
|
||||
def insert(self, element, pos=0):
|
||||
"""Insert new element to the SVG figure, default is at the beginning"""
|
||||
try:
|
||||
self.root.insert(pos, element.root)
|
||||
except AttributeError:
|
||||
self.root.insert(pos, GroupElement(element).root)
|
||||
|
||||
def getroot(self):
|
||||
"""Return the root element of the figure.
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,67 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="297mm"
|
||||
height="210mm"
|
||||
viewBox="0 0 297 210"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
|
||||
sodipodi:docname="inkscape.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="-475.4461"
|
||||
inkscape:cy="271.72412"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2123"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Capa 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:9.36837px;line-height:1.25;font-family:sans-serif;fill:#cbcbcb;fill-opacity:1;stroke:none;stroke-width:0.23421;"
|
||||
x="-74.364159"
|
||||
y="183.57529"
|
||||
id="text835"
|
||||
transform="rotate(-36.240038)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan833"
|
||||
x="-74.364159"
|
||||
y="183.57529"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:31.228px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.23421;fill:#cbcbcb;fill-opacity:1;">CONFIDENTIAL</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="297mm" height="210mm" version="1.1" viewBox="0 0 297 210" xmlns="http://www.w3.org/2000/svg">
|
||||
<text transform="rotate(-36.24)" x="-74.364159" y="183.57529" fill="#cbcbcb" font-family="sans-serif" font-size="9.3684px" stroke-width=".23421" style="line-height:1.25" xml:space="preserve"><tspan x="-74.364159" y="183.57529" fill="#cbcbcb" font-family="sans-serif" font-size="31.228px" font-weight="bold" stroke-width=".23421" style="font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal">CONFIDENTIAL</tspan></text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 632 B |
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="297mm"
|
||||
height="210mm"
|
||||
viewBox="0 0 297 210"
|
||||
version="1.1"
|
||||
id="svg8">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:9.36837px;line-height:1.25;font-family:sans-serif;fill:#cbcbcb;fill-opacity:1;stroke:none;stroke-width:0.23421;"
|
||||
x="-74.364159"
|
||||
y="183.57529"
|
||||
id="text835"
|
||||
transform="rotate(-36.240038)"><tspan
|
||||
id="tspan833"
|
||||
x="-74.364159"
|
||||
y="183.57529"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:31.228px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.23421;fill:#cbcbcb;fill-opacity:1;">CONFIDENTIAL</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
File diff suppressed because it is too large
Load Diff
|
|
@ -18,6 +18,9 @@ outputs:
|
|||
keep_temporal_files: true
|
||||
add_background: true
|
||||
background_color: "#C5C4BF"
|
||||
# background_color: "#FFFFFF"
|
||||
background_image: "tests/data/confidential_optimized.svg"
|
||||
sheet_reference_layout: "${KIPRJMOD}/../../data/test_img.kicad_wks"
|
||||
pages:
|
||||
- # monochrome: true
|
||||
scaling: 2.0
|
||||
|
|
|
|||
Loading…
Reference in New Issue