diff --git a/.gitignore b/.gitignore index 965f90d..70d0720 100644 --- a/.gitignore +++ b/.gitignore @@ -18,10 +18,12 @@ *.pro.user.* *.moc moc_*.cpp +moc_*.h qrc_*.cpp ui_*.h Makefile* *-build-* +pcb2gcodegui_plugin_import.cpp # QtCreator @@ -30,3 +32,8 @@ Makefile* #QtCtreator Qml *.qmlproject.user *.qmlproject.user.* + +# Output files and executables +release/ +pcb2gcodeGUI +pcb2gcode diff --git a/README.md b/README.md index 4a49be2..a5aa1c1 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,22 @@ A GUI for [pcb2gcode](https://github.com/pcb2gcode/pcb2gcode). sudo apt-get install build-essential git qt5-default libqt5svg5-dev git clone https://github.com/pcb2gcode/pcb2gcodeGUI.git + +Then follow the common steps + +### Build on Ubuntu Jammy Jellyfish or newer + sudo apt install build-essential git qmake6 qt6-base-dev qt6-svg-dev + git clone https://github.com/pcb2gcode/pcb2gcodeGUI.git + +Then follow the common steps + +### Common steps cd pcb2gcodeGUI/ qmake make sudo make install -Now follow the installations in the pcb2gcode's [README](https://github.com/pcb2gcode/pcb2gcode/blob/master/README.md) +Now follow the installations in pcb2gcode's [README](https://github.com/pcb2gcode/pcb2gcode/blob/master/README.md) and install pcb2gcode. Now you can run pcb2gcodeGUI with diff --git a/argaction.cpp b/argaction.cpp index 76a90f4..9da17c3 100755 --- a/argaction.cpp +++ b/argaction.cpp @@ -157,16 +157,17 @@ bool argBase::getEnabled() return object->button(0)->isEnabled(); } -QStringList argAction::getAllArgs(const QString prepend, bool getCommentedOptions) +QStringList argAction::getAllArgs(bool getCommentedOptions) { QStringList output; QString value; + const QString prepend = getCommentedOptions ? "" : "--"; for (QMap::const_iterator i = objects.constBegin(); i != objects.constEnd(); i++) { value = i.value()->getValue(); - if ( !value.isEmpty() ) + if ( !value.isEmpty() && !isDefault(i.key())) { if( i.value()->getEnabled() ) output << prepend + i.key() + '=' + value; diff --git a/argaction.h b/argaction.h index 15a5adc..cfdc8dc 100755 --- a/argaction.h +++ b/argaction.h @@ -85,7 +85,7 @@ template <> bool argBase::getEnabled(); class argAction { public: - QStringList getAllArgs(const QString prepend, bool getCommentedOptions); + QStringList getAllArgs(bool getCommentedOptions=false); inline bool setValue(const QString key, const QString value) { @@ -103,13 +103,26 @@ class argAction { } template - inline void insert(const QString argName, T *object) + inline void insert(const QString argName, T *object, QString defaultValue1="", QString defaultValue2="") { objects.insert(argName, new argBase(object)); + if(defaultValue1.length() > 0) + { + defaultValues1.insert(argName, defaultValue1); + if(defaultValue2.length() > 0) + defaultValues2.insert(argName, defaultValue2); + } + } + + inline bool isDefault(const QString key) + { + return objects.value(key)->getValue() == defaultValues1.value(key) || objects.value(key)->getValue() == defaultValues2.value(key); } protected: QMap objects; + QMap defaultValues1; + QMap defaultValues2; }; #endif // ARGACTION_H diff --git a/graphics_view_zoom.cpp b/graphics_view_zoom.cpp index 2867728..e78d6b9 100644 --- a/graphics_view_zoom.cpp +++ b/graphics_view_zoom.cpp @@ -63,7 +63,7 @@ bool Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) QWheelEvent* wheel_event = static_cast(event); if (QApplication::keyboardModifiers() == modifiers) { - if (wheel_event->orientation() == Qt::Vertical) + if (wheel_event->angleDelta().y() != 0) // Avoid zooming if wheel event is not vertical { double angle = wheel_event->angleDelta().y(); double factor = qPow(zoom_factor_base, angle); diff --git a/mainwindow.cpp b/mainwindow.cpp index 4ced834..1486a6d 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016 Nicola Corna (nicola@corna.info) + * Copyright (c) 2025 Enrique Condes (kosmerebel@gmail.com) * * This file is part of pcb2gcodeGUI. * @@ -32,7 +33,7 @@ #include "settings.h" -const QString MainWindow::names[] = { "File", "Common", "Mill", "Drill", "Outline", "Autoleveller" }; +const QString MainWindow::names[] = { "File", "Common", "Mill", "Drill", "Outline", "Autoleveller", "Optimisations" }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -70,38 +71,57 @@ MainWindow::MainWindow(QWidget *parent) : args[ FILEARGS ].insert("preamble", ui->preambleLineEdit); args[ FILEARGS ].insert("preamble-text", ui->preambletextLineEdit); args[ FILEARGS ].insert("postamble", ui->postambleLineEdit); + args[ FILEARGS ].insert("basename", ui->basenameLineEdit); args[ FILEARGS ].insert("output-dir", ui->outputDirLineEdit); + args[ FILEARGS ].insert("no-export", ui->noExportCheckBox, "false"); - args[ COMMONARGS ].insert("metric", &inputUnits); - args[ COMMONARGS ].insert("metricoutput", &outputUnits); + args[ COMMONARGS ].insert("metric", &inputUnits, "false"); + args[ COMMONARGS ].insert("metricoutput", &outputUnits, "false"); args[ COMMONARGS ].insert("zsafe", ui->zsafeDoubleSpinBox); args[ COMMONARGS ].insert("zchange", ui->zchangeDoubleSpinBox); - args[ COMMONARGS ].insert("zchange-absolute", ui->zchangeAbsoluteCheckBox); - args[ COMMONARGS ].insert("nog64", ui->nog64CheckBox); + args[ COMMONARGS ].insert("zchange-absolute", ui->zchangeAbsoluteCheckBox, "false"); + args[ COMMONARGS ].insert("nog64", ui->nog64CheckBox, "false"); args[ COMMONARGS ].insert("tolerance", ui->toleranceDoubleSpinBox); - args[ COMMONARGS ].insert("optimise", ui->optimiseDoubleSpinBox); - args[ COMMONARGS ].insert("zero-start", ui->zerostartCheckBox); - args[ COMMONARGS ].insert("mirror-axis", ui->mirroraxisDoubleSpinBox); - args[ COMMONARGS ].insert("mirror-yaxis", ui->mirroryaxisCheckBox); - args[ COMMONARGS ].insert("tile-x", ui->tilexSpinBox); - args[ COMMONARGS ].insert("tile-y", ui->tileySpinBox); + args[ COMMONARGS ].insert("optimise", ui->optimiseDoubleSpinBox, "0.0025", "0.0001"); + args[ COMMONARGS ].insert("zero-start", ui->zerostartCheckBox, "false"); + args[ COMMONARGS ].insert("mirror-axis", ui->mirroraxisDoubleSpinBox, "0.0000"); + args[ COMMONARGS ].insert("mirror-yaxis", ui->mirroryaxisCheckBox, "false"); + args[ COMMONARGS ].insert("tile-x", ui->tilexSpinBox, "1"); + args[ COMMONARGS ].insert("tile-y", ui->tileySpinBox, "1"); + args[ COMMONARGS ].insert("x-offset", ui->offsetXDoubleSpinBox, "0.0000"); + args[ COMMONARGS ].insert("y-offset", ui->offsetYDoubleSpinBox, "0.0000"); + args[ COMMONARGS ].insert("spinup-time", ui->spinupDoubleSpinBox, "0.0010"); + args[ COMMONARGS ].insert("spindown-time", ui->spindownDoubleSpinBox); args[ MILLARGS ].insert("zwork", ui->zworkDoubleSpinBox); args[ MILLARGS ].insert("mill-feed", ui->millfeedSpinBox); args[ MILLARGS ].insert("mill-speed", ui->millspeedSpinBox); - args[ MILLARGS ].insert("offset", ui->offsetDoubleSpinBox); - args[ MILLARGS ].insert("voronoi", ui->voronoiCheckBox); - args[ MILLARGS ].insert("extra-passes", ui->extrapassesSpinBox); + args[ MILLARGS ].insert("offset", ui->offsetDoubleSpinBox, "0.0000"); + args[ MILLARGS ].insert("voronoi", ui->voronoiCheckBox, "false"); + args[ MILLARGS ].insert("preserve-thermal-reliefs", ui->preserveThermalRelievesCheckBox, "true"); + args[ MILLARGS ].insert("isolation-width", ui->isolationwidthDoubleSpinBox, "0.0000"); + args[ MILLARGS ].insert("mill-diameters", ui->milldiametersLineEdit, "0mm", "0inch"); + args[ MILLARGS ].insert("milling-overlap", ui->milloverlapLineEdit, "50%"); + args[ MILLARGS ].insert("pre-milling-gcode", ui->premillingcodeLineEdit); + args[ MILLARGS ].insert("post-milling-gcode", ui->postmillingcodeLineEdit); + args[ MILLARGS ].insert("mill-vertfeed", ui->millvertfeedSpinBox, "0"); + args[ MILLARGS ].insert("mill-infeed", ui->millinfeedDoubleSpinBox, "0.0000"); + args[ MILLARGS ].insert("mill-feed-direction", ui->millingdirectionComboBox, "any"); + args[ MILLARGS ].insert("invert-gerbers", ui->invertgerbersCheckBox, "false"); + args[ MILLARGS ].insert("draw-gerber-lines", ui->drawgerberlinesCheckBox, "false"); args[ DRILLARGS ].insert("zdrill", ui->zdrillDoubleSpinBox); args[ DRILLARGS ].insert("drill-feed", ui->drillfeedSpinBox); args[ DRILLARGS ].insert("drill-speed", ui->drillspeedSpinBox); - args[ DRILLARGS ].insert("milldrill", ui->milldrillCheckBox); + args[ DRILLARGS ].insert("min-milldrill-hole-diameter", ui->milldrillholediameterDoubleSpinBox, "0.0000"); args[ DRILLARGS ].insert("milldrill-diameter", ui->milldrilldiameterDoubleSpinBox); - args[ DRILLARGS ].insert("drill-side", ui->drillsideComboBox); - args[ DRILLARGS ].insert("onedrill", ui->onedrillCheckBox); - args[ DRILLARGS ].insert("nog81", ui->nog81CheckBox); - args[ DRILLARGS ].insert("nog91-1", ui->nog911CheckBox); + args[ DRILLARGS ].insert("zmilldrill", ui->zmilldrillDoubleSpinBox); + args[ DRILLARGS ].insert("drill-side", ui->drillsideComboBox, "auto"); + args[ DRILLARGS ].insert("onedrill", ui->onedrillCheckBox, "false"); + args[ DRILLARGS ].insert("drills-available", ui->drillsAvailableLineEdit); + args[ DRILLARGS ].insert("nom6", ui->nom6CheckBox, "false"); + args[ DRILLARGS ].insert("nog81", ui->nog81CheckBox, "false"); + args[ DRILLARGS ].insert("nog91-1", ui->nog911CheckBox, "false"); args[ OUTLINEARGS ].insert("cutter-diameter", ui->cutterdiameterDoubleSpinBox); args[ OUTLINEARGS ].insert("zcut", ui->zcutDoubleSpinBox); @@ -109,11 +129,11 @@ MainWindow::MainWindow(QWidget *parent) : args[ OUTLINEARGS ].insert("cut-speed", ui->cutspeedSpinBox); args[ OUTLINEARGS ].insert("cut-infeed", ui->cutinfeedDoubleSpinBox); args[ OUTLINEARGS ].insert("cut-vertfeed", ui->cutvertfeedSpinBox); - args[ OUTLINEARGS ].insert("bridges", ui->bridgesDoubleSpinBox); + args[ OUTLINEARGS ].insert("bridges", ui->bridgesDoubleSpinBox, "0.0000"); args[ OUTLINEARGS ].insert("zbridges", ui->zbridgesDoubleSpinBox); - args[ OUTLINEARGS ].insert("bridgesnum", ui->bridgesnumSpinBox); - args[ OUTLINEARGS ].insert("cut-side", ui->cutsideComboBox); - args[ OUTLINEARGS ].insert("fill-outline", ui->filloutlineCheckBox); + args[ OUTLINEARGS ].insert("bridgesnum", ui->bridgesnumSpinBox, "2"); + args[ OUTLINEARGS ].insert("cut-side", ui->cutsideComboBox, "auto"); + args[ OUTLINEARGS ].insert("fill-outline", ui->filloutlineCheckBox, "true"); args[ AUTOLEVELLERARGS ].insert("al-front", ui->alfrontCheckBox); args[ AUTOLEVELLERARGS ].insert("al-back", ui->albackCheckBox); @@ -123,9 +143,17 @@ MainWindow::MainWindow(QWidget *parent) : args[ AUTOLEVELLERARGS ].insert("al-probefeed", ui->alprobefeedSpinBox); args[ AUTOLEVELLERARGS ].insert("al-probe-on", ui->alprobeonLineEdit); args[ AUTOLEVELLERARGS ].insert("al-probe-off", ui->alprobeoffLineEdit); - args[ AUTOLEVELLERARGS ].insert("al-probecode", ui->alprobecodeLineEdit); - args[ AUTOLEVELLERARGS ].insert("al-probevar", ui->alprobevarSpinBox); - args[ AUTOLEVELLERARGS ].insert("al-setzzero", ui->alsetzzeroLineEdit); + args[ AUTOLEVELLERARGS ].insert("al-probecode", ui->alprobecodeLineEdit, "G31"); + args[ AUTOLEVELLERARGS ].insert("al-probevar", ui->alprobevarSpinBox, "2002"); + args[ AUTOLEVELLERARGS ].insert("al-setzzero", ui->alsetzzeroLineEdit, "G92 Z0"); + + args[ OPTIMISEARGS ].insert("eulerian-paths", ui->eulerianCheckBox, "true"); + args[ OPTIMISEARGS ].insert("vectorial", ui->vectorialCheckBox, "true"); + args[ OPTIMISEARGS ].insert("tsp-2opt", ui->tsp2optCheckBox, "true"); + args[ OPTIMISEARGS ].insert("path-finding-limit", ui->pathfindinglimitSpinBox, "1"); + args[ OPTIMISEARGS ].insert("g0-vertical-speed", ui->g0verticalspeedSpinBox, "1270", "50"); + args[ OPTIMISEARGS ].insert("g0-horizontal-speed", ui->g0horizontalspeedSpinBox, "2540", "100"); + args[ OPTIMISEARGS ].insert("backtrack", ui->backtrackSpinBox, "0"); connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(close())); connect(ui->actionShow_command_line_arguments, SIGNAL(triggered(bool)), this, SLOT(menu_showCommandLineArguments())); @@ -149,14 +177,22 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->outputDirPushButton, SIGNAL(clicked()), this, SLOT(getOutputDirectory())); connect(ui->voronoiCheckBox, SIGNAL(toggled(bool)), this, SLOT(voronoiEnable(bool))); - connect(ui->milldrillCheckBox, SIGNAL(toggled(bool)), ui->milldrilldiameterDoubleSpinBox, SLOT(setEnabled(bool))); + connect(ui->tsp2optCheckBox, SIGNAL(toggled(bool)), this, SLOT(milldirectionEnable(bool))); + connect(ui->milldrillholediameterDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(enableMilldrill(double))); + connect(ui->onedrillCheckBox, SIGNAL(toggled(bool)), this, SLOT(drillListDisable(bool))); + connect(ui->drillsAvailableLineEdit, SIGNAL(textChanged(QString)), this, SLOT(enableNoM6(QString))); connect(ui->softwareComboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(updateAlCustomEnableState(QString))); connect(ui->startPushButton, SIGNAL(clicked()), this, SLOT(startPcb2gcode())); connect(ui->inputMetricRadioButton, SIGNAL(toggled(bool)), this, SLOT(changeMetricInputUnits(bool))); connect(&pcb2gcodeProcess, SIGNAL(finished(int)), this, SLOT(pcb2gcodeStopped())); + // Keep compatibility with Qt 5 + #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(&pcb2gcodeProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(pcb2gcodeError(QProcess::ProcessError))); + #else + connect(&pcb2gcodeProcess, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(pcb2gcodeError(QProcess::ProcessError))); + #endif connect(&pcb2gcodeProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); connect(&pcb2gcodeProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(changeKillCloseButtonText(QProcess::ProcessState))); @@ -165,7 +201,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(&pcb2gcodeProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(imagesGenerated(int,QProcess::ExitStatus))); connect(ui->imageComboBox, SIGNAL(activated(int)), this, SLOT(imageSelected(int))); - appDataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + appDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); if (appDataLocation.isEmpty()) QMessageBox::information(this, tr("Error"), tr("Can't retrieve standard folder location")); else @@ -233,19 +269,43 @@ void MainWindow::checkPcb2gcodeVersion() " v%1.%2.%3, but v%4.%5.%6 has been detected.\n" "Some features may not work."); - warningBox->warning(this, tr("Old " PCB2GCODE_COMMAND_NAME " detected"), - warningMessage.arg(targetVersion[0]).arg(targetVersion[1]).arg(targetVersion[2]) - .arg(versionNumbers[0]).arg(versionNumbers[1]).arg(versionNumbers[2]), - tr("Got it, let's try anyways")); + warningBox->setIcon(QMessageBox::Warning); + warningBox->setWindowTitle(tr("Old " PCB2GCODE_COMMAND_NAME " detected")); + warningBox->setText(warningMessage.arg(targetVersion[0]).arg(targetVersion[1]).arg(targetVersion[2]) + .arg(versionNumbers[0]).arg(versionNumbers[1]).arg(versionNumbers[2])); + warningBox->addButton(tr("Got it, let's try anyways"), QMessageBox::AcceptRole); warningBox->setFixedSize(600,200); + warningBox->exec(); } } } -void MainWindow::voronoiEnable(bool enable) -{ - ui->extrapassesSpinBox->setEnabled(!enable); +void MainWindow::voronoiEnable(bool enable) { + ui->isolationwidthDoubleSpinBox->setEnabled(!enable); ui->offsetDoubleSpinBox->setEnabled(!enable); + ui->preserveThermalRelievesCheckBox->setEnabled(enable); + if(!enable) { + ui->preserveThermalRelievesCheckBox->setChecked(true); + } +} + +void MainWindow::milldirectionEnable(bool enable) { + ui->millingdirectionComboBox->setEnabled(!enable); +} + +void MainWindow::enableMilldrill(double value) { + ui->milldrilldiameterDoubleSpinBox->setEnabled(value > 0.0); + ui->zmilldrillDoubleSpinBox->setEnabled(value > 0.0); +} + +void MainWindow::drillListDisable(bool disable) { + ui->drillsAvailableLabel->setVisible(!disable); + ui->drillsAvailableLineEdit->setVisible(!disable); + ui->nom6CheckBox->setVisible(!disable); +} + +void MainWindow::enableNoM6(QString text) { + ui->nom6CheckBox->setEnabled(text.trimmed().length()>0); } void MainWindow::bridgesAvailable() @@ -484,21 +544,23 @@ void MainWindow::changeMetricInputUnits(bool metric) ui->zcutDoubleSpinBox, ui->cutinfeedDoubleSpinBox, ui->bridgesDoubleSpinBox, ui->zbridgesDoubleSpinBox, ui->alxDoubleSpinBox, ui->alyDoubleSpinBox, ui->toleranceDoubleSpinBox, ui->optimiseDoubleSpinBox, - ui->mirroraxisDoubleSpinBox }; + ui->mirroraxisDoubleSpinBox, ui->isolationwidthDoubleSpinBox, ui->offsetXDoubleSpinBox, + ui->offsetYDoubleSpinBox, ui->milldrillholediameterDoubleSpinBox, ui->milldrilldiameterDoubleSpinBox, + ui->zmilldrillDoubleSpinBox, ui->millinfeedDoubleSpinBox }; - QSpinBox *spinBoxes[] = { ui->millfeedSpinBox, ui->drillfeedSpinBox, ui->cutfeedSpinBox, ui->cutvertfeedSpinBox, ui->alprobefeedSpinBox }; + QSpinBox *spinBoxes[] = { ui->millfeedSpinBox, ui->drillfeedSpinBox, ui->cutfeedSpinBox, ui->cutvertfeedSpinBox, ui->alprobefeedSpinBox, + ui->g0verticalspeedSpinBox, ui->g0horizontalspeedSpinBox, ui->backtrackSpinBox, ui->millvertfeedSpinBox }; const unsigned int doubleSpinBoxesLen = sizeof(doubleSpinBoxes) / sizeof(doubleSpinBoxes[0]); const unsigned int spinBoxesLen = sizeof(spinBoxes) / sizeof(spinBoxes[0]); const double cfactor = metric ? 25.4 : 1/25.4; - const char *distance = metric ? " mm" : " in" ; - const char *speed = metric ? " mm/min" : " in/min" ; + const char *unit = metric ? " mm" : " in" ; for( unsigned int i = 0; i < doubleSpinBoxesLen; i++ ) - adjustMetricImperial( doubleSpinBoxes[i], cfactor, distance ); + adjustMetricImperial( doubleSpinBoxes[i], cfactor, unit ); for( unsigned int i = 0; i < spinBoxesLen; i++ ) - adjustMetricImperial( spinBoxes[i], cfactor, speed ); + adjustMetricImperial( spinBoxes[i], cfactor, unit ); } void MainWindow::adjustMetricImperial(QSpinBox *spinBox, const double cfactor, const QString suffix) @@ -518,7 +580,7 @@ void MainWindow::adjustMetricImperial(QSpinBox *spinBox, const double cfactor, c spinBox->setValue( round( value * cfactor ) ); } - spinBox->setSuffix(suffix); + spinBox->setSuffix(suffix + (spinBox->suffix().contains("/min",Qt::CaseInsensitive) ? "/min" : "/s")); } void MainWindow::adjustMetricImperial(QDoubleSpinBox *doubleSpinBox, const double cfactor, const QString suffix) @@ -544,28 +606,30 @@ void MainWindow::adjustMetricImperial(QDoubleSpinBox *doubleSpinBox, const doubl doubleSpinBox->setDecimals(doubleSpinBox->decimals() - 1); } - doubleSpinBox->setSuffix(suffix); + doubleSpinBox->setSuffix(suffix + (doubleSpinBox->suffix().contains("/min",Qt::CaseInsensitive) ? "/min" : "")); } QStringList MainWindow::getCmdLineArguments() { QStringList arguments; - arguments += args[ FILEARGS ].getAllArgs("--", false); - arguments += args[ COMMONARGS ].getAllArgs("--", false); + arguments += args[ FILEARGS ].getAllArgs(); + arguments += args[ COMMONARGS ].getAllArgs(); if( !ui->frontLineEdit->text().isEmpty() || !ui->backLineEdit->text().isEmpty() ) - arguments += args[ MILLARGS ].getAllArgs("--", false); + arguments += args[ MILLARGS ].getAllArgs(); if( !ui->drillLineEdit->text().isEmpty() ) - arguments += args[ DRILLARGS ].getAllArgs("--", false); + arguments += args[ DRILLARGS ].getAllArgs(); - if( !ui->outlineLineEdit->text().isEmpty() || ui->milldrillCheckBox->isChecked() ) - arguments += args[ OUTLINEARGS ].getAllArgs("--", false); + if( !ui->outlineLineEdit->text().isEmpty() || ui->milldrillholediameterDoubleSpinBox->value() > 0 ) + arguments += args[ OUTLINEARGS ].getAllArgs(); if ( (ui->alfrontCheckBox->isChecked() || ui->albackCheckBox->isChecked()) && (!ui->frontLineEdit->text().isEmpty() || !ui->backLineEdit->text().isEmpty()) ) - arguments += args[ AUTOLEVELLERARGS ].getAllArgs("--", false); + arguments += args[ AUTOLEVELLERARGS ].getAllArgs(); + + arguments += args[ OPTIMISEARGS ].getAllArgs(); return arguments; } @@ -646,7 +710,7 @@ void MainWindow::pcb2gcodeError(QProcess::ProcessError error) case QProcess::ReadError: outputTextEdit->appendHtml(tr("" - "An error occured while reading from pcb2gcode." + "An error occurred while reading from pcb2gcode." "Please report this error to the project manager." "")); break; @@ -867,7 +931,7 @@ void MainWindow::saveConfFile(const QString filename) for( int i = COMMONARGS; i <= AUTOLEVELLERARGS; i++ ) { - arguments = args[i].getAllArgs("", true); + arguments = args[i].getAllArgs(true); confFile.write( QString("# " + names[i] + " options\n").toLatin1() ); for( QStringList::const_iterator j = arguments.begin(); j != arguments.constEnd(); j++ ) @@ -884,7 +948,7 @@ void MainWindow::saveConfFile(const QString filename) void MainWindow::saveDefaultConfFile() { - QString appDataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + QString appDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); if( appDataLocation.isEmpty() ) QMessageBox::information(this, tr("Error"), tr("Can't retrieve standard folder location")); @@ -897,7 +961,7 @@ void MainWindow::saveDefaultConfFile() void MainWindow::loadDefaultConfFile() { - QString appDataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + QString appDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); if( appDataLocation.isEmpty() ) QMessageBox::information(this, tr("Error"), tr("Can't retrieve standard folder location")); else @@ -915,7 +979,7 @@ void MainWindow::resetDefaultConfFile() tr("Are you sure you want to reset the default configuration?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes ) { - appDataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + appDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); if( appDataLocation.isEmpty() ) QMessageBox::information(this, tr("Error"), tr("Can't retrieve standard folder location")); else diff --git a/mainwindow.h b/mainwindow.h index b6b5591..6b7b6a0 100755 --- a/mainwindow.h +++ b/mainwindow.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016 Nicola Corna (nicola@corna.info) + * Copyright (c) 2025 Enrique Condes (kosmerebel@gmail.com) * * This file is part of pcb2gcodeGUI. * @@ -53,6 +54,7 @@ class MainWindow : public QMainWindow private slots: void voronoiEnable(bool disable); + void milldirectionEnable(bool enable); void bridgesAvailable(); void changeMetricInputUnits(bool metric); void startPcb2gcode(); @@ -77,6 +79,10 @@ private slots: void getPostambleFile(); void getOutputDirectory(); + void enableMilldrill(double value); + void drillListDisable(bool disable); + void enableNoM6(QString text); + void menu_showCommandLineArguments(); void menu_aboutpcb2gcode(); void menu_aboutpcb2gcodeGUI(); @@ -91,7 +97,7 @@ private slots: void updateAlCustomEnableState(QString text); private: - enum ArgsType { FILEARGS = 0, COMMONARGS = 1, MILLARGS = 2, DRILLARGS = 3, OUTLINEARGS = 4, AUTOLEVELLERARGS = 5 }; + enum ArgsType { FILEARGS = 0, COMMONARGS = 1, MILLARGS = 2, DRILLARGS = 3, OUTLINEARGS = 4, AUTOLEVELLERARGS = 5, OPTIMISEARGS = 6}; static const QString names[]; Ui::MainWindow *ui; @@ -120,7 +126,7 @@ private slots: bool fillOutline; bool restarted; - argAction args[6]; + argAction args[7]; outputWindow *pcb2gcodeOutputWindow; QPlainTextEdit *outputTextEdit; diff --git a/mainwindow.ui b/mainwindow.ui index b27a0f8..281790b 100755 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 907 + 1007 709 @@ -42,7 +42,7 @@ - 545 + 645 600 @@ -59,12 +59,12 @@ QTabWidget::Rounded - 1 + 1 Qt::ElideNone - + Input/output @@ -78,30 +78,19 @@ - - - - <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> - - - - - + + - <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> + <html><head/><body><p>Engrave the front side according to the given file</p></body></html> - Select file... + Front: - - - - - - <html><head/><body><p>Engrave the front side according to the given file</p></body></html> + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - Select file... + + frontLineEdit @@ -122,37 +111,33 @@ - - - - <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> - - - - - + + - <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> + <html><head/><body><p>Engrave the front side according to the given file</p></body></html> - Select file... + Back: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + backLineEdit - - + + - <html><head/><body><p>Gcode preamble file, inserted at the very beginning</p></body></html> - - - Select file... + <html><head/><body><p>Engrave the front side according to the given file</p></body></html> - - + + - <html><head/><body><p>Cut out the board to the shape exposed in the given file. Typically, there is only a polygon in this gerber file. Alternatively, this file can contain a closed line chain (see outline -&gt; fill-outline)</p></body></html> + <html><head/><body><p>Engrave the front side according to the given file</p></body></html> Select file... @@ -175,61 +160,53 @@ - - + + - <html><head/><body><p>Engrave the front side according to the given file</p></body></html> - - - Back: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - backLineEdit + <html><head/><body><p>Cut out the board to the shape exposed in the given file. Typically, there is only a polygon in this gerber file. Alternatively, this file can contain a closed line chain (see outline -&gt; fill-outline)</p></body></html> - - + + - <html><head/><body><p>Gcode postamble file, inserted before M9 and M2</p></body></html> + <html><head/><body><p>Cut out the board to the shape exposed in the given file. Typically, there is only a polygon in this gerber file. Alternatively, this file can contain a closed line chain (see outline -&gt; fill-outline)</p></body></html> Select file... - - + + - <html><head/><body><p>Output folder where the output files will be created</p></body></html> + <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> - Output folder: + Drill: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - outputDirLineEdit + drillLineEdit - - + + - <html><head/><body><p>Engrave the front side according to the given file</p></body></html> - - - Front: + <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> - - frontLineEdit + + Select file... @@ -256,13 +233,46 @@ - - + + - <html><head/><body><p>Output folder where the output files will be created</p></body></html> + <html><head/><body><p>Gcode preamble file, inserted at the very beginning</p></body></html> - Select folder... + Select file... + + + + + + + <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> + + + Preamble text: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + preambletextLineEdit + + + + + + + <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> + + + + + + + <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> + + + Select file... @@ -289,67 +299,90 @@ - - + + - <html><head/><body><p>Cut out the board to the shape exposed in the given file. Typically, there is only a polygon in this gerber file. Alternatively, this file can contain a closed line chain (see outline -&gt; fill-outline)</p></body></html> + <html><head/><body><p>Gcode postamble file, inserted before M9 and M2</p></body></html> + + + Select file... - - - - <html><head/><body><p>Gcode text preamble file, inserted at the very beginning (before the preamble) as a comment. All the rounded parenthesis will be converted to angled parenthesis (due to gcode's comments limitations). You can use this to include the license header at the top of the gcode output files</p></body></html> + + + + Qt::Horizontal + + + + + + + <html><head/><body><p>Prefix for default output file names</p></body></html> - Preamble text: + Basename: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - preambletextLineEdit - - - - - - - <html><head/><body><p>Engrave the front side according to the given file</p></body></html> + basenameLineEdit - + - <html><head/><body><p>Output folder where the output files will be created</p></body></html> + <html><head/><body><p>Prefix for default output file names</p></body></html> - - + + - <html><head/><body><p>Convert the given file (containing drill sizes and positions) to G-code</p></body></html> + <html><head/><body><p>Output folder where the output files will be created</p></body></html> - Drill: + Output folder: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - drillLineEdit + outputDirLineEdit - - - - Qt::Horizontal + + + + <html><head/><body><p>Output folder where the output files will be created</p></body></html> + + + + + + + <html><head/><body><p>Output folder where the output files will be created</p></body></html> + + + Select folder... + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--no-export</span></p><p>skip the exporting process</p></body></html> + + + Skip gcode export - + Qt::Vertical @@ -654,14 +687,14 @@ 0.000010000000000 - 0.000010000000000 + 0.00254000000000 - <html><head/><body><p><span style=" font-style:italic;">--zero-start</span></p><p>set the starting point of the project at (0,0). With this option the projet will be between (0,0) and (max_x_value, max_y_value) (positive values)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--zero-start</span></p><p>set the starting point of the project at (0,0). With this option the project will be between (0,0) and (max_x_value, max_y_value) (positive values)</p></body></html> Start at (0,0) @@ -674,7 +707,7 @@ - <html><head/><body><p><span style=" font-style:italic;">--mirror-axis</span></p><p>Distance from zero axis to flip the bcb around</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--mirror-axis</span></p><p>Distance from zero axis to flip the PCB around</p></body></html> Axis mirror offset @@ -690,7 +723,7 @@ true - <html><head/><body><p><span style=" font-style:italic;">--mirror-axis</span></p><p>Distance from zero axis to flip the bcb around</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--mirror-axis</span></p><p>Distance from zero axis to flip the PCB around</p></body></html> mm @@ -788,71 +821,244 @@ - - - - Qt::Vertical + + + + <html><head/><body><p><span style=" font-style:italic;">--x-offset</span>, <span style=" font-style:italic;">--y-offset</span></p><p>Offset from the origin in the X/Y axis</p></body></html> - - - 20 - 40 - + + Offset from origin - + - - - - - - Mill - - - - - 10 - 10 - 430 - 411 - - - - - 12 - - - 6 - - - - - <html><head/><body><p><span style=" font-style:italic;">--extra-passes</span></p><p>number of additional isolation passes For each extra pass, engraving is repeated with the offset width increased by half its original value, creating wider isolation areas. This option is ignored when --voronoi is in use.</p></body></html> - - + + + + + + <html><head/><body><p><span style=" font-style:italic;">--x-offset</span></p><p>offset the origin on the x-axis this distance</p></body></html> + + + x + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + offsetXDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--x-offset</span></p><p>offset the origin on the x-axis this distance</p></body></html> + + + mm + + + 3 + + + -10000.000000000000000 + + + 10000.000000000000000 + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--y-offset</span></p><p>offset the origin on the y-axis this distance</p></body></html> + + + y + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + offsetYDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--y-offset</span></p><p>offset the origin on the y-axis this distance</p></body></html> + + + mm + + + 3 + + + -10000.000000000000000 + + + 10000.000000000000000 + + + 1.000000000000000 + + + 0.000000000000000 + + + + - - + + - <html><head/><body><p><span style=" font-style:italic;">--offset * 2</span></p><p>distance by which the tool movement will be outset from the contours in the gerber file to be engraved. If you want to obtain a PCB as similar as possible to the original file, you should set this value to half of the tool diameter. If this distance can't be satisfied because copper areas are too close, a warning will be printed and the line will be drawn between the areas. This behavior can be used to get voronoi-style (flood-filling) areas; sim‐ply set the offset to a large value (like 1 inch). When the vectorial mode is in use, --voronoi is preferred.</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--spinup-time</span>, <span style=" font-style:italic;">--spindown-time</span></p><p>Time required for the spindle to reach speed/stop completely</p></body></html> - - mm + + Spindle times - - 3 + + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--spinup-time</span></p><p>time required to the spindle to reach the correct speed</p></body></html> + + + spinup + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + spinupDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--spinup-time</span></p><p>time required to the spindle to reach the correct speed</p></body></html> + + + s + + + 3 + + + 0.001 + + + 20.000000000000000 + + + 0.01 + + + 0.001 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--spindown-time</span></p><p>time required for the spindle to return to 0 rpm</p></body></html> + + + spindown + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + spindownDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--spindown-time</span></p><p>time required for the spindle to return to 0 rpm</p></body></html> + + + s + + + 3 + + + 0.001 + + + 20.000000000000000 + + + 0.01 + + + 0.001 + + + + + + + + + Qt::Vertical - - 0.000000000000000 + + + 20 + 40 + - - 100.000000000000000 + + + + + + + + Mill + + + + + 10 + 10 + 430 + 411 + + + + + 12 + + + 6 + + + + + <html><head/><body><p><span style=" font-style:italic;">--zwork</span></p><p>Z-coordinate at which engraving happens</p></body></html> - - 0.050000000000000 + + Milling depth - - 0.100000000000000 + + zworkDoubleSpinBox @@ -881,6 +1087,19 @@ + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-feed</span></p><p>Feed rate at which engraving takes place (horizontal speed)</p></body></html> + + + Horizontal mill speed + + + millfeedSpinBox + + + @@ -900,6 +1119,67 @@ + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-speed</span></p><p>Spindle speed during engraving</p></body></html> + + + Spindle speed + + + millspeedSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-speed</span></p><p>Spindle speed during engraving</p></body></html> + + + rpm + + + 100000 + + + 500 + + + 10000 + + + + + + + true + + + <html><head/><body><p><span style=" font-style:italic;">--voronoi</span></p><p>enable the voronoi mode (requires --vectorial). This option is more efficient than a large --offset value, and provides the same result.</p></body></html> + + + Voronoi regions + + + + + + + false + + + true + + + <html><head/><body><p><span style=" font-style:italic;">--preserve-thermal-reliefs</span></p><p>Generate mill paths for thermal reliefs in voronoi mode.</p></body></html> + + + Preserve thermal reliefs + + + @@ -913,91 +1193,296 @@ - - + + - <html><head/><body><p><span style=" font-style:italic;">--mill-feed</span></p><p>Feed rate at which engraving takes place (horizontal speed)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--offset * 2</span></p><p>distance by which the tool movement will be outset from the contours in the gerber file to be engraved. If you want to obtain a PCB as similar as possible to the original file, you should set this value to half of the tool diameter. If this distance can't be satisfied because copper areas are too close, a warning will be printed and the line will be drawn between the areas. This behavior can be used to get voronoi-style (flood-filling) areas; sim‐ply set the offset to a large value (like 1 inch). When the vectorial mode is in use, --voronoi is preferred.</p></body></html> + + + mm + + + 3 + + + 0.000000000000000 + + + 100.000000000000000 + + + 0.050000000000000 + + + 0.100000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--isolation-width</span></p><p>Minimum isolating separation between copper surfaces. This option is ignored when <em>voronoi</em> is in use.</p></body></html> - Horizontal mill speed + Isolation width - millfeedSpinBox + isolationwidthDoubleSpinBox - - + + - <html><head/><body><p><span style=" font-style:italic;">--zwork</span></p><p>Z-coordinate at which engraving happens</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--isolation-width</span></p><p>Minimum isolating separation between copper surfaces. This option is ignored when <em>voronoi</em> is in use.</p></body></html> + + + mm + + + 3 + + + 0.000000000000000 + + + 100.000000000000000 + + + 0.050000000000000 + + + 0.000000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-diameters</span></p><p>Comma-separated list of available mill bits. Each entry must consist of a numeric value followed by a unit(inch,mm,m). Used in the order that they are provided</p></body></html> - Milling depth + Available mill diameters - zworkDoubleSpinBox + milldiametersLineEdit - - + + - <html><head/><body><p><span style=" font-style:italic;">--mill-speed</span></p><p>Spindle speed during engraving</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--mill-diameters</span></p><p>Comma-separated list of available mill bits. Each entry must consist of a numeric value followed by a unit(inch,mm,m). Used in the order that they are provided</p></body></html> + + + 0mm,0.001inch,0.4mm + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--milling-overlap</span></p><p>How much to overlap milling passes, from 0% to 100% or an absolute length</p></body></html> - Spindle speed + Milling overlap - millspeedSpinBox + milloverlapLineEdit - - + + + + <html><head/><body><p><span style=" font-style:italic;">--milling-overlap</span></p><p>How much to overlap milling passes, from 0% to 100% or an absolute length</p></body></html> + + + 50%/12mm/0.3in + + + + + - <html><head/><body><p><span style=" font-style:italic;">--extra-passes</span></p><p>number of additional isolation passes For each extra pass, engraving is repeated with the offset width increased by half its original value, creating wider isolation areas. This option is ignored when --voronoi is in use.</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--pre-milling-gcode</span></p><p>custom gcode inserted before the start of milling each trace (used to activate pump or fan or laser connected to fan).</p></body></html> - Extra passes + Milling start custom command - extrapassesSpinBox + premillingcodeLineEdit - - + + - <html><head/><body><p><span style=" font-style:italic;">--mill-speed</span></p><p>Spindle speed during engraving</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--pre-milling-gcode</span></p><p>custom gcode inserted before the start of milling each trace (used to activate pump or fan or laser connected to fan).</p></body></html> + + + + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--post-milling-gcode</span></p><p>custom gcode inserted after the end of milling each trace (used to deactivate pump or fan or laser connected to fan).</p></body></html> + + + Milling end custom command + + + postmillingcodeLineEdit + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--post-milling-gcode</span></p><p>custom gcode inserted after the end of milling each trace (used to deactivate pump or fan or laser connected to fan).</p></body></html> + + + + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-vertfeed</span></p><p>vertical feed while isolating in [in/min] or [mm/min].</p></body></html> + + + Milling vertical feed + + + millvertfeedSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-vertfeed</span></p><p>vertical feed while isolating in [in/min] or [mm/min].</p></body></html> - rpm + mm/min - 100000 + 10000 - 500 + 10 - 10000 + 0 - - + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-infeed</span></p><p>Maximum milling depth per pass. PCB may be cut in multiple passes</p></body></html> + + + Milling depth per pass + + + millinfeedDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-infeed</span></p><p>Maximum milling depth per pass. PCB may be cut in multiple passes</p></body></html> + + + mm + + + 3 + + + -1000.000000000000000 + + + 0.000000000000000 + + + 0.001000000000000 + + + 0.0000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-feed-direction</span></p><p>In which direction should all milling occur. Can't use it together with tsp-2opt optimization</p></body></html> + + + Milling direction + + + millingdirectionComboBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--mill-feed-direction</span></p><p>In which direction should all milling occur. Can't use it together with tsp-2opt optimization</p></body></html> + - true + false + + + any + + + + + clockwise + + + + + anticlockwise + + + + + + - <html><head/><body><p><span style=" font-style:italic;">--voronoi</span></p><p>enable the voronoi mode (requires --vectorial). This option is more efficient than a large --offset value, and provides the same result.</p></body></html> + <html><head/><body><p>--invert-gerbers</p><p>Invert polarity of front and back gerbers, causing the milling to occur inside the shapes</p></body></html> - Voronoi regions + Invert gerbers + + + false - + + + + <html><head/><body><p>--draw-gerber-lines</p><p>Draw lines in the gerber file as just lines and not as filled in shapes</p></body></html> + + + Draw gerbers lines + + + false + + + + Qt::Vertical @@ -1033,16 +1518,6 @@ 6 - - - - <html><head/><body><p><span style=" font-style:italic;">--nog81</span></p><p>replace G81 with G0+G1. This option makes the gcode compatible with low-end cnc controllers (like grbl), but also makes it bigger and less clean</p></body></html> - - - Remove G81 from G-code - - - @@ -1056,49 +1531,7 @@ - - - - <html><head/><body><p><span style=" font-style:italic;">--milldrill</span></p><p>If milldrill is given, the milling head will be used to drill the holes in the PCB. Holes up to the size of the milling head will be drilled regularly (possibly creating a bigger hole than intended), the other holes are created by moving the head in circles using the feed and infeed parameters used in cutting</p><p>Remember that you have to set also &quot;outline&quot; parameters if you set this option</p></body></html> - - - Qt::LeftToRight - - - Mill holes - - - false - - - - - - - <html><head/><body><p><span style=" font-style:italic;">--drill-speed</span></p><p>Spindle speed during drilling</p></body></html> - - - Spindle speed - - - drillspeedSpinBox - - - - - - - <html><head/><body><p><span style=" font-style:italic;">--drill-feed</span></p><p>Feed rate for drilling (vertical speed)</p></body></html> - - - Vertical drill speed - - - drillfeedSpinBox - - - - + <html><head/><body><p><span style=" font-style:italic;">--zdrill</span></p><p>Z value down to which will be drilled</p></body></html> @@ -1123,20 +1556,20 @@ - - + + - <html><head/><body><p>--onedrill</p><p>Use only one drill bit size</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--drill-feed</span></p><p>Feed rate for drilling (vertical speed)</p></body></html> - Use a single drill bit size - - - false + Vertical drill speed + + + drillfeedSpinBox - + <html><head/><body><p><span style=" font-style:italic;">--drill-feed</span></p><p>Feed rate for drilling (vertical speed)</p></body></html> @@ -1155,7 +1588,20 @@ - + + + + <html><head/><body><p><span style=" font-style:italic;">--drill-speed</span></p><p>Spindle speed during drilling</p></body></html> + + + Spindle speed + + + drillspeedSpinBox + + + + <html><head/><body><p><span style=" font-style:italic;">--drill-speed</span></p><p>Spindle speed during drilling</p></body></html> @@ -1174,7 +1620,20 @@ - + + + + <html><head/><body><p><span style=" font-style:italic;">--drill-side</span></p><p>choose the drill side. Valid choices are front, back or auto (default). In auto mode the drill side is automatically chosen (always front unless only the back side is specified)</p></body></html> + + + Board side for drilling + + + drillsideComboBox + + + + <html><head/><body><p><span style=" font-style:italic;">--drill-side</span></p><p>choose the drill side. Valid choices are front, back or auto (default). In auto mode the drill side is automatically chosen (always front unless only the back side is specified)</p></body></html> @@ -1196,68 +1655,208 @@ - - + + + + Milldrill (hole milling) + + + + 12 + + + 3 + + + + + <html><head/><body><p><span style=" font-style:italic;">--min-milldrill-hole-diameter</span></p><p>minimum hole width for milldrilling. Holes smaller than this are drilled. Zero to disable milldrilling.</p></body></html> + + + Minimum diameter + + + milldrillholediameterDoubleSpinBox + + + + + + + true + + + <html><head/><body><p><span style=" font-style:italic;">--min-milldrill-hole-diameter</span></p><p>minimum hole width for milldrilling. Holes smaller than this are drilled. Zero to disable milldrilling.</p></body></html> + + + mm + + + 3 + + + 100.000000000000000 + + + 0.100000000000000 + + + 0 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--milldrill-diameter</span></p><p>diameter of milling head which is used with --milldrill; the default value is same as --cutter-diameter.</p></body></html> + + + Tool diameter + + + milldrilldiameterDoubleSpinBox + + + + + + + false + + + <html><head/><body><p><span style=" font-style:italic;">--milldrill-diameter</span></p><p>diameter of milling head which is used with --milldrill; the default value is same as --cutter-diameter.</p></body></html> + + + mm + + + 3 + + + 100.000000000000000 + + + 0.100000000000000 + + + 3.000000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--zmilldrill</span></p><p>Z value down to which will be milldrilled</p></body></html> + + + Depth + + + zdrillDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--zmilldrill</span></p><p>Z value down to which will be milldrilled</p></body></html> + + + false + + + mm + + + 3 + + + -1000.000000000000000 + + + 0.000000000000000 + + + 0.050000000000000 + + + -2.500000000000000 + + + + + + + + - <html><head/><body><p><span style=" font-style:italic;">--drill-side</span></p><p>choose the drill side. Valid choices are front, back or auto (default). In auto mode the drill side is automatically chosen (always front unless only the back side is specified)</p></body></html> + <html><head/><body><p>--onedrill</p><p>Use only one drill bit size</p></body></html> - Board side for drilling + Use a single drill bit size - - drillsideComboBox + + false - - + + - <html><head/><body><p><span style=" font-style:italic;">--nog91-1</span></p><p>do not explicitly set G91.1 (incremental arc mode distance) in drill headers. Some controllers (like Roland's) does not support G91.1 and they can wrongly interpret it as G91 (relative distance). Since the default mode is usually &quot;incremental&quot;, you can safely remove G91.1 in most of the cases</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--drills-available</span></p><p>Comma-separated list of available drills. Each entry must consist of a numeric value followed by a unit(inch,mm,m)</p></body></html> - Remove G91.1 from G-code + Available drills list + + + drillsAvailableLineEdit - - + + - <html><head/><body><p><span style=" font-style:italic;">--milldrill-diameter</span></p><p>diameter of milling head which is used with --milldrill; the default value is same as --cutter-diameter.</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--drills-available</span></p><p>Comma-separated list of available drills. Each entry must consist of a numeric value followed by a unit(inch,mm,m)</p></body></html> - - Tool diameter for hole milling - - - milldrilldiameterDoubleSpinBox + + 0.5mm,1.75mm,0.125inch,0.004m - - + + + + <html><head/><body><p><span style=" font-style:italic;">--nom6</span></p><p>do not emit M6 on tool changes</p></body></html> + false - - <html><head/><body><p><span style=" font-style:italic;">--milldrill-diameter</span></p><p>diameter of milling head which is used with --milldrill; the default value is same as --cutter-diameter.</p></body></html> - - - mm + + Remove M6 from G-code - - 3 + + + + + + <html><head/><body><p><span style=" font-style:italic;">--nog81</span></p><p>replace G81 with G0+G1. This option makes the gcode compatible with low-end cnc controllers (like grbl), but also makes it bigger and less clean</p></body></html> - - 100.000000000000000 + + Remove G81 from G-code - - 0.100000000000000 + + + + + + <html><head/><body><p><span style=" font-style:italic;">--nog91-1</span></p><p>do not explicitly set G91.1 (incremental arc mode distance) in drill headers. Some controllers (like Roland's) does not support G91.1 and they can wrongly interpret it as G91 (relative distance). Since the default mode is usually &quot;incremental&quot;, you can safely remove G91.1 in most of the cases</p></body></html> - - 3.000000000000000 + + Remove G91.1 from G-code - + Qt::Vertical @@ -1500,7 +2099,7 @@ - <html><head/><body><p><span style=" font-style:italic;">--bridgesnum</span></p><p>Sets the numer of bridges to be created (--bridgesnum bridges for each closed line)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--bridgesnum</span></p><p>Sets the number of bridges to be created (--bridgesnum bridges for each closed line)</p></body></html> Number of bridges @@ -1510,7 +2109,7 @@ - <html><head/><body><p><span style=" font-style:italic;">--bridgesnum</span></p><p>Sets the numer of bridges to be created (--bridgesnum bridges for each closed line)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--bridgesnum</span></p><p>Sets the number of bridges to be created (--bridgesnum bridges for each closed line)</p></body></html> 0 @@ -1683,6 +2282,19 @@ 6 + + + + <html><head/><body><p><span style=" font-style:italic;">--al-front</span></p><p>Enable the autoleveller for the front side</p></body></html> + + + Enable autoleveller (front) + + + false + + + @@ -1696,10 +2308,23 @@ + + + + <html><head/><body><p><span style=" font-style:italic;">--software</span></p><p>the height probing commands are different from software to software. Use this option to select the used software; currently supported programs are LinuxCNC, Mach3, Mach4 and custom. With custom you can specify al-probecode, al-probevar and al-setzzero, in order to generate gcode for an unsupported software. For compatibility reasons, the custom gcode is much bigger (3-4 times) than the gcode for a supported software.</p></body></html> + + + Control software + + + softwareComboBox + + + - <html><head/><body><p><span style=" font-style:italic;">--software</span></p><p>the height probing commands are different from software to software. Use this option to select the used software; currently supported softwares are LinuxCNC, Mach3, Mach4 and custom. With custom you can specify al-probecode, al-probevar and al-setzzero, in order to generate gcode for an unsupported software. For compatibility reasons, the custom gcode is much bigger (3-4 times) than the gcode for a supported software.</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--software</span></p><p>the height probing commands are different from software to software. Use this option to select the used software; currently supported programs are LinuxCNC, Mach3, Mach4 and custom. With custom you can specify al-probecode, al-probevar and al-setzzero, in order to generate gcode for an unsupported software. For compatibility reasons, the custom gcode is much bigger (3-4 times) than the gcode for a supported software.</p></body></html> @@ -1723,54 +2348,193 @@ - - + + + + <html><head/><body><p><span style=" font-style:italic;">--al-x</span></p><p>Width of the probing on the X axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + + + Probe grid pitch (X) + + + alxDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-x</span></p><p>Width of the probing on the X axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + + + mm + + + 3 + + + 1.000000000000000 + + + 1000.000000000000000 + + + 15.000000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-y</span></p><p>Width of the probing on the Y axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + + + Probe grid pitch (Y) + + + alyDoubleSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-y</span></p><p>Width of the probing on the Y axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + + + mm + + + 3 + + + 1.000000000000000 + + + 1000.000000000000000 + + + 15.000000000000000 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probefeed</span></p><p>Probe speed on the Z axis. Higher values decrease the probing time but also increase the wear of the probing tool</p></body></html> + + + Vertical probe speed + + + alprobefeedSpinBox + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probefeed</span></p><p>Probe speed on the Z axis. Higher values decrease the probing time but also increase the wear of the probing tool</p></body></html> + + + mm/min + + + 5000 + + + 10 + + + 100 + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probe-on</span></p><p>Insert these commands at the start of the probing sequence. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically enable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + + + Probing start custom commands + + + alprobeonLineEdit + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probe-on</span></p><p>Insert these commands at the start of the probing sequence. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically enable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + + + + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probe-off</span></p><p>Insert these commands at the end of the probing sequence, replacing the standard M0 command. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically disable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + + + Probing stop custom commands + + + alprobeoffLineEdit + + + + + + + <html><head/><body><p><span style=" font-style:italic;">--al-probe-off</span></p><p>Insert these commands at the end of the probing sequence, replacing the standard M0 command. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically disable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + + + + + true - <html><head/><body><p><span style=" font-style:italic;">--al-setzzero</span></p><p>custom gcode for setting the actual height as the zero of the Z axis. For example, LinuxCNC uses G10 L20 P0 Z0 while Mach3, Mach4 and TurboCNC use G92 Z0. If unspecified, G92 Z0 will be used. This option is relevant only when --software=custom</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--al-probecode</span></p><p>custom Z probe code. For example, LinuxCNC uses G38.2 while Mach3, Mach4 and TurboCNC use G31. If unspecified, G31 will be used. This option is relevant only when --software=custom</p></body></html> - G-code for zero setting (Z axis) + G-code for vertical probing - alsetzzeroLineEdit + alprobecodeLineEdit - - - - <html><head/><body><p><span style=" font-style:italic;">--al-x</span></p><p>Width of the probing on the X axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> - - - mm - - - 3 - - - 1.000000000000000 + + + + false - - 1000.000000000000000 + + <html><head/><body><p><span style=" font-style:italic;">--al-probecode</span></p><p>custom Z probe code. For example, LinuxCNC uses G38.2 while Mach3, Mach4 and TurboCNC use G31. If unspecified, G31 will be used. This option is relevant only when --software=custom</p></body></html> - - 15.000000000000000 + + G31 - - + + + + true + - <html><head/><body><p><span style=" font-style:italic;">--al-x</span></p><p>Width of the probing on the X axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--al-probevar</span></p><p>custom Z probe result variable. For example, LinuxCNC uses 5063 while Mach3, Mach4 and TurboCNC use 2002. If unspecified, 2002 will be used. This option is relevant only when --software=custom</p></body></html> - Probe grid pitch (X) + G-code variable for probe result - alxDoubleSpinBox + alprobevarSpinBox @@ -1782,12 +2546,6 @@ <html><head/><body><p><span style=" font-style:italic;">--al-probevar</span></p><p>custom Z probe result variable. For example, LinuxCNC uses 5063 while Mach3, Mach4 and TurboCNC use 2002. If unspecified, 2002 will be used. This option is relevant only when --software=custom</p></body></html> - - - - - - 1 @@ -1799,202 +2557,249 @@ - - - - <html><head/><body><p><span style=" font-style:italic;">--al-probe-off</span></p><p>Insert these commands at the end of the probing sequence, replacing the standard M0 command. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically disable the probe tool. Use a at sign (@) to insert a newline</p></body></html> - - - - - + + true - <html><head/><body><p><span style=" font-style:italic;">--al-probecode</span></p><p>custom Z probe code. For example, LinuxCNC uses G38.2 while Mach3, Mach4 and TurboCNC use G31. If unspecified, G31 will be used. This option is relevant only when --software=custom</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--al-setzzero</span></p><p>custom gcode for setting the actual height as the zero of the Z axis. For example, LinuxCNC uses G10 L20 P0 Z0 while Mach3, Mach4 and TurboCNC use G92 Z0. If unspecified, G92 Z0 will be used. This option is relevant only when --software=custom</p></body></html> - G-code for vertical probing + G-code for zero setting (Z axis) - alprobecodeLineEdit + alsetzzeroLineEdit - - + + false - <html><head/><body><p><span style=" font-style:italic;">--al-probecode</span></p><p>custom Z probe code. For example, LinuxCNC uses G38.2 while Mach3, Mach4 and TurboCNC use G31. If unspecified, G31 will be used. This option is relevant only when --software=custom</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--al-setzzero</span></p><p>custom gcode for setting the actual height as the zero of the Z axis. For example, LinuxCNC uses G10 L20 P0 Z0 while Mach3, Mach4 and TurboCNC use G92 Z0. If unspecified, G92 Z0 will be used. This option is relevant only when --software=custom</p></body></html> - G31 + G92 Z0 - - - - <html><head/><body><p><span style=" font-style:italic;">--al-probefeed</span></p><p>Probe speed on the Z axis. Higher values decrease the probing time but also increase the wear of the probing tool</p></body></html> + + + + Qt::Vertical - - mm/min + + + 20 + 40 + - - 5000 + + + + + + + + Optimizations + + + + + 10 + 10 + 504 + 553 + + + + + 12 + + + 6 + + + + + <html><head/><body><p><span style="font-style:italic">--eulerian-paths</span></p><p>Don't mill the same path twice if milling loops overlap. Can save up to 50% of milling time.</p></body></html> - - 10 + + Eulerian paths - - 100 + + true - - - - true - + + - <html><head/><body><p><span style=" font-style:italic;">--al-probevar</span></p><p>custom Z probe result variable. For example, LinuxCNC uses 5063 while Mach3, Mach4 and TurboCNC use 2002. If unspecified, 2002 will be used. This option is relevant only when --software=custom</p></body></html> + <html><head/><body><p><span style="font-style:italic">--vectorial</span></p><p>enable or disable the vectorial rendering engine.</p></body></html> - G-code variable for probe result + Vectorial engine - - alprobevarSpinBox + + true - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-probe-on</span></p><p>Insert these commands at the start of the probing sequence. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically enable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + <html><head/><body><p><span style="font-style:italic">--tsp-2opt</span></p><p>use TSP 2OPT to find a faster toolpath (but slows down gcode generation).</p></body></html> - Probing start custom commands + TSP 2OPT optimization - - alprobeonLineEdit + + true - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-y</span></p><p>Width of the probing on the Y axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--path-finding-limit</span></p><p>Use path finding for up to this many steps in the search (more is slower but makes a faster gcode path)</p></body></html> - Probe grid pitch (Y) + Path finding limit - alyDoubleSpinBox + pathfindinglimitSpinBox - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-y</span></p><p>Width of the probing on the Y axis. Higher values increase the levelling precision but also increases the probing time (but not the milling time)</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--path-finding-limit</span></p><p>Use path finding for up to this many steps in the search (more is slower but makes a faster gcode path)</p></body></html> - mm - - - 3 + steps - 1.000000000000000 + 1 - 1000.000000000000000 + 100000 - 15.000000000000000 + 1 - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-probe-on</span></p><p>Insert these commands at the start of the probing sequence. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically enable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--g0-vertical-speed</span></p><p>speed of vertical G0 movements, for use in path-finding</p></body></html> - - + + Path finding vertical speed + + + g0verticalspeedSpinBox - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-probefeed</span></p><p>Probe speed on the Z axis. Higher values decrease the probing time but also increase the wear of the probing tool</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--g0-vertical-speed</span></p><p>speed of vertical G0 movements, for use in path-finding</p></body></html> - - Vertical probe speed + + mm/min - - alprobefeedSpinBox + + 1 + + + 10000 + + + 50 + + + 1270 - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-probe-off</span></p><p>Insert these commands at the end of the probing sequence, replacing the standard M0 command. You can use this argument to add a M64/M65 command (LinuxCNC) to automatically disable the probe tool. Use a at sign (@) to insert a newline</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--g0-horizontal-speed</span></p><p>speed of horizontal G0 movements, for use in path-finding</p></body></html> - Probing stop custom commands + Path finding horizontal speed - alprobeoffLineEdit + g0horizontalspeedSpinBox - - + + - <html><head/><body><p><span style=" font-style:italic;">--software</span></p><p>the height probing commands are different from software to software. Use this option to select the used software; currently supported softwares are LinuxCNC, Mach3, Mach4 and custom. With custom you can specify al-probecode, al-probevar and al-setzzero, in order to generate gcode for an unsupported software. For compatibility reasons, the custom gcode is much bigger (3-4 times) than the gcode for a supported software.</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--g0-horizontal-speed</span></p><p>speed of horizontal G0 movements, for use in path-finding</p></body></html> - - Control software + + mm/min - - softwareComboBox + + 1 + + + 10000 + + + 50 + + + 2540 - - + + - <html><head/><body><p><span style=" font-style:italic;">--al-front</span></p><p>Enable the autoleveller for the front side</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--backtrack</span></p><p>allow retracing a milled path if it's faster than retract-move-lower. For example, set to 5in/s if you are willing to remill 5 inches of trace in order to save 1 second of milling time.</p></body></html> - Enable autoleveller (front) + Backtrack distance - - false + + backtrackSpinBox - - - - false - + + - <html><head/><body><p><span style=" font-style:italic;">--al-setzzero</span></p><p>custom gcode for setting the actual height as the zero of the Z axis. For example, LinuxCNC uses G10 L20 P0 Z0 while Mach3, Mach4 and TurboCNC use G92 Z0. If unspecified, G92 Z0 will be used. This option is relevant only when --software=custom</p></body></html> + <html><head/><body><p><span style=" font-style:italic;">--backtrack</span></p><p>allow retracing a milled path if it's faster than retract-move-lower. For example, set to 5in/s if you are willing to remill 5 inches of trace in order to save 1 second of milling time.</p></body></html> - - G92 Z0 + + mm/s + + + 0 + + + 100 + + + 1 + + + 0 - - + + Qt::Vertical @@ -2137,7 +2942,7 @@ 0 0 - 907 + 1007 43 @@ -2261,6 +3066,10 @@ outlinePushButton drillLineEdit drillPushButton + basenameLineEdit + outputDirLineEdit + outputDirPushButton + noExportCheckBox optionsTab inputMetricRadioButton inputImperialRadioButton @@ -2268,7 +3077,7 @@ outputImperialRadioButton zsafeDoubleSpinBox zchangeDoubleSpinBox - vectorialCheckBox + zchangeAbsoluteCheckBox nog64CheckBox toleranceDoubleSpinBox optimiseDoubleSpinBox @@ -2277,17 +3086,31 @@ mirroryaxisCheckBox tilexSpinBox tileySpinBox + offsetXDoubleSpinBox + offsetYDoubleSpinBox + spinupDoubleSpinBox + spindownDoubleSpinBox zworkDoubleSpinBox millfeedSpinBox millspeedSpinBox voronoiCheckBox + preserveThermalRelievesCheckBox offsetDoubleSpinBox - extrapassesSpinBox + isolationwidthDoubleSpinBox + milldiametersLineEdit + milloverlapLineEdit + premillingcodeLineEdit + postmillingcodeLineEdit + millvertfeedSpinBox + millinfeedDoubleSpinBox + millingdirectionComboBox + invertgerbersCheckBox + drawgerberlinesCheckBox zdrillDoubleSpinBox drillfeedSpinBox drillspeedSpinBox drillsideComboBox - milldrillCheckBox + milldrillholediameterDoubleSpinBox milldrilldiameterDoubleSpinBox onedrillCheckBox nog81CheckBox @@ -2295,8 +3118,10 @@ cutterdiameterDoubleSpinBox zcutDoubleSpinBox cutfeedSpinBox + cutvertfeedSpinBox cutspeedSpinBox cutinfeedDoubleSpinBox + bridgesnumSpinBox bridgesDoubleSpinBox zbridgesDoubleSpinBox cutsideComboBox @@ -2312,6 +3137,13 @@ alprobecodeLineEdit alprobevarSpinBox alsetzzeroLineEdit + eulerianCheckBox + vectorialCheckBox + tsp2optCheckBox + pathfindinglimitSpinBox + g0verticalspeedSpinBox + g0horizontalspeedSpinBox + backtrackSpinBox imageComboBox gview diff --git a/pcb2gcodeGUI.pro b/pcb2gcodeGUI.pro index aa6883b..31eba4a 100644 --- a/pcb2gcodeGUI.pro +++ b/pcb2gcodeGUI.pro @@ -1,6 +1,7 @@ -QT += core gui svg +QT += core gui svg -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +equals(QT_MAJOR_VERSION, 5): QT += widgets +greaterThan(QT_MAJOR_VERSION, 5): QT += svgwidgets isEmpty(PREFIX) { PREFIX = /usr/local @@ -14,7 +15,7 @@ INSTALLS += target TEMPLATE = app SOURCES += main.cpp\ - mainwindow.cpp \ + mainwindow.cpp \ outputwindow.cpp \ argaction.cpp \ graphics_view_zoom.cpp \ diff --git a/settings.h b/settings.h index 8e02e79..59f8319 100755 --- a/settings.h +++ b/settings.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016 Nicola Corna (nicola@corna.info) + * Copyright (c) 2025 Enrique Condes (kosmerebel@gmail.com) * * This file is part of pcb2gcodeGUI. * @@ -25,18 +26,18 @@ #ifdef Q_OS_WIN #define PCB2GCODE_COMMAND_NAME "pcb2gcode.exe" -#define PCB2GCODE_EXECUTABLE PCB2GCODE_COMMAND_NAME #else #define PCB2GCODE_COMMAND_NAME "pcb2gcode" -#define PCB2GCODE_EXECUTABLE PCB2GCODE_COMMAND_NAME #endif +#define PCB2GCODE_EXECUTABLE PCB2GCODE_COMMAND_NAME -#define PCB2GCODE_GUI_VERSION "1.3.2-1" +#define PCB2GCODE_GUI_VERSION "2.5.0" static const char *about_pcb2gcode_str = "pcb2gcode v%1
" "https://github.com/pcb2gcode/pcb2gcode
"; static const char *about_pcb2gcodegui_str = "pcb2gcodeGUI v%1
" "Created by Nicola Corna (nicola@corna.info)
" + "Supported by Enrique Condes (kosmerebel@gmail.com)
" "https://github.com/pcb2gcode/pcb2gcodeGUI"; static const char *manual_link = "https://github.com/pcb2gcode/pcb2gcode/wiki/Manual"; @@ -51,6 +52,6 @@ static const QString excellon_file_filter = "Excellon files (*.drl *.drd *.dri * static const QString gcode_file_filter = "G-Code files (*.nc *.cnc *.ncc *.ecs *.ngc *.fan *.hnc);;All types (*.*)"; static const QString text_file_filter = "Text files (*.*)"; -static const QVector targetVersion(QVector() << 1 << 3 << 2); +static const QVector targetVersion(QVector() << 2 << 5 << 0); #endif // SETTINGS