diff --git a/.idea/QtSettings.xml b/.idea/QtSettings.xml
index ba715ef..ba30479 100644
--- a/.idea/QtSettings.xml
+++ b/.idea/QtSettings.xml
@@ -7,16 +7,16 @@
-
-
+
+
-
-
+
+
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 897b274..8156501 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,11 +1,104 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/editor.xml b/.idea/editor.xml
new file mode 100644
index 0000000..f7bb51e
--- /dev/null
+++ b/.idea/editor.xml
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..0ee84f5
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FarField2csvTool.exe b/FarField2csvTool.exe
new file mode 100644
index 0000000..6666b20
Binary files /dev/null and b/FarField2csvTool.exe differ
diff --git a/NearField2csvTool.exe b/NearField2csvTool.exe
new file mode 100644
index 0000000..3cd396c
Binary files /dev/null and b/NearField2csvTool.exe differ
diff --git a/cmake/FindOpenCASCADE.cmake b/cmake/FindOpenCASCADE.cmake
index 88fd0ba..9d48d05 100644
--- a/cmake/FindOpenCASCADE.cmake
+++ b/cmake/FindOpenCASCADE.cmake
@@ -35,7 +35,7 @@ if(LAMPCAE_OpenCASCADE_ALREADY_INCLUDED)
endif()
set(LAMPCAE_OpenCASCADE_ALREADY_INCLUDED 1)
-set(OpenCASCADE_DIRS "C:/OCCT")
+set(OpenCASCADE_DIRS ${CMAKE_SOURCE_DIR}/extlib/OCCT)
set(OpenCASCADE_VERSION_MAJOR 7)
set(OpenCASCADE_VERSION_MINOR 6)
diff --git a/cmake/FindVTK.cmake b/cmake/FindVTK.cmake
index 3644a27..7a932f1 100644
--- a/cmake/FindVTK.cmake
+++ b/cmake/FindVTK.cmake
@@ -36,7 +36,7 @@ endif()
set(LAMPCAE_VTK_ALREADY_INCLUDED 1)
#set(VTK_DIRS "${CMAKE_SOURCE_DIR}/extlib/VTK")
-set(VTK_DIRS "C:/VTK")
+set(VTK_DIRS ${CMAKE_SOURCE_DIR}/extlib/VTK)
set(VTK_VERSION_MAJOR 9)
set(VTK_VERSION_MINOR 3)
diff --git a/src/MainWidgets/ControlPanel.cpp b/src/MainWidgets/ControlPanel.cpp
index 703dbe1..39bbf4e 100644
--- a/src/MainWidgets/ControlPanel.cpp
+++ b/src/MainWidgets/ControlPanel.cpp
@@ -48,7 +48,6 @@ namespace MainWidget
_ui->propTabWidget->tabBar()->hide(); // 属性接口
MainWidgetPy::init(mainwindow, this, _geometryWidget, _meshWidget, _physicsWidget);
connect(_meshWidget,SIGNAL(ToOCCTItemSIGNAL(MeshData::MeshKernal *)),this,SIGNAL(MeshToGeometrySig(MeshData::MeshKernal *)));
-
}
ControlPanel::~ControlPanel()
diff --git a/src/MainWidgets/ControlPanel.h b/src/MainWidgets/ControlPanel.h
index 3b42d8a..6b13cf1 100644
--- a/src/MainWidgets/ControlPanel.h
+++ b/src/MainWidgets/ControlPanel.h
@@ -30,7 +30,6 @@ namespace DataProperty
namespace PostPlot
{
class PlotTreeWidget;
-
}
namespace Post
@@ -130,8 +129,10 @@ namespace MainWidget
Post::PostInfoWidget *_postInfoWidget{};
PostPlot::PlotTreeWidget *_plotTreewidget{};
- };
+
+
+ };
}
#endif
diff --git a/src/MainWidgets/ControlPanel.ui b/src/MainWidgets/ControlPanel.ui
index e93fcd9..b4f11c8 100644
--- a/src/MainWidgets/ControlPanel.ui
+++ b/src/MainWidgets/ControlPanel.ui
@@ -317,7 +317,7 @@ font: 10pt "Arial";
0
0
421
- 204
+ 181
diff --git a/src/MainWidgets/createfekocadmodel.ui b/src/MainWidgets/createfekocadmodel.ui
index a71cfbe..21d78a5 100644
--- a/src/MainWidgets/createfekocadmodel.ui
+++ b/src/MainWidgets/createfekocadmodel.ui
@@ -7,7 +7,7 @@
0
0
835
- 557
+ 650
diff --git a/src/MainWindow/SubWindowManager.h b/src/MainWindow/SubWindowManager.h
index 311a3cf..c669616 100644
--- a/src/MainWindow/SubWindowManager.h
+++ b/src/MainWindow/SubWindowManager.h
@@ -1,6 +1,12 @@
-#ifndef _SUBWINDOWMANAGER_H_
+/**
+ * 原始版本来自 FastCAE, 于2024.01.02修改
+ * 主要管理窗体界面的三维展示窗口等关系
+ * */
+#ifndef _SUBWINDOWMANAGER_H_
#define _SUBWINDOWMANAGER_H_
+
+
#include "MainWindowAPI.h"
#include
diff --git a/src/PluginLAMPScatterProcess/CMakeLists.txt b/src/PluginLAMPScatterProcess/CMakeLists.txt
new file mode 100644
index 0000000..a3e0ef0
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/CMakeLists.txt
@@ -0,0 +1,230 @@
+#-----------------------------------------------------------------------------
+# 加载 LAMP的散射数据
+#
+# 处理: LAMP的散射数据
+#
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# 头文件搜索路径
+#-----------------------------------------------------------------------------
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
+
+# boost
+include_directories(D:/vcpkg/installed/x64-windows/include)
+
+# pcl
+include_directories(C:/PCL/3rdParty/FLANN/include)
+include_directories(C:/PCL/3rdParty/VTK/include/vtk-9.3)
+include_directories(C:/PCL/include/pcl-1.14)
+
+# qt5
+include_directories(C:/Qt/5.15.2/msvc2019_64/include/QtQml)
+
+# json
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../json)
+
+# qscintilla2
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2/lexers)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2/include)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2/lexlib)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2/Qt4Qt5)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qscintilla2/src)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
+
+# boost
+include_directories(D:/vcpkg/installed/x64-windows/include)
+
+# pcl
+include_directories(C:/PCL/3rdParty/FLANN/include)
+include_directories(C:/PCL/3rdParty/VTK/include/vtk-9.3)
+include_directories(C:/PCL/include/pcl-1.14)
+
+# qt5
+include_directories(C:/Qt/5.15.2/msvc2019_64/include/QtQml)
+
+# json
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../json)
+
+
+# qcustomplot
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qcustomplot)
+
+# qhexedit
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../qhexedit)
+# opencv
+include_directories(${OpenCV_INCLUDE_DIRS})
+
+
+
+# 内部结构
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/SqliteDBProcess/src)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/modelProcess)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/EchoShowProcess)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/OCCViewer)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/PointCloudProcess)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/SharedModuleLib)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/TableProcess)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/TaskXml)
+
+
+
+
+#-----------------------------------------------------------------------------
+# 链接库
+#-----------------------------------------------------------------------------
+
+# pcl
+link_directories("C:/PCL/3rdParty/FLANN/lib")
+link_directories("C:/VTK/lib")
+link_directories("C:/PCL/lib")
+
+
+#-----------------------------------------------------------------------------
+# 自动添加include目录
+#-----------------------------------------------------------------------------
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+
+
+
+#-----------------------------------------------------------------------------
+# 添加资源文件
+#-----------------------------------------------------------------------------
+set(_qrc "${CMAKE_CURRENT_SOURCE_DIR}/../qrc/qianfan.qrc")
+set(_lang "${CMAKE_CURRENT_SOURCE_DIR}/../qrc/translations.qrc")
+qt5_add_resources(_resource ${_qrc} ${_lang})
+
+#-----------------------------------------------------------------------------
+# 源码扫描
+#-----------------------------------------------------------------------------
+file(GLOB _ui "*.ui")
+file(GLOB _header "*.h")
+file(GLOB _source "*.cpp")
+file(GLOB _templetasource "*.inl")
+qt5_wrap_ui(_interface ${_ui})
+
+#-----------------------------------------------------------------------------
+# 添加动态库目标
+#-----------------------------------------------------------------------------
+add_library(PluginLAMPScatterProcess
+ ${_resource}
+ ${_interface}
+ ${_header}
+ ${_source}
+ ${_templetasource}
+)
+
+
+#-----------------------------------------------------------------------------
+# 链接库
+#-----------------------------------------------------------------------------
+
+## pcl
+#link_directories("C:/PCL/3rdParty/FLANN/lib")
+#link_directories("C:/VTK/lib")
+#link_directories("C:/PCL/lib")
+
+
+
+find_package(Qt5 REQUIRED COMPONENTS Core Quick Sql Core Xml Opengl Gui Svg Xmlpatterns Uitools Widgets Qml Printsupport Sensors Quickwidgets Quick Concurrent Openglextensions Charts Datavisualization)
+find_package(PCL )
+
+#gdal
+find_package(GDAL REQUIRED)
+include_directories(${GDAL_INCLUDE_DIRS})
+link_directories(${GDAL_LIBRARIES})
+
+# boost
+include_directories(D:/vcpkg/installed/x64-windows/include)
+
+# pcl
+include_directories(C:/PCL/3rdParty/FLANN/include)
+include_directories(C:/PCL/3rdParty/VTK/include/vtk-9.3)
+include_directories(C:/PCL/include/pcl-1.14)
+
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+# netcdf
+find_package(netCDF CONFIG REQUIRED)
+
+#flann
+find_package(flann CONFIG REQUIRED)
+
+#-----------------------------------------------------------------------------
+# 添加接口声明宏
+#-----------------------------------------------------------------------------
+target_compile_definitions(PluginLAMPScatterProcess PRIVATE "NOMINMAX") # 禁用vc++ 中的min max 定义,避免与 pcl 的中 std::min,pcl::max 函数冲突
+target_compile_definitions(PluginLAMPScatterProcess PRIVATE "LAMPSCATTERPROCESSPLUGIN_API")
+
+
+list(APPEND _depend_library
+ Common PointCloudOperator Settings PythonModule DataProperty MeshData Material Geometry BCBase ConfigOptions SelfDefObject ModelData ModuleBase PluginManager GeometryCommand GeometryWidgets IO MainWidgets MainWindow
+ qcustomplot qhexedit qscintilla2
+ PointCloudOperator
+)
+
+list(APPEND _runtimes_libraries
+ GDAL::GDAL netCDF::netcdf
+ flann::flann flann::flann_cpp
+)
+
+list(APPEND _runtimes_libraries
+ Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Xml
+
+)
+
+list(APPEND _runtimes_libraries
+ Qt5::Network Qt5::Core Qt5::Gui Qt5::Widgets Qt5::DBus Qt5::Core Qt5::Xml Qt5::OpenGL Qt5::Gui Qt5::Svg Qt5::Widgets Qt5::Qml Qt5::DataVisualization Qt5::Charts Qt5::PrintSupport Qt5::Test
+)
+
+list(APPEND _runtimes_libraries
+ OpenCASCADE::TKOpenGl OpenCASCADE::TKOffset OpenCASCADE::TKSTL OpenCASCADE::TKFillet OpenCASCADE::Freetype OpenCASCADE::TKBO OpenCASCADE::TKBRep OpenCASCADE::TKBool OpenCASCADE::TKCAF OpenCASCADE::TKCDF OpenCASCADE::TKG2d OpenCASCADE::TKG3d OpenCASCADE::TKGeomAlgo OpenCASCADE::TKGeomBase OpenCASCADE::TKHLR OpenCASCADE::TKIGES OpenCASCADE::TKLCAF OpenCASCADE::TKMath OpenCASCADE::TKMesh OpenCASCADE::TKPrim OpenCASCADE::TKSTEP OpenCASCADE::TKSTEP209 OpenCASCADE::TKSTEPAttr OpenCASCADE::TKSTEPBase OpenCASCADE::TKService OpenCASCADE::TKShHealing OpenCASCADE::TKTopAlgo OpenCASCADE::TKV3d OpenCASCADE::TKVCAF OpenCASCADE::TKXCAF OpenCASCADE::TKXDEIGES OpenCASCADE::TKXSBase OpenCASCADE::TKernel Qt5::Widgets Qt5::Xml VTK::CommonColor VTK::CommonComputationalGeometry VTK::CommonCore VTK::CommonDataModel VTK::CommonExecutionModel VTK::CommonMath VTK::CommonMisc VTK::CommonSystem VTK::CommonTransforms VTK::FiltersCore VTK::FiltersExtraction VTK::FiltersGeneral VTK::FiltersGeometry VTK::FiltersSources VTK::FiltersStatistics VTK::IOCore VTK::IOLegacy VTK::IOXML VTK::IOXMLParser VTK::ImagingCore VTK::ImagingFourier VTK::ImagingMath VTK::InteractionStyle VTK::ParallelCore VTK::ParallelDIY VTK::RenderingCore VTK::RenderingFreeType VTK::RenderingOpenGL2 VTK::RenderingUI VTK::RenderingVolume VTK::RenderingVolumeOpenGL2 VTK::doubleconversion VTK::expat VTK::freetype VTK::glew VTK::lz4 VTK::lzma VTK::sys VTK::zlib VTK::IOGeometry
+)
+
+# 添加 VTK
+list(APPEND _runtimes_libraries
+ VTK::CommonColor VTK::CommonComputationalGeometry VTK::CommonCore VTK::CommonDataModel VTK::CommonExecutionModel VTK::CommonMath VTK::CommonMisc VTK::CommonSystem VTK::CommonTransforms VTK::DICOMParser VTK::FiltersCore VTK::FiltersGeneral VTK::FiltersGeometry VTK::FiltersHybrid VTK::FiltersModeling VTK::FiltersSources VTK::IOCore VTK::IOChemistry VTK::IOGeometry VTK::IOImage VTK::IOLegacy VTK::ImagingCore VTK::ImagingSources VTK::RenderingCore VTK::RenderingLOD VTK::doubleconversion VTK::jpeg VTK::jsoncpp VTK::lz4 VTK::lzma VTK::metaio VTK::png VTK::pugixml VTK::sys VTK::tiff VTK::zlib
+)
+
+#-----------------------------------------------------------------------------
+# 链接依赖库
+#-----------------------------------------------------------------------------
+target_link_libraries(PluginLAMPScatterProcess PRIVATE
+ ${_runtimes_libraries}
+ ${_depend_library}
+
+
+# ${PCL_LIBRARIES}
+)
+
+#-----------------------------------------------------------------------------
+# 添加依赖关系
+#-----------------------------------------------------------------------------
+add_dependencies(PluginLAMPScatterProcess ${_depend_library})
+
+#-----------------------------------------------------------------------------
+# 添加运行时依赖关系
+#-----------------------------------------------------------------------------
+set(LAMPCAE_PluginLAMPScatterProcess_Runtimes_Libraries ${_runtimes_libraries} PARENT_SCOPE)
+
+#-----------------------------------------------------------------------------
+# 设置插件的输出目录
+#-----------------------------------------------------------------------------
+set_target_properties(PluginLAMPScatterProcess
+ PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY_RELEASE $/plugins
+ LIBRARY_OUTPUT_DIRECTORY_RELEASE $/plugins
+ RUNTIME_OUTPUT_DIRECTORY_RELEASE $/plugins
+ ARCHIVE_OUTPUT_DIRECTORY_DEBUG $/plugins
+ LIBRARY_OUTPUT_DIRECTORY_DEBUG $/plugins
+ RUNTIME_OUTPUT_DIRECTORY_DEBUG $/plugins
+)
+
+
diff --git a/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.cpp b/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.cpp
new file mode 100644
index 0000000..c7d79ac
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.cpp
@@ -0,0 +1,53 @@
+#include "LAMPScatterProcessPlugin.h"
+//#include "ll_qgis_base_lib.h"
+#include
+#include
+#include
+#include
+#include "lampscattermanagertool.h"
+
+GUI::MainWindow* LAMPScatterTool::LAMPScatterProcessPlugin::_mainwindow = nullptr;
+namespace LAMPScatterTool {
+ LAMPScatterProcessPlugin::LAMPScatterProcessPlugin(GUI::MainWindow* m)
+ {
+ _describe = "LAMPScatterProcessPlugin Installed Successfully";
+ _mainwindow = m;
+ connect(_mainwindow,SIGNAL(on_action_LoadLaboratoryScatterResultSIGN(GUI::MainWindow* )),
+ this,SLOT(TriggedProcess(GUI::MainWindow*)));
+ }
+
+ bool LAMPScatterProcessPlugin::install()
+ {
+ qDebug()<<"LAMPScatterProcessPlugin install LAMPScatterProcessPlugin::install ";
+ qDebug()<<"Base on QGIS has binding ";
+ return true;
+ }
+
+ bool LAMPScatterProcessPlugin::uninstall()
+ {
+ return true;
+ }
+
+ void LAMPScatterProcessPlugin::reTranslate(QString) {}
+
+ GUI::MainWindow* LAMPScatterProcessPlugin::getMWpt()
+ {
+ return _mainwindow;
+ }
+ void LAMPScatterProcessPlugin::TriggedProcess(GUI::MainWindow* m) {
+ qDebug()<<"LAMPScatterProcessPlugin TriggedProcess sucessfully";
+ LAMPScatterManagerTool* toolwindow = new LAMPScatterManagerTool(_mainwindow);
+ qDebug()<<"LAMPScatterManagerTool Init";
+ toolwindow->show();
+ }
+}
+
+
+void Register(GUI::MainWindow* m, QList* ps)
+{
+ qDebug()<<"LAMPScatterProcessPlugin install LAMPScatterProcessPlugin::install start Register";
+ Plugins::PluginBase* p_plugin = new LAMPScatterTool::LAMPScatterProcessPlugin(m);
+ ps->append(p_plugin);
+ qDebug()<<"LAMPScatterProcessPlugin install LAMPScatterProcessPlugin::install finish Register";
+
+}
\ No newline at end of file
diff --git a/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.h b/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.h
new file mode 100644
index 0000000..4ef1a01
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/LAMPScatterProcessPlugin.h
@@ -0,0 +1,33 @@
+#ifndef _LAMPSCATTERPROCESS_H_
+#define _LAMPSCATTERPROCESS_H_
+
+#include "LAMPScatterProcessPluginAPI.h"
+#include "PluginManager/pluginBase.h"
+#include "MainWindow/MainWindow.h"
+
+namespace LAMPScatterTool {
+
+
+ class LAMPSCATTERPROCESSPLUGINAPI LAMPScatterProcessPlugin : public Plugins::PluginBase {
+ Q_OBJECT
+ public:
+ LAMPScatterProcessPlugin(GUI::MainWindow* m);
+ ~LAMPScatterProcessPlugin() = default;
+
+ bool install();
+ bool uninstall();
+ void reTranslate(QString);
+ static GUI::MainWindow* getMWpt();
+ public slots:
+ void TriggedProcess(GUI::MainWindow* m);
+ private:
+ static GUI::MainWindow* _mainwindow;
+ };
+};
+
+extern "C"
+{
+ void LAMPSCATTERPROCESSPLUGINAPI Register(GUI::MainWindow* m, QList* plugs);
+}
+
+#endif
\ No newline at end of file
diff --git a/src/PluginLAMPScatterProcess/LAMPScatterProcessPluginAPI.h b/src/PluginLAMPScatterProcess/LAMPScatterProcessPluginAPI.h
new file mode 100644
index 0000000..9d57870
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/LAMPScatterProcessPluginAPI.h
@@ -0,0 +1,13 @@
+#ifndef _LAMPSCATTERPROCESSPLUGINAPI_H__
+#define _LAMPSCATTERPROCESSPLUGINAPI_H__
+
+#include
+
+
+#if defined(LAMPSCATTERPROCESSPLUGIN_API)
+#define LAMPSCATTERPROCESSPLUGINAPI Q_DECL_EXPORT
+#else
+#define LAMPSCATTERPROCESSPLUGINAPI Q_DECL_IMPORT
+#endif
+
+#endif
diff --git a/src/PluginLAMPScatterProcess/LAMPScatterS1B.cpp b/src/PluginLAMPScatterProcess/LAMPScatterS1B.cpp
new file mode 100644
index 0000000..5d75e4b
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/LAMPScatterS1B.cpp
@@ -0,0 +1,503 @@
+#include "LAMPScatterS1B.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace LAMPScatterTool {
+ LAMPScatterS1BRCSDataNode::LAMPScatterS1BRCSDataNode(QString PolarName, double AzAngle, double IncAngle, std::shared_ptr freqs, std::shared_ptr InRCSPoints, long freqnumber) {
+ this->PolarName = PolarName;
+ this->FreqPointNumber = freqnumber;
+ this->FreqPoints = freqs;
+ this->RCSPoints = InRCSPoints;
+ this->AzAngle = AzAngle;
+ this->IncAngle = IncAngle;
+ }
+
+ LAMPScatterS1BRCSDataNode::~LAMPScatterS1BRCSDataNode() {
+ }
+
+ long LAMPScatterS1BRCSDataNode::getFreqPointNumber() {
+ return this->FreqPointNumber;
+ }
+
+ std::shared_ptr LAMPScatterS1BRCSDataNode::getFreqPoints() {
+ return this->FreqPoints;
+ }
+
+ std::shared_ptr LAMPScatterS1BRCSDataNode::getRCSPoints() {
+ return this->RCSPoints;
+ }
+
+ QString LAMPScatterS1BRCSDataNode::getPolarName() {
+ return this->PolarName;
+ }
+
+ double LAMPScatterS1BRCSDataNode::getAzAngle() {
+ return this->AzAngle;
+ }
+
+ double LAMPScatterS1BRCSDataNode::getIncAngle() {
+ return this->IncAngle;
+ }
+
+ QString LAMPScatterS1BRCSDataNode::getUniqueName() {
+ return this->NodeUniqueName;
+ }
+
+ void LAMPScatterS1BRCSDataNode::setUniqueName(QString uniqueName) {
+ this->NodeUniqueName = uniqueName;
+ }
+
+
+ LAMPScatterS1BPolarKdTree::LAMPScatterS1BPolarKdTree(std::vector > inDatalist) {
+ this->KdtreeFlannDatasetPtr = nullptr;
+ this->kdtreeIndexPtr = nullptr;
+ this->datalist = std::vector >(inDatalist.size());
+ for (long i = 0; i < inDatalist.size(); i++) {
+ this->datalist[i] = inDatalist[i];
+ }
+
+ this->dataset = std::vector >(this->datalist.size(), std::vector(2));
+ for (size_t i = 0; i < this->datalist.size(); ++i) {
+ dataset[i][0] = static_cast(this->datalist[i]->getAzAngle());
+ dataset[i][1] = static_cast(this->datalist[i]->getIncAngle());
+ }
+
+ // KDtree
+ this->KdtreeFlannDatasetPtr = std::make_shared >(&(this->dataset)[0][0], this->dataset.size(), this->dataset[0].size());
+ this->kdtreeIndexPtr = std::make_shared > >(*(this->KdtreeFlannDatasetPtr.get()), flann::KDTreeSingleIndexParams(1));
+ this->kdtreeIndexPtr->buildIndex();
+ }
+
+ LAMPScatterS1BPolarKdTree::~LAMPScatterS1BPolarKdTree() {
+ this->datalist.clear();
+ std::vector >().swap(this->datalist);
+ }
+
+ QVector > LAMPScatterS1BPolarKdTree::search(double sAzAngle, double sIncAngle, long sPointNumber) {
+ // ѯ
+ std::vector queryPoint = {sAzAngle, sIncAngle};
+ flann::Matrix query(&queryPoint[0], 1, queryPoint.size());
+
+ // 洢;
+ std::vector indices(sPointNumber);
+ std::vector dists(sPointNumber);
+
+ // ȷ indices dists flann::Matrix
+ flann::Matrix flannIndices(&indices[0], sPointNumber, 1);
+ flann::Matrix flannDists(&dists[0], sPointNumber, 1);
+
+ // ִ
+ int result = this->kdtreeIndexPtr->knnSearch(query, flannIndices, flannDists, sPointNumber, flann::FLANN_CHECKS_AUTOTUNED);
+
+
+ if (result > 0) {
+ QVector > searchResults(sPointNumber);
+ for (long i = 0; i < sPointNumber; i++) {
+ searchResults[i] = datalist[indices[0]];
+ }
+ return searchResults;
+ } else {
+ return QVector >(0);
+ }
+ }
+
+ std::vector > LAMPScatterS1BPolarKdTree::getAZIncPoints() {
+ return this->dataset;
+ }
+
+ std::vector > LAMPScatterS1BPolarKdTree::getdatalists() {
+ return this->datalist;
+ }
+
+ LAMPScatterS1BDataset::LAMPScatterS1BDataset() {
+ this->FreqPointNumber = 0;
+ this->polNumber = 0;
+ this->AzNumber = 0;
+ this->IncNumber = 0;
+ this->polarRCSTree.clear();
+ }
+
+ LAMPScatterS1BDataset::~LAMPScatterS1BDataset() {
+ this->polarRCSTree.clear(); //ɾļ
+ }
+
+ int LAMPScatterS1BDataset::OpenFile(QString s1bfilepath) {
+ int ncid;
+ if (nc_open(s1bfilepath.toLocal8Bit().constData(), NC_NOWRITE, &ncid)) {
+ qCritical() << "Failed to open NetCDF file";
+ return 1;
+ }
+
+ int FreqVarid;
+ int PolVarid;
+ int AzVarid;
+ int IncVarid;
+ int RCSVarid;
+ if (nc_inq_varid(ncid, "Freq", &FreqVarid)
+ || nc_inq_varid(ncid, "Pol", &PolVarid)
+ || nc_inq_varid(ncid, "Az", &AzVarid)
+ || nc_inq_varid(ncid, "Inc", &IncVarid)
+ || nc_inq_varid(ncid, "RCS", &RCSVarid)
+ ) {
+ qDebug() << "Failed to get variable ";
+ qDebug() << "Freq:\t" << FreqVarid << "\tPol:\t" << PolVarid << "\tAz:\t" << AzVarid << "\tInc:\t" << IncVarid << "\RCS:\t" << RCSVarid;
+ nc_close(ncid);
+ return 1;
+ }
+
+ qDebug() << "[VarID]\t Freq:\t" << FreqVarid << "\tPol:\t" << PolVarid << "\tAz:\t" << AzVarid << "\tInc:\t" << IncVarid << "\RCS:\t" << RCSVarid;
+
+
+ // ά
+ int Freqndims;
+ int Polndims;
+ int Azndims;
+ int Incndims;
+ int RCSndims;
+ if (nc_inq_varndims(ncid, FreqVarid, &Freqndims)
+ || nc_inq_varndims(ncid, PolVarid, &Polndims)
+ || nc_inq_varndims(ncid, AzVarid, &Azndims)
+ || nc_inq_varndims(ncid, IncVarid, &Incndims)
+ || nc_inq_varndims(ncid, RCSVarid, &RCSndims)
+ ) {
+ qDebug() << "Failed to get number of dimensions for variable";
+ qDebug() << "[Dimensions]\t Freq:\t" << Freqndims
+ << "\tPol:\t" << Polndims
+ << "\tAz:\t" << Azndims
+ << "\tInc:\t" << Incndims
+ << "\RCS:\t" << RCSndims;
+
+ nc_close(ncid);
+ return 1;
+ }
+ qDebug() << "[Dimensions]\t Freq:\t" << Freqndims
+ << "\tPol:\t" << Polndims
+ << "\tAz:\t" << Azndims
+ << "\tInc:\t" << Incndims
+ << "\RCS:\t" << RCSndims;
+
+
+ // ȡ
+
+ std::vector Freqdimids(Freqndims);
+ std::vector Poldimids(Polndims);
+ std::vector Azdimids(Azndims);
+ std::vector Incdimids(Incndims);
+ std::vector RCSdimids(RCSndims);
+
+ if (nc_inq_vardimid(ncid, FreqVarid, Freqdimids.data())
+ || nc_inq_vardimid(ncid, PolVarid, Poldimids.data())
+ || nc_inq_vardimid(ncid, AzVarid, Azdimids.data())
+ || nc_inq_vardimid(ncid, IncVarid, Incdimids.data())
+ || nc_inq_vardimid(ncid, RCSVarid, RCSdimids.data())
+ ) {
+ qDebug() << "Failed to get dimension IDs for variable";
+ qDebug() << "[Dimensions IDs]\t Freq:\t" << Freqdimids.size()
+ << "\tPol:\t" << Poldimids.size()
+ << "\tAz:\t" << Azdimids.size()
+ << "\tInc:\t" << Incdimids.size()
+ << "\RCS:\t" << RCSdimids.size();
+ nc_close(ncid);
+ return 1;
+ }
+ qDebug() << "[Dimensions IDs]\t Freq:\t" << Freqdimids.size()
+ << "\tPol:\t" << Poldimids.size()
+ << "\tAz:\t" << Azdimids.size()
+ << "\tInc:\t" << Incdimids.size()
+ << "\RCS:\t" << RCSdimids.size();
+
+
+ std::vector Freqdimsize(Freqndims);
+ std::vector Poldimsizes(Polndims);
+ std::vector Azdimsize(Azndims);
+ std::vector Incdimsize(Incndims);
+ std::vector RCSdimsize(RCSndims);
+
+
+ for (long i = 0; i < Freqdimids.size(); i++) {
+ size_t datalen_temp;
+ if (nc_inq_dimlen(ncid, Freqdimids[i], &datalen_temp)) {
+ qDebug() << "Failed to get Freqdimsize for variable";
+ } else {
+ Freqdimsize[i] = datalen_temp;
+ }
+ }
+
+ for (long i = 0; i < Poldimids.size(); i++) {
+ size_t datalen_temp;
+ if (nc_inq_dimlen(ncid, Poldimids[i], &datalen_temp)) {
+ qDebug() << "Failed to get Poldimids for variable";
+ } else {
+ Poldimsizes[i] = datalen_temp;
+ }
+ }
+
+ for (long i = 0; i < Azdimids.size(); i++) {
+ size_t datalen_temp;
+ if (nc_inq_dimlen(ncid, Azdimids[i], &datalen_temp)) {
+ qDebug() << "Failed to get Azdimids for variable";
+ } else {
+ Azdimsize[i] = datalen_temp;
+ }
+ }
+
+ for (long i = 0; i < Incdimids.size(); i++) {
+ size_t datalen_temp;
+ if (nc_inq_dimlen(ncid, Incdimids[i], &datalen_temp)) {
+ qDebug() << "Failed to get Incdimids for variable";
+ } else {
+ Incdimsize[i] = datalen_temp;
+ }
+ }
+
+ for (long i = 0; i < RCSdimids.size(); i++) {
+ size_t datalen_temp;
+ if (nc_inq_dimlen(ncid, RCSdimids[i], &datalen_temp)) {
+ qDebug() << "Failed to get RCSdimids for variable";
+ } else {
+ RCSdimsize[i] = datalen_temp;
+ }
+ }
+
+ long Freq_datalen = 1;
+ long Pol_datalen = 1;
+ long Az_datalen = 1;
+ long Inc_datalen = 1;
+ long RCS_datalen = 1;
+
+
+ for (long i = 0; i < Freqdimsize.size(); i++) {
+ Freq_datalen = Freq_datalen * Freqdimsize[i];
+ }
+
+ for (long i = 0; i < Poldimsizes.size(); i++) {
+ Pol_datalen = Pol_datalen * Poldimsizes[i];
+ }
+
+ for (long i = 0; i < Azdimsize.size(); i++) {
+ Az_datalen = Az_datalen * Azdimsize[i];
+ }
+
+ for (long i = 0; i < Incdimsize.size(); i++) {
+ Inc_datalen = Inc_datalen * Incdimsize[i];
+ }
+
+ for (long i = 0; i < RCSdimsize.size(); i++) {
+ RCS_datalen = RCS_datalen * RCSdimsize[i];
+ }
+
+ qDebug() << "[Data Size]\t Freq:\t" << Freq_datalen
+ << "\tPol:\t" << Pol_datalen
+ << "\tAz:\t" << Az_datalen
+ << "\tInc:\t" << Inc_datalen
+ << "\RCS:\t" << RCS_datalen;
+
+ // ȡ
+ std::vector pol_data(Pol_datalen);
+ std::vector inc_data(Inc_datalen);
+ std::vector az_data(Az_datalen);
+ std::vector freq_data(Freq_datalen);
+ std::vector rcs_data(RCS_datalen);
+
+ if (nc_get_var_float(ncid, FreqVarid, freq_data.data())
+ || nc_get_var_float(ncid, PolVarid, pol_data.data())
+ || nc_get_var_float(ncid, AzVarid, az_data.data())
+ || nc_get_var_float(ncid, IncVarid, inc_data.data())
+ || nc_get_var_double(ncid, RCSVarid, rcs_data.data())
+ ) {
+ qDebug() << "reading Data for variable";
+ qDebug() << "[Data size ]\t Freq:\t" << pol_data.size()
+ << "\tPol:\t" << inc_data.size()
+ << "\tAz:\t" << az_data.size()
+ << "\tInc:\t" << freq_data.size()
+ << "\tRCS:\t" << rcs_data.size();
+ nc_close(ncid);
+ return 1;
+ }
+
+ qDebug() << "[Data size ]\t Freq:\t" << pol_data.size()
+ << "\tPol:\t" << inc_data.size()
+ << "\tAz:\t" << az_data.size()
+ << "\tInc:\t" << freq_data.size()
+ << "\RCS:\t" << rcs_data.size();
+
+
+ // ȡPol
+ QMap polnamedict = ReadPolAttribution(ncid, PolVarid);
+ if (polnamedict.count() == 0) {
+ qDebug() << "Failed to get attribution Number for variable Pol ";
+ nc_close(ncid);
+ return 1;
+ }
+ nc_close(ncid);
+
+
+ // ڵ
+ for (long PolId = 0; PolId < Pol_datalen; PolId++) {
+ // Polar
+ QString polkey = QString("label_Pol_%1").arg(PolId + 1);
+ QString polname = polnamedict[polkey];
+ std::vector > nodes(0);
+ for (long Azid = 0; Azid < Az_datalen; Azid++) {
+ // Az
+ for (long Incid = 0; Incid < Inc_datalen; Incid++) {
+ // Inc
+
+ std::shared_ptr freqs(new double[Freq_datalen], LAMPScatterS1BdelArrPtr);
+ std::shared_ptr RCSData(new double[Freq_datalen], LAMPScatterS1BdelArrPtr);
+ double Azvalue = az_data[Azid];
+ double Incvalue = inc_data[Azid];
+ for (long freqID = 0; freqID < Freq_datalen; freqID++) {
+ // Freq
+ freqs.get()[freqID] = freq_data[freqID];
+ RCSData.get()[freqID] = rcs_data[PolId * Az_datalen * Inc_datalen * Freq_datalen +
+ Azid * Inc_datalen * Freq_datalen +
+ Incid * Freq_datalen +
+ freqID
+ ];
+ }
+ std::shared_ptr node(new LAMPScatterS1BRCSDataNode(polname, Azvalue, Incvalue, freqs, RCSData, Freq_datalen));
+ node->setUniqueName(getLAMPScatterS1BNodeUniqueCode(node));
+ this->Nodedict.insert(node->getUniqueName(), node); // ѯڵ
+ nodes.push_back(node);
+ }
+ }
+
+ std::shared_ptr treetemp(new LAMPScatterS1BPolarKdTree(nodes));
+ polarRCSTree.insert(polname, treetemp); // KDTree
+ }
+
+ this->FreqPointNumber = Freq_datalen;
+ this->polNumber = Pol_datalen;
+ this->AzNumber = Az_datalen;
+ this->IncNumber = Inc_datalen;
+
+ std::vector().swap(pol_data);
+ std::vector().swap(inc_data);
+ std::vector().swap(az_data);
+ std::vector().swap(freq_data);
+ std::vector().swap(rcs_data);
+
+ std::vector().swap(Freqdimids);
+ std::vector().swap(Poldimids);
+ std::vector().swap(Azdimids);
+ std::vector().swap(Incdimids);
+ std::vector().swap(RCSdimids);
+
+ std::vector().swap(Freqdimsize);
+ std::vector().swap(Poldimsizes);
+ std::vector().swap(Azdimsize);
+ std::vector().swap(Incdimsize);
+ std::vector().swap(RCSdimsize);
+
+
+ return 0;
+ }
+
+ QVector LAMPScatterS1BDataset::getPolarNames() {
+ QVector polnames;
+ polnames.clear();
+
+ for (QString polarName: this->polarRCSTree.keys()) {
+ polnames.append(polarName);
+ }
+
+ return polnames;
+ }
+
+ std::shared_ptr LAMPScatterS1BDataset::getPolarKdTree(QString polarName) {
+ if (this->polarRCSTree.contains(polarName)) {
+ return this->polarRCSTree[polarName];
+ } else {
+ return nullptr;
+ }
+ }
+
+ QVector LAMPScatterS1BDataset::getNodeUniqueNames() {
+ QVector nodeUniqueNames;
+ for (QString keyname:this->Nodedict.keys()) {
+ nodeUniqueNames.append(keyname);
+ }
+ return nodeUniqueNames;
+ }
+
+ std::complex LAMPScatterS1BDataset::getRCSData(QString polarName, double AzAngle, double IncAngle, double FreqId) {
+ return std::complex();
+ }
+
+ std::shared_ptr LAMPScatterS1BDataset::getRCSDataNode(QString hashCodeName) {
+ if (this->Nodedict.contains(hashCodeName)) {
+ return this->Nodedict[hashCodeName];
+ }else {
+ return nullptr;
+ }
+ }
+
+ QMap LAMPScatterS1BDataset::ReadPolAttribution(int ncid, int pol_varid) {
+ int num_atts;
+ if (nc_inq_varnatts(ncid, pol_varid, &num_atts)) {
+ return QMap();
+ }
+ if (num_atts == 0) {
+ return QMap();
+ } else {
+ QMap result;
+ qDebug() << "Attributes for Pol:";
+ for (int i = 0; i < num_atts; ++i) {
+ char att_name[NC_MAX_NAME + 1];
+ if (nc_inq_attname(ncid, pol_varid, i, att_name)) {
+ qDebug() << "Error getting attribute name";
+ }
+
+ // ȡͺͳ
+ nc_type xtype;
+ size_t len;
+ if (nc_inq_att(ncid, pol_varid, att_name, &xtype, &len)) {
+ qDebug() << "Error getting attribute type and length";
+ }
+
+ // Ͷȡֵ
+ switch (xtype) {
+ case NC_CHAR: {
+ std::vector att_value(len + 1); // +1 for null terminator
+ if (nc_get_att_text(ncid, pol_varid, att_name, att_value.data())) {
+ qDebug() << "Error reading text attribute";
+ }
+
+ qDebug() << "Attribute Name: " << att_name << ", Type: NC_CHAR, Value: " << att_value.data();
+ result.insert(QString(att_name), QString(att_value.data()));
+ break;
+ }
+ default:
+ std::cout << "Attribute Name: " << att_name << ", Type: Unknown" << std::endl;
+ break;
+ }
+ }
+ return result;
+ }
+ }
+
+ QString getLAMPScatterS1BNodeUniqueCode(std::shared_ptr nodePtr) {
+ uintptr_t add_ptr=reinterpret_cast(&(*nodePtr));
+ QString str = QString::number(add_ptr,16);
+ return QString("%1%2").arg(str).arg(generateRandomString(6));
+ }
+
+ QString generateRandomString(int length) {
+ const QString characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
+ const int maxIndex = characters.length() - 1;
+ QString randomString;
+
+ for (int i = 0; i < length; ++i) {
+ int index = QRandomGenerator::global()->bounded(maxIndex + 1);
+ QChar nextChar = characters.at(index);
+ randomString.append(nextChar);
+ }
+
+ return randomString;
+ }
+}
diff --git a/src/PluginLAMPScatterProcess/LAMPScatterS1B.h b/src/PluginLAMPScatterProcess/LAMPScatterS1B.h
new file mode 100644
index 0000000..15b0c0e
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/LAMPScatterS1B.h
@@ -0,0 +1,115 @@
+#pragma once
+#ifndef _LAMPSCATTERS1B_H_
+#define _LAMPSCATTERS1B_H_
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include "PostAlgorithm/Plot3DReaderAlgorithm.h"
+
+
+namespace LAMPScatterTool {
+ inline void LAMPScatterS1BdelArrPtr(void *p) {
+ delete[] p;
+ p = nullptr;
+ }
+
+
+
+ class LAMPScatterS1BRCSDataNode {
+ public:
+ LAMPScatterS1BRCSDataNode(QString PolarName, double AzAngle, double IncAngle, std::shared_ptr freqs, std::shared_ptr RCSPoints, long freqnumber);
+
+ ~LAMPScatterS1BRCSDataNode();
+
+ public:
+ long getFreqPointNumber();
+
+ std::shared_ptr getFreqPoints();
+
+ std::shared_ptr getRCSPoints();
+
+ QString getPolarName();
+
+ double getAzAngle();
+
+ double getIncAngle();
+
+ QString getUniqueName();
+ void setUniqueName(QString uniqueName);
+ private:
+ double AzAngle;
+ double IncAngle;
+ long FreqPointNumber;
+ std::shared_ptr FreqPoints;
+ std::shared_ptr RCSPoints;
+ QString PolarName;
+ QString NodeUniqueName;
+ };
+
+
+ class LAMPScatterS1BPolarKdTree {
+
+ public:
+ LAMPScatterS1BPolarKdTree(std::vector > inDatalist);
+
+ ~LAMPScatterS1BPolarKdTree();
+
+ public:
+ QVector > search(double sAzAngle, double sIncAngle, long sPointNumber);
+ std::vector> getAZIncPoints();
+ std::vector > getdatalists();
+ private: //kdtree
+ std::vector > dataset;
+ std::shared_ptr > KdtreeFlannDatasetPtr;
+ std::shared_ptr > > kdtreeIndexPtr;
+
+ private:
+ std::vector > datalist;
+ };
+
+
+ class LAMPScatterS1BDataset {
+
+ public:
+ LAMPScatterS1BDataset();
+ ~LAMPScatterS1BDataset();
+
+ public:
+ int OpenFile(QString s1bfilepath);
+ QVector getPolarNames();
+ std::shared_ptr getPolarKdTree(QString polarName);
+ public:
+ std::complex getRCSData(QString polarName, double AzAngle, double IncAngle, double FreqId);
+ std::shared_ptr getRCSDataNode(QString hashCodeName);
+ QVector getNodeUniqueNames();
+
+ private:
+ long FreqPointNumber;
+ long polNumber;
+ long AzNumber;
+ long IncNumber;
+ QMap > polarRCSTree;
+ QMap > Nodedict;
+
+ private:
+ QMap ReadPolAttribution(int ncid, int polvarid);
+ };
+
+
+
+
+ QString getLAMPScatterS1BNodeUniqueCode(std::shared_ptr nodePtr);
+
+ QString generateRandomString(int length);
+}
+
+#endif
diff --git a/src/PluginLAMPScatterProcess/lampscattermanagertool.cpp b/src/PluginLAMPScatterProcess/lampscattermanagertool.cpp
new file mode 100644
index 0000000..12aaf8f
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/lampscattermanagertool.cpp
@@ -0,0 +1,343 @@
+//
+// Created by 30453 on 25-1-11.
+//
+
+// You may need to build the project (run Qt uic code generator) to get "ui_LAMPScatterManagerTool.h" resolved
+
+#include "lampscattermanagertool.h"
+#include "ui_LAMPScatterManagerTool.h"
+#include "LAMPScatterS1B.h"
+#include
+#include "qcustomplot.h"
+
+namespace LAMPScatterTool {
+ LAMPScatterS1BNode::LAMPScatterS1BNode(QWidget *parent, QTreeWidget *rootnode, QString Inncfilepath): QWidget(parent),
+ ncfilepath(Inncfilepath) {
+ QFileInfo fileInfo(Inncfilepath);
+ this->ncfilename = fileInfo.fileName(); // 获取文件名
+
+ this->dataset=std::make_shared();
+ this->dataset->OpenFile(Inncfilepath); //
+
+ // 根据属性创建tree Node
+ this->NodeData = new QTreeWidgetItem(rootnode, SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_ROOT); // 创建更目录
+ this->NodeData->setText(0, this->ncfilename);
+ // 创建极化
+ QVector polarnames=this->dataset->getPolarNames();
+ for (long i = 0; i < polarnames.count(); i++) {
+ QTreeWidgetItem *polaritem = new QTreeWidgetItem(this->NodeData, SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_POLARNODE);
+ polaritem->setText(0, polarnames[i]);
+ std::shared_ptr tempPtr = this->dataset->getPolarKdTree(polarnames[i]);
+ std::shared_ptr rscdatakdtree=this->dataset->getPolarKdTree(polarnames[i]);
+ if (nullptr == rscdatakdtree) {
+ continue;
+ }
+ std::vector > nodedictkeylist =rscdatakdtree->getdatalists();
+ QString temphascode="";
+ for (long j = 0; j < nodedictkeylist.size(); j++) {
+ temphascode=nodedictkeylist[j]->getUniqueName();
+ std::shared_ptr tempdatanode = this->dataset->getRCSDataNode(temphascode);
+ QTreeWidgetItem *AzIncNode = new QTreeWidgetItem(polaritem, SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_AZINCANGLENODE);
+ AzIncNode->setText(0, QString("(Az:%1,Inc:%2)").arg(tempdatanode->getAzAngle()).arg(tempdatanode->getIncAngle()));
+ AzIncNode->setData(0, Qt::UserRole, tempdatanode->getUniqueName());
+ polaritem->addChild(AzIncNode);
+ qDebug() << polarnames[i]<<" -- "<< tempdatanode->getUniqueName();
+ }
+ this->NodeData->addChild(polaritem);
+ }
+ rootnode->addTopLevelItem(this->NodeData);
+ }
+
+ LAMPScatterS1BNode::~LAMPScatterS1BNode() {
+ if (nullptr != this->dataset) {
+ this->dataset.reset();
+ }
+ if (nullptr != this->NodeData) {
+ delete this->NodeData;
+ }
+ }
+
+ QString LAMPScatterS1BNode::getName() {
+ return this->ncfilename;
+ }
+
+ QString LAMPScatterS1BNode::getPath() {
+ return this->ncfilepath;
+ }
+
+ std::shared_ptr LAMPScatterS1BNode::getRCSDataNode(QString hasCodeName) {
+ return this->dataset->getRCSDataNode(hasCodeName);
+ }
+
+ LAMPScatterManagerTool::LAMPScatterManagerTool(QWidget *parent) : QMainWindow(parent), ui(new Ui::LAMPScatterManagerTool) {
+ ui->setupUi(this);
+ qDebug("LAMPScatterManagerTool::LAMPScatterManagerTool UI finish!!");
+ connect(this->ui->action_ScatterS1B,SIGNAL(triggered()),this,SLOT(actionScatterS1BOpenFile()));
+ connect(this->ui->actionCloseFileNode,SIGNAL(triggered()),this,SLOT(actionCloseNodeFileTrigged()));
+ // this->LAMPScatterS1Brootnode = new QTreeWidgetItem(this->ui->treeWidget);
+ // this->LAMPScatterS1Brootnode->setText(0,u8"全极化散射测量数据");
+ this->LAMPScatterS1Bnodemap.clear();
+ this->graphdict.clear();
+ this->ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);// 右键菜单
+
+ connect(this->ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowTreeWidgetContextMenu(const QPoint& )));
+ this->InitTreeWidgetMenu();
+ this->ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
+ this->ui->treeWidget->setHeaderHidden(true);
+ qDebug("LAMPScatterManagerTool::LAMPScatterManagerTool InitTreeWidgetMenu finish!!");
+ }
+ LAMPScatterManagerTool::~LAMPScatterManagerTool() {
+ delete ui;
+ }
+
+
+
+
+
+ void LAMPScatterManagerTool::actionScatterS1BOpenFile() {
+ qDebug() << "LAMPScatterManagerTool::actionScatterS1BOpenFile";
+
+ QString fileName = QFileDialog::getOpenFileName(
+ this,
+ tr("Open NetCDF File"),
+ "",
+ tr("NetCDF Files (*.nc *.NC);;All Files (*)")
+ );
+
+ if (!fileName.isEmpty()) {
+ QMessageBox::information(this, tr("Selected File"), tr("You selected:\n%1").arg(fileName));
+ qDebug() << "Selected NetCDF File:" << fileName;
+
+ std::shared_ptr tempnode(new LAMPScatterS1BNode(this->ui->treeWidget,this->ui->treeWidget,fileName));
+ this->LAMPScatterS1Bnodemap.insert(tempnode->getName(),tempnode);
+ } else {
+ QMessageBox::warning(this, tr("No File Selected"), tr("No file was selected."));
+ }
+ this->ui->treeWidget->update();
+ }
+
+ void LAMPScatterManagerTool::actionCloseNodeFileTrigged() {
+ QList items= this->ui->treeWidget->selectedItems();
+ for (QTreeWidgetItem* item : items) {
+ QTreeWidgetItem* ncnode=item;
+ while (nullptr != ncnode) {
+ if (ncnode->type()==SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_ROOT) {
+ this->RemoveNCNode(ncnode);
+ break;
+ }else {
+ ncnode=ncnode->parent();
+ }
+ }
+ }
+
+ }
+
+ void LAMPScatterManagerTool::RemoveNCNode(QTreeWidgetItem *node) {
+ // 删除图像
+ QVector > graphs=this->graphdict[node->text(0)];
+ for (std::shared_ptr graph : graphs) {
+ this->RemoveCustomPlotData(graph->name());
+ }
+ QString ncname=node->text(0);
+ this->graphdict.remove(ncname);
+ this->LAMPScatterS1Bnodemap.remove(ncname);
+ this->ui->treeWidget->removeItemWidget(node,0);
+ }
+
+ void LAMPScatterManagerTool::ShowTreeWidgetContextMenu(const QPoint& point) {
+ QTreeWidget* curTree = qobject_cast(sender());
+ if (nullptr != curTree) {
+ qDebug() << "LAMPScatterManagerTool::ShowTreeWidgetContextMenu";
+ this->currentSelectedItem=nullptr;
+ this->currentSelectedItem = curTree->itemAt(point); // 根据坐标求出当前右键点击的
+ if (nullptr != this->currentSelectedItem ) {
+ switch (this->currentSelectedItem ->type()) {
+ case SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_ROOT:
+ break;
+ case SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_POLARNODE:
+ break;
+ case SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_AZINCANGLENODE:
+ this->AzIncNodeMenu->exec(QCursor::pos());// 展示AzInc节点
+ break;
+ default:
+ break;
+ }
+ }else{}
+ }else{}
+ }
+
+ void LAMPScatterManagerTool::InitTreeWidgetMenu() {
+ this->AzIncNodeMenu=std::make_shared( new QMenu(this->ui->treeWidget)); // 右键菜单
+ QAction* AzIncNode_action_ShowRCSDatadB=this->AzIncNodeMenu->addAction(tr(u8"展示散射测量数据(dBsm)")); // 展示数据散射测量数据
+ QAction* AzIncNode_action_RemoveRCSData=this->AzIncNodeMenu->addAction(tr(u8"隐藏散射测量数据"));
+ connect(AzIncNode_action_ShowRCSDatadB,SIGNAL(triggered()),this,SLOT(onAzIncNode_action_ShowRCSDatadB_triggered()));
+ connect(AzIncNode_action_RemoveRCSData,SIGNAL(triggered()),this,SLOT(onAzIncNode_action_RemoveRCSData_triggered()));
+ }
+
+
+ void LAMPScatterManagerTool::onAzIncNode_action_ShowRCSDatadB_triggered() {
+ QTreeWidgetItem* currentItem = this->currentSelectedItem;
+ if (nullptr != currentItem) {
+ QString ncname="";
+ QTreeWidgetItem* parentItem = currentItem->parent();
+ ncname.clear();
+ while (nullptr != parentItem) {
+ if (parentItem->type()==SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_ROOT) {
+ ncname=parentItem->text(0);
+ break;
+ }else {
+ parentItem = parentItem->parent();
+ }
+ }
+ qDebug()<<"select nc file name:\t"<data(0,Qt::UserRole).toString();
+ qDebug() << "currentName:" << currentName;
+ if (!this->LAMPScatterS1Bnodemap.contains(ncname)) {
+ qDebug()<<"LAMPScatterS1Bnodemap not contains "<LAMPScatterS1Bnodemap[ncname]) {
+ qDebug()<<"nullptr == LAMPScatterS1Bnodemap "< currentNode =this->LAMPScatterS1Bnodemap[ncname]->getRCSDataNode(currentName); // 当前散射数据节点
+ if (nullptr != currentNode) { // 当前节点
+ QString graphname=QString("Polar:%1 Az:%2 Inc:%3 %4")
+ .arg(currentNode->getPolarName())
+ .arg(QString::number(currentNode->getAzAngle()))
+ .arg(QString::number(currentNode->getIncAngle()))
+ .arg(ncname);
+ qDebug() << "graphname:" << graphname;
+ QString xlabel="Frequency (GHz)";
+ QString ylabel="RCS (dBsm)";
+
+
+ long FreqPointNumber=currentNode->getFreqPointNumber();
+ std::shared_ptr freqlist_ptr = currentNode->getFreqPoints();
+ std::shared_ptr rsclist_ptr=currentNode->getRCSPoints();
+ QVector xs(FreqPointNumber);
+ QVector ys(FreqPointNumber);
+ for (long freqidx=0;freqidxShowCustomPlotData(xs,ys,xlabel,ylabel,graphname,ncname);
+
+ }else{}
+ }
+ else {}
+ }
+ }
+
+ void LAMPScatterManagerTool::onAzIncNode_action_RemoveRCSData_triggered() {
+ QTreeWidgetItem* currentItem = this->currentSelectedItem;
+ if (nullptr != currentItem) {
+ QString ncname="";
+ QTreeWidgetItem* parentItem = currentItem->parent();
+ ncname.clear();
+ while (nullptr != parentItem) {
+ if (parentItem->type()==SCATTER_S1B_NODETYPE::SCATTER_S1B_NODETYPE_NCNODE_ROOT) {
+ ncname=parentItem->text(0);
+ break;
+ }else {
+ parentItem = parentItem->parent();
+ }
+ }
+ qDebug()<<"select nc file name:\t"<data(0,Qt::UserRole).toString();
+ qDebug() << "currentName:" << currentName;
+ if (!this->LAMPScatterS1Bnodemap.contains(ncname)) {
+ qDebug()<<"LAMPScatterS1Bnodemap not contains "<LAMPScatterS1Bnodemap[ncname]) {
+ qDebug()<<"nullptr == LAMPScatterS1Bnodemap "< currentNode =this->LAMPScatterS1Bnodemap[ncname]->getRCSDataNode(currentName); // 当前散射数据节点
+ if (nullptr != currentNode) {
+ // 当前节点
+ QString graphname=QString("Polar:%1 Az:%2 Inc:%3 %4")
+ .arg(currentNode->getPolarName())
+ .arg(QString::number(currentNode->getAzAngle()))
+ .arg(QString::number(currentNode->getIncAngle()))
+ .arg(ncname);
+ this->RemoveCustomPlotData(graphname);
+ }
+ }
+ }
+ }
+
+
+ void LAMPScatterManagerTool::AddCustomPlotGraph(std::shared_ptr graphPtr, QString ncname) {
+ if (!this->graphdict.contains(ncname)) {
+ this->graphdict.insert(ncname,QVector>(0));
+ }else{}
+ this->graphdict[ncname].append(graphPtr);
+
+
+ }
+
+ QColor LAMPScatterManagerTool::getNewColor() {
+ QColor color = QColor::fromHsv(ColorhueOffset, 255, 255);
+ int graphCount=this->ui->customPlot->graphCount();
+ ColorhueOffset += (360 / (graphCount+1)) % 360;
+ return color;
+ }
+
+ void LAMPScatterManagerTool::ShowCustomPlotData(QVector xs, QVector ys, QString xlabel, QString ylabel,QString graphName,QString ncname) {
+ qDebug() << "LAMPScatterManagerTool::ShowCustomPlotData \t"<y) {
+ ymin=y;
+ }else if (ymaxui->customPlot->xAxis->setLabel(xlabel);
+ this->ui->customPlot->xAxis->setRange(0,21);
+ this->ui->customPlot->yAxis->setLabel(ylabel);
+ this->ui->customPlot->yAxis->setRange(ymin-0.1*ystep,ymax+0.1*ystep);
+
+ std::shared_ptr graph_ptr( this->ui->customPlot->addGraph());
+ graph_ptr->setName(graphName);
+ graph_ptr->setData(xs,ys);
+ QColor color=getNewColor();
+ graph_ptr->setPen(QPen(color)); // 设置当前 graph 的颜色
+ this->AddCustomPlotGraph(graph_ptr,ncname);
+
+ this->ui->customPlot->legend->setVisible(true);
+ this->ui->customPlot->replot();
+
+ }
+
+ void LAMPScatterManagerTool::RemoveCustomPlotData(QString graphname) {
+ for (int i = 0; i < this->ui->customPlot->graphCount(); ++i) {
+ QCPGraph *graph = this->ui->customPlot->graph(i);
+ if (graph->name() == graphname) {
+ this->ui->customPlot->removeGraph(i); // 删除该图形
+ this->ui->customPlot->replot(); // 刷新
+ break;
+ }
+ }
+ }
+} // LAMPScatterTool
diff --git a/src/PluginLAMPScatterProcess/lampscattermanagertool.h b/src/PluginLAMPScatterProcess/lampscattermanagertool.h
new file mode 100644
index 0000000..9d146cc
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/lampscattermanagertool.h
@@ -0,0 +1,107 @@
+//
+// Created by 30453 on 25-1-11.
+//
+
+#ifndef LAMPSCATTERMANAGERTOOL_H
+#define LAMPSCATTERMANAGERTOOL_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "LAMPScatterS1B.h"
+
+
+namespace LAMPScatterTool {
+ QT_BEGIN_NAMESPACE
+
+ namespace Ui {
+ class LAMPScatterManagerTool;
+ }
+
+ QT_END_NAMESPACE
+
+ class LAMPScatterS1BDataset;
+
+ /**
+ * 节点级别
+ */
+ enum SCATTER_S1B_NODETYPE {
+ SCATTER_S1B_NODETYPE_NCNODE_ROOT = 0,
+ SCATTER_S1B_NODETYPE_NCNODE_POLARNODE = 1,
+ SCATTER_S1B_NODETYPE_NCNODE_AZINCANGLENODE = 2,
+ };
+
+
+ /**
+ * S1B的 节点类
+ */
+ class LAMPScatterS1BNode : public QWidget {
+ Q_OBJECT
+
+ public:
+ LAMPScatterS1BNode(QWidget *parent, QTreeWidget *rootnode, QString ncfilepath);
+ ~LAMPScatterS1BNode();
+
+ public:
+ QString getName();
+ QString getPath();
+ std::shared_ptr getRCSDataNode(QString hasCodeName);
+ private:
+ QString ncfilepath; //netcdf 文件路径
+ QString ncfilename; // netcdf 文件文件
+ std::shared_ptr dataset = nullptr;
+
+ private:
+ QTreeWidgetItem *NodeData = nullptr;
+ };
+
+ /**
+ * S1B数据展示
+ */
+ class LAMPScatterManagerTool : public QMainWindow {
+ Q_OBJECT
+
+ public:
+ explicit LAMPScatterManagerTool(QWidget *parent = nullptr);
+
+ ~LAMPScatterManagerTool() override;
+
+ public slots: // 加载NetCDF 数据
+ void actionScatterS1BOpenFile();
+ void actionCloseNodeFileTrigged();
+ void ShowTreeWidgetContextMenu(const QPoint &point);
+ private:
+ QTreeWidgetItem *LAMPScatterS1Brootnode;
+ QMap> LAMPScatterS1Bnodemap;
+ private:
+ Ui::LAMPScatterManagerTool *ui;
+ private: // 右键菜单
+ void InitTreeWidgetMenu();
+ std::shared_ptr AzIncNodeMenu=nullptr;
+ QTreeWidgetItem* currentSelectedItem=nullptr;
+ void RemoveNCNode(QTreeWidgetItem *node);
+ public slots: // 右键菜单事件
+ void onAzIncNode_action_ShowRCSDatadB_triggered();
+ void onAzIncNode_action_RemoveRCSData_triggered();
+
+ public:// 绘制图像
+ void ShowCustomPlotData(QVector xs,QVector ys,QString xlabel,QString ylabel,QString graphName,QString ncname);
+ void RemoveCustomPlotData(QString graphname);
+ void AddCustomPlotGraph(std::shared_ptr,QString ncname);
+ private:// 图像管理
+ QMap>> graphdict;
+
+ private:
+ int ColorhueOffset=0;
+
+ public:
+ QColor getNewColor();
+
+ };
+} // LAMPScatterTool
+
+#endif //LAMPSCATTERMANAGERTOOL_H
diff --git a/src/PluginLAMPScatterProcess/lampscattermanagertool.ui b/src/PluginLAMPScatterProcess/lampscattermanagertool.ui
new file mode 100644
index 0000000..a138d73
--- /dev/null
+++ b/src/PluginLAMPScatterProcess/lampscattermanagertool.ui
@@ -0,0 +1,95 @@
+
+
+ LAMPScatterTool::LAMPScatterManagerTool
+
+
+
+ 0
+ 0
+ 717
+ 487
+
+
+
+ LAMPScatterManagerTool
+
+
+
+ -
+
+
+
+
+
+
+
+
+ 散射数据
+
+
+ 1
+
+
+
+ -
+
+
+
+ 数据节点
+
+
+
+
+
+
+
+
+
+ 散射文件
+
+
+
+
+ close
+
+
+
+
+ 关闭
+
+
+
+
+
+ QCustomPlot
+ QWidget
+
+ 1
+
+
+
+
+