Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Plugins/PlanEditor/mil2525d_to_mil2525c.cpp
T
torstenandCopilot b774f4035c Qt6 Migration: DDS-Stubs, Logger-Fixes, Export-Header Korrekturen
- NGL_ADD_LIBRARY2: 87 CMakeLists.txt konvertiert für Export-Header Generierung
- 44 Export-Header Include-Pfade korrigiert (_export.h)
- 81 DDS-Stub-Header generiert (*_dtc.h, *_fts.h, *_dts.h, *_ftc.h)
- INGLLogger: Duplikat gelöscht, m_logger Member entfernt, variadische Makros
- Q_FUNC_INFO Redefinition behoben (Qt6 definiert bereits)
- FATAL_LOG Makro hinzugefügt
- InfrastructureManagement DDS-Stubs (ism.hpp, ism_enums.hpp, ism_ftc.h)
- FilterManagement DDS-Stubs (flt_ftc.h, flt_dts.h)
- AreaEffectSimulation DDS-Stubs (aes.hpp, aes_enums.hpp)
- SymbolAppearance Klasse vollständig definiert mit content() Methode
- BuildingComponentFilter Klasse definiert mit Copy-Konstruktor
- Ftc Factory: nullptr Return (abstract class)
- AesFilter Klasse in aes.hpp hinzugefügt
- Dtc Klasse in ppm.hpp mit participantChanged Signal
- AesType Enum: alle 15 At* Werte definiert
- AesEffectState_def: EsReceived hinzugefügt
- DataModification Enum: eAdded/eModified/eRemoved
- function_reply_object.h → core_types.h Include-Pfad (72 Dateien)
- Enum-Class-Streaming Template-Operator in INGLLogger.h
- ism_mounting_point.h: QImage → QtGui/QImage, QGuiApplication/QScreen
- ism_data_plugin_interface.h: QSet Include, Include-Reihenfolge
- QRegExp → QRegularExpression in tpm_js_parser.cpp
- .underlying() Aufrufe zu direktem Enum-Vergleich korrigiert
- Include-Pfade: aes.hpp in symbol_appearance_settings_impl.h und aes_display_filter_impl.h

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-19 06:06:24 +02:00

234 lines
6.1 KiB
C++
Executable File

