166 lines
5.1 KiB
C++
Raw Normal View History

/*
2025-01-04 13:37:40 +01:00
Copyright 2025 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "qet_elementscaler.h"
#include "../ui/thirdpartybinaryinstalldialog.h"
#include <QFile>
#include <QProcess>
#include <QInputDialog>
#include <QMessageBox>
#include <QDir>
/**
* @brief QET_ElementScaler
* Return the scaled element from @a file_path.
* The returned value is a QByteArray, instead of a
* QDomDocument or QString, to let user do what he/she wants.
* If something goes wrong the QByteArray returned is empty.
* @param file_path
* @return
*/
QByteArray ElementScaler(const QString &file_path, QWidget *parent)
{
if (!ElementScalerIsPresent(false)) {
return QByteArray();
}
bool ok;
double fx = QInputDialog::getDouble(parent, QObject::tr("Entrer le facteur d'échelle"),
QObject::tr("Facteur X:"), 1.0, 0.1, 100, 5, &ok,
Qt::WindowFlags());
QString sFactorX = "1.0";
if (ok)
sFactorX = (QString::number(fx, 'f', 5));
else
return QByteArray();
double fy = QInputDialog::getDouble(parent, QObject::tr("Entrer le facteur d'échelle"),
QObject::tr("Facteur Y:"), fx, 0.1, 100, 5, &ok,
Qt::WindowFlags());
QString sFactorY = "1.0";
if (ok)
sFactorY = (QString::number(fy, 'f', 5));
else
return QByteArray();
const QStringList items{QObject::tr("sans"),
QObject::tr("horizontal"),
QObject::tr("vertical"),
QObject::tr("horizontal + vertical")};
QString item = QInputDialog::getItem(parent,
QObject::tr("Retourner l'élément :"),
QObject::tr("direction"), items, 0, false, &ok);
int8_t mirrorIndex = 0;
if (ok && !item.isEmpty()) {
mirrorIndex = items.indexOf(item, 0);
}
2024-08-20 11:48:41 +02:00
else
return QByteArray();
QProcess process_;
const QString program{ElementScalerBinaryPath()};
QStringList arguments{QStringLiteral("-x"), sFactorX,
QStringLiteral("-y"), sFactorY};
switch (mirrorIndex) {
case 1: arguments << QStringLiteral("--FlipHorizontal");
break;
case 2: arguments << QStringLiteral("--FlipVertical");
break;
case 3: arguments << QStringLiteral("--FlipHorizontal")
<< QStringLiteral("--FlipVertical");
break;
}
arguments << QStringLiteral("-o") << QStringLiteral("-f") << file_path;
process_.start(program, arguments);
if (process_.waitForFinished())
{
const auto byte_array{process_.readAllStandardOutput()};
const auto error_output{process_.readAllStandardError()};
process_.close();
if (error_output.length() > 0) {
// inform the user about log-output via QMessageBox
QMessageBox msgBox;
2024-10-13 10:02:49 +02:00
msgBox.setText(QObject::tr("QET_ElementScaler: \nadditional information about %1 import / scaling").arg(file_path));
msgBox.setInformativeText(QObject::tr("See details here:"));
msgBox.setDetailedText(error_output);
msgBox.exec();
}
return byte_array;
}
else
{
//If something went wrong we return an empty QByteArray
return QByteArray();
}
}
QString ElementScalerDirPath()
{
#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
return (QDir::homePath() + QStringLiteral("/Application Data/qet/binary"));
#elif defined(Q_OS_MACOS)
return (QDir::homePath() + QStringLiteral("/.qet/binary"));
#else
return (QDir::homePath() + QStringLiteral("/.qet/binary"));
#endif
}
/**
* @brief ElementScalerBinaryPath
* @return the path to the QET_ElementScaler program
*/
QString ElementScalerBinaryPath()
{
#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
return ElementScalerDirPath() + QStringLiteral("/QET_ElementScaler.exe");
#elif defined(Q_OS_MACOS)
return ElementScalerDirPath() + QStringLiteral("/./QET_ElementScaler");
#else
return ElementScalerDirPath() + QStringLiteral("/QET_ElementScaler");
#endif
}
/**
* @brief ElementScalerIsPresent
* Return true if QET_ElementScaler is present in the system
* @param install_dialog
* True to display a dialog with the explanations
* of how to install the QET_ElementScaler program
* if not present in the system.
* @return
*/
bool ElementScalerIsPresent(bool install_dialog, QWidget *parent)
{
const bool exist{QFile::exists(ElementScalerBinaryPath())};
if (!exist && install_dialog)
{
auto string_{QObject::tr("Le logiciel QET_ElementScaler est nécessaire pour mettre les éléments à l'échelle.\n"
"Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation")};
ThirdPartyBinaryInstallDialog dialog_(string_,
QStringLiteral("https://github.com/plc-user/QET_ElementScaler/releases"),
ElementScalerDirPath(),
parent);
dialog_.exec();
}
return exist;
}