diff --git a/Source/src/entities/ConeWaveComponent.cpp b/Source/src/entities/ConeWaveComponent.cpp index 2669bb48..c0b37a88 100644 --- a/Source/src/entities/ConeWaveComponent.cpp +++ b/Source/src/entities/ConeWaveComponent.cpp @@ -8,6 +8,7 @@ #include "entities/Entity.h" #include "workspace/WorkSpace.h" #include "workspace/Timestep.h" +#include "workspace/LampStatus.h" ConeWaveComponent::ConeWaveComponent(SceneComponent* parent) @@ -15,6 +16,10 @@ ConeWaveComponent::ConeWaveComponent(SceneComponent* parent) const QString txturePath = RecourceHelper::Get().GetBasePath() + "/resources/textures/stripes_h.png"; coneWave_ = new ConeWave(txturePath.toStdString()); coneWave_->InitGeode(); + + colorMap_[1] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); + colorMap_[2] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); + colorMap_[3] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); } ConeWaveComponent::~ConeWaveComponent() { @@ -26,8 +31,12 @@ std::string ConeWaveComponent::GetTypeName() { } bool ConeWaveComponent::SetAttribute(const char* name, const char* value) { - if (0 == strcmp("color" ,name)) { - SetBaseColor(StringUtils::StringToVec4(value)); + if (0 == strcmp("color1" ,name)) { + AddColor(1, StringUtils::StringToVec4(value)); + } else if (0 == strcmp("color2" ,name)) { + AddColor(2, StringUtils::StringToVec4(value)); + }else if (0 == strcmp("color3" ,name)) { + AddColor(3, StringUtils::StringToVec4(value)); } else if (0 == strcmp("radius", name)) { SetRadius(atof(value)); } else if (0 == strcmp("height", name)) { @@ -40,7 +49,21 @@ bool ConeWaveComponent::SetAttribute(const char* name, const char* value) { } bool ConeWaveComponent::SaveAttribute(tinyxml2::XMLElement* element) { - element->SetAttribute("color", StringUtils::Vec4ToString(GetBaseColor()).c_str()); + if (colorMap_.find(1) != colorMap_.end()) { + element->SetAttribute("color1", StringUtils::Vec4ToString(colorMap_[1]).c_str()); + } else { + element->SetAttribute("color1", StringUtils::Vec4ToString(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)).c_str()); + } + if (colorMap_.find(2) != colorMap_.end()) { + element->SetAttribute("color2", StringUtils::Vec4ToString(colorMap_[2]).c_str()); + } else { + element->SetAttribute("color2", StringUtils::Vec4ToString(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)).c_str()); + } + if (colorMap_.find(3) != colorMap_.end()) { + element->SetAttribute("color3", StringUtils::Vec4ToString(colorMap_[3]).c_str()); + } else { + element->SetAttribute("color3", StringUtils::Vec4ToString(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)).c_str()); + } element->SetAttribute("radius", std::to_string(GetRadius()).c_str()); element->SetAttribute("height", std::to_string(GetHeight()).c_str()); element->SetAttribute("event", timeAction_ == nullptr ? "" : timeAction_->GetPath().toStdString().c_str()); @@ -82,6 +105,33 @@ const osg::Vec4 ConeWaveComponent::GetBaseColor() const { return coneWave_->GetBaseColor(); } +void ConeWaveComponent::SetColor1(const osg::Vec4& color) { + colorMap_[1] = color; +} + +const osg::Vec4 ConeWaveComponent::GetColor1() const { + const auto color = colorMap_.find(1); + return color->second; +} + +void ConeWaveComponent::SetColor2(const osg::Vec4& color) { + colorMap_[2] = color; +} + +const osg::Vec4 ConeWaveComponent::GetColor2() const { + const auto color = colorMap_.find(2); + return color->second; +} + +void ConeWaveComponent::SetColor3(const osg::Vec4& color) { + colorMap_[3] = color; +} + +const osg::Vec4 ConeWaveComponent::GetColor3() const { + const auto color = colorMap_.find(3); + return color->second; +} + void ConeWaveComponent::SetTimeAction(const QString& path) { if (nullptr != timeAction_) { timeAction_->deleteLater(); @@ -112,18 +162,43 @@ void ConeWaveComponent::UpdateEvent() { return; } - Timestep* timeStep = workspace->GetTimestep(); - if (nullptr == timeStep) { - LOG_WARN("timeStep is nullptr"); + LampStatus* lampStatus = workspace->GetLampStatus(); + if (nullptr == lampStatus) { return; } - double dt = timeStep->GetCurrent(); - int value = timeAction_->GetValue(dt); - if (-1 == value) { + if (currentStatus_ == lampStatus->GetCurrent()) { + return; + } + currentStatus_ = lampStatus->GetCurrent(); + if (colorMap_.find(currentStatus_) == colorMap_.end()) { + coneWave_->setNodeMask(0x0); return; } - coneWave_->setNodeMask(value == 0 ? 0x0 : 0xff); + osg::Vec4& color = colorMap_[currentStatus_]; + coneWave_->SetBaseColor(color); + coneWave_->setNodeMask(0xff); + + + //Timestep* timeStep = workspace->GetTimestep(); + //if (nullptr == timeStep) { + // LOG_WARN("timeStep is nullptr"); + // return; + //} + + //double dt = timeStep->GetCurrent(); + //int value = timeAction_->GetValue(dt); + //if (-1 == value) { + // return; + //} + // + + //coneWave_->setNodeMask(value == 0 ? 0x0 : 0xff); + +} + +void ConeWaveComponent::AddColor(int32_t status, const osg::Vec4& color) { + colorMap_[status] = color; } diff --git a/Source/src/entities/ConeWaveComponent.h b/Source/src/entities/ConeWaveComponent.h index 53d22f32..5cf15c19 100644 --- a/Source/src/entities/ConeWaveComponent.h +++ b/Source/src/entities/ConeWaveComponent.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "entities/SceneComponent.h" #include "osg/Vec3" @@ -32,14 +34,26 @@ public: void SetBaseColor(const osg::Vec4& color); const osg::Vec4 GetBaseColor() const; + void SetColor1(const osg::Vec4& color); + const osg::Vec4 GetColor1() const; + + void SetColor2(const osg::Vec4& color); + const osg::Vec4 GetColor2() const; + + void SetColor3(const osg::Vec4& color); + const osg::Vec4 GetColor3() const; + void SetTimeAction(const QString& path); protected: void AddToRender() override; void Initialize(); void UpdateEvent(); + void AddColor(int32_t status, const osg::Vec4& color); protected: osg::ref_ptr coneWave_; + std::unordered_map colorMap_; class TimeAction* timeAction_{ nullptr }; + int currentStatus_{ 0 }; }; diff --git a/Source/src/translations/Dyt_zh_CN.ts b/Source/src/translations/Dyt_zh_CN.ts index 1e7628f9..979e3c86 100644 --- a/Source/src/translations/Dyt_zh_CN.ts +++ b/Source/src/translations/Dyt_zh_CN.ts @@ -322,52 +322,52 @@ - + model elements - + attribte - + Wave Curve - + Speed Curve - + 3D Curve - + Report Table - + Report - + Signal Indicator Lamp - + name: 5year 0412 - + start: no start @@ -690,24 +690,34 @@ QtConeWaveComponentManager - - + + ConeWaveComponent - + Height - + Radius - - Color + + Color1 + + + + + Color2 + + + + + Color3 @@ -812,28 +822,28 @@ QtDashedLineComponentManager - - + + DashedLineComponent - + Start - + End - + Radius - + Color diff --git a/Source/src/ui/Layout/SignalIndicatorLampUI.cpp b/Source/src/ui/Layout/SignalIndicatorLampUI.cpp index 20b70deb..6c25016c 100644 --- a/Source/src/ui/Layout/SignalIndicatorLampUI.cpp +++ b/Source/src/ui/Layout/SignalIndicatorLampUI.cpp @@ -213,6 +213,21 @@ void SignalIndicatorLampUI::slotUpdateTime(double dTime) SetLampState(vecStatus); } +void SignalIndicatorLampUI::onStatusChanged(int status) { + if ((status) >= m_lampStatus.size()) { + return; + } + + std::vector vecStatus; + for (size_t i = 0; i < m_iLampCount; i++) { + vecStatus.push_back(0); + } + + vecStatus[status - 1] = 1; + + SetLampState(vecStatus); +} + void SignalIndicatorLampUI::paintEvent(QPaintEvent* event) { QPainter painter(this); diff --git a/Source/src/ui/Layout/SignalIndicatorLampUI.h b/Source/src/ui/Layout/SignalIndicatorLampUI.h index 06d0c87b..65d5fad8 100644 --- a/Source/src/ui/Layout/SignalIndicatorLampUI.h +++ b/Source/src/ui/Layout/SignalIndicatorLampUI.h @@ -35,6 +35,7 @@ public: protected slots: void slotUpdateTime(double dTime); + void onStatusChanged(int status); protected: void paintEvent(QPaintEvent* event); diff --git a/Source/src/ui/MainWindow.cpp b/Source/src/ui/MainWindow.cpp index d2d0b164..e7625156 100644 --- a/Source/src/ui/MainWindow.cpp +++ b/Source/src/ui/MainWindow.cpp @@ -27,6 +27,7 @@ #include "../workspace/WorkSpaceManager.h" #include "../workspace/WorkSpace.h" #include "../workspace/Timestep.h" +#include "../workspace/LampStatus.h" #include "ui_MainWindow.h" @@ -174,7 +175,7 @@ void MainWindow::InitUI() { signalIndicatorLampUI_ = new SignalIndicatorLampUI; signalIndicatorLampUI_->AttachDock(signalIndicatorLampDock); signalIndicatorLampUI_->InitLamp(lampPath); - connect(WorkSpaceManager::Get().GetCurrent()->GetTimestep(), SIGNAL(TimeChanged(double)), signalIndicatorLampUI_, SLOT(slotUpdateTime(double))); + connect(WorkSpaceManager::Get().GetCurrent()->GetLampStatus(), SIGNAL(StatusChanged(int)), signalIndicatorLampUI_, SLOT(onStatusChanged(int))); m_mapDockWidget.insert("SignalIndicatorLampUI", signalIndicatorLampDock); diff --git a/Source/src/ui/PropertyBrowser/qtpropertymanager.cpp b/Source/src/ui/PropertyBrowser/qtpropertymanager.cpp index a3922a36..79ff3875 100644 --- a/Source/src/ui/PropertyBrowser/qtpropertymanager.cpp +++ b/Source/src/ui/PropertyBrowser/qtpropertymanager.cpp @@ -8254,11 +8254,15 @@ public: QMap m_properyToRadius; QMap m_properyToHeight; - QMap m_properyToColor; + QMap m_properyToColor1; + QMap m_properyToColor2; + QMap m_properyToColor3; QMap m_radiusToPropery; QMap m_heightToPropery; - QMap m_colorToPropery; + QMap m_color1ToPropery; + QMap m_color2ToPropery; + QMap m_color3ToPropery; }; @@ -8276,9 +8280,17 @@ void QtConeWaveComponentManagerPrivate::slotDoubleChanged(QtProperty* property, } void QtConeWaveComponentManagerPrivate::slotColorChanged(QtProperty* property, const QColor& value) { - if (QtProperty* prop = m_colorToPropery.value(property, 0)) { + if (QtProperty* prop = m_color1ToPropery.value(property, 0)) { QConeWaveComponentAttribute c = m_values[prop]; - c.SetColor(value); + c.SetColor1(value); + q_ptr->setValue(prop, c); + } else if (QtProperty* prop = m_color2ToPropery.value(property, 0)) { + QConeWaveComponentAttribute c = m_values[prop]; + c.SetColor2(value); + q_ptr->setValue(prop, c); + } else if (QtProperty* prop = m_color3ToPropery.value(property, 0)) { + QConeWaveComponentAttribute c = m_values[prop]; + c.SetColor3(value); q_ptr->setValue(prop, c); } } @@ -8292,9 +8304,18 @@ void QtConeWaveComponentManagerPrivate::slotPropertyDestroyed(QtProperty* proper m_heightToPropery[subProp] = 0; m_heightToPropery.remove(property); } - if (QtProperty* subProp = m_colorToPropery.value(property, nullptr)) { - m_colorToPropery[subProp] = 0; - m_colorToPropery.remove(property); + if (QtProperty* subProp = m_color1ToPropery.value(property, nullptr)) { + m_color1ToPropery[subProp] = 0; + m_color1ToPropery.remove(property); + } + + if (QtProperty* subProp = m_color2ToPropery.value(property, nullptr)) { + m_color2ToPropery[subProp] = 0; + m_color2ToPropery.remove(property); + } + if (QtProperty* subProp = m_color3ToPropery.value(property, nullptr)) { + m_color3ToPropery[subProp] = 0; + m_color3ToPropery.remove(property); } } @@ -8397,7 +8418,9 @@ void QtConeWaveComponentManager::setValue(QtProperty* property, const QConeWaveC d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToRadius[property], value.GetRadius()); d_ptr->m_doubleProperyManager->setValue(d_ptr->m_properyToHeight[property], value.GetHeight()); - d_ptr->m_colorProperyManager->setValue(d_ptr->m_properyToColor[property], value.GetColor()); + d_ptr->m_colorProperyManager->setValue(d_ptr->m_properyToColor1[property], value.GetColor1()); + d_ptr->m_colorProperyManager->setValue(d_ptr->m_properyToColor2[property], value.GetColor2()); + d_ptr->m_colorProperyManager->setValue(d_ptr->m_properyToColor3[property], value.GetColor3()); emit propertyChanged(property); emit valueChanged(property, value); @@ -8425,10 +8448,24 @@ void QtConeWaveComponentManager::initializeProperty(QtProperty* property) { property->addSubProperty(prop); prop = d_ptr->m_colorProperyManager->addProperty(); - prop->setPropertyName(tr("Color")); - d_ptr->m_colorProperyManager->setValue(prop, val.GetColor()); - d_ptr->m_properyToColor[property] = prop; - d_ptr->m_colorToPropery[prop] = property; + prop->setPropertyName(tr("Color1")); + d_ptr->m_colorProperyManager->setValue(prop, val.GetColor1()); + d_ptr->m_properyToColor1[property] = prop; + d_ptr->m_color1ToPropery[prop] = property; + property->addSubProperty(prop); + + prop = d_ptr->m_colorProperyManager->addProperty(); + prop->setPropertyName(tr("Color2")); + d_ptr->m_colorProperyManager->setValue(prop, val.GetColor2()); + d_ptr->m_properyToColor2[property] = prop; + d_ptr->m_color2ToPropery[prop] = property; + property->addSubProperty(prop); + + prop = d_ptr->m_colorProperyManager->addProperty(); + prop->setPropertyName(tr("Color3")); + d_ptr->m_colorProperyManager->setValue(prop, val.GetColor3()); + d_ptr->m_properyToColor3[property] = prop; + d_ptr->m_color3ToPropery[prop] = property; property->addSubProperty(prop); } @@ -8450,12 +8487,26 @@ void QtConeWaveComponentManager::uninitializeProperty(QtProperty* property) { } d_ptr->m_properyToHeight.remove(property); - prop = d_ptr->m_colorToPropery[property]; + prop = d_ptr->m_color1ToPropery[property]; if (prop) { - d_ptr->m_colorToPropery.remove(prop); + d_ptr->m_color1ToPropery.remove(prop); delete prop; } - d_ptr->m_properyToColor.remove(property); + d_ptr->m_properyToColor1.remove(property); + + prop = d_ptr->m_color2ToPropery[property]; + if (prop) { + d_ptr->m_color2ToPropery.remove(prop); + delete prop; + } + d_ptr->m_properyToColor2.remove(property); + + prop = d_ptr->m_color3ToPropery[property]; + if (prop) { + d_ptr->m_color3ToPropery.remove(prop); + delete prop; + } + d_ptr->m_properyToColor3.remove(property); } #pragma endregion diff --git a/Source/src/ui/PropertyBrowser/qtworkspaceattribute.cpp b/Source/src/ui/PropertyBrowser/qtworkspaceattribute.cpp index 5adc98e0..fa764058 100644 --- a/Source/src/ui/PropertyBrowser/qtworkspaceattribute.cpp +++ b/Source/src/ui/PropertyBrowser/qtworkspaceattribute.cpp @@ -265,12 +265,12 @@ float QConeWaveComponentAttribute::GetRadius() const { return object_->GetRadius(); } -void QConeWaveComponentAttribute::SetColor(const QColor& c) { +void QConeWaveComponentAttribute::SetColor1(const QColor& c) { if (nullptr == object_) { return; } - osg::Vec4 vColor = object_->GetBaseColor(); + osg::Vec4 vColor = object_->GetColor1(); QColor color; OsgUtils::Vec4ToQColor(vColor, &color); if (c == color) { @@ -278,14 +278,66 @@ void QConeWaveComponentAttribute::SetColor(const QColor& c) { } OsgUtils::QColorToVec4(color, &vColor); - object_->SetBaseColor(vColor); + object_->SetColor1(vColor); } -QColor QConeWaveComponentAttribute::GetColor() const { +QColor QConeWaveComponentAttribute::GetColor1() const { if (nullptr == object_) { return QColor(); } - osg::Vec4 vColor = object_->GetBaseColor(); + osg::Vec4 vColor = object_->GetColor1(); + QColor color; + OsgUtils::Vec4ToQColor(vColor, &color); + return color; +} + +void QConeWaveComponentAttribute::SetColor2(const QColor& c) { + if (nullptr == object_) { + return; + } + + osg::Vec4 vColor = object_->GetColor2(); + QColor color; + OsgUtils::Vec4ToQColor(vColor, &color); + if (c == color) { + return; + } + + OsgUtils::QColorToVec4(color, &vColor); + object_->SetColor2(vColor); +} + +QColor QConeWaveComponentAttribute::GetColor2() const { + if (nullptr == object_) { + return QColor(); + } + osg::Vec4 vColor = object_->GetColor2(); + QColor color; + OsgUtils::Vec4ToQColor(vColor, &color); + return color; +} + +void QConeWaveComponentAttribute::SetColor3(const QColor& c) { + if (nullptr == object_) { + return; + } + + osg::Vec4 vColor = object_->GetColor3(); + QColor color; + OsgUtils::Vec4ToQColor(vColor, &color); + if (c == color) { + return; + } + + OsgUtils::QColorToVec4(color, &vColor); + object_->SetColor3(vColor); +} + +QColor QConeWaveComponentAttribute::GetColor3() const { + if (nullptr == object_) { + return QColor(); + } + osg::Vec4 vColor = object_->GetColor3(); QColor color; OsgUtils::Vec4ToQColor(vColor, &color); return color; diff --git a/Source/src/ui/PropertyBrowser/qtworkspaceattribute.h b/Source/src/ui/PropertyBrowser/qtworkspaceattribute.h index 82fcb127..957cd515 100644 --- a/Source/src/ui/PropertyBrowser/qtworkspaceattribute.h +++ b/Source/src/ui/PropertyBrowser/qtworkspaceattribute.h @@ -154,8 +154,12 @@ public: void SetRadius(float r); float GetRadius() const; - void SetColor(const QColor& c); - QColor GetColor() const; + void SetColor1(const QColor& c); + QColor GetColor1() const; + void SetColor2(const QColor& c); + QColor GetColor2() const; + void SetColor3(const QColor& c); + QColor GetColor3() const; void SetHeight(float h); float GetHeight() const; diff --git a/Source/src/workspace/LampStatus.cpp b/Source/src/workspace/LampStatus.cpp new file mode 100644 index 00000000..93a8f4db --- /dev/null +++ b/Source/src/workspace/LampStatus.cpp @@ -0,0 +1,57 @@ +#include "workspace/LampStatus.h" + +#include +#include + +#include "workspace/WorkSpace.h" + +#include "common/RecourceHelper.h" +#include "common/SpdLogger.h" + +LampStatus::LampStatus(const std::vector& status, const QString& path, WorkSpace* parent /*= nullptr*/) noexcept + : QObject((QObject*)parent) + , status_(status) + , path_(path) + , workSpace_(parent) { +} + +LampStatus* LampStatus::Load(const QString& path, WorkSpace* parent) { + const QString filePath = QString("%1/%2").arg(RecourceHelper::Get().GetBasePath()).arg(path); + LOG_INFO("Load LampStatus: {}", filePath.toStdString()); + + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + LOG_WARN("Cannot open file for reading: {}", file.errorString().toStdString()); + return nullptr; + } + + QTextStream in(&file); + std::vector numbers; + + while (!in.atEnd()) { + QString line = in.readLine(); + bool ok; + double value = line.toDouble(&ok); + if (ok) { + int status = static_cast(value); + numbers.push_back(status); + } else { + LOG_WARN("Cannot open file for reading: {}", line.toStdString()); + } + } + + file.close(); + + LampStatus* lampStatus = new LampStatus(numbers, path, parent); + return lampStatus; +} + +void LampStatus::OnFrame(double dt) { + int status = static_cast(dt); + if (status >= status_.size()) { + return; + } + + current_ = status; + emit StatusChanged(GetCurrent()); +} diff --git a/Source/src/workspace/LampStatus.h b/Source/src/workspace/LampStatus.h new file mode 100644 index 00000000..e974fb56 --- /dev/null +++ b/Source/src/workspace/LampStatus.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include +#include + +class WorkSpace; + +class LampStatus : public QObject { + Q_OBJECT +public: + enum class PlayStatus : uint8_t { + PS_Started, + PS_Stoped, + PS_Suspended, + }; + +public: + explicit LampStatus(const std::vector& status, const QString& path, WorkSpace* parent = nullptr) noexcept; + ~LampStatus() override = default; + + static LampStatus* Load(const QString& path, WorkSpace* parent = nullptr); + + void OnFrame(double dt); + const QString& GetPath() const { + return path_; + } + + int32_t GetCurrent() const { + if (current_ < 0 || current_ >= status_.size()) { + return -1; + } + return status_[current_]; + } + +Q_SIGNALS: + void StatusChanged(int); + + +private: + std::vector status_; + QString path_; + int32_t current_{ 0 }; + + WorkSpace* workSpace_{ nullptr }; +}; + diff --git a/Source/src/workspace/WorkSpace.cpp b/Source/src/workspace/WorkSpace.cpp index 05babe7f..89819691 100644 --- a/Source/src/workspace/WorkSpace.cpp +++ b/Source/src/workspace/WorkSpace.cpp @@ -7,6 +7,7 @@ #include "workspace/WorkSpaceItem.h" #include "workspace/Timestep.h" +#include "workspace/LampStatus.h" #include "xml/tinyxml2.h" #include "common/SpdLogger.h" @@ -107,6 +108,25 @@ bool WorkSpace::SetTimestepPath(const QString& path) { return SetTimestep(timestep); } +bool WorkSpace::SetLampStatus(class LampStatus* lampStatus) { + if (!lampStatus) { + return false; + } + + if (nullptr != lampStatus_ && lampStatus_ != lampStatus) { + lampStatus_->deleteLater(); + } + + lampStatus_ = lampStatus; + return true; +} + +bool WorkSpace::SetLampPath(const QString& path) { + LampStatus* timestep = LampStatus::Load(path, this); + + return SetLampStatus(timestep); +} + bool WorkSpace::Save(const QString& path) { path_ = path; return Save(); @@ -151,6 +171,11 @@ void WorkSpace::Begin() { } void WorkSpace::OnFrame(double dt) { + if (nullptr != lampStatus_) { + double current = timestep_->GetCurrent(); + lampStatus_->OnFrame(current); + } + for (auto item : entities_) { item->Update(dt); } diff --git a/Source/src/workspace/WorkSpace.h b/Source/src/workspace/WorkSpace.h index 7fcf1430..ea78b40b 100644 --- a/Source/src/workspace/WorkSpace.h +++ b/Source/src/workspace/WorkSpace.h @@ -51,7 +51,13 @@ public: bool SetTimestepPath(const QString& path); class Timestep* GetTimestep() const { return timestep_; - ;} + } + + bool SetLampStatus(class LampStatus* timestep); + bool SetLampPath(const QString& path); + class LampStatus* GetLampStatus() const { + return lampStatus_; + } void AddEntity(class Entity* entity); void RemoveEntity(class Entity* entity); @@ -81,10 +87,6 @@ private: osg::ref_ptr activeScene_; class OsgView* view_{ nullptr }; class Timestep* timestep_{ nullptr }; - - /*class DYTChart* curveChart2D_{ nullptr }; - class DYTChart* curveChart2DLg_{ nullptr }; - class DYTChart* curveChart3D_{ nullptr };*/ - + class LampStatus* lampStatus_{ nullptr }; }; diff --git a/Source/src/workspace/WorkSpaceXMLParse.cpp b/Source/src/workspace/WorkSpaceXMLParse.cpp index 635465df..3f3ad2a4 100644 --- a/Source/src/workspace/WorkSpaceXMLParse.cpp +++ b/Source/src/workspace/WorkSpaceXMLParse.cpp @@ -57,6 +57,21 @@ bool WorkSpaceXMLParse::ParseTimestep(const tinyxml2::XMLElement* element) { return workSpace_->SetTimestepPath(path); } +bool WorkSpaceXMLParse::ParseLamp(const tinyxml2::XMLElement* element) { + if (nullptr == element) { + LOG_WARN("element is nullptr"); + return false; + } + + const char* path = element->Attribute("path"); + if (nullptr == path) { + LOG_WARN("element not has path"); + return false; + } + + return workSpace_->SetLampPath(path); +} + bool WorkSpaceXMLParse::ParseEntities(const tinyxml2::XMLElement* element) { if (nullptr == element) { LOG_WARN("element is nullptr"); @@ -201,6 +216,8 @@ bool WorkSpaceXMLParse::Load(const QString& dyt) { ParseEntities(xmlElement); } else if (0 == strcmp(name, "timestep")) { ParseTimestep(xmlElement); + } else if (0 == strcmp(name, "lamp")) { + ParseLamp(xmlElement); } else if (0 == strcmp(name, "charts")) { ParseChart(xmlElement); diff --git a/Source/src/workspace/WorkSpaceXMLParse.h b/Source/src/workspace/WorkSpaceXMLParse.h index 7cf93fec..219f6fb5 100644 --- a/Source/src/workspace/WorkSpaceXMLParse.h +++ b/Source/src/workspace/WorkSpaceXMLParse.h @@ -30,6 +30,7 @@ public: private: bool ParseScene(const tinyxml2::XMLElement* element); bool ParseTimestep(const tinyxml2::XMLElement* element); + bool ParseLamp(const tinyxml2::XMLElement* element); bool ParseEntities(const tinyxml2::XMLElement* element); bool ParseChart(const tinyxml2::XMLElement* element); bool ParseReport(const tinyxml2::XMLElement* element); diff --git a/Source/src/workspace/WorkSpaceXMLWrite.cpp b/Source/src/workspace/WorkSpaceXMLWrite.cpp index 5a04b12a..8067c3c1 100644 --- a/Source/src/workspace/WorkSpaceXMLWrite.cpp +++ b/Source/src/workspace/WorkSpaceXMLWrite.cpp @@ -4,6 +4,7 @@ #include "entities/EntitiesManager.h" #include "entities/Entity.h" #include "workspace/Timestep.h" +#include "workspace/LampStatus.h" #include "common/SpdLogger.h" @@ -66,6 +67,16 @@ bool WorkSpaceXMLWrite::SaveTimeStep(tinyxml2::XMLElement* scene) { return true; } +bool WorkSpaceXMLWrite::SaveLamp(tinyxml2::XMLElement* scene) { + LampStatus* lampStatus = workSpace_->GetLampStatus(); + if (nullptr == lampStatus) { + return false; + } + tinyxml2::XMLElement* timestepXml = scene->InsertNewChildElement("lamp"); + timestepXml->SetAttribute("path", lampStatus->GetPath().toStdString().c_str()); + return true; +} + bool WorkSpaceXMLWrite::SaveEntities(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc) { tinyxml2::XMLElement* entitics = doc->NewElement("entities"); scene->LinkEndChild(entitics); diff --git a/Source/src/workspace/WorkSpaceXMLWrite.h b/Source/src/workspace/WorkSpaceXMLWrite.h index 62ab3d4d..fe6a9c6b 100644 --- a/Source/src/workspace/WorkSpaceXMLWrite.h +++ b/Source/src/workspace/WorkSpaceXMLWrite.h @@ -18,6 +18,7 @@ public: protected: bool SaveScene(tinyxml2::XMLElement* scene); bool SaveTimeStep(tinyxml2::XMLElement* scene); + bool SaveLamp(tinyxml2::XMLElement* scene); bool SaveEntities(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc); bool SaveChart(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc); bool SaveTargetList(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc); diff --git a/Source/workspace/default2.dyt b/Source/workspace/default2.dyt index 527f807a..76b938d3 100644 --- a/Source/workspace/default2.dyt +++ b/Source/workspace/default2.dyt @@ -6,6 +6,7 @@ + @@ -29,7 +30,7 @@ - +