mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer.git
synced 2026-03-28 19:55:48 +03:00
268 lines
10 KiB
C++
268 lines
10 KiB
C++
#include "cficontroller.h"
|
||
|
||
CfiController::CfiController(UpdateController* updateController, QObject *parent) :
|
||
QObject(parent),
|
||
updateController(updateController),
|
||
germanLocale(nullptr)
|
||
{
|
||
germanLocale = new QLocale(QLocale::German);
|
||
}
|
||
|
||
CfiController::~CfiController()
|
||
{
|
||
|
||
}
|
||
|
||
void CfiController::lockAccessToCfiXML()
|
||
{
|
||
mtxAccess.lock();
|
||
}
|
||
|
||
void CfiController::unLockAccessToCfiXML()
|
||
{
|
||
mtxAccess.unlock();
|
||
}
|
||
|
||
|
||
bool CfiController::parsingCfiXML(QMap<int, CfiObject>& mapCfiObjects)
|
||
{
|
||
QMutexLocker locker(&mtxAccess);
|
||
|
||
if(!updateController)
|
||
return false;
|
||
|
||
QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName);
|
||
|
||
QDomDocument docCfiListDOM_Orig;
|
||
if(! Tools::loadFileXMLtoDOM(pathCfiListFile, &docCfiListDOM_Orig))
|
||
return false;
|
||
|
||
if(!parsingCfiXML_DOM(docCfiListDOM_Orig, mapCfiObjects))
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CfiController::updateCfiXML(const QByteArray &array)
|
||
{
|
||
QMutexLocker locker(&mtxAccess);
|
||
|
||
if(!updateController)
|
||
return false;
|
||
|
||
//Исходный файл (на Сервере)
|
||
QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName);
|
||
QDomDocument docCfiListDOM_Orig;
|
||
if(! Tools::loadFileXMLtoDOM(pathCfiListFile, &docCfiListDOM_Orig))
|
||
return false;
|
||
|
||
//Новый файл с изменениями (поступивший от клиента) в формате массива
|
||
QDomDocument docCfiListDOM_New;
|
||
if(! Tools::loadByteArrayXMLtoDOM(array, &docCfiListDOM_New))
|
||
return false;
|
||
|
||
QMap<int, CfiObject> mapCfiObjects_Orig;
|
||
QMap<int, CfiObject> mapCfiObjects_New;
|
||
|
||
if(!parsingCfiXML_DOM(docCfiListDOM_Orig, mapCfiObjects_Orig))
|
||
return false;
|
||
|
||
if(!parsingCfiXML_DOM(docCfiListDOM_New, mapCfiObjects_New))
|
||
return false;
|
||
|
||
if(!merge2map(mapCfiObjects_Orig, mapCfiObjects_New))
|
||
return false;
|
||
|
||
return saveNewCfiListFile(mapCfiObjects_Orig);
|
||
}
|
||
|
||
/*
|
||
void CfiController::test()
|
||
{
|
||
QString pathCfiListFile = updateController->getPathAdditionalFile("/new_CfiList.xml");
|
||
QByteArray array;
|
||
Tools::loadFileXMLtoByteArray(pathCfiListFile, array);
|
||
updateCfiXML(array);
|
||
}
|
||
*/
|
||
|
||
Vector3dDouble CfiController::getXYZfromElement(QDomElement element)
|
||
{
|
||
Vector3dDouble vector3D;
|
||
QDomNamedNodeMap nodeMap = element.attributes();
|
||
vector3D.setX(germanLocale->toDouble(nodeMap.namedItem("x").nodeValue()));
|
||
vector3D.setY(germanLocale->toDouble(nodeMap.namedItem("y").nodeValue()));
|
||
vector3D.setZ(germanLocale->toDouble(nodeMap.namedItem("z").nodeValue()));
|
||
return vector3D;
|
||
}
|
||
|
||
Vector2dDouble CfiController::getXYfromElement(QDomElement element)
|
||
{
|
||
Vector2dDouble vector2D;
|
||
QDomNamedNodeMap nodeMap = element.attributes();
|
||
vector2D.setX(germanLocale->toDouble(nodeMap.namedItem("x").nodeValue()));
|
||
vector2D.setY(germanLocale->toDouble(nodeMap.namedItem("y").nodeValue()));
|
||
return vector2D;
|
||
}
|
||
|
||
double CfiController::roundDoubleVal(double value, int cntNumAfterPoint)
|
||
{
|
||
return round(value * pow(10, cntNumAfterPoint)) / pow(10, cntNumAfterPoint);
|
||
}
|
||
|
||
bool CfiController::parsingCfiXML_DOM(QDomDocument &domDoc, QMap<int, CfiObject>& mapCfiObjects)
|
||
{
|
||
QDomElement CFIObjectsElement = domDoc.firstChildElement("CFIObjects");
|
||
if(CFIObjectsElement.isNull())
|
||
return false;
|
||
|
||
mapCfiObjects.clear();
|
||
|
||
//Parsing
|
||
QDomElement oneCFIObjectElement = CFIObjectsElement.firstChildElement();
|
||
if(oneCFIObjectElement.isNull())
|
||
return true;
|
||
|
||
QString name;
|
||
|
||
do
|
||
{
|
||
name = oneCFIObjectElement.nodeName();
|
||
|
||
if(name == "CFIObject")
|
||
{
|
||
CfiObject cfiObj;
|
||
|
||
cfiObj.setDomElement(oneCFIObjectElement);
|
||
|
||
//атрибуты CFIObject
|
||
QDomNamedNodeMap nodeMapOneCFIObject = oneCFIObjectElement.attributes();
|
||
cfiObj.setId(nodeMapOneCFIObject.namedItem("id").nodeValue().toInt());
|
||
cfiObj.setIsChanged(nodeMapOneCFIObject.namedItem("isChanged").nodeValue() == "True" ? true : false);
|
||
|
||
//childs CFIObject
|
||
QDomElement cfiName_Element = oneCFIObjectElement.elementsByTagName("cfiName").at(0).toElement();
|
||
cfiObj.setCfiName(cfiName_Element.text());
|
||
QDomElement cfi_Element = oneCFIObjectElement.elementsByTagName("cfi").at(0).toElement();
|
||
cfiObj.setCfi(cfi_Element.text());
|
||
QDomElement zoneName_Element = oneCFIObjectElement.elementsByTagName("zoneName").at(0).toElement();
|
||
cfiObj.setZoneName(zoneName_Element.text());
|
||
QDomElement goName_Element = oneCFIObjectElement.elementsByTagName("goName").at(0).toElement();
|
||
cfiObj.setGoName(goName_Element.text());
|
||
|
||
//child CFIObject : SetCameraPos
|
||
SetCameraPos setCamPos;
|
||
QDomElement setcamerapos_Element = oneCFIObjectElement.elementsByTagName("setcamerapos").at(0).toElement();
|
||
//атрибуты setcamerapos
|
||
QDomNamedNodeMap nodeMapSetcamerapos = setcamerapos_Element.attributes();
|
||
setCamPos.set = nodeMapSetcamerapos.namedItem("set").nodeValue() == "True" ? true : false;
|
||
setCamPos.fast = nodeMapSetcamerapos.namedItem("fast").nodeValue() == "True" ? true : false;
|
||
setCamPos.specialPanel = nodeMapSetcamerapos.namedItem("specialPanel").nodeValue() == "True" ? true : false;
|
||
|
||
setCamPos.cameraMode = nodeMapSetcamerapos.namedItem("cameraMode").nodeValue();
|
||
setCamPos.state = nodeMapSetcamerapos.namedItem("state").nodeValue();
|
||
setCamPos.panelName = nodeMapSetcamerapos.namedItem("panelName").nodeValue();
|
||
|
||
setCamPos.prevCamOffsetMARposY = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue());
|
||
setCamPos.camOffsetMARposY = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue());
|
||
setCamPos.prevCharControlerHeight = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue());
|
||
setCamPos.charControlerHeight = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue());
|
||
setCamPos.FOV = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("FOV").nodeValue());
|
||
setCamPos.moveSpeed = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue());
|
||
setCamPos.projectionSize = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("projectionSize").nodeValue());
|
||
setCamPos.offset = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("offset").nodeValue());
|
||
setCamPos.prevPlayerRot = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue());
|
||
|
||
//childs setcamerapos
|
||
QDomElement loc_Element;
|
||
loc_Element = setcamerapos_Element.elementsByTagName("axesClamp").at(0).toElement();
|
||
setCamPos.axesClamp = getXYfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("prevPlayerPos").at(0).toElement();
|
||
setCamPos.prevPlayerPos = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("playerPos").at(0).toElement();
|
||
setCamPos.playerPos = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("playerRot").at(0).toElement();
|
||
setCamPos.playerRot = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("prevCamRot").at(0).toElement();
|
||
setCamPos.prevCamRot = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("camRot").at(0).toElement();
|
||
setCamPos.camRot = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("goCenter").at(0).toElement();
|
||
setCamPos.goCenter = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("playerMARpos").at(0).toElement();
|
||
setCamPos.playerMARpos = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("playerMARrot").at(0).toElement();
|
||
setCamPos.playerMARrot = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("camMARrot").at(0).toElement();
|
||
setCamPos.camMARrot = getXYZfromElement(loc_Element);
|
||
loc_Element = setcamerapos_Element.elementsByTagName("playerPosRelativeToThePanel").at(0).toElement();
|
||
setCamPos.playerPosRelativeToThePanel = getXYZfromElement(loc_Element);
|
||
|
||
cfiObj.setSetCameraPos(setCamPos);
|
||
|
||
mapCfiObjects.insert(cfiObj.getId(), cfiObj);
|
||
}
|
||
}while (! (oneCFIObjectElement = oneCFIObjectElement.nextSiblingElement()).isNull());
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CfiController::merge2map(QMap<int, CfiObject> &mapCfiObjects_orig, QMap<int, CfiObject> &mapCfiObjects_new)
|
||
{
|
||
//Проверка на удаление
|
||
for(CfiObject cfiObj : mapCfiObjects_orig)
|
||
{
|
||
int id = cfiObj.getId();
|
||
|
||
if(!mapCfiObjects_new.contains(id))
|
||
{//Удаляем
|
||
mapCfiObjects_orig.take(id);
|
||
}
|
||
}
|
||
|
||
//Замена, Добавление
|
||
for(CfiObject cfiObj : mapCfiObjects_new)
|
||
{
|
||
int id = cfiObj.getId();
|
||
|
||
if(mapCfiObjects_orig.contains(id))
|
||
{//Такой есть
|
||
if(cfiObj.getIsChanged())
|
||
{//Заменяем
|
||
mapCfiObjects_orig.take(id);
|
||
|
||
cfiObj.setIsChanged(false);
|
||
cfiObj.resetIsChangedInDomElement();
|
||
mapCfiObjects_orig.insert(id, cfiObj);
|
||
}
|
||
}
|
||
else
|
||
{//Добавляем
|
||
cfiObj.setIsChanged(false);
|
||
cfiObj.resetIsChangedInDomElement();
|
||
mapCfiObjects_orig.insert(id, cfiObj);
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CfiController::saveNewCfiListFile(QMap<int, CfiObject> &mapCfiObjects)
|
||
{
|
||
QDomDocument commonDOM;
|
||
if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListCFI.xml", &commonDOM))
|
||
return false;
|
||
|
||
QDomNode listNode = commonDOM.namedItem("CFIObjects");
|
||
|
||
for(CfiObject cfiObj : mapCfiObjects)
|
||
{
|
||
listNode.appendChild(cfiObj.getDomElement());
|
||
}
|
||
|
||
QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName);
|
||
|
||
return Tools::saveDOMtoFileXML(pathCfiListFile, &commonDOM);
|
||
}
|