#include "mil2525d_to_mil2525c.h"
#include "logging.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QHash>
#include <QtCore/QVector>
#include <QtCore/QRegExp>
#include <QtCore/QSharedData>
#include <QtCore/QExplicitlySharedDataPointer>
#include <QtCore/QTextStream>
namespace PlanEditor
{
namespace MIL2525
{
class Converter::Internal
{
class CodePair : public QSharedData
{
public:
unsigned int m_code2525d;
QString m_sidc2525c;
QRegExp m_sidcQuery;
QString m_kindOfRubberband;
explicit CodePair(unsigned int code, QString sidc, const QString &kindOfRubberband)
: m_code2525d(code)
, m_sidc2525c(sidc)
, m_kindOfRubberband(kindOfRubberband)
{
sidc.replace(QLatin1Char('*'), QLatin1Char('.'));
m_sidcQuery = QRegExp(sidc);
if (m_kindOfRubberband.isEmpty()) m_kindOfRubberband = QStringLiteral("PointFeature");
}
~CodePair() = default;
};
typedef QExplicitlySharedDataPointer<CodePair> CodePairPointer;
QVector<CodePairPointer> m_codePairList;
QHash<unsigned int, CodePairPointer> m_2525dToSidc;
QHash<QString, QVector<CodePairPointer>> m_kindOfRubberbandHash;
Logger m_logger;
bool parseLine(const QString &line)
{
if (line.isEmpty()) return true;
QVector<QStringRef> tokenList = line.splitRef(QLatin1Char(';'));
QRegExp sidcTemplate(QStringLiteral("^[A-Z]{1,1}\\*[A-Z]+[\\-\\*X]+$"));
QString sidc;
foreach (const auto &t, tokenList)
{
if (t.size() != 15) continue;
const QString token(t.toString());
if (sidcTemplate.exactMatch(token))
{
sidc = token;
break;
}
}
if (sidc.isEmpty()) return true;
bool isNumber = false;
const QStringRef &code2525d = tokenList.last();
unsigned int code = code2525d.toUInt(&isNumber);
if (!isNumber)
{
return true;
}
if (m_2525dToSidc.contains(code)) return true;
QStringRef kindOfRubberband;
foreach (auto token, tokenList)
{
if (token.startsWith(QStringLiteral("gct_")))
{
kindOfRubberband = token;
break;
}
}
CodePairPointer codePair(new CodePair(code, sidc.left(10), kindOfRubberband.toString()));
m_2525dToSidc[code] = codePair;
m_codePairList += codePair;
m_kindOfRubberbandHash[codePair->m_kindOfRubberband] += codePair;
return true;
}
public:
Internal() : m_logger(getLogger("MIL2525-Converter"))
{
auto stripLeadingAndTrailingQuotes = [](QString str) -> QString
{
str = str.simplified();
if (str.startsWith(QLatin1Char('"')))
{
str.remove(0, 1);
if (str.endsWith(QLatin1Char('"'))) str.chop(1);
}
return str;
};
QFile file(QCoreApplication::applicationDirPath() + QStringLiteral("/MIL2525D_to_MIL2525C.def"));
if (file.exists())
{
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
unsigned int lineNo = 0;
while (!file.atEnd())
{
lineNo++;
QString line(QString::fromLatin1(file.readLine()));
if (lineNo > 1)
{
if (!parseLine(stripLeadingAndTrailingQuotes(line)))
ERROR_LOG() << "Error while parsing MIL2525D_toMIL2525C.def in line " << lineNo << ENDLOG();
}
}
file.close();
#ifdef LOG_gct_token
file.setFileName(QStringLiteral("C:/MIL2525D_RubberbandKinds.txt"));
if (file.open(QIODevice::OpenModeFlag::ReadWrite | QIODevice::OpenModeFlag::Truncate | QIODevice::OpenModeFlag::Text))
{
QTextStream ostream(&file);
for (auto keyIter = m_kindOfRubberbandHash.keyBegin(); keyIter != m_kindOfRubberbandHash.keyEnd(); ++keyIter)
{
const QString &kindOfRubberband = *keyIter;
const QLinkedList<CodePairPointer> &codeList = m_kindOfRubberbandHash[kindOfRubberband];
ostream.setFieldWidth(35);
ostream.setFieldAlignment(QTextStream::FieldAlignment::AlignLeft);
ostream << kindOfRubberband;
ostream.setFieldAlignment(QTextStream::FieldAlignment::AlignRight);
ostream.setFieldWidth(-1);
foreach (const auto code, codeList)
{
ostream << '\n';
ostream.setFieldWidth(35);
ostream << ' ';
ostream.setFieldWidth(16);
ostream << code->m_sidc2525c;
ostream.setFieldWidth(9);
ostream << code->m_code2525d;
ostream.setFieldWidth(-1);
}
ostream << '\n';
ostream.flush();
}
file.close();
}
#endif
}
else ERROR_LOG() << "Open file for reading failed: " << file.fileName() << ENDLOG();
}
else ERROR_LOG() << "File doesn't exist: " << file.fileName() << ENDLOG();
}
~Internal()
{
m_2525dToSidc.clear();
m_codePairList.clear();
m_codePairList.clear();
}
QString baseSymbolFromSidc(const QString &sidc) const
{
foreach (auto codePairPtr, m_codePairList)
{
if (codePairPtr->m_sidcQuery.exactMatch(sidc))
return QString::number(codePairPtr->m_code2525d);
}
return QString();
}
QString baseSymbolToSidc(const QString &baseSymbolCode) const
{
bool ok = false;
unsigned int code = baseSymbolCode.toUInt(&ok);
if (!ok) return QString();
auto it = m_2525dToSidc.find(code);
if (it == m_2525dToSidc.end()) return QString();
return it.value()->m_sidc2525c;
}
};
Converter::Converter() : m_internal(new Internal()) {;}
Converter::~Converter() { delete m_internal; }
QString Converter::baseSymbolFromSidc(const QString &sidc) const { return m_internal->baseSymbolFromSidc(sidc); }
QString Converter::baseSymbolToSidc(const QString &baseSymbolCode) const { return m_internal->baseSymbolToSidc(baseSymbolCode); }
}
}