diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts
index 0c43d34..37cb211 100644
--- a/src/renderer/components.d.ts
+++ b/src/renderer/components.d.ts
@@ -20,10 +20,12 @@ declare module 'vue' {
ElDialog: typeof import('element-plus/es')['ElDialog']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
+ ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElInput: typeof import('element-plus/es')['ElInput']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
+ ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
ElRow: typeof import('element-plus/es')['ElRow']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSlider: typeof import('element-plus/es')['ElSlider']
diff --git a/src/renderer/src/icons/svg/BIMEdit.svg b/src/renderer/src/icons/svg/BIMEdit.svg
new file mode 100644
index 0000000..7078ac3
--- /dev/null
+++ b/src/renderer/src/icons/svg/BIMEdit.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/Intervisibility.svg b/src/renderer/src/icons/svg/Intervisibility.svg
new file mode 100644
index 0000000..b4dc818
--- /dev/null
+++ b/src/renderer/src/icons/svg/Intervisibility.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/MeasureAngle.svg b/src/renderer/src/icons/svg/MeasureAngle.svg
new file mode 100644
index 0000000..fe6a45a
--- /dev/null
+++ b/src/renderer/src/icons/svg/MeasureAngle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/MeasureAzimuth.svg b/src/renderer/src/icons/svg/MeasureAzimuth.svg
new file mode 100644
index 0000000..7960c36
--- /dev/null
+++ b/src/renderer/src/icons/svg/MeasureAzimuth.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/POI.svg b/src/renderer/src/icons/svg/POI.svg
new file mode 100644
index 0000000..630a9d5
--- /dev/null
+++ b/src/renderer/src/icons/svg/POI.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/add.svg b/src/renderer/src/icons/svg/add.svg
new file mode 100644
index 0000000..3861e59
--- /dev/null
+++ b/src/renderer/src/icons/svg/add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/add.svg - 快捷方式.lnk b/src/renderer/src/icons/svg/add.svg - 快捷方式.lnk
deleted file mode 100644
index b96a7c1..0000000
Binary files a/src/renderer/src/icons/svg/add.svg - 快捷方式.lnk and /dev/null differ
diff --git a/src/renderer/src/icons/svg/addBIM.svg b/src/renderer/src/icons/svg/addBIM.svg
new file mode 100644
index 0000000..62b3e45
--- /dev/null
+++ b/src/renderer/src/icons/svg/addBIM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/addDevice.svg b/src/renderer/src/icons/svg/addDevice.svg
new file mode 100644
index 0000000..1315a56
--- /dev/null
+++ b/src/renderer/src/icons/svg/addDevice.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/addDirectory.svg b/src/renderer/src/icons/svg/addDirectory.svg
new file mode 100644
index 0000000..89d5957
--- /dev/null
+++ b/src/renderer/src/icons/svg/addDirectory.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/addEventTs.svg b/src/renderer/src/icons/svg/addEventTs.svg
new file mode 100644
index 0000000..5b8bcb0
--- /dev/null
+++ b/src/renderer/src/icons/svg/addEventTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/addResource.svg b/src/renderer/src/icons/svg/addResource.svg
new file mode 100644
index 0000000..b68f1e2
--- /dev/null
+++ b/src/renderer/src/icons/svg/addResource.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/addTrajectory.svg b/src/renderer/src/icons/svg/addTrajectory.svg
new file mode 100644
index 0000000..21d9dba
--- /dev/null
+++ b/src/renderer/src/icons/svg/addTrajectory.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/analysis.svg b/src/renderer/src/icons/svg/analysis.svg
new file mode 100644
index 0000000..d34b0d0
--- /dev/null
+++ b/src/renderer/src/icons/svg/analysis.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/annotation.svg b/src/renderer/src/icons/svg/annotation.svg
new file mode 100644
index 0000000..6fe6dc0
--- /dev/null
+++ b/src/renderer/src/icons/svg/annotation.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/annotationAggregation.svg b/src/renderer/src/icons/svg/annotationAggregation.svg
new file mode 100644
index 0000000..e7c3052
--- /dev/null
+++ b/src/renderer/src/icons/svg/annotationAggregation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/areaMeasure.svg b/src/renderer/src/icons/svg/areaMeasure.svg
new file mode 100644
index 0000000..fb7f91f
--- /dev/null
+++ b/src/renderer/src/icons/svg/areaMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/areaScreen.svg b/src/renderer/src/icons/svg/areaScreen.svg
new file mode 100644
index 0000000..65c9cd6
--- /dev/null
+++ b/src/renderer/src/icons/svg/areaScreen.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/arrow.svg b/src/renderer/src/icons/svg/arrow.svg
new file mode 100644
index 0000000..a1841f5
--- /dev/null
+++ b/src/renderer/src/icons/svg/arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/arrow1.svg b/src/renderer/src/icons/svg/arrow1.svg
new file mode 100644
index 0000000..7dbef7c
--- /dev/null
+++ b/src/renderer/src/icons/svg/arrow1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/arrow2.svg b/src/renderer/src/icons/svg/arrow2.svg
new file mode 100644
index 0000000..2ab00d3
--- /dev/null
+++ b/src/renderer/src/icons/svg/arrow2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/attackArrow.svg b/src/renderer/src/icons/svg/attackArrow.svg
new file mode 100644
index 0000000..267f5a0
--- /dev/null
+++ b/src/renderer/src/icons/svg/attackArrow.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/backTs.svg b/src/renderer/src/icons/svg/backTs.svg
new file mode 100644
index 0000000..7f8bb12
--- /dev/null
+++ b/src/renderer/src/icons/svg/backTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/beidou.svg b/src/renderer/src/icons/svg/beidou.svg
new file mode 100644
index 0000000..fd34840
--- /dev/null
+++ b/src/renderer/src/icons/svg/beidou.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/renderer/src/icons/svg/circle.svg b/src/renderer/src/icons/svg/circle.svg
new file mode 100644
index 0000000..17a23d6
--- /dev/null
+++ b/src/renderer/src/icons/svg/circle.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/circleKen.svg b/src/renderer/src/icons/svg/circleKen.svg
new file mode 100644
index 0000000..4f247d8
--- /dev/null
+++ b/src/renderer/src/icons/svg/circleKen.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/circleStatistics.svg b/src/renderer/src/icons/svg/circleStatistics.svg
new file mode 100644
index 0000000..8aa29d7
--- /dev/null
+++ b/src/renderer/src/icons/svg/circleStatistics.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/renderer/src/icons/svg/clear.svg b/src/renderer/src/icons/svg/clear.svg
new file mode 100644
index 0000000..33a6d87
--- /dev/null
+++ b/src/renderer/src/icons/svg/clear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/clearAnalysis.svg b/src/renderer/src/icons/svg/clearAnalysis.svg
new file mode 100644
index 0000000..33a6d87
--- /dev/null
+++ b/src/renderer/src/icons/svg/clearAnalysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/clearGraffiti.svg b/src/renderer/src/icons/svg/clearGraffiti.svg
new file mode 100644
index 0000000..31d36b8
--- /dev/null
+++ b/src/renderer/src/icons/svg/clearGraffiti.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/clearQuery.svg b/src/renderer/src/icons/svg/clearQuery.svg
new file mode 100644
index 0000000..af5eda6
--- /dev/null
+++ b/src/renderer/src/icons/svg/clearQuery.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/renderer/src/icons/svg/clearRoute.svg b/src/renderer/src/icons/svg/clearRoute.svg
new file mode 100644
index 0000000..bdd45db
--- /dev/null
+++ b/src/renderer/src/icons/svg/clearRoute.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/clearTilesetClipping.svg b/src/renderer/src/icons/svg/clearTilesetClipping.svg
new file mode 100644
index 0000000..f15341b
--- /dev/null
+++ b/src/renderer/src/icons/svg/clearTilesetClipping.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/close.svg b/src/renderer/src/icons/svg/close.svg
new file mode 100644
index 0000000..d2316ca
--- /dev/null
+++ b/src/renderer/src/icons/svg/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/closeLeftTs.svg b/src/renderer/src/icons/svg/closeLeftTs.svg
new file mode 100644
index 0000000..11f96c9
--- /dev/null
+++ b/src/renderer/src/icons/svg/closeLeftTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/closeRightTs.svg b/src/renderer/src/icons/svg/closeRightTs.svg
new file mode 100644
index 0000000..b0747b2
--- /dev/null
+++ b/src/renderer/src/icons/svg/closeRightTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/clt.svg b/src/renderer/src/icons/svg/clt.svg
new file mode 100644
index 0000000..0cd27df
--- /dev/null
+++ b/src/renderer/src/icons/svg/clt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/contour.svg b/src/renderer/src/icons/svg/contour.svg
new file mode 100644
index 0000000..32ea370
--- /dev/null
+++ b/src/renderer/src/icons/svg/contour.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/coorLocation.svg b/src/renderer/src/icons/svg/coorLocation.svg
new file mode 100644
index 0000000..6a34036
--- /dev/null
+++ b/src/renderer/src/icons/svg/coorLocation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/coorMeasure.svg b/src/renderer/src/icons/svg/coorMeasure.svg
new file mode 100644
index 0000000..7fed0c1
--- /dev/null
+++ b/src/renderer/src/icons/svg/coorMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/copy.svg b/src/renderer/src/icons/svg/copy.svg
new file mode 100644
index 0000000..e18d86c
--- /dev/null
+++ b/src/renderer/src/icons/svg/copy.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/creat.svg b/src/renderer/src/icons/svg/creat.svg
new file mode 100644
index 0000000..c81c44f
--- /dev/null
+++ b/src/renderer/src/icons/svg/creat.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/crossPoint.svg b/src/renderer/src/icons/svg/crossPoint.svg
new file mode 100644
index 0000000..faed398
--- /dev/null
+++ b/src/renderer/src/icons/svg/crossPoint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/curve.svg b/src/renderer/src/icons/svg/curve.svg
new file mode 100644
index 0000000..f315ec0
--- /dev/null
+++ b/src/renderer/src/icons/svg/curve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/cutFill.svg b/src/renderer/src/icons/svg/cutFill.svg
new file mode 100644
index 0000000..5fb2529
--- /dev/null
+++ b/src/renderer/src/icons/svg/cutFill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/del.svg b/src/renderer/src/icons/svg/del.svg
new file mode 100644
index 0000000..969722f
--- /dev/null
+++ b/src/renderer/src/icons/svg/del.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/renderer/src/icons/svg/delModel.svg b/src/renderer/src/icons/svg/delModel.svg
new file mode 100644
index 0000000..815394b
--- /dev/null
+++ b/src/renderer/src/icons/svg/delModel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/des_detail.svg b/src/renderer/src/icons/svg/des_detail.svg
new file mode 100644
index 0000000..545eb8b
--- /dev/null
+++ b/src/renderer/src/icons/svg/des_detail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/diffuseScan.svg b/src/renderer/src/icons/svg/diffuseScan.svg
new file mode 100644
index 0000000..c4904c8
--- /dev/null
+++ b/src/renderer/src/icons/svg/diffuseScan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/dimension.svg b/src/renderer/src/icons/svg/dimension.svg
new file mode 100644
index 0000000..e8247e7
--- /dev/null
+++ b/src/renderer/src/icons/svg/dimension.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/distanceMeasure.svg b/src/renderer/src/icons/svg/distanceMeasure.svg
new file mode 100644
index 0000000..33d7ce1
--- /dev/null
+++ b/src/renderer/src/icons/svg/distanceMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/download.svg b/src/renderer/src/icons/svg/download.svg
new file mode 100644
index 0000000..bf49251
--- /dev/null
+++ b/src/renderer/src/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/edit.svg b/src/renderer/src/icons/svg/edit.svg
new file mode 100644
index 0000000..69d48f2
--- /dev/null
+++ b/src/renderer/src/icons/svg/edit.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/ellipse.svg b/src/renderer/src/icons/svg/ellipse.svg
new file mode 100644
index 0000000..5d40ee4
--- /dev/null
+++ b/src/renderer/src/icons/svg/ellipse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/entityWall.svg b/src/renderer/src/icons/svg/entityWall.svg
new file mode 100644
index 0000000..8ec2541
--- /dev/null
+++ b/src/renderer/src/icons/svg/entityWall.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/ersan_ts.svg b/src/renderer/src/icons/svg/ersan_ts.svg
new file mode 100644
index 0000000..16d4de2
--- /dev/null
+++ b/src/renderer/src/icons/svg/ersan_ts.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/exitTs.svg b/src/renderer/src/icons/svg/exitTs.svg
new file mode 100644
index 0000000..1322abf
--- /dev/null
+++ b/src/renderer/src/icons/svg/exitTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/explosion.svg b/src/renderer/src/icons/svg/explosion.svg
new file mode 100644
index 0000000..92563f2
--- /dev/null
+++ b/src/renderer/src/icons/svg/explosion.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/export.svg b/src/renderer/src/icons/svg/export.svg
new file mode 100644
index 0000000..010445b
--- /dev/null
+++ b/src/renderer/src/icons/svg/export.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/fire.svg b/src/renderer/src/icons/svg/fire.svg
new file mode 100644
index 0000000..8158072
--- /dev/null
+++ b/src/renderer/src/icons/svg/fire.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/fk.svg b/src/renderer/src/icons/svg/fk.svg
new file mode 100644
index 0000000..35e3bd0
--- /dev/null
+++ b/src/renderer/src/icons/svg/fk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/floodSimulation.svg b/src/renderer/src/icons/svg/floodSimulation.svg
new file mode 100644
index 0000000..7df3f79
--- /dev/null
+++ b/src/renderer/src/icons/svg/floodSimulation.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/flyLine.svg b/src/renderer/src/icons/svg/flyLine.svg
new file mode 100644
index 0000000..166801a
--- /dev/null
+++ b/src/renderer/src/icons/svg/flyLine.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/fog.svg b/src/renderer/src/icons/svg/fog.svg
new file mode 100644
index 0000000..eeffdfe
--- /dev/null
+++ b/src/renderer/src/icons/svg/fog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/fountain.svg b/src/renderer/src/icons/svg/fountain.svg
new file mode 100644
index 0000000..5402ba9
--- /dev/null
+++ b/src/renderer/src/icons/svg/fountain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/full_screen.svg b/src/renderer/src/icons/svg/full_screen.svg
new file mode 100644
index 0000000..746a2ec
--- /dev/null
+++ b/src/renderer/src/icons/svg/full_screen.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/full_screen_exit.svg b/src/renderer/src/icons/svg/full_screen_exit.svg
new file mode 100644
index 0000000..6bc746d
--- /dev/null
+++ b/src/renderer/src/icons/svg/full_screen_exit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/gdbImport.svg b/src/renderer/src/icons/svg/gdbImport.svg
new file mode 100644
index 0000000..ea9c419
--- /dev/null
+++ b/src/renderer/src/icons/svg/gdbImport.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/geojson.svg b/src/renderer/src/icons/svg/geojson.svg
new file mode 100644
index 0000000..6e51849
--- /dev/null
+++ b/src/renderer/src/icons/svg/geojson.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/globalContour.svg b/src/renderer/src/icons/svg/globalContour.svg
new file mode 100644
index 0000000..bea5eaa
--- /dev/null
+++ b/src/renderer/src/icons/svg/globalContour.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/graffiti.svg b/src/renderer/src/icons/svg/graffiti.svg
new file mode 100644
index 0000000..c6d5b02
--- /dev/null
+++ b/src/renderer/src/icons/svg/graffiti.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/groundText.svg b/src/renderer/src/icons/svg/groundText.svg
new file mode 100644
index 0000000..6a003be
--- /dev/null
+++ b/src/renderer/src/icons/svg/groundText.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/heightMeasure.svg b/src/renderer/src/icons/svg/heightMeasure.svg
new file mode 100644
index 0000000..f2b8558
--- /dev/null
+++ b/src/renderer/src/icons/svg/heightMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/hh.svg b/src/renderer/src/icons/svg/hh.svg
new file mode 100644
index 0000000..fbea00f
--- /dev/null
+++ b/src/renderer/src/icons/svg/hh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/highQuality.svg b/src/renderer/src/icons/svg/highQuality.svg
new file mode 100644
index 0000000..43123b7
--- /dev/null
+++ b/src/renderer/src/icons/svg/highQuality.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/renderer/src/icons/svg/icon-compass1.svg b/src/renderer/src/icons/svg/icon-compass1.svg
new file mode 100644
index 0000000..3352557
--- /dev/null
+++ b/src/renderer/src/icons/svg/icon-compass1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/icon-compass2.svg b/src/renderer/src/icons/svg/icon-compass2.svg
new file mode 100644
index 0000000..db6c964
--- /dev/null
+++ b/src/renderer/src/icons/svg/icon-compass2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/icon-compass3.svg b/src/renderer/src/icons/svg/icon-compass3.svg
new file mode 100644
index 0000000..988d759
--- /dev/null
+++ b/src/renderer/src/icons/svg/icon-compass3.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/icon-compass4.svg b/src/renderer/src/icons/svg/icon-compass4.svg
new file mode 100644
index 0000000..85bcd72
--- /dev/null
+++ b/src/renderer/src/icons/svg/icon-compass4.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/importHeader.svg b/src/renderer/src/icons/svg/importHeader.svg
new file mode 100644
index 0000000..7c38135
--- /dev/null
+++ b/src/renderer/src/icons/svg/importHeader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/importHeader1.svg b/src/renderer/src/icons/svg/importHeader1.svg
new file mode 100644
index 0000000..9786685
--- /dev/null
+++ b/src/renderer/src/icons/svg/importHeader1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/importImg.svg b/src/renderer/src/icons/svg/importImg.svg
new file mode 100644
index 0000000..cbcb4e2
--- /dev/null
+++ b/src/renderer/src/icons/svg/importImg.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/importModel.svg b/src/renderer/src/icons/svg/importModel.svg
new file mode 100644
index 0000000..9b6a58e
--- /dev/null
+++ b/src/renderer/src/icons/svg/importModel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/importPanorama.svg b/src/renderer/src/icons/svg/importPanorama.svg
new file mode 100644
index 0000000..a4b5898
--- /dev/null
+++ b/src/renderer/src/icons/svg/importPanorama.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/renderer/src/icons/svg/index.js b/src/renderer/src/icons/svg/index.js
new file mode 100644
index 0000000..e197e7d
--- /dev/null
+++ b/src/renderer/src/icons/svg/index.js
@@ -0,0 +1,1449 @@
+import Dialog from '../../Obj/Element/Dialog';
+import Tools from '../../Tools';
+import { legp } from '../../Obj/Element/datalist'
+import { getTemplateData } from './dataSource.js'
+
+let tools = new Tools();
+
+
+async function MapPrint(sdk, thumbnailImg, rectangle, originalImg) {
+ let exporting = false;
+ let templateData = getTemplateData(tools)
+ let _DialogObject
+ let template = '1'
+ let unitDistance
+ let isLoad = true
+ let borderImage
+ let margin = 0
+ let svgText
+ let title = {
+ text: '标题',
+ height: 40,
+ bgColor: '#5d5d5d',
+ color: '#ffffff',
+ show: true,
+ }
+
+ let border = {
+ show: true,
+ url: tools.getSourceRootPath() + '/custom/img/map-border1.svg',
+ width: 20,
+ }
+
+ let data = [
+ {
+ text: '',
+ x: 10,
+ y: 100,
+ height: 24,
+ fontSize: 24,
+ isSelected: false,
+ show: true,
+ color: '#ffffff',
+ },
+ {
+ text: '-',
+ x: 10,
+ y: 100,
+ height: 24,
+ fontSize: 24,
+ isSelected: false,
+ show: true,
+ color: '#ffffff',
+ },
+ {
+ x: 10,
+ y: 100,
+ width: 100,
+ height: 100,
+ show: false,
+ isSelected: false,
+ url: tools.getSourceRootPath() + '/custom/img/icon-compass1.svg'
+ }
+ ]
+
+ // 比例尺
+ let plottingScale = {
+ cell: 2,
+ color: '#ffffff',
+ show: true,
+ isSelected: false,
+ x: 10,
+ y: 100,
+ width: 100,
+ }
+
+ let compassList = [
+ '/custom/img/icon-compass1.svg',
+ '/custom/img/icon-compass2.svg',
+ '/custom/img/icon-compass3.svg',
+ '/custom/img/icon-compass4.svg'
+ ]
+
+ if (_DialogObject) {
+ _DialogObject.close()
+ _DialogObject = null
+ }
+ _DialogObject = await new Dialog(sdk, {}, {
+ title: '地图打印', left: '5%', top: '10%', ismove: false
+ })
+ _DialogObject._element.body.className = _DialogObject._element.body.className + ' map-print'
+ let contentElm = document.createElement('div');
+ contentElm.innerHTML = `
+
+
+
+
地图要素
+
+
+
指北针
+
+
+
+ ${(() => {
+ let str = '';
+ for (let i = 0; i < compassList.length; i++) {
+ const compass = tools.getSourceRootPath() + compassList[i];
+ str += `
+
+

+
`
+ }
+ return str
+ })()}
+
+
+
+
+
+
+
+
+ `;
+ _DialogObject.contentAppChild(contentElm)
+ let leftElm = contentElm.getElementsByClassName('left')[0]
+ let rightElm = contentElm.getElementsByClassName('right')[0]
+ // let mapImgBoxElm = rightElm.getElementsByClassName('map-img-box')[0]
+ let titleInputElm = leftElm.getElementsByClassName('title-input')[0]
+ let titleCheckboxElm = leftElm.getElementsByClassName('title-checkbox')[0]
+ let unitInputElm = leftElm.getElementsByClassName('unit-input')[0]
+ let unitCheckboxElm = leftElm.getElementsByClassName('unit-checkbox')[0]
+ let compassCheckboxElm = leftElm.getElementsByClassName('compass-checkbox')[0]
+ let compassRadiosElm = leftElm.getElementsByClassName('compass-radio')
+ let plottingScaleCheckboxElm = leftElm.getElementsByClassName('plotting-scale-checkbox')[0]
+ let mapBorderCheckboxElm = leftElm.getElementsByClassName('map-border-checkbox')[0]
+
+
+ let canvas = document.createElement('canvas');
+ let ctx = canvas.getContext('2d');
+ rightElm.appendChild(canvas)
+ let imgElm = new Image();
+ imgElm.src = thumbnailImg
+
+ imgElm.onload = function () {
+ isLoad = false
+ getPlottingScale()
+ changeTemplate(template)
+ }
+
+
+
+ // 标题
+ titleInputElm.value = title.text;
+ titleCheckboxElm.checked = title.show;
+ titleInputElm.addEventListener('input', function () {
+ title.text = this.value;
+ if (imgElm.complete) {
+ updateCanvas()
+ }
+ });
+ titleCheckboxElm.addEventListener('change', function () {
+ title.show = this.checked;
+ if (imgElm.complete) {
+ updateCanvas()
+ }
+ });
+
+ // 制图单位
+ unitInputElm.value = data[1].text;
+ unitCheckboxElm.checked = data[1].show;
+ unitInputElm.addEventListener('input', function () {
+ data[1].text = this.value;
+ if (imgElm && imgElm.complete) {
+ updateCanvas()
+ }
+ });
+ unitCheckboxElm.addEventListener('change', function () {
+ data[1].show = this.checked;
+ if (imgElm && imgElm.complete) {
+ updateCanvas()
+ }
+ })
+
+ // 指北针
+ compassCheckboxElm.checked = data[2].show;
+ compassCheckboxElm.addEventListener('change', function () {
+ data[2].show = this.checked;
+ if (imgElm && imgElm.complete) {
+ updateCanvas()
+ }
+ })
+ for (let i = 0; i < compassRadiosElm.length; i++) {
+ compassRadiosElm[i].addEventListener('change', function () {
+ if (this.checked) {
+ data[2].svg = null
+ data[2].url = compassList[i]
+ if (imgElm && imgElm.complete) {
+ updateCanvas()
+ }
+ }
+ })
+ }
+
+ // 比例尺
+ plottingScaleCheckboxElm.checked = plottingScale.show;
+ plottingScaleCheckboxElm.addEventListener('change', function () {
+ plottingScale.show = this.checked;
+ if (imgElm && imgElm.complete) {
+ updateCanvas()
+ }
+ })
+
+ // 图框
+ mapBorderCheckboxElm.checked = border.show;
+ mapBorderCheckboxElm.addEventListener('change', function () {
+ border.show = this.checked;
+ if (borderImage && borderImage.complete) {
+ updateCanvas()
+ }
+ })
+ let borderColorPicker = new YJColorPicker({
+ el: contentElm.getElementsByClassName('border-color')[0],
+ size: 'mini', //颜色box类型
+ alpha: false, //是否开启透明度
+ defaultColor: border.color,
+ disabled: false, //是否禁止打开颜色选择器
+ openPickerAni: 'opacity', //打开颜色选择器动画
+ sure: color => {
+ changeMapBorderColor(color)
+ }, //点击确认按钮事件回调
+ clear: () => {
+ changeMapBorderColor('rgba(0,0,0,1)')
+ } //点击清空按钮事件回调
+ })
+
+
+
+ let jeDateObject
+
+
+ let printDateCheckboxElm
+ let mapBorderDataLegpElm
+ let mapBorderObject
+ let iActiveElm
+
+ let closeBtn
+ let exportBtn
+
+ setTimeout(() => {
+ closeBtn = _DialogObject._element.foot.getElementsByClassName('close')[0]
+ exportBtn = document.createElement('button')
+ exportBtn.className = 'export';
+ exportBtn.innerHTML = '打印';
+ leftElm.appendChild(closeBtn)
+ leftElm.appendChild(exportBtn)
+ exportBtn.addEventListener('click', function () {
+ if (exporting) {
+ return
+ }
+ exporting = true
+ exportBtn.innerHTML = '打印'
+ exportMap()
+ // exporting = true
+ // exportBtn.innerHTML = '打印'
+ // let imgBlobData = canvas.toDataURL();
+ // let downloadElement = document.createElement('a');
+ // downloadElement.href = imgBlobData;
+ // downloadElement.download = `高清出图-${getDateTimeString()}.png`;
+ // document.body.appendChild(downloadElement);
+ // downloadElement.click();
+ // document.body.removeChild(downloadElement);
+ // URL.revokeObjectURL(imgBlobData);
+ })
+
+
+ // 时间
+ let printDateElm = contentElm.getElementsByClassName('print-date')[0]
+ printDateCheckboxElm = contentElm.getElementsByClassName('print-date-checkbox')[0]
+
+ printDateCheckboxElm.checked = data[0].show;
+ printDateCheckboxElm.addEventListener('change', function () {
+ data[0].show = this.checked;
+ if (imgElm.complete) {
+ updateCanvas()
+ }
+ })
+ jeDateObject = jeDate(printDateElm, {
+ format: "YYYY-MM-DD",
+ isinitVal: true,
+ isClear: false,
+ donefun: function (obj) {
+ data[0].text = obj.val;
+ if (imgElm.complete) {
+ updateCanvas()
+ }
+ }
+ });
+ if (data[0].text) {
+ jeDateObject.setValue(data[0].text)
+ }
+ else {
+ jeDateObject.nowBtn && jeDateObject.nowBtn()
+ data[0].text = jeDateObject.getValue()
+ updateCanvas()
+ }
+
+
+ // 模板
+ // let templateData = templateData
+ let templateObject = legp(
+ _DialogObject._element.content.getElementsByClassName(
+ 'template-box'
+ )[0],
+ '.template'
+ )
+ if (templateObject) {
+ templateObject.legp_search(templateData)
+ let templateDataLegpElm = _DialogObject._element.content
+ .getElementsByClassName('template')[0]
+ .getElementsByTagName('input')[0]
+ for (let i = 0; i < templateData.length; i++) {
+ if (templateData[i].id == template) {
+ templateDataLegpElm.value = templateData[i].value
+ templateObject.legp_searchActive(
+ templateData[i].value
+ )
+ break
+ }
+ }
+ templateDataLegpElm.addEventListener('input', () => {
+ for (let i = 0; i < templateData.length; i++) {
+ if (templateData[i].value === templateDataLegpElm.value) {
+ changeTemplate(templateData[i].id)
+ break
+ }
+ }
+ })
+ }
+
+ // 图框
+ let mapBorderData = [
+ {
+ name: ``,
+ value: '/custom/img/map-border1.svg',
+ key: 0,
+ },
+ {
+ name: ``,
+ value: '/custom/img/map-border2.svg',
+ key: 1,
+ },
+ {
+ name: ``,
+ value: '/custom/img/map-border3.svg',
+ key: 2,
+ },
+ {
+ name: ``,
+ value: '/custom/img/map-border4.svg',
+ key: 3,
+ },
+ {
+ name: ``,
+ value: '/custom/img/map-border5.svg',
+ key: 4,
+ },
+ {
+ name: ``,
+ value: '/custom/img/map-border6.svg',
+ key: 5,
+ },
+ ]
+ mapBorderObject = legp(
+ _DialogObject._element.content.getElementsByClassName(
+ 'map-border-box'
+ )[0],
+ '.map-border'
+ )
+ if (mapBorderObject) {
+ mapBorderObject.legp_search(mapBorderData)
+ iActiveElm = document.createElement('span')
+ iActiveElm.className = "icon icon-active"
+ iActiveElm.style.width = 'calc(100% - 40px)'
+ iActiveElm.style.height = 'calc(100% - 12px)'
+ iActiveElm.style.position = 'absolute'
+ iActiveElm.style.top = '6px'
+ iActiveElm.style.left = '10px'
+ iActiveElm.style.pointerEvents = 'none'
+ iActiveElm.style.backgroundImage = `url(${tools.getSourceRootPath() + border.url})`
+ iActiveElm.style.backgroundSize = 'auto 100%'
+ iActiveElm.style.backgroundRepeat = 'repeat-x'
+ _DialogObject._element.content
+ .getElementsByClassName('map-border')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm)
+ mapBorderDataLegpElm = _DialogObject._element.content
+ .getElementsByClassName('map-border')[0]
+ .getElementsByTagName('input')[0]
+ mapBorderDataLegpElm.style.fontSize = 0
+ mapBorderDataLegpElm.style.color = 'transparent'
+ for (let i = 0; i < mapBorderData.length; i++) {
+ if (mapBorderData[i].value == border.url) {
+ mapBorderDataLegpElm.value = mapBorderData[i].value
+ mapBorderObject.legp_searchActive(
+ mapBorderData[i].value
+ )
+ break
+ }
+ }
+ mapBorderDataLegpElm.addEventListener('input', () => {
+ for (let i = 0; i < mapBorderData.length; i++) {
+ if (mapBorderData[i].value === mapBorderDataLegpElm.value) {
+ iActiveElm.style.backgroundImage = `url(${tools.getSourceRootPath() + mapBorderData[i].value})`
+ changeMapBorder(mapBorderData[i].value)
+ break
+ }
+ }
+ })
+ }
+ }, 0);
+
+ function initData() {
+ if (isLoad) {
+ return
+ }
+ margin = margin * imgElm.width
+ triggerRange = imgElm.height / 140;
+
+ titleInputElm.value = title.text;
+ titleCheckboxElm.checked = title.show;
+ unitInputElm.value = data[1].text;
+ unitCheckboxElm.checked = data[1].show;
+ compassCheckboxElm.checked = data[2].show;
+ for (let i = 0; i < compassList.length; i++) {
+ if (compassList[i] === data[2].url) {
+ compassRadiosElm[i].checked = true
+ }
+ }
+ plottingScaleCheckboxElm.checked = plottingScale.show;
+
+ border.width = imgElm.width * border.width
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+
+ canvas.width = imgElm.width + (allmargin * 2)
+ canvas.height = imgElm.height + (allmargin * 2)
+
+ printDateCheckboxElm && (printDateCheckboxElm.checked = data[0].show);
+ if (jeDateObject) {
+ if (data[0].text) {
+ jeDateObject.setValue(data[0].text)
+ }
+ else {
+ jeDateObject.nowBtn && jeDateObject.nowBtn()
+ data[0].text = jeDateObject.getValue()
+ }
+ }
+
+ // plottingScale.x = imgElm.width * plottingScale.x;
+ // plottingScale.y = imgElm.height * plottingScale.y;
+
+
+ if (mapBorderObject && mapBorderDataLegpElm && iActiveElm) {
+ mapBorderDataLegpElm.value = border.url;
+ mapBorderObject.legp_searchActive(
+ border.url
+ )
+ iActiveElm.style.backgroundImage = `url(${tools.getSourceRootPath() + border.url})`
+ }
+ mapBorderCheckboxElm.checked = border.show;
+ borderImage = null
+ if (border && border.url) {
+ changeMapBorder(border.url)
+ }
+ }
+
+ function changeTemplate(v) {
+ template = v
+ templateData = getTemplateData(tools)
+ for (let i = 0; i < templateData.length; i++) {
+ if (templateData[i].id === template) {
+ title = templateData[i].title || title
+ margin = ((!templateData[i].margin && templateData[i].margin != 0) ? margin : templateData[i].margin)
+ data = templateData[i].data || data
+ border = templateData[i].border || border
+ border.color = border.color || '#000000'
+ plottingScale = templateData[i].plottingScale || plottingScale
+ break
+ }
+ }
+ initData()
+ updateCanvas()
+ }
+
+ function changeMapBorder(v) {
+ border.url = v
+ if (!border.url) {
+ return
+ }
+ borderImage = new Image();
+ borderImage.setAttribute('crossOrigin', 'anonymous');
+ if (border.url.endsWith('svg')) {
+ fetch(tools.getSourceRootPath() + border.url).then(async (response) => {
+ if (response.ok) {
+ svgText = await response.text();
+ changeMapBorderColor(border.color)
+ }
+ })
+ }
+ else {
+ borderImage.src = tools.getSourceRootPath() + border.url;
+ borderImage.onload = () => {
+ if (border.show) {
+ updateCanvas();
+ }
+ }
+ }
+ }
+
+ function changeMapBorderColor(color) {
+ border.color = color || '#000000'
+ new YJColorPicker({
+ el: contentElm.getElementsByClassName('border-color')[0],
+ size: 'mini', //颜色box类型
+ alpha: false, //是否开启透明度
+ defaultColor: border.color,
+ disabled: false, //是否禁止打开颜色选择器
+ openPickerAni: 'opacity', //打开颜色选择器动画
+ sure: color => {
+ changeMapBorderColor(color)
+ }, //点击确认按钮事件回调
+ clear: () => {
+ changeMapBorderColor('rgba(0,0,0,1)')
+ } //点击清空按钮事件回调
+ })
+ let currentSvg
+ let svgDataUrl
+ if (color) {
+ const colorRegex = /fill="[^"]+"/g;
+ currentSvg = svgText.replace(colorRegex, `fill="${color}"`);
+ }
+ else {
+ currentSvg = svgText
+ }
+ svgDataUrl = 'data:image/svg+xml;base64,' +
+ btoa(Array.from(new TextEncoder().encode(currentSvg),
+ (byte) => String.fromCharCode(byte)).join(''));
+ borderImage = new Image();
+ borderImage.setAttribute('crossOrigin', 'anonymous');
+ borderImage.src = svgDataUrl;
+ borderImage.onload = () => {
+ if (border.show) {
+ updateCanvas();
+ }
+ }
+ }
+
+
+
+ let isDragging = false;
+ let triggerRange = 5;
+ let selectedElement = null;
+ let isDraggingElement = false;
+ let isResizingElement = false;
+ let resizeCorner = null;
+ let startX, startY, startY2, startX2;
+ let elementOffsetX, elementOffsetY;
+ let elementWidth, elementHeight;
+ let currentFontSize; // 记录当前字体大小
+
+ function getCanvasMouseY(e) {
+ const rect = canvas.getBoundingClientRect();
+ const containerWidth = rect.width;
+ const containerHeight = rect.height;
+ const canvasWidth = canvas.width;
+ const canvasHeight = canvas.height;
+
+ let scale;
+ if (canvasWidth / canvasHeight > containerWidth / containerHeight) {
+ scale = containerWidth / canvasWidth;
+ } else {
+ scale = containerHeight / canvasHeight;
+ }
+
+ const scaledWidth = canvasWidth * scale;
+ const scaledHeight = canvasHeight * scale;
+ const offsetX = (containerWidth - scaledWidth) / 2;
+ const offsetY = (containerHeight - scaledHeight) / 2;
+
+ const clientY = e.clientY - rect.top - offsetY;
+ return clientY / scale;
+ }
+
+ function getCanvasMouseX(e) {
+ const rect = canvas.getBoundingClientRect();
+ const containerWidth = rect.width;
+ const containerHeight = rect.height;
+ const canvasWidth = canvas.width;
+ const canvasHeight = canvas.height;
+
+ let scale;
+ if (canvasWidth / canvasHeight > containerWidth / containerHeight) {
+ scale = containerWidth / canvasWidth;
+ } else {
+ scale = containerHeight / canvasHeight;
+ }
+
+ const scaledWidth = canvasWidth * scale;
+ const scaledHeight = canvasHeight * scale;
+ const offsetX = (containerWidth - scaledWidth) / 2;
+ const offsetY = (containerHeight - scaledHeight) / 2;
+
+ const clientX = e.clientX - rect.left - offsetX;
+ return clientX / scale;
+ }
+
+ function getCorners(element, allmargin) {
+ let elementX = element.x * imgElm.width + allmargin;
+ let elementY = element.y * imgElm.height + allmargin;
+ let elementWidth = element.width * imgElm.height;
+ let elementHeight = element.height * imgElm.height;
+ if ('text' in element) {
+ return [
+ { x: elementX, y: elementY - elementHeight },
+ { x: elementX + elementWidth, y: elementY - elementHeight },
+ { x: elementX, y: elementY },
+ { x: elementX + elementWidth, y: elementY }
+ ];
+ } else if ('url' in element) {
+ return [
+ { x: elementX, y: elementY },
+ { x: elementX + elementWidth, y: elementY },
+ { x: elementX, y: elementY + elementHeight },
+ { x: elementX + elementWidth, y: elementY + elementHeight }
+ ];
+ } else {
+ // 比例尺
+ return [
+ { x: elementX, y: elementY },
+ { x: elementX + elementWidth, y: elementY },
+ { x: elementX, y: elementY + elementHeight },
+ { x: elementX + elementWidth, y: elementY + elementHeight }
+ ]
+ }
+ }
+
+ function updateCanvas() {
+ if (isLoad) {
+ return
+ }
+
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+
+ canvas.width = imgElm.width + (allmargin * 2)
+ canvas.height = imgElm.height + (allmargin * 2)
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.rect(0, 0, canvas.width, canvas.height);
+ ctx.fillStyle = "#ffffff";
+ ctx.fill();
+ ctx.drawImage(imgElm, allmargin, allmargin, imgElm.width, imgElm.height);
+
+ // 标题内容
+ if (title.show) {
+ const text = title.text;
+ const fontSize = Math.max(5, (title.height * imgElm.height) * 0.5);
+ ctx.font = `${fontSize}px serif`;
+ // const textWidth = ctx.measureText(text).width;
+ ctx.fillStyle = title.bgColor || '#5d5d5d';
+
+ ctx.fillRect(allmargin, allmargin, canvas.width - (allmargin * 2), (title.height * imgElm.height));
+
+ ctx.fillStyle = title.color || 'white';
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+ ctx.fillText(text, canvas.width / 2, ((title.height * imgElm.height) / 2) + allmargin);
+ }
+
+ // 其他内容
+ for (let i = 0; i < data.length; i++) {
+ if (data[i].show) {
+ if ('text' in data[i]) {
+ ctx.font = `${imgElm.height * data[i].height}px serif`;
+ ctx.fillStyle = data[i].color || 'white';
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'bottom';
+ data[i].width = ctx.measureText(data[i].text).width / imgElm.height;
+ ctx.fillText(data[i].text, (imgElm.width * data[i].x) + allmargin, (imgElm.height * data[i].y) + allmargin);
+ if (data[i].isSelected) {
+ drawSelectionBorder(data[i]);
+ }
+ }
+ else if ('url' in data[i]) {
+ if (data[i].svg && data[i].svg.complete) {
+ ctx.drawImage(data[i].svg, (imgElm.width * data[i].x) + allmargin, (imgElm.height * data[i].y) + allmargin, imgElm.height * data[i].width, imgElm.height * data[i].height);
+ if (data[i].isSelected) {
+ drawSelectionBorder(data[i]);
+ }
+ }
+ else {
+ const svg = new Image();
+ svg.src = tools.getSourceRootPath() + data[i].url;
+ svg.onload = function () {
+ data[i].svg = svg
+ ctx.drawImage(svg, (imgElm.width * data[i].x) + allmargin, (imgElm.height * data[i].y) + allmargin, imgElm.height * data[i].width, imgElm.height * data[i].height);
+ if (data[i].isSelected) {
+ drawSelectionBorder(data[i]);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // 比例尺
+ if (plottingScale.show) {
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+ let plottingScaleX = imgElm.width * plottingScale.x + allmargin
+ let plottingScaleY = imgElm.height * plottingScale.y + allmargin
+ let unit = 'm'
+ // const fontSize = plottingScale.width * 0.12;
+ const fontSize = imgElm.width * 0.08 * 0.12;
+ let spacing = imgElm.width * 0.08 / plottingScale.cell;
+ let spacingDistance = Math.round(unitDistance * spacing);
+ let spacingDistanceString = spacingDistance + ''
+ if (spacingDistance < 10) {
+ }
+ else {
+ spacingDistance = Number(spacingDistanceString[0])
+ for (let i = 0; i < spacingDistanceString.length - 1; i++) {
+ spacingDistance = spacingDistance * 10
+ }
+ spacing = spacingDistance / unitDistance
+ }
+ plottingScale.width = spacing * plottingScale.cell;
+ plottingScale.height = plottingScale.width * 0.2;
+ if (spacingDistance >= 1000) {
+ unit = '㎞'
+ spacingDistance = Math.round(spacingDistance / 1000);
+ }
+ const scaleY = plottingScaleY;
+ ctx.beginPath();
+ ctx.moveTo(plottingScaleX, scaleY);
+ ctx.lineTo(plottingScaleX + plottingScale.width, scaleY);
+ ctx.strokeStyle = plottingScale.color;
+ ctx.lineWidth = plottingScale.width * 0.01;
+ ctx.stroke();
+
+ let tickX = 0
+ for (let i = 0; i <= plottingScale.cell; i++) {
+ tickX = plottingScaleX + i * spacing;
+ ctx.beginPath();
+ ctx.moveTo(tickX, scaleY - plottingScale.width * 0.1);
+ ctx.lineTo(tickX, scaleY);
+ ctx.strokeStyle = plottingScale.color;
+ ctx.lineWidth = plottingScale.width * 0.01;
+ ctx.stroke();
+
+ ctx.font = `${fontSize}px Arial`;
+ ctx.fillStyle = plottingScale.color;
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'bottom';
+ ctx.fillText(i * spacingDistance, tickX, scaleY - plottingScale.width * 0.1);
+ }
+
+ ctx.font = `${fontSize}px Arial`;
+ ctx.fillStyle = plottingScale.color;
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'bottom';
+ ctx.fillText(unit, tickX + (fontSize * 1.2), scaleY - plottingScale.width * 0.1);
+
+ if (plottingScale.isSelected) {
+ drawSelectionBorder(plottingScale);
+ }
+ }
+
+ // 边框
+ if (border.show && borderImage && borderImage.complete) {
+ // 绘制四个角(裁剪成45度角)
+ drawBorder(ctx, borderImage, margin, margin, border.width, 'top', 1);
+ drawBorder(ctx, borderImage, canvas.width - border.width - margin, margin, border.width, 'right', 1);
+ drawBorder(ctx, borderImage, canvas.width - border.width - margin, canvas.height - border.width - margin, border.width, 'bottom', 1);
+ drawBorder(ctx, borderImage, margin, canvas.height - border.width - margin, border.width, 'left', 1);
+ }
+ }
+
+ // 绘制边框
+ function drawBorder(ctx, img, x, y, size, position, isStart = 1) {
+ ctx.save();
+ ctx.translate(x + size / 2, y + size / 2);
+
+ // 根据位置设置旋转角度
+ switch (position) {
+ case 'right':
+ ctx.rotate(Math.PI / 2);
+ break;
+ case 'bottom':
+ ctx.rotate(Math.PI);
+ break;
+ case 'left':
+ ctx.rotate(3 * Math.PI / 2);
+ break;
+ }
+ // 创建45度角的裁剪路径
+ ctx.beginPath();
+ ctx.moveTo((-size * isStart) / 2, -size / 2);
+ if (position === 'top' || position === 'bottom') {
+ ctx.lineTo(canvas.width - (margin * 2) - (size / 2), -size / 2);
+ ctx.lineTo(canvas.width - (margin + size) * 2 + (size / 2), size / 2);
+ }
+ else {
+ ctx.lineTo(canvas.height - (margin * 2) - (size / 2), -size / 2);
+ ctx.lineTo(canvas.height - (margin + size) * 2 + (size / 2), size / 2);
+ }
+ ctx.lineTo((size * isStart) / 2, size / 2);
+ ctx.closePath();
+ ctx.clip();
+
+ let imgWidth = img.width / img.height * size
+
+ // 绘制图片
+ ctx.drawImage(img, -size / 2, -size / 2, imgWidth, size);
+
+ let count;
+ if (position === 'top' || position === 'bottom') {
+ count = Math.ceil((canvas.width - (margin * 2) - (border.width * 2)) / border.width);
+ } else {
+ count = Math.ceil((canvas.height - (margin * 2) - (border.width * 2)) / border.width);
+ }
+ count++
+
+ for (let i = 1; i <= count; i++) {
+ ctx.drawImage(img, -size / 2 + imgWidth * i, -size / 2, imgWidth, size);
+ }
+
+ ctx.restore();
+ }
+
+ function drawSelectionBorder(element) {
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+ const cornerRadius = canvas.height * 0.005;
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = canvas.height * 0.002;
+ if ('text' in element) {
+ ctx.strokeRect((imgElm.width * element.x + allmargin), (imgElm.height * element.y + allmargin) - (imgElm.height * element.height), (imgElm.height * element.width), (imgElm.height * element.height));
+ } else if ('url' in element) {
+ ctx.strokeRect((imgElm.width * element.x + allmargin), (imgElm.height * element.y + allmargin), (imgElm.height * element.width), (imgElm.height * element.height));
+ }
+ else if (element === plottingScale) {
+ ctx.strokeRect((imgElm.width * element.x + allmargin) - (plottingScale.width * 0.2), (imgElm.height * element.y + allmargin) - element.height - (plottingScale.height * 0.5), element.width + (plottingScale.width * 0.6), element.height + (plottingScale.height));
+ return
+ }
+ const corners = getCorners(element, allmargin);
+ ctx.fillStyle = 'red';
+ corners.forEach(corner => {
+ ctx.beginPath();
+ ctx.arc(corner.x, corner.y, cornerRadius, 0, 2 * Math.PI);
+ ctx.fill();
+ });
+ }
+
+ canvas.addEventListener('mousedown', function (e) {
+ const x = getCanvasMouseX(e);
+ const y = getCanvasMouseY(e);
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+
+ if (title.show) {
+ // 检查是否点击了标题编辑触发区域
+ if (y >= ((title.height * imgElm.height) + allmargin) - triggerRange && y <= ((title.height * imgElm.height) + allmargin) + triggerRange) {
+ isDragging = true;
+
+ // 先将所有元素的选中状态置为 false
+ for (let i = 0; i < data.length; i++) {
+ data[i].isSelected = false;
+ }
+ selectedElement = null;
+ isDraggingElement = false;
+ isResizingElement = false;
+ resizeCorner = null;
+ return
+ }
+ }
+
+
+ // 检查是否点击了边框角上的小圆点
+ if (selectedElement && selectedElement !== plottingScale) {
+ const cornerRadius = canvas.height * 0.005;
+ const corners = getCorners(selectedElement, allmargin);
+ corners.forEach((corner, index) => {
+ if (x >= corner.x - cornerRadius && x <= corner.x + cornerRadius &&
+ y >= corner.y - cornerRadius && y <= corner.y + cornerRadius) {
+ isResizingElement = true;
+ isDraggingElement = false;
+ resizeCorner = index;
+ startX = x;
+ startY = y;
+ elementWidth = (selectedElement.width * imgElm.height);
+ elementHeight = (selectedElement.height * imgElm.height);
+ if ('text' in selectedElement) {
+ elementWidth = (selectedElement.width * imgElm.height);
+ currentFontSize = selectedElement.height;
+ }
+ }
+ });
+ }
+ if (isResizingElement) {
+ return
+ }
+
+ // 先将所有元素的选中状态置为 false
+ for (let i = 0; i < data.length; i++) {
+ data[i].isSelected = false;
+ }
+ plottingScale.isSelected = false;
+ selectedElement = null;
+ isDraggingElement = false;
+ isResizingElement = false;
+ resizeCorner = null;
+
+ for (let i = data.length - 1; i >= 0; i--) {
+ if (data[i].show) {
+ if ('text' in data[i]) {
+ if (x >= (imgElm.width * data[i].x) + allmargin && x <= (imgElm.width * data[i].x) + allmargin + (imgElm.height * data[i].width) &&
+ y >= (imgElm.height * data[i].y) + allmargin - (imgElm.height * data[i].height) && y <= (imgElm.height * data[i].y) + allmargin) {
+ selectedElement = data[i];
+ data[i].isSelected = true;
+ isDraggingElement = true;
+ startX = x;
+ startY = y;
+ startY2 = (imgElm.height * data[i].y) - (imgElm.height * data[i].height)
+ startX2 = (imgElm.width * data[i].x) + (imgElm.height * data[i].width)
+ elementOffsetX = (imgElm.width * data[i].x) + allmargin;
+ elementOffsetY = (imgElm.height * data[i].y) + allmargin;
+ updateCanvas(); // 点击时重新绘制画布以显示边框
+ break;
+ }
+ }
+ if ('url' in data[i]) {
+ if (data[i].svg && data[i].svg.complete && data[i].show) {
+ if (x >= (imgElm.width * data[i].x) + allmargin && x <= (imgElm.width * data[i].x) + allmargin + (imgElm.height * data[i].width) &&
+ y >= (imgElm.height * data[i].y) + allmargin && y <= (imgElm.height * data[i].y) + allmargin + (imgElm.height * data[i].height)) {
+ selectedElement = data[i];
+ data[i].isSelected = true;
+ isDraggingElement = true;
+ startX = x;
+ startY = y;
+ startY2 = (imgElm.height * data[i].y) + (imgElm.height * data[i].height)
+ startX2 = (imgElm.width * data[i].x) + (imgElm.height * data[i].width);
+ elementOffsetX = (imgElm.width * data[i].x) + allmargin;
+ elementOffsetY = (imgElm.height * data[i].y) + allmargin;
+ updateCanvas(); // 点击时重新绘制画布以显示边框
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (plottingScale.show) {
+ if (x >= (imgElm.width * plottingScale.x + allmargin) - (plottingScale.width * 0.2) && x <= (imgElm.width * plottingScale.x + allmargin) - (plottingScale.width * 0.2) + plottingScale.width + (plottingScale.width * 0.6) &&
+ y >= (imgElm.height * plottingScale.y + allmargin) - plottingScale.height - (plottingScale.height * 0.5) && y <= (imgElm.height * plottingScale.y + allmargin) - (plottingScale.height * 0.5) + (plottingScale.height)) {
+ selectedElement = plottingScale;
+ plottingScale.isSelected = true;
+ isDraggingElement = true;
+ startX = x;
+ startY = y;
+ startY2 = (imgElm.height * plottingScale.y + allmargin) + plottingScale.height;
+ startX2 = (imgElm.width * plottingScale.x + allmargin) + plottingScale.width;
+ elementOffsetX = (imgElm.width * plottingScale.x + allmargin);
+ elementOffsetY = imgElm.height * plottingScale.y + allmargin;
+ updateCanvas(); // 点击时重新绘制画布以显示边框
+ }
+ }
+
+ // 如果点击在内容以外,重新绘制画布以移除边框
+ if (!selectedElement) {
+ updateCanvas();
+ }
+ });
+
+ canvas.addEventListener('mousemove', function (e) {
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+ const x = getCanvasMouseX(e);
+ const y = getCanvasMouseY(e);
+ if (x < 0 || y < 0 || x > canvas.width || y > canvas.height) {
+ return
+ }
+
+ if (title.show) {
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+ if (y >= ((title.height * imgElm.height) + allmargin) - triggerRange && y <= ((title.height * imgElm.height) + allmargin) + triggerRange) {
+ canvas.style.cursor = 'n-resize';
+ } else {
+ canvas.style.cursor = 'default';
+ }
+
+ if (isDragging) {
+ title.height = Math.min(Math.max(y - allmargin, 30) / imgElm.height, 1);
+ updateCanvas();
+ }
+ }
+
+
+ if (isDraggingElement) {
+ const dx = x - startX;
+ const dy = y - startY;
+ selectedElement.x = ((elementOffsetX + dx) - allmargin) / imgElm.width;
+ selectedElement.y = ((elementOffsetY + dy) - allmargin) / imgElm.height;
+ updateCanvas();
+ }
+
+ if (isResizingElement) {
+ const dx = x - startX;
+ const dy = y - startY;
+ let scaleFactor;
+
+ switch (resizeCorner) {
+ case 0: // 左上角
+ if ('text' in selectedElement) {
+ scaleFactor = (elementWidth - dx) / elementWidth;
+ selectedElement.height = Math.max((10 / imgElm.height), currentFontSize * scaleFactor)
+ selectedElement.x = (startX2 - (selectedElement.width * imgElm.height)) / imgElm.width;
+ }
+ else if ('url' in selectedElement) {
+ selectedElement.x = (startX2 - (selectedElement.width * imgElm.height)) / imgElm.width;
+ selectedElement.y = (startY2 - (selectedElement.height * imgElm.height)) / imgElm.height;
+ selectedElement.width = Math.max(10, elementWidth - dx) / imgElm.height;
+ selectedElement.height = Math.max(10, elementHeight - dy) / imgElm.height;
+ }
+ break;
+ case 1: // 右上角
+ if ('text' in selectedElement) {
+ scaleFactor = (elementWidth + dx) / elementWidth;
+ selectedElement.height = Math.max((10 / imgElm.height), currentFontSize * scaleFactor);
+ }
+ else if ('url' in selectedElement) {
+ selectedElement.width = Math.max(10, elementWidth + dx) / imgElm.height;
+ selectedElement.height = Math.max(10, elementHeight - dy) / imgElm.height;
+ selectedElement.y = (startY2 - (selectedElement.height * imgElm.height)) / imgElm.height;
+ }
+ break;
+ case 2: // 左下角
+ if ('text' in selectedElement) {
+ scaleFactor = (elementWidth - dx) / elementWidth;
+ selectedElement.height = Math.max((10 / imgElm.height), currentFontSize * scaleFactor);
+ selectedElement.x = (startX2 - (selectedElement.width * imgElm.height)) / imgElm.width;
+ selectedElement.y = (startY2 + (selectedElement.height * imgElm.height)) / imgElm.height;
+ }
+ else if ('url' in selectedElement) {
+ selectedElement.x = (startX2 - (selectedElement.width * imgElm.height)) / imgElm.width;
+ selectedElement.width = Math.max(10, elementWidth - dx) / imgElm.height;
+ selectedElement.height = Math.max(10, elementHeight + dy) / imgElm.height;
+ }
+ break;
+ case 3: // 右下角
+ if ('text' in selectedElement) {
+ scaleFactor = (elementWidth + dx) / elementWidth;
+ selectedElement.height = Math.max((10 / imgElm.height), currentFontSize * scaleFactor);
+ selectedElement.y = (startY2 + (selectedElement.height * imgElm.height)) / imgElm.height;
+ }
+ else if ('url' in selectedElement) {
+ selectedElement.width = Math.max(10, elementWidth + dx) / imgElm.height;
+ selectedElement.height = Math.max(10, elementHeight + dy) / imgElm.height;
+ }
+ break;
+ }
+
+ updateCanvas();
+ }
+ });
+
+ document.addEventListener('mouseup', function () {
+ isDragging = false;
+ let allmargin = margin
+ if (border.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border.width
+ }
+ for (let i = 0; i < data.length; i++) {
+ if (data[i].show && data[i].isSelected) {
+ startY2 = (imgElm.height * data[i].y) - (imgElm.height * data[i].height)
+ startX2 = (imgElm.width * data[i].x) + (imgElm.height * data[i].width)
+ if ('url' in data[i]) {
+ startY2 = (imgElm.height * data[i].y) + (imgElm.height * data[i].height)
+ startX2 = (imgElm.width * data[i].x) + (imgElm.height * data[i].width);
+ }
+ elementOffsetX = data[i].x;
+ elementOffsetY = data[i].y;
+ }
+ }
+ if (plottingScale.show && plottingScale.isSelected) {
+ startY2 = plottingScale.y + plottingScale.height
+ startX2 = plottingScale.x + plottingScale.width
+ elementOffsetX = plottingScale.x;
+ elementOffsetY = plottingScale.y;
+ }
+ isDraggingElement = false;
+ isResizingElement = false;
+ resizeCorner = null;
+ });
+
+ function getPlottingScale() {
+ if (!rectangle) {
+ return
+ }
+ let westLng = Cesium.Math.toDegrees(rectangle.west)
+ let eastLng = Cesium.Math.toDegrees(rectangle.east)
+ let northLat = Cesium.Math.toDegrees(rectangle.north)
+ let southLat = Cesium.Math.toDegrees(rectangle.south)
+
+ let from = turf.point([westLng, northLat]);
+ let to = turf.point([eastLng, northLat]);
+ let distance = turf.distance(from, to, { units: 'kilometers' });
+
+ unitDistance = distance * 1000 / imgElm.width;
+ }
+
+ function getDateTimeString() {
+ // 创建一个表示当前时间的 Date 对象
+ const now = new Date();
+ // 获取年份
+ const year = now.getFullYear();
+ // 获取月份(从 0 开始,所以要加 1),并将其转换为两位字符串,不足两位在前面补零
+ const month = String(now.getMonth() + 1).padStart(2, '0');
+ // 获取日期,并将其转换为两位字符串,不足两位在前面补零
+ const day = String(now.getDate()).padStart(2, '0');
+ // 获取小时,并将其转换为两位字符串,不足两位在前面补零
+ const hours = String(now.getHours()).padStart(2, '0');
+ // 获取分钟,并将其转换为两位字符串,不足两位在前面补零
+ const minutes = String(now.getMinutes()).padStart(2, '0');
+ // 获取秒,并将其转换为两位字符串,不足两位在前面补零
+ const seconds = String(now.getSeconds()).padStart(2, '0');
+ // 获取毫秒,并将其转换为三位字符串,不足三位在前面补零
+ const milliseconds = String(now.getMilliseconds()).padStart(3, '0');
+ // 将年、月、日、时、分、秒、毫秒拼接成所需的字符串
+ return `${year}${month}${day}${hours}${minutes}${seconds}${milliseconds}`;
+ }
+
+ function exportMap() {
+ let unitDistance2
+ let canvas2 = document.createElement('canvas');
+ let ctx2 = canvas2.getContext('2d');
+ let imgElm2 = new Image();
+ imgElm2.src = originalImg
+ imgElm2.onload = function () {
+ if (isLoad) {
+ return
+ }
+ let title2 = { ...title }
+ let data2 = JSON.parse(JSON.stringify(data))
+ let plottingScale2 = { ...plottingScale }
+ let border2 = { ...border }
+ border2.width = border.width / imgElm.width * imgElm2.width
+
+ let margin2 = margin / imgElm.width * imgElm2.width;
+ let allmargin = margin2
+ if (border2.show && borderImage && borderImage.complete) {
+ allmargin = allmargin + border2.width
+ }
+
+ canvas2.width = imgElm2.width + (allmargin * 2);
+ canvas2.height = imgElm2.height + (allmargin * 2);
+
+ ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
+ ctx2.rect(0, 0, canvas2.width, canvas2.height);
+ ctx2.fillStyle = "#ffffff";
+ ctx2.fill();
+ ctx2.drawImage(imgElm2, allmargin, allmargin, imgElm2.width, imgElm2.height);
+ // 标题内容
+ if (title2.show) {
+ const text = title2.text;
+ const fontSize = Math.max(5, (title2.height * imgElm2.height) * 0.5);
+ ctx2.font = `${fontSize}px serif`;
+ ctx2.fillStyle = title2.bgColor || '#5d5d5d';
+
+ ctx2.fillRect(allmargin, allmargin, canvas2.width - (allmargin * 2), (title2.height * imgElm2.height));
+
+ ctx2.fillStyle = title2.color || 'white';
+ ctx2.textAlign = 'center';
+ ctx2.textBaseline = 'middle';
+ ctx2.fillText(text, canvas2.width / 2, ((title2.height * imgElm2.height) / 2) + allmargin);
+ }
+
+ // 其他内容
+ for (let i = 0; i < data2.length; i++) {
+ if (data2[i].show) {
+ if ('text' in data2[i]) {
+ ctx2.font = `${imgElm2.height * data2[i].height}px serif`;
+ ctx2.fillStyle = data2[i].color || 'white';
+ ctx2.textAlign = 'left';
+ ctx2.textBaseline = 'bottom';
+ data2[i].width = ctx2.measureText(data2[i].text).width / imgElm2.height;
+ ctx2.fillText(data2[i].text, (imgElm2.width * data2[i].x) + allmargin, (imgElm2.height * data2[i].y) + allmargin);
+ }
+ else if ('url' in data2[i]) {
+ if (data[i].svg && data[i].svg.complete) {
+ ctx2.drawImage(data[i].svg, (imgElm2.width * data2[i].x) + allmargin, (imgElm2.height * data2[i].y) + allmargin, imgElm2.height * data2[i].width, imgElm2.height * data2[i].height);
+ }
+ else {
+ const svg = new Image();
+ svg.src = tools.getSourceRootPath() + data2[i].url;
+ svg.onload = function () {
+ data2[i].svg = svg
+ ctx2.drawImage(svg, (imgElm2.width * data2[i].x) + allmargin, (imgElm2.height * data2[i].y) + allmargin, imgElm2.height * data2[i].width, imgElm2.height * data2[i].height)
+ }
+ }
+ }
+ }
+ }
+
+ // 比例尺
+ if (plottingScale2.show) {
+ getPlottingScale()
+ let plottingScale2X = imgElm2.width * plottingScale2.x + allmargin
+ let plottingScale2Y = imgElm2.height * plottingScale2.y + allmargin
+ let unit = 'm'
+ // const fontSize = plottingScale2.width * 0.12;
+ const fontSize = imgElm2.width * 0.08 * 0.12;
+ let spacing = imgElm2.width * 0.08 / plottingScale2.cell;
+ let spacingDistance = Math.round(unitDistance2 * spacing);
+ let spacingDistanceString = spacingDistance + ''
+ if (spacingDistance < 10) {
+ }
+ else {
+ spacingDistance = Number(spacingDistanceString[0])
+ for (let i = 0; i < spacingDistanceString.length - 1; i++) {
+ spacingDistance = spacingDistance * 10
+ }
+ spacing = spacingDistance / unitDistance2
+ }
+ plottingScale2.width = spacing * plottingScale2.cell;
+ plottingScale2.height = plottingScale2.width * 0.2;
+ if (spacingDistance >= 1000) {
+ unit = '㎞'
+ spacingDistance = Math.round(spacingDistance / 1000);
+ }
+ const scaleY = plottingScale2Y;
+ ctx2.beginPath();
+ ctx2.moveTo(plottingScale2X, scaleY);
+ ctx2.lineTo(plottingScale2X + plottingScale2.width, scaleY);
+ ctx2.strokeStyle = plottingScale2.color;
+ ctx2.lineWidth = plottingScale2.width * 0.01;
+ ctx2.stroke();
+
+ let tickX = 0
+ for (let i = 0; i <= plottingScale2.cell; i++) {
+ tickX = plottingScale2X + i * spacing;
+ ctx2.beginPath();
+ ctx2.moveTo(tickX, scaleY - plottingScale2.width * 0.1);
+ ctx2.lineTo(tickX, scaleY);
+ ctx2.strokeStyle = plottingScale2.color;
+ ctx2.lineWidth = plottingScale2.width * 0.01;
+ ctx2.stroke();
+
+ ctx2.font = `${fontSize}px Arial`;
+ ctx2.fillStyle = plottingScale2.color;
+ ctx2.textAlign = 'center';
+ ctx2.textBaseline = 'bottom';
+ ctx2.fillText(i * spacingDistance, tickX, scaleY - plottingScale2.width * 0.1);
+ }
+
+ ctx2.font = `${fontSize}px Arial`;
+ ctx2.fillStyle = plottingScale2.color;
+ ctx2.textAlign = 'left';
+ ctx2.textBaseline = 'bottom';
+ ctx2.fillText(unit, tickX + (fontSize * 1.2), scaleY - plottingScale2.width * 0.1);
+ }
+
+ // 边框
+ if (border2.show && borderImage && borderImage.complete) {
+ // 绘制四个角(裁剪成45度角)
+ drawBorder2(ctx2, borderImage, margin2, margin2, border2.width, 'top', 1);
+ drawBorder2(ctx2, borderImage, canvas2.width - border2.width - margin2, margin2, border2.width, 'right', 1);
+ drawBorder2(ctx2, borderImage, canvas2.width - border2.width - margin2, canvas2.height - border2.width - margin2, border2.width, 'bottom', 1);
+ drawBorder2(ctx2, borderImage, margin2, canvas2.height - border2.width - margin2, border2.width, 'left', 1);
+ }
+
+ function getPlottingScale() {
+ if (!rectangle) {
+ return
+ }
+ let westLng = Cesium.Math.toDegrees(rectangle.west)
+ let eastLng = Cesium.Math.toDegrees(rectangle.east)
+ let northLat = Cesium.Math.toDegrees(rectangle.north)
+ let southLat = Cesium.Math.toDegrees(rectangle.south)
+
+ let from = turf.point([westLng, northLat]);
+ let to = turf.point([eastLng, northLat]);
+ let distance = turf.distance(from, to, { units: 'kilometers' });
+
+ unitDistance2 = distance * 1000 / imgElm2.width;
+ }
+
+ // 绘制边框
+ function drawBorder2(ctx2, img, x, y, size, position, isStart = 1) {
+ ctx2.save();
+ ctx2.translate(x + size / 2, y + size / 2);
+
+ // 根据位置设置旋转角度
+ switch (position) {
+ case 'right':
+ ctx2.rotate(Math.PI / 2);
+ break;
+ case 'bottom':
+ ctx2.rotate(Math.PI);
+ break;
+ case 'left':
+ ctx2.rotate(3 * Math.PI / 2);
+ break;
+ }
+ // 创建45度角的裁剪路径
+ ctx2.beginPath();
+ ctx2.moveTo((-size * isStart) / 2, -size / 2);
+ if (position === 'top' || position === 'bottom') {
+ ctx2.lineTo(canvas2.width - (margin2 * 2) - (size / 2), -size / 2);
+ ctx2.lineTo(canvas2.width - (margin2 + size) * 2 + (size / 2), size / 2);
+ }
+ else {
+ ctx2.lineTo(canvas2.height - (margin2 * 2) - (size / 2), -size / 2);
+ ctx2.lineTo(canvas2.height - (margin2 + size) * 2 + (size / 2), size / 2);
+ }
+ ctx2.lineTo((size * isStart) / 2, size / 2);
+ ctx2.closePath();
+ ctx2.clip();
+
+ let imgWidth = img.width / img.height * size
+
+ // 绘制图片
+ ctx2.drawImage(img, -size / 2, -size / 2, imgWidth, size);
+
+ let count;
+ if (position === 'top' || position === 'bottom') {
+ count = Math.ceil((canvas2.width - (margin2 * 2) - (border2.width * 2)) / border2.width);
+ } else {
+ count = Math.ceil((canvas2.height - (margin2 * 2) - (border2.width * 2)) / border2.width);
+ }
+ count++
+
+ for (let i = 1; i <= count; i++) {
+ ctx2.drawImage(img, -size / 2 + imgWidth * i, -size / 2, imgWidth, size);
+ }
+
+ ctx2.restore();
+ }
+
+ // let dataURL = canvas2.toDataURL('image/jpeg', 0.95)
+ // let downloadElement = document.createElement('a');
+ // downloadElement.href = dataURL;
+ // downloadElement.download = `高清出图-${getDateTimeString()}.jpg`;
+ // document.body.appendChild(downloadElement);
+ // downloadElement.click();
+ // document.body.removeChild(downloadElement);
+ // console.log('dataURL', dataURL)
+ // URL.revokeObjectURL(dataURL);
+
+ // 在释放资源后执行回调
+
+ canvas2.toBlob(function (blob) {
+ const url = URL.createObjectURL(blob);
+ let downloadElement = document.createElement('a');
+ downloadElement.href = url;
+ downloadElement.download = `高清出图-${getDateTimeString()}.png`;
+ document.body.appendChild(downloadElement);
+ downloadElement.click();
+ document.body.removeChild(downloadElement);
+ }, 'image/png', 0.95);
+ exporting = false;
+ exportBtn.innerHTML = '打印';
+ // canvas2.toBlob(function (blob) {
+ // let imgBlobData = URL.createObjectURL(blob);
+ // let downloadElement = document.createElement('a');
+ // downloadElement.href = imgBlobData;
+ // downloadElement.download = `高清出图-${getDateTimeString()}.png`;
+ // document.body.appendChild(downloadElement);
+ // downloadElement.click();
+ // document.body.removeChild(downloadElement);
+ // URL.revokeObjectURL(imgBlobData);
+
+ // // 在释放资源后执行回调
+ // exporting = false;
+ // exportBtn.innerHTML = '打印';
+ // });
+ }
+ }
+
+}
+
+export default MapPrint
diff --git a/src/renderer/src/icons/svg/inundationAnalysis.svg b/src/renderer/src/icons/svg/inundationAnalysis.svg
new file mode 100644
index 0000000..4c2abd0
--- /dev/null
+++ b/src/renderer/src/icons/svg/inundationAnalysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/jct.svg b/src/renderer/src/icons/svg/jct.svg
new file mode 100644
index 0000000..ca9ef48
--- /dev/null
+++ b/src/renderer/src/icons/svg/jct.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/json.svg b/src/renderer/src/icons/svg/json.svg
new file mode 100644
index 0000000..ce4a703
--- /dev/null
+++ b/src/renderer/src/icons/svg/json.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/kenAnalysis.svg b/src/renderer/src/icons/svg/kenAnalysis.svg
new file mode 100644
index 0000000..87abb5e
--- /dev/null
+++ b/src/renderer/src/icons/svg/kenAnalysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/kml.svg b/src/renderer/src/icons/svg/kml.svg
new file mode 100644
index 0000000..b8fded1
--- /dev/null
+++ b/src/renderer/src/icons/svg/kml.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/kmz.svg b/src/renderer/src/icons/svg/kmz.svg
new file mode 100644
index 0000000..b8fded1
--- /dev/null
+++ b/src/renderer/src/icons/svg/kmz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/layer.svg b/src/renderer/src/icons/svg/layer.svg
new file mode 100644
index 0000000..ba44d46
--- /dev/null
+++ b/src/renderer/src/icons/svg/layer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/layerLower.svg b/src/renderer/src/icons/svg/layerLower.svg
new file mode 100644
index 0000000..ece0255
--- /dev/null
+++ b/src/renderer/src/icons/svg/layerLower.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/layerRaise.svg b/src/renderer/src/icons/svg/layerRaise.svg
new file mode 100644
index 0000000..c6c0c30
--- /dev/null
+++ b/src/renderer/src/icons/svg/layerRaise.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/layerToBottom.svg b/src/renderer/src/icons/svg/layerToBottom.svg
new file mode 100644
index 0000000..5ccd1d4
--- /dev/null
+++ b/src/renderer/src/icons/svg/layerToBottom.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/renderer/src/icons/svg/layerToTop.svg b/src/renderer/src/icons/svg/layerToTop.svg
new file mode 100644
index 0000000..4ea3de1
--- /dev/null
+++ b/src/renderer/src/icons/svg/layerToTop.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/leading_in.svg b/src/renderer/src/icons/svg/leading_in.svg
new file mode 100644
index 0000000..9bddf1b
--- /dev/null
+++ b/src/renderer/src/icons/svg/leading_in.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/leading_out.svg b/src/renderer/src/icons/svg/leading_out.svg
new file mode 100644
index 0000000..85cb229
--- /dev/null
+++ b/src/renderer/src/icons/svg/leading_out.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/line.svg b/src/renderer/src/icons/svg/line.svg
new file mode 100644
index 0000000..76cdc16
--- /dev/null
+++ b/src/renderer/src/icons/svg/line.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/linkImage.svg b/src/renderer/src/icons/svg/linkImage.svg
new file mode 100644
index 0000000..372b1f0
--- /dev/null
+++ b/src/renderer/src/icons/svg/linkImage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/loadTemp.svg b/src/renderer/src/icons/svg/loadTemp.svg
new file mode 100644
index 0000000..51cbd5d
--- /dev/null
+++ b/src/renderer/src/icons/svg/loadTemp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/location.svg b/src/renderer/src/icons/svg/location.svg
new file mode 100644
index 0000000..ebc7e34
--- /dev/null
+++ b/src/renderer/src/icons/svg/location.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/lopeDistanceMeasures.svg b/src/renderer/src/icons/svg/lopeDistanceMeasures.svg
new file mode 100644
index 0000000..e50443f
--- /dev/null
+++ b/src/renderer/src/icons/svg/lopeDistanceMeasures.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/map-border1.svg b/src/renderer/src/icons/svg/map-border1.svg
new file mode 100644
index 0000000..1d226f6
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border1.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/map-border2.svg b/src/renderer/src/icons/svg/map-border2.svg
new file mode 100644
index 0000000..b727f98
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border2.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/map-border3.svg b/src/renderer/src/icons/svg/map-border3.svg
new file mode 100644
index 0000000..aa380bd
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border3.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/map-border4.svg b/src/renderer/src/icons/svg/map-border4.svg
new file mode 100644
index 0000000..e2e38f6
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border4.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/map-border5.svg b/src/renderer/src/icons/svg/map-border5.svg
new file mode 100644
index 0000000..02de935
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border5.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/map-border6.svg b/src/renderer/src/icons/svg/map-border6.svg
new file mode 100644
index 0000000..630776d
--- /dev/null
+++ b/src/renderer/src/icons/svg/map-border6.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/mbtiles.svg b/src/renderer/src/icons/svg/mbtiles.svg
new file mode 100644
index 0000000..849baa7
--- /dev/null
+++ b/src/renderer/src/icons/svg/mbtiles.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/measure.svg b/src/renderer/src/icons/svg/measure.svg
new file mode 100644
index 0000000..8df9bac
--- /dev/null
+++ b/src/renderer/src/icons/svg/measure.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/mif.svg b/src/renderer/src/icons/svg/mif.svg
new file mode 100644
index 0000000..0dd5c16
--- /dev/null
+++ b/src/renderer/src/icons/svg/mif.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/military.svg b/src/renderer/src/icons/svg/military.svg
new file mode 100644
index 0000000..63e761f
--- /dev/null
+++ b/src/renderer/src/icons/svg/military.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/model.svg b/src/renderer/src/icons/svg/model.svg
new file mode 100644
index 0000000..7db3edf
--- /dev/null
+++ b/src/renderer/src/icons/svg/model.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/more.svg b/src/renderer/src/icons/svg/more.svg
new file mode 100644
index 0000000..b0e45db
--- /dev/null
+++ b/src/renderer/src/icons/svg/more.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/mouseLocation.svg b/src/renderer/src/icons/svg/mouseLocation.svg
new file mode 100644
index 0000000..4ff086f
--- /dev/null
+++ b/src/renderer/src/icons/svg/mouseLocation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/nightVision.svg b/src/renderer/src/icons/svg/nightVision.svg
new file mode 100644
index 0000000..e03e58f
--- /dev/null
+++ b/src/renderer/src/icons/svg/nightVision.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/out_login.svg b/src/renderer/src/icons/svg/out_login.svg
new file mode 100644
index 0000000..461735d
--- /dev/null
+++ b/src/renderer/src/icons/svg/out_login.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/pak.svg b/src/renderer/src/icons/svg/pak.svg
new file mode 100644
index 0000000..217c30c
--- /dev/null
+++ b/src/renderer/src/icons/svg/pak.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/panel.svg b/src/renderer/src/icons/svg/panel.svg
new file mode 100644
index 0000000..39c214a
--- /dev/null
+++ b/src/renderer/src/icons/svg/panel.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/path.svg b/src/renderer/src/icons/svg/path.svg
new file mode 100644
index 0000000..bf21173
--- /dev/null
+++ b/src/renderer/src/icons/svg/path.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/pdf.svg b/src/renderer/src/icons/svg/pdf.svg
new file mode 100644
index 0000000..38c463d
--- /dev/null
+++ b/src/renderer/src/icons/svg/pdf.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/renderer/src/icons/svg/peopleRoomLink.svg b/src/renderer/src/icons/svg/peopleRoomLink.svg
new file mode 100644
index 0000000..280bc5a
--- /dev/null
+++ b/src/renderer/src/icons/svg/peopleRoomLink.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/perspective.svg b/src/renderer/src/icons/svg/perspective.svg
new file mode 100644
index 0000000..003dc09
--- /dev/null
+++ b/src/renderer/src/icons/svg/perspective.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/renderer/src/icons/svg/pictureLocation.svg b/src/renderer/src/icons/svg/pictureLocation.svg
new file mode 100644
index 0000000..032f566
--- /dev/null
+++ b/src/renderer/src/icons/svg/pictureLocation.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/renderer/src/icons/svg/pincerArrow.svg b/src/renderer/src/icons/svg/pincerArrow.svg
new file mode 100644
index 0000000..f46d8d8
--- /dev/null
+++ b/src/renderer/src/icons/svg/pincerArrow.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/pitchImport.svg b/src/renderer/src/icons/svg/pitchImport.svg
new file mode 100644
index 0000000..eebca00
--- /dev/null
+++ b/src/renderer/src/icons/svg/pitchImport.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/playTs.svg b/src/renderer/src/icons/svg/playTs.svg
new file mode 100644
index 0000000..b505323
--- /dev/null
+++ b/src/renderer/src/icons/svg/playTs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/point.svg b/src/renderer/src/icons/svg/point.svg
new file mode 100644
index 0000000..932a40f
--- /dev/null
+++ b/src/renderer/src/icons/svg/point.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/polygonStatistics.svg b/src/renderer/src/icons/svg/polygonStatistics.svg
new file mode 100644
index 0000000..95ce6d0
--- /dev/null
+++ b/src/renderer/src/icons/svg/polygonStatistics.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/polyhedronObject.svg b/src/renderer/src/icons/svg/polyhedronObject.svg
new file mode 100644
index 0000000..f9a6c4c
--- /dev/null
+++ b/src/renderer/src/icons/svg/polyhedronObject.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/posiFly.svg b/src/renderer/src/icons/svg/posiFly.svg
new file mode 100644
index 0000000..5011eaf
--- /dev/null
+++ b/src/renderer/src/icons/svg/posiFly.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/pressModel.svg b/src/renderer/src/icons/svg/pressModel.svg
new file mode 100644
index 0000000..0c8736b
--- /dev/null
+++ b/src/renderer/src/icons/svg/pressModel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/profileAnalysis.svg b/src/renderer/src/icons/svg/profileAnalysis.svg
new file mode 100644
index 0000000..2685e8f
--- /dev/null
+++ b/src/renderer/src/icons/svg/profileAnalysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/projConvert.svg b/src/renderer/src/icons/svg/projConvert.svg
new file mode 100644
index 0000000..5461b46
--- /dev/null
+++ b/src/renderer/src/icons/svg/projConvert.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/renderer/src/icons/svg/projectionArea.svg b/src/renderer/src/icons/svg/projectionArea.svg
new file mode 100644
index 0000000..d45f9b2
--- /dev/null
+++ b/src/renderer/src/icons/svg/projectionArea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/projectionConvert.svg b/src/renderer/src/icons/svg/projectionConvert.svg
new file mode 100644
index 0000000..7cc7a95
--- /dev/null
+++ b/src/renderer/src/icons/svg/projectionConvert.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/projectionDistanceMeasure.svg b/src/renderer/src/icons/svg/projectionDistanceMeasure.svg
new file mode 100644
index 0000000..65d877f
--- /dev/null
+++ b/src/renderer/src/icons/svg/projectionDistanceMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/prompt.svg b/src/renderer/src/icons/svg/prompt.svg
new file mode 100644
index 0000000..1ec5971
--- /dev/null
+++ b/src/renderer/src/icons/svg/prompt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/pw.svg b/src/renderer/src/icons/svg/pw.svg
new file mode 100644
index 0000000..cb29ef6
--- /dev/null
+++ b/src/renderer/src/icons/svg/pw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/qc.svg b/src/renderer/src/icons/svg/qc.svg
new file mode 100644
index 0000000..c6eb5ac
--- /dev/null
+++ b/src/renderer/src/icons/svg/qc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/radarScan.svg b/src/renderer/src/icons/svg/radarScan.svg
new file mode 100644
index 0000000..84df4d3
--- /dev/null
+++ b/src/renderer/src/icons/svg/radarScan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/rain.svg b/src/renderer/src/icons/svg/rain.svg
new file mode 100644
index 0000000..61287fa
--- /dev/null
+++ b/src/renderer/src/icons/svg/rain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/rangeQuery.svg b/src/renderer/src/icons/svg/rangeQuery.svg
new file mode 100644
index 0000000..f30d218
--- /dev/null
+++ b/src/renderer/src/icons/svg/rangeQuery.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/renderer/src/icons/svg/rectangle.svg b/src/renderer/src/icons/svg/rectangle.svg
new file mode 100644
index 0000000..82bbaa8
--- /dev/null
+++ b/src/renderer/src/icons/svg/rectangle.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/renderer/src/icons/svg/rename.svg b/src/renderer/src/icons/svg/rename.svg
new file mode 100644
index 0000000..f042d6b
--- /dev/null
+++ b/src/renderer/src/icons/svg/rename.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/rendezvous.svg b/src/renderer/src/icons/svg/rendezvous.svg
new file mode 100644
index 0000000..078c901
--- /dev/null
+++ b/src/renderer/src/icons/svg/rendezvous.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/resetView.svg b/src/renderer/src/icons/svg/resetView.svg
new file mode 100644
index 0000000..7f3f30f
--- /dev/null
+++ b/src/renderer/src/icons/svg/resetView.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/road_network.svg b/src/renderer/src/icons/svg/road_network.svg
new file mode 100644
index 0000000..aa205a7
--- /dev/null
+++ b/src/renderer/src/icons/svg/road_network.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/roam.svg b/src/renderer/src/icons/svg/roam.svg
new file mode 100644
index 0000000..7d1e06c
--- /dev/null
+++ b/src/renderer/src/icons/svg/roam.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/routePlan.svg b/src/renderer/src/icons/svg/routePlan.svg
new file mode 100644
index 0000000..3f1d72d
--- /dev/null
+++ b/src/renderer/src/icons/svg/routePlan.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/renderer/src/icons/svg/scanStereoscopic.svg b/src/renderer/src/icons/svg/scanStereoscopic.svg
new file mode 100644
index 0000000..f5eac40
--- /dev/null
+++ b/src/renderer/src/icons/svg/scanStereoscopic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/screenShot.svg b/src/renderer/src/icons/svg/screenShot.svg
new file mode 100644
index 0000000..abd4787
--- /dev/null
+++ b/src/renderer/src/icons/svg/screenShot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/search.svg b/src/renderer/src/icons/svg/search.svg
new file mode 100644
index 0000000..ab7c475
--- /dev/null
+++ b/src/renderer/src/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/sector.svg b/src/renderer/src/icons/svg/sector.svg
new file mode 100644
index 0000000..71d8ceb
--- /dev/null
+++ b/src/renderer/src/icons/svg/sector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/select.svg b/src/renderer/src/icons/svg/select.svg
new file mode 100644
index 0000000..da5b316
--- /dev/null
+++ b/src/renderer/src/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/setView.svg b/src/renderer/src/icons/svg/setView.svg
new file mode 100644
index 0000000..12a0465
--- /dev/null
+++ b/src/renderer/src/icons/svg/setView.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/renderer/src/icons/svg/showAttr.svg b/src/renderer/src/icons/svg/showAttr.svg
new file mode 100644
index 0000000..4a62fc9
--- /dev/null
+++ b/src/renderer/src/icons/svg/showAttr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/shp.svg b/src/renderer/src/icons/svg/shp.svg
new file mode 100644
index 0000000..37860e5
--- /dev/null
+++ b/src/renderer/src/icons/svg/shp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/sightAnalysis.svg b/src/renderer/src/icons/svg/sightAnalysis.svg
new file mode 100644
index 0000000..59b03b0
--- /dev/null
+++ b/src/renderer/src/icons/svg/sightAnalysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/sitting.svg b/src/renderer/src/icons/svg/sitting.svg
new file mode 100644
index 0000000..e7e2984
--- /dev/null
+++ b/src/renderer/src/icons/svg/sitting.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/situation.svg b/src/renderer/src/icons/svg/situation.svg
new file mode 100644
index 0000000..900b136
--- /dev/null
+++ b/src/renderer/src/icons/svg/situation.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/skystarry.svg b/src/renderer/src/icons/svg/skystarry.svg
new file mode 100644
index 0000000..c6bc5d4
--- /dev/null
+++ b/src/renderer/src/icons/svg/skystarry.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/slopeDirection.svg b/src/renderer/src/icons/svg/slopeDirection.svg
new file mode 100644
index 0000000..3d63f10
--- /dev/null
+++ b/src/renderer/src/icons/svg/slopeDirection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/smoke.svg b/src/renderer/src/icons/svg/smoke.svg
new file mode 100644
index 0000000..11c789d
--- /dev/null
+++ b/src/renderer/src/icons/svg/smoke.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/snow.svg b/src/renderer/src/icons/svg/snow.svg
new file mode 100644
index 0000000..794117a
--- /dev/null
+++ b/src/renderer/src/icons/svg/snow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/special.svg b/src/renderer/src/icons/svg/special.svg
new file mode 100644
index 0000000..584f86b
--- /dev/null
+++ b/src/renderer/src/icons/svg/special.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/splitScreen.svg b/src/renderer/src/icons/svg/splitScreen.svg
new file mode 100644
index 0000000..5fb0d84
--- /dev/null
+++ b/src/renderer/src/icons/svg/splitScreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/standText.svg b/src/renderer/src/icons/svg/standText.svg
new file mode 100644
index 0000000..15f2d63
--- /dev/null
+++ b/src/renderer/src/icons/svg/standText.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/renderer/src/icons/svg/stop.svg b/src/renderer/src/icons/svg/stop.svg
new file mode 100644
index 0000000..8b6cfad
--- /dev/null
+++ b/src/renderer/src/icons/svg/stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/subscript1.svg b/src/renderer/src/icons/svg/subscript1.svg
new file mode 100644
index 0000000..86f7f66
--- /dev/null
+++ b/src/renderer/src/icons/svg/subscript1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/subscript2.svg b/src/renderer/src/icons/svg/subscript2.svg
new file mode 100644
index 0000000..f648550
--- /dev/null
+++ b/src/renderer/src/icons/svg/subscript2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/switch.svg b/src/renderer/src/icons/svg/switch.svg
new file mode 100644
index 0000000..73ce871
--- /dev/null
+++ b/src/renderer/src/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/sys_reset.svg b/src/renderer/src/icons/svg/sys_reset.svg
new file mode 100644
index 0000000..ed6f943
--- /dev/null
+++ b/src/renderer/src/icons/svg/sys_reset.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/sys_set.svg b/src/renderer/src/icons/svg/sys_set.svg
new file mode 100644
index 0000000..a8ebb20
--- /dev/null
+++ b/src/renderer/src/icons/svg/sys_set.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/tab.svg b/src/renderer/src/icons/svg/tab.svg
new file mode 100644
index 0000000..500b0fe
--- /dev/null
+++ b/src/renderer/src/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/tacticalCalculation.svg b/src/renderer/src/icons/svg/tacticalCalculation.svg
new file mode 100644
index 0000000..1e606a6
--- /dev/null
+++ b/src/renderer/src/icons/svg/tacticalCalculation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/terrainDig.svg b/src/renderer/src/icons/svg/terrainDig.svg
new file mode 100644
index 0000000..b64cdda
--- /dev/null
+++ b/src/renderer/src/icons/svg/terrainDig.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/text-bold.svg b/src/renderer/src/icons/svg/text-bold.svg
new file mode 100644
index 0000000..87c564a
--- /dev/null
+++ b/src/renderer/src/icons/svg/text-bold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/text-italic.svg b/src/renderer/src/icons/svg/text-italic.svg
new file mode 100644
index 0000000..be65ba5
--- /dev/null
+++ b/src/renderer/src/icons/svg/text-italic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/text-line-bottom.svg b/src/renderer/src/icons/svg/text-line-bottom.svg
new file mode 100644
index 0000000..ab119e3
--- /dev/null
+++ b/src/renderer/src/icons/svg/text-line-bottom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/text-line-through.svg b/src/renderer/src/icons/svg/text-line-through.svg
new file mode 100644
index 0000000..a5e003b
--- /dev/null
+++ b/src/renderer/src/icons/svg/text-line-through.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/textBox.svg b/src/renderer/src/icons/svg/textBox.svg
new file mode 100644
index 0000000..028852f
--- /dev/null
+++ b/src/renderer/src/icons/svg/textBox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/tilesetClipping.svg b/src/renderer/src/icons/svg/tilesetClipping.svg
new file mode 100644
index 0000000..b01308e
--- /dev/null
+++ b/src/renderer/src/icons/svg/tilesetClipping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/tool.svg b/src/renderer/src/icons/svg/tool.svg
new file mode 100644
index 0000000..953c8f1
--- /dev/null
+++ b/src/renderer/src/icons/svg/tool.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/transform.svg b/src/renderer/src/icons/svg/transform.svg
new file mode 100644
index 0000000..6003dc0
--- /dev/null
+++ b/src/renderer/src/icons/svg/transform.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/renderer/src/icons/svg/triangleMeasure.svg b/src/renderer/src/icons/svg/triangleMeasure.svg
new file mode 100644
index 0000000..3c5ea81
--- /dev/null
+++ b/src/renderer/src/icons/svg/triangleMeasure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/turn.svg b/src/renderer/src/icons/svg/turn.svg
new file mode 100644
index 0000000..717ef5e
--- /dev/null
+++ b/src/renderer/src/icons/svg/turn.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/renderer/src/icons/svg/video.svg b/src/renderer/src/icons/svg/video.svg
new file mode 100644
index 0000000..d3d044a
--- /dev/null
+++ b/src/renderer/src/icons/svg/video.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/videoRecord.svg b/src/renderer/src/icons/svg/videoRecord.svg
new file mode 100644
index 0000000..2d496cc
--- /dev/null
+++ b/src/renderer/src/icons/svg/videoRecord.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/vrImage.svg b/src/renderer/src/icons/svg/vrImage.svg
new file mode 100644
index 0000000..b887aa2
--- /dev/null
+++ b/src/renderer/src/icons/svg/vrImage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/wallStereoscopic.svg b/src/renderer/src/icons/svg/wallStereoscopic.svg
new file mode 100644
index 0000000..13d03b6
--- /dev/null
+++ b/src/renderer/src/icons/svg/wallStereoscopic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/water.svg b/src/renderer/src/icons/svg/water.svg
new file mode 100644
index 0000000..5f98fe1
--- /dev/null
+++ b/src/renderer/src/icons/svg/water.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/waterL.svg b/src/renderer/src/icons/svg/waterL.svg
new file mode 100644
index 0000000..c64f5b0
--- /dev/null
+++ b/src/renderer/src/icons/svg/waterL.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/weather.svg b/src/renderer/src/icons/svg/weather.svg
new file mode 100644
index 0000000..c95a14d
--- /dev/null
+++ b/src/renderer/src/icons/svg/weather.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/weatherBase.svg b/src/renderer/src/icons/svg/weatherBase.svg
new file mode 100644
index 0000000..3b1fab3
--- /dev/null
+++ b/src/renderer/src/icons/svg/weatherBase.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/xaxis.svg b/src/renderer/src/icons/svg/xaxis.svg
new file mode 100644
index 0000000..e377f31
--- /dev/null
+++ b/src/renderer/src/icons/svg/xaxis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/yaxis.svg b/src/renderer/src/icons/svg/yaxis.svg
new file mode 100644
index 0000000..ec16e6a
--- /dev/null
+++ b/src/renderer/src/icons/svg/yaxis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/icons/svg/zw.svg b/src/renderer/src/icons/svg/zw.svg
new file mode 100644
index 0000000..f4dfdb2
--- /dev/null
+++ b/src/renderer/src/icons/svg/zw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file