- started to work on PDF import tool

This commit is contained in:
Marius Stanciu
2019-04-19 17:12:10 +03:00
committed by Marius
parent f7f52e3bec
commit 52fceae054
5 changed files with 189 additions and 2 deletions

View File

@@ -2007,8 +2007,10 @@ class App(QtCore.QObject):
self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport, self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport,
separator=True) separator=True)
self.pcb_wizard_tool = PcbWizard(self) self.pcb_wizard_tool = PcbWizard(self)
self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport, self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport)
separator=True)
self.pdf_tool = ToolPDF(self)
self.pdf_tool.install(icon=QtGui.QIcon('share/pdf32.png'), pos=self.ui.menufileimport)
self.log.debug("Tools are installed.") self.log.debug("Tools are installed.")

View File

@@ -9,7 +9,13 @@ CAD program, and create G-Code for Isolation routing.
================================================= =================================================
19.04.2019
- started to work on PDF import tool
18.04.2019 18.04.2019
- Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool
- Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions).
- Gerber Editor: Region Tool will add regions only in '0' aperture - Gerber Editor: Region Tool will add regions only in '0' aperture

178
flatcamTools/ToolPDF.py Normal file
View File

@@ -0,0 +1,178 @@
############################################################
# FlatCAM: 2D Post-processing for Manufacturing #
# http://flatcam.org #
# File Author: Marius Adrian Stanciu (c) #
# Date: 3/10/2019 #
# MIT Licence #
############################################################
from FlatCAMTool import FlatCAMTool
from FlatCAMObj import *
import math
import numpy as np
import scipy.interpolate
import zlib
import re
import gettext
import FlatCAMTranslation as fcTranslate
fcTranslate.apply_language('strings')
import builtins
if '_' not in builtins.__dict__:
_ = gettext.gettext
class ToolPDF(FlatCAMTool):
'''
Parse a PDF file.
Reference here: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
Return a list of geometries
'''
toolName = _("PDF Import Tool")
def __init__(self, app):
FlatCAMTool.__init__(self, app)
self.app = app
self.step_per_circles = self.app.defaults["gerber_circle_steps"]
self.stream_re = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S)
# detect 'w' command
self.strokewidth_re = re.compile(r'^(\d+\.?\d*)\s*w$')
# detect 're' command
self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sre$')
# detect 'm' command
self.start_path_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sm$')
# detect 'l' command
self.draw_line_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sl')
# detect 'c' command
self.draw_arc_3pt_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sc$')
# detect 'v' command
self.draw_arc_2pt_23_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sv$')
# detect 'y' command
self.draw_arc_2pt_13_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sy$')
# detect 'h' command
self.end_path_re = re.compile(r'^h$')
self.pdf_parsed = ''
def run(self, toggle=True):
self.app.report_usage("ToolPDF()")
# if toggle:
# # if the splitter is hidden, display it, else hide it but only if the current widget is the same
# if self.app.ui.splitter.sizes()[0] == 0:
# self.app.ui.splitter.setSizes([1, 1])
# else:
# try:
# if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName:
# self.app.ui.splitter.setSizes([0, 1])
# except AttributeError:
# pass
# else:
# if self.app.ui.splitter.sizes()[0] == 0:
# self.app.ui.splitter.setSizes([1, 1])
#
# FlatCAMTool.run(self)
self.set_tool_ui()
self.on_open_pdf_click()
# self.app.ui.notebook.setTabText(2, "PDF Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+Q', **kwargs)
def set_tool_ui(self):
pass
def on_open_pdf_click(self):
"""
File menu callback for opening an PDF file.
:return: None
"""
self.app.report_usage("ToolPDF.on_open_pdf_click()")
self.app.log.debug("ToolPDF.on_open_pdf_click()")
_filter_ = "Adobe PDF Files (*.pdf);;" \
"All Files (*.*)"
try:
filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"),
directory=self.app.get_last_folder(), filter=_filter_)
except TypeError:
filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"), filter=_filter_)
filenames = [str(filename) for filename in filenames]
if len(filenames) == 0:
self.app.inform.emit(_("[WARNING_NOTCL] Open PDF cancelled."))
else:
for filename in filenames:
if filename != '':
self.app.worker_task.emit({'fcn': self.open_pdf,
'params': [filename]})
def open_pdf(self, filename):
def obj_init(grb_obj, app_obj):
with open(filename, "rb") as f:
pdf = f.read()
for s in re.findall(self.stream_re, pdf):
s = s.strip(b'\r\n')
try:
self.pdf_parsed += zlib.decompress(s).decode('UTF-8')
except:
pass
grb_obj.solid_geometry = [self.bezier_to_linestring(0, 0, 0, 0)]
with self.app.proc_container.new(_("Opening PDF.")):
# obj_init()
self.parse_pdf()
ret = self.app.new_object("geometry", "bla", obj_init, autoselected=False)
# Register recent file
self.app.file_opened.emit("geometry", "bla")
# # Object name
# name = outname or filename.split('/')[-1].split('\\')[-1]
#
# ret = self.new_object("excellon", name, obj_init, autoselected=False)
# if ret == 'fail':
# self.inform.emit(_('[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file.'))
# return
#
# # Register recent file
# self.file_opened.emit("excellon", filename)
#
# # GUI feedback
# self.inform.emit(_("[success] Opened: %s") % filename)
# # self.progress.emit(100)
def parse_pdf(self):
for pline in self.pdf_parsed:
pass
def bezier_to_linestring(self, start, stop, c1, c2):
"""
From here: https://gis.stackexchange.com/questions/106937/python-library-or-algorithm-to-generate-arc-geometry-from-three-coordinate-pairs
:return: LineString geometry
"""
coords = np.array([[0, 0], [25, 10], [33, 39], [53, 53]])
# equation Bezier, page 184 PDF 1.4 reference
# https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
# R(t) = P0*(1 - t) ** 3 + P1*3*t*(1 - 5) ** 2 + P2 * 3*(1 - t) * t ** 2 + P3*t ** 3
domain = []
i = 0
while i <=1:
domain.append(i)
for i in domain:
return even_line

View File

@@ -15,5 +15,6 @@ from flatcamTools.ToolNonCopperClear import NonCopperClear
from flatcamTools.ToolTransform import ToolTransform from flatcamTools.ToolTransform import ToolTransform
from flatcamTools.ToolSolderPaste import SolderPaste from flatcamTools.ToolSolderPaste import SolderPaste
from flatcamTools.ToolPcbWizard import PcbWizard from flatcamTools.ToolPcbWizard import PcbWizard
from flatcamTools.ToolPDF import ToolPDF
from flatcamTools.ToolShell import FCShell from flatcamTools.ToolShell import FCShell

BIN
share/pdf32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB