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 + + + + + + + + + + + + 0 + 0 + 717 + 22 + + + + + 文件 + + + + 打开 + + + + + + + + + + + + 散射数据 + + + 1 + + + + + + + + 数据节点 + + + + + + + + + + 散射文件 + + + + + close + + + + + 关闭 + + + + + + QCustomPlot + QWidget +
qcustomplot.h
+ 1 +
+
+ + +