14.06.2023

This commit is contained in:
Plotnikov
2023-06-14 18:08:32 +03:00
parent b0a0566f19
commit bdf6eab9ec
221 changed files with 203557 additions and 585 deletions

View File

@@ -0,0 +1,231 @@
#include "console.h"
#include "s1000d_manager.h"
#include <iostream>
#include <QDebug>
#include <QDir>
using namespace std;
// -SCORM -p "FULL, 2p" E:\C++\Test\01\auk-01_mi-38.lyx E:\C++\Test\01
// -SCORM -p "FULL" E:\C++\Test\AUK-01\01_mi-38.lyx E:\C++\Test\AUK-01
// -SCORM E:\C++\Test\AUK02_Mi38\auk-02_mi-38.lyx E:\C++\Test\AUK02_Mi38
console::console()
{
}
int console::exec(int argc, char *argv[])
{
//Q_UNUSED(argc)
if(QString(argv[1]) == "-?" || QString(argv[1]) == "-h" || QString(argv[1]) == "/h" || argc < 3)
{ printHelp(); return 0; }
exportSCORM = exportS1000D = false;
for(int i = 1; i < argc-2; i++)
{
if(QString(argv[i]).toUpper() == "-SCORM") exportSCORM = true;
if(QString(argv[i]).toUpper() == "-S1000D") exportS1000D = true;
if(QString(argv[i]).toLower() == "-p" && (i+1<argc-2))
{
QStringList l = QString(argv[i+1]).replace(" ", "").replace("\"","").split(",");
packageNames.append(l);
i++;
}
}
if(!exportSCORM && !exportS1000D) {exportSCORM = exportS1000D = true;}
lyxFile = QString(argv[argc-2]); dstPath = QString(argv[argc-1]);
QFileInfo lyxFileInfo(lyxFile); QDir dstdir(dstPath);
qDebug() << "Конвертация " << lyxFileInfo.fileName() << ":";
if(!lyxFileInfo.exists()) {
qDebug() << " Файл LyX не найден: " << lyxFile;
qDebug() << " Запустите конвертер с параметром -h для описания.";
return 1;
}
if(!dstdir.exists()) {
qDebug() << " Папка назначения не найдена: " << dstPath;
qDebug() << " Запустите конвертер с параметром -h для описания.";
return 1;
}
QString pckFileName = lyxFile;
pckFileName.replace(".lyx", ".xml");
if(!QFileInfo::exists(pckFileName)) {
qDebug() << " Файл пакетов в папке АУК не найден: " << pckFileName;
qDebug() << " Запустите конвертер в оконном режиме и создайте конфигурацию пакетов экспорта.";
return 1;
}
SM.isConsole = true;
SM.rootLyXfile = lyxFile;
SM.LoadPackagesXML();
QStringList configPackageNames;
foreach(S1000D_Manager::PackageStruct pack, SM.packages)
configPackageNames.append(pack.cfgName);
if(packageNames.count() == 0)
packageNames = configPackageNames;
else {
foreach(QString n, packageNames)
if(!configPackageNames.contains(n)) {
qDebug() << " Пакет " << n << " не сконфигурирован.";
qDebug() << " Запустите конвертер в оконном режиме и создайте конфигурацию пакетов экспорта.";
return 1;
}
}
printf(" LyX -> HTML (%d sec) .. ", SM.timeConvert); std::cout << std::flush;
QElapsedTimer timer; timer.start();
if(!lyx.Import(&SM, lyxFile, NULL)) {
printf("ОШИБКА импорта LyX.\n");
return 1;
}
SM.LoadPackagesXML();
if(!isCodingFilled()) {
printf("Ошибка: кодирование S1000D не заполнено.\n");
return 1;
}
html.Generate(&SM, false, NULL);
SM.LoadPackagesXML();
SM.timeConvert = (int)timer.elapsed()/1000;
SM.SaveProject();
printf("Ok\n");
if(exportSCORM) {
printf(" SCORM (%d sec):\n", SM.timeSCORM*packageNames.count());
if(packageNames.count() == 0)
printf("Пакеты не заданы. Пропущено.\n");
else
foreach(S1000D_Manager::PackageStruct pack, SM.packages)
if(packageNames.contains(pack.cfgName))
{
for(int i=0;i<SM.items.count();i++)
SM.items[i].toExport = SM.items[i].inPackages.contains(pack.cfgName);
QString s = " \""+pack.cfgName+"\" -> "+pack.exportFileName+"_SCORM"+".zip .. " ;
printf("%s", s.toLocal8Bit().toStdString().c_str()); std::cout << std::flush;
QApplication::processEvents();
bool res = SM.exportSCORM(dstPath, pack.exportFileName, pack.title, NULL);
if(res)
printf("Ok\n");
else
printf("ОШИБКА экспорта\n");
}
}
if(exportS1000D) {
printf(" S1000D (%d sec):\n", SM.timeS1000D*packageNames.count()) ;
if(packageNames.count() == 0)
printf("Пакеты не заданы. Пропущено.\n");
else
foreach(S1000D_Manager::PackageStruct pack, SM.packages)
if(packageNames.contains(pack.cfgName))
{
for(int i=0;i<SM.items.count();i++)
SM.items[i].toExport = SM.items[i].inPackages.contains(pack.cfgName);
QString s = " \""+pack.cfgName+"\" -> "+pack.exportFileName+".zip .. ";
printf("%s", s.toLocal8Bit().toStdString().c_str()); std::cout << std::flush;
QApplication::processEvents();
bool res = SM.exportS1000D(dstPath, pack.exportFileName, pack.title, NULL);
if(res)
printf("Ok\n");
else
printf("ОШИБКА экспорта\n");
}
}
SM.SaveProject(); //SM.SavePackagesXML();
return 0;
}
void console::printHelp()
{
setlocale(LC_ALL,"Russian");
qDebug() << "Конвертер АУК с формата LyX в пакеты стандартов S1000D и SCORM\n";
qDebug() << "Для запуска в оконном режиме запустите без параметров.";
qDebug() << "Формирование пакетов в консольном режиме выполняется со следующими параметрами:";
qDebug() << "CONVERTER [-SCORM] [-S1000D] [-p \"package1, ...\"] lyxfile destpath\n";
qDebug() << " -SCORM - тип формируемого пакета - SCORM;";
qDebug() << " -S1000D - тип формируемого пакета - S1000D, без явного указания формируются оба типа; ";
qDebug() << " -p - сформировать пакеты с именами package1,... (список через запятую в \"кавычках\");";
qDebug() << " без данной опции формируются все созданные в оконном режиме пакеты;";
qDebug() << " lyxfile - путь и имя файла LyX;";
qDebug() << " dstpath - путь для размещения сформировнных пакетов.";
}
QString console::delYYY(QString st) {
return st.replace("X", "").replace("Y", "").replace("N", "");
}
bool console::isCodingFilled() {
tmpStrList.clear(); tmpIntList.clear();
if(SM.items.count() == 0) return false;
for(int i=0;i<SM.items.count();i++)
if(SM.items[i].parent == -1)
if(!isCodingFilledRecurs(i))
return false;
return true;
}
bool console::isCodingFilledRecurs(int ind) {
SM.setCurItem(ind);
QString fCode, title;
if(SM.item->moduleType == mtPM) {
QString pmTitle, modelIdentCode, pmIssuer, pmNumber, pmVolume;
title = pmTitle = SM.getNodeText("identAndStatusSection.pmAddress.pmAddressItems.pmTitle");
modelIdentCode = SM.getNodeAttr("identAndStatusSection.pmAddress.pmIdent.pmCode", "modelIdentCode");
pmIssuer = SM.getNodeAttr("identAndStatusSection.pmAddress.pmIdent.pmCode", "pmIssuer");
pmNumber = SM.getNodeAttr("identAndStatusSection.pmAddress.pmIdent.pmCode", "pmNumber");
pmVolume = SM.getNodeAttr("identAndStatusSection.pmAddress.pmIdent.pmCode", "pmVolume");
if(pmTitle.isEmpty() || delYYY(pmIssuer).isEmpty() || delYYY(pmNumber).isEmpty() || delYYY(pmVolume).isEmpty()) {
return false;
}
fCode = SM.pmIdentString("identAndStatusSection.pmAddress.pmIdent");
}
if(SM.item->moduleType == mtDM) {
QString modelIdentCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "modelIdentCode");
QString systemDiffCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "systemDiffCode");
QString systemCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "systemCode");
QString subSystemCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "subSystemCode");
QString subSubSystemCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "subSubSystemCode");
QString assyCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "assyCode");
QString disassyCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "disassyCode");
QString disassyCodeVariant = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "disassyCodeVariant");
QString infoCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "infoCode");
QString infoCodeVariant = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "infoCodeVariant");
QString itemLocationCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "itemLocationCode");
QString learnCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "learnCode");
QString learnEventCode = SM.getNodeAttr("identAndStatusSection.dmAddress.dmIdent.dmCode", "learnEventCode");
QString techName = SM.getNodeText("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.techName");
//QString infoName = SM.getNodeText("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.infoName");
if(delYYY(modelIdentCode).isEmpty() || delYYY(systemDiffCode).isEmpty() || delYYY(systemCode).isEmpty() || delYYY(subSystemCode).isEmpty() || delYYY(subSubSystemCode).isEmpty() ||
delYYY(assyCode).isEmpty() || delYYY(disassyCode).isEmpty() || delYYY(disassyCodeVariant).isEmpty() || delYYY(infoCode).isEmpty() || delYYY(infoCodeVariant).isEmpty() ||
delYYY(itemLocationCode).isEmpty() || delYYY(learnCode).isEmpty() || delYYY(learnEventCode).isEmpty() || delYYY(techName).isEmpty() ) {
return false;
}
title = techName;
fCode = SM.dmIdentString("identAndStatusSection.dmAddress.dmIdent");
}
int tmpInd = tmpStrList.indexOf(fCode);
if(tmpInd != -1) {
SM.setCurItem(tmpIntList[tmpInd]);
QString title2;
if(SM.item->moduleType == mtDM)
title2 = SM.getNodeText("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.techName");
else
title2 = SM.getNodeText("identAndStatusSection.pmAddress.pmAddressItems.pmTitle");
return false;
}
tmpStrList.append(fCode); tmpIntList.append(ind);
for(int i=0;i<SM.items[ind].child.count();i++)
if(!isCodingFilledRecurs(SM.items[ind].child[i]))
return false;
return true;
}