This commit is contained in:
Chenwenxuan
2024-03-06 14:54:30 +08:00
commit edac2715f0
1525 changed files with 809982 additions and 0 deletions

View File

@@ -0,0 +1,257 @@
/******************************************************************************
**
** This file was created for the LibreCAD project, a 2D CAD program.
**
** Copyright (C) 2018 Alexander Pravdin <aledin@mail.ru>
** Copyright (C) 2022 A. Stebich (librecad@mail.lordofbikes.de)
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file gpl-2.0.txt included in the
** packaging of this file.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**
** This copyright notice MUST APPEAR in all copies of the script!
**
******************************************************************************/
#include <QtCore>
#include <QCoreApplication>
#include <QApplication>
#include "rs_debug.h"
#include "rs_fontlist.h"
#include "rs_patternlist.h"
#include "rs_settings.h"
#include "rs_system.h"
#include "main.h"
#include "console_dxf2pdf.h"
#include "pdf_print_loop.h"
static RS_Vector parsePageSizeArg(QString);
static void parsePagesNumArg(QString, PdfPrintParams&);
static void parseMarginsArg(QString, PdfPrintParams&);
int console_dxf2pdf(int argc, char* argv[])
{
RS_DEBUG->setLevel(RS_Debug::D_NOTHING);
QApplication app(argc, argv);
QCoreApplication::setOrganizationName("LibreCAD");
QCoreApplication::setApplicationName("LibreCAD");
QCoreApplication::setApplicationVersion(XSTR(LC_VERSION));
QFileInfo prgInfo(QFile::decodeName(argv[0]));
RS_SETTINGS->init(app.organizationName(), app.applicationName());
RS_SYSTEM->init( app.applicationName(), app.applicationVersion(), XSTR(QC_APPDIR), argv[0]);
QCommandLineParser parser;
QStringList appDesc;
QString librecad( prgInfo.filePath());
if (prgInfo.baseName() != "dxf2pdf") {
librecad += " dxf2pdf"; // executable is not dxf2pdf, thus argv[1] must be 'dxf2pdf'
appDesc << "";
appDesc << "dxf2pdf " + QObject::tr( "usage: ") + librecad + QObject::tr( " [options] <dxf_files>");
}
appDesc << "";
appDesc << "Print a bunch of DXF files to PDF file(s).";
appDesc << "";
appDesc << "Examples:";
appDesc << "";
appDesc << " " + librecad + QObject::tr( " *.dxf");
appDesc << " " + QObject::tr( "-- print all dxf files to pdf files with the same names.");
appDesc << "";
appDesc << " " + librecad + QObject::tr( " -o some.pdf *.dxf");
appDesc << " " + QObject::tr( "-- print all dxf files to 'some.pdf' file.");
parser.setApplicationDescription( appDesc.join( "\n"));
parser.addHelpOption();
parser.addVersionOption();
QCommandLineOption fitOpt(QStringList() << "a" << "fit",
QObject::tr( "Auto fit and center drawing to page."));
parser.addOption(fitOpt);
QCommandLineOption centerOpt(QStringList() << "c" << "center",
QObject::tr( "Auto center drawing on page."));
parser.addOption(centerOpt);
QCommandLineOption grayOpt(QStringList() << "k" << "grayscale",
QObject::tr( "Print grayscale."));
parser.addOption(grayOpt);
QCommandLineOption monoOpt(QStringList() << "m" << "monochrome",
QObject::tr( "Print monochrome (black/white)."));
parser.addOption(monoOpt);
QCommandLineOption pageSizeOpt(QStringList() << "p" << "paper",
QObject::tr( "Paper size (Width x Height) in mm.", "WxH"));
parser.addOption(pageSizeOpt);
QCommandLineOption resOpt(QStringList() << "r" << "resolution",
QObject::tr( "Output resolution (DPI).", "integer"));
parser.addOption(resOpt);
QCommandLineOption scaleOpt(QStringList() << "s" << "scale",
QObject::tr( "Output scale. E.g.: 0.01 (for 1:100 scale)."), "double");
parser.addOption(scaleOpt);
QCommandLineOption marginsOpt(QStringList() << "f" << "margins",
QObject::tr( "Paper margins in mm (integer or float)."), "L,T,R,B");
parser.addOption(marginsOpt);
QCommandLineOption pagesNumOpt(QStringList() << "z" << "pages",
QObject::tr( "Print on multiple pages (Horiz. x Vert.)."), "HxV");
parser.addOption(pagesNumOpt);
QCommandLineOption outFileOpt(QStringList() << "o" << "outfile",
QObject::tr( "Output PDF file.", "file"));
parser.addOption(outFileOpt);
QCommandLineOption outDirOpt(QStringList() << "t" << "directory",
QObject::tr( "Target output directory."), "path");
parser.addOption(outDirOpt);
parser.addPositionalArgument(QObject::tr( "<dxf_files>"), QObject::tr( "Input DXF file(s)"));
parser.process(app);
const QStringList args = parser.positionalArguments();
if (args.isEmpty() || (args.size() == 1 && args[0] == "dxf2pdf"))
parser.showHelp(EXIT_FAILURE);
PdfPrintParams params;
params.fitToPage = parser.isSet(fitOpt);
params.centerOnPage = parser.isSet(centerOpt);
params.grayscale = parser.isSet(grayOpt);
params.monochrome = parser.isSet(monoOpt);
params.pageSize = parsePageSizeArg(parser.value(pageSizeOpt));
bool resOk;
int res = parser.value(resOpt).toInt(&resOk);
if (resOk)
params.resolution = res;
bool scaleOk;
double scale = parser.value(scaleOpt).toDouble(&scaleOk);
if (scaleOk)
params.scale = scale;
parseMarginsArg(parser.value(marginsOpt), params);
parsePagesNumArg(parser.value(pagesNumOpt), params);
params.outFile = parser.value(outFileOpt);
params.outDir = parser.value(outDirOpt);
for (auto arg : args) {
QFileInfo dxfFileInfo(arg);
if (dxfFileInfo.suffix().toLower() != "dxf")
continue; // Skip files without .dxf extension
params.dxfFiles.append(arg);
}
if (params.dxfFiles.isEmpty())
parser.showHelp(EXIT_FAILURE);
if (!params.outDir.isEmpty()) {
// Create output directory
if (!QDir().mkpath(params.outDir)) {
qDebug() << "ERROR: Cannot create directory" << params.outDir;
return EXIT_FAILURE;
}
}
RS_FONTLIST->init();
RS_PATTERNLIST->init();
PdfPrintLoop *loop = new PdfPrintLoop(params, &app);
QObject::connect(loop, SIGNAL(finished()), &app, SLOT(quit()));
QTimer::singleShot(0, loop, SLOT(run()));
return app.exec();
}
static RS_Vector parsePageSizeArg(QString arg)
{
RS_Vector v(0.0, 0.0);
if (arg.isEmpty())
return v;
QRegularExpression re("^(?<width>\\d+)[x|X]{1}(?<height>\\d+)$");
QRegularExpressionMatch match = re.match(arg);
if (match.hasMatch()) {
QString width = match.captured("width");
QString height = match.captured("height");
v.x = width.toDouble();
v.y = height.toDouble();
} else {
qDebug() << "WARNING: Ignoring bad page size:" << arg;
}
return v;
}
static void parsePagesNumArg(QString arg, PdfPrintParams& params)
{
if (arg.isEmpty())
return;
QRegularExpression re("^(?<horiz>\\d+)[x|X](?<vert>\\d+)$");
QRegularExpressionMatch match = re.match(arg);
if (match.hasMatch()) {
QString h = match.captured("horiz");
QString v = match.captured("vert");
params.pagesH = h.toInt();
params.pagesV = v.toInt();
} else {
qDebug() << "WARNING: Ignoring bad number of pages:" << arg;
}
}
static void parseMarginsArg(QString arg, PdfPrintParams& params)
{
if (arg.isEmpty())
return;
QRegularExpression re("^(?<left>\\d+(?:\\.\\d+)?),"
"(?<top>\\d+(?:\\.\\d+)?),"
"(?<right>\\d+(?:\\.\\d+)?),"
"(?<bottom>\\d+(?:\\.\\d+)?)$");
QRegularExpressionMatch match = re.match(arg);
if (match.hasMatch()) {
QString left = match.captured("left");
QString top = match.captured("top");
QString right = match.captured("right");
QString bottom = match.captured("bottom");
params.margins.left = left.toDouble();
params.margins.top = top.toDouble();
params.margins.right = right.toDouble();
params.margins.bottom = bottom.toDouble();
} else {
qDebug() << "WARNING: Ignoring bad paper margins:" << arg;
}
}