From f656f66c0b2dfa0e52b25f41c761f03b5997262b Mon Sep 17 00:00:00 2001
From: liuyg <376836862@qq.com>
Date: Tue, 29 Jun 2021 15:03:38 +0800
Subject: [PATCH] Box裁剪未完成和开敞度不支持

---
 config.json                                 |   13 
 widgets/BOXInteractive/nls/es/strings.js    |    5 
 widgets/openAnalysis/Widget.js              |  390 +++++++++++++++
 widgets/BOXInteractive/nls/strings.js       |    7 
 widgets/slope/css/style.css                 |    4 
 widgets/BOXInteractive/Widget.html          |   37 +
 widgets/openAnalysis/manifest.json          |   17 
 widgets/crossTailoring/nls/strings.js       |    7 
 widgets/crossTailoring/nls/zh-cn/strings.js |    5 
 widgets/BOXInteractive/nls/zh-cn/strings.js |    5 
 实例临时.html                                   |  299 +++++++++++
 widgets/crossTailoring/css/style.css        |   42 +
 widgets/crossTailoring/nls/es/strings.js    |    5 
 widgets/BOXInteractive/manifest.json        |   17 
 widgets/openAnalysis/nls/strings.js         |    7 
 widgets/searchL/css/style.css               |    9 
 widgets/BOXInteractive/css/style.css        |   42 +
 widgets/openAnalysis/Widget.html            |   95 +++
 images/addL/measure.cur                     |    0 
 widgets/crossTailoring/manifest.json        |   17 
 widgets/crossTailoring/Widget.js            |   72 ++
 widgets/BOXInteractive/Widget.js            |  229 +++++++++
 widgets/openAnalysis/nls/es/strings.js      |    5 
 widgets/openAnalysis/css/style.css          |   42 +
 widgets/openAnalysis/nls/zh-cn/strings.js   |    5 
 widgets/crossTailoring/Widget.html          |   77 +++
 26 files changed, 1,449 insertions(+), 4 deletions(-)

diff --git a/config.json b/config.json
index 09772df..0fbd4da 100644
--- a/config.json
+++ b/config.json
@@ -280,6 +280,19 @@
       {
         "name": "BOX裁剪",
         "uri": "widgets/BOXTailoring/Widget"
+      },
+      {
+        "name": "开敞度分析",
+        "uri": "widgets/openAnalysis/Widget"
+      }
+      ,
+      {
+        "name": "BOX交互裁剪",
+        "uri": "widgets/BOXInteractive/Widget"
+      },
+      {
+        "name": "Cross裁剪",
+        "uri": "widgets/BOXInteractive/Widget"
       }
     ],
     "groups": [],
diff --git a/images/addL/measure.cur b/images/addL/measure.cur
new file mode 100644
index 0000000..407f633
--- /dev/null
+++ b/images/addL/measure.cur
Binary files differ
diff --git a/widgets/BOXInteractive/Widget.html b/widgets/BOXInteractive/Widget.html
new file mode 100644
index 0000000..a0c10ea
--- /dev/null
+++ b/widgets/BOXInteractive/Widget.html
@@ -0,0 +1,37 @@
+<div>
+    <!-- BOXInteractive -->
+    <div id='loadingbarBOXInteractive' class="spinner">
+        <div class="spinner-container container1">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+        <div class="spinner-container container2">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+        <div class="spinner-container container3">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+    </div>
+    <div id='toolbarBOXInteractive' class="param-container tool-bar">
+        <div>
+            <select style="width: 180px;" id="clipModeBOXInteractive">
+                <option value="clip_behind_all_plane">裁剪包围盒内</option>
+                <option value="clip_behind_any_plane">裁剪包围盒外</option>
+            </select>
+            <button type="button" id="beginrboxBOXInteractive" class="button black" style="float: right;">设 置</button>
+            <button type="button" id="clearboxBOXInteractive" class="button black" style="float: right;">清 除</button>
+
+        </div>
+    </div>
+    <i class="layui-icon closeOUR">
+        &#x1006;
+    </i></span>
+</div>
\ No newline at end of file
diff --git a/widgets/BOXInteractive/Widget.js b/widgets/BOXInteractive/Widget.js
new file mode 100644
index 0000000..146379b
--- /dev/null
+++ b/widgets/BOXInteractive/Widget.js
@@ -0,0 +1,229 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/_base/array',
+    'dojo/_base/html',
+    'dojo/topic',
+    'jimu/BaseWidget',
+],
+    function (declare,
+        lang,
+        array,
+        html,
+        topic,
+        BaseWidget
+    ) {
+        return declare([BaseWidget], {
+            baseClass: 'jimu-widget-BOXInteractive',
+            name: 'BOXInteractive',
+            flag: false,
+            startup: function () {
+                var that = this;
+                topic.subscribe("beginBOXInteractive", lang.hitch(this, this.beginBOXInteractive));
+                topic.subscribe("closesBOXInteractive", lang.hitch(this, this.closesBOXInteractive));
+                // topic.publish('getbeginSlope', that.beginSlope);
+                $(`.${that.baseClass}`).find('.closeOUR').click(() => {
+                    $(`.${that.baseClass}`).hide();
+                    that.closesBOXInteractive();
+                })
+
+
+                that.beginBOXInteractive();
+
+            },
+            beginBOXInteractive: function () {
+                console.log(`${this.name}--kaishi`);
+                var that = this;
+
+                var viewer = that.map;
+                var URL_CONFIG = window.MYURL_CONFIG;
+                viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
+                    url: 'https://dev.virtualearth.net',
+                    mapStyle: Cesium.BingMapsStyle.AERIAL,
+                    key: URL_CONFIG.BING_MAP_KEY
+                }));
+
+                var scene = viewer.scene;
+                var widget = viewer.cesiumWidget;
+                $('#toolbarBOXInteractive').show();
+                $('#loadingbarBOXInteractive').remove();
+
+                var promise = scene.open(URL_CONFIG.SCENE_BIMBUILDING);
+                Cesium.when(promise, function (layers) {
+                    // 精准定位
+                    scene.camera.setView({
+                        destination: new Cesium.Cartesian3(-2180753.065987198, 4379023.266141494, 4092583.575045952),
+                        orientation: {
+                            heading: 4.0392222751147955,
+                            pitch: 0.010279641987852584,
+                            roll: 1.240962888005015e-11
+                        }
+                    });
+                    // 设置裁剪线颜色
+                    setAllLayersClipColor();
+                    var boxEntity = undefined;
+                    var $clipMode = $('#clipModeBOXInteractive');
+
+                    var tooltip = window.MYcreateTooltip(document.body);
+
+                    //交互绘制box
+
+                    // Cesium.DrawMode.Box = 4;
+                    // console.log(Cesium.DrawMode.Box, 4634343)
+                    // var handlerBox = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Box);
+                    var handlerBox = new Cesium.DrawHandler(viewer, 4);
+                    var editorBox;
+
+                    handlerBox.activeEvt.addEventListener(function (isActive) {
+                        if (isActive == true) {
+                            viewer.enableCursorStyle = false;
+                            viewer._element.style.cursor = '';
+                            $('body').removeClass('drawCurshizi').addClass('drawCurshizi');
+                        }
+                        else {
+                            viewer.enableCursorStyle = true;
+                            $('body').removeClass('drawCurshizi');
+                        }
+                    });
+                    handlerBox.movingEvt.addEventListener(function (windowPosition) {
+
+                        if (handlerBox.isDrawing) {
+                            tooltip.showAt(windowPosition, '<p>点击鼠标左键结束矩形绘制,移动鼠标绘制box高度。</p><p>右键结束绘制.</p>');
+                        } else {
+                            tooltip.showAt(windowPosition, '<p>点击鼠标左键,开始绘制矩形作为box底面</p>');
+                        }
+
+                    });
+                    handlerBox.drawEvt.addEventListener(function (e) {
+                        console.log(88888888888888888888)
+                        tooltip.setVisible(false);
+                        // boxEntity = e.object;
+                        // var newDim = boxEntity.box.dimensions.getValue();
+                        // var position = boxEntity.position.getValue(0);
+                        // var boxOption = {
+                        //     dimensions: newDim,
+                        //     position: position,
+                        //     clipMode: $clipMode.val(),
+                        //     heading: 0
+                        // };
+
+                        // //box编辑
+                        // editorBox = new Cesium.BoxEditor(viewer, boxEntity);
+
+                        // editorBox.editEvt.addEventListener(function (e) {
+                        //     boxEntity.box.dimensions = e.dimensions
+                        //     boxEntity.position = e.position;
+                        //     boxEntity.orientation = e.orientation;
+
+                        //     setClipBox();
+                        // });
+                        // editorBox.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(0, 950);
+                        // editorBox.activate();
+                        // setAllLayersClipOptions(boxOption);
+                        // tooltip.setVisible(false);
+                        // handlerBox.clear();
+                        // handlerBox.deactivate();
+                    });
+                    handlerBox.activate();
+
+                    $('#clearboxBOXInteractive').click(function () {
+                        for (var i = 0, j = layers.length; i < j; i++) {
+                            layers[i].clearCustomClipBox();
+                        };
+                        editorBox.deactivate();
+                        viewer.entities.removeAll();
+                        handlerBox.clear();
+                        handlerBox.deactivate();
+                        handlerBox.activate();
+
+                    });
+
+                    $clipMode.change(function () {
+                        setClipBox();
+                    });
+
+                    function setClipBox() {
+                        var clipMode = $clipMode.val();
+                        if (typeof (boxEntity) == "undefined") {
+                            return;
+                        }
+                        var newDim = boxEntity.box.dimensions.getValue();
+                        var position = boxEntity.position.getValue(0);
+
+                        var heading = 0;
+                        if (typeof (boxEntity.orientation) != "undefined") {
+                            let rotationM3 = Cesium.Matrix3.fromQuaternion(boxEntity.orientation._value, new Cesium.Matrix3());
+                            let localFrame = Cesium.Matrix4.fromRotationTranslation(rotationM3, Cesium.Cartesian3.ZERO, new Cesium.Matrix4());
+                            let inverse = Cesium.Matrix4.inverse(Cesium.Transforms.eastNorthUpToFixedFrame(position), new Cesium.Matrix4());
+                            let hprm = Cesium.Matrix4.multiply(inverse, localFrame, new Cesium.Matrix4());
+                            var rotation = Cesium.Matrix4.getMatrix3(hprm, new Cesium.Matrix3());
+                            let hpr = Cesium.HeadingPitchRoll.fromQuaternion(Cesium.Quaternion.fromRotationMatrix(rotation));
+                            heading = hpr.heading;
+                        }
+
+
+                        var boxOptions = {
+                            dimensions: newDim,
+                            position: position,
+                            clipMode: clipMode,
+                            heading: heading
+                        };
+                        setAllLayersClipOptions(boxOptions);
+                    }
+
+                    function setAllLayersClipColor() {
+                        for (var i = 0, j = layers.length; i < j; i++) {
+                            layers[i].clipLineColor = new Cesium.Color(1, 1, 1, 0);
+                            console.log(layers[i].clipLineColor, 4444444444444)
+                        }
+                    }
+
+                    function setAllLayersClipOptions(boxOptions) {
+                        console.log(5555555555555)
+                        for (var i = 0, j = layers.length; i < j; i++) {
+                            layers[i].setCustomClipBox(boxOptions);
+                        }
+                    }
+
+                }, function (e) {
+                    if (widget._showRenderLoopErrors) {
+                        var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
+                        widget.showErrorPanel(title, undefined, e);
+                    }
+                });
+
+            },
+            closesBOXInteractive: function (froms) {
+                console.log(`${this.name}--guanbi`);
+                var that = this;
+            },
+            onOpen: function () {
+
+            },
+
+            onClose: function () {
+                //面板关闭的时候触发 (when this panel is closed trigger)
+                console.log('jies')
+            },
+
+            onMinimize: function () {
+                this.resize();
+            },
+
+            onMaximize: function () {
+                this.resize();
+            },
+
+            resize: function () {
+
+            },
+
+            destroy: function () {
+                //销毁的时候触发
+                //todo
+                //do something before this func
+                this.inherited(arguments);
+            }
+
+        });
+    });
diff --git a/widgets/BOXInteractive/css/style.css b/widgets/BOXInteractive/css/style.css
new file mode 100644
index 0000000..985dadf
--- /dev/null
+++ b/widgets/BOXInteractive/css/style.css
@@ -0,0 +1,42 @@
+.jimu-widget-BOXInteractive {
+  position: fixed !important;
+  top: 72px !important;
+  right: 388px !important;
+  width: 200px !important;
+  height: 40px !important;
+  background-color: rgb(255, 255, 255);
+  font-size: 14px;
+  color: rgb(0, 0, 0);
+  z-index: 12 !important;
+  border-radius: 10px;
+  /* display: none; */
+  box-shadow: 0 0 8px #fff;
+  padding: 0px 5px !important;
+}
+
+.jimu-widget-BOXInteractive .closeOUR {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.jimu-widget-BOXInteractive .closeOUR:hover {
+  color: red;
+}
+
+/* .jimu-widget-BOXInteractive .but {
+  line-height: 30px;
+  width: 80px;
+  height: 30px;
+  font-size: 14px;
+  border-radius: 5px;
+  box-shadow: 2px 2px 15px -5px #378ef1;
+   border: 1px solid transparent;
+  background-color: #fff;
+}
+
+.jimu-widget-BOXInteractive .but:hover {
+  box-shadow: 2px 2px 25px -5px #1679eb;
+} */
\ No newline at end of file
diff --git a/widgets/BOXInteractive/manifest.json b/widgets/BOXInteractive/manifest.json
new file mode 100644
index 0000000..d840129
--- /dev/null
+++ b/widgets/BOXInteractive/manifest.json
@@ -0,0 +1,17 @@
+{
+  "name": "BOXInteractive",
+  "2D": true,
+  "3D": true,
+  "platform": "HTML",
+  "version": "2.10",
+  "wabVersion": "2.10",
+  "author": "liuyg",
+  "description": "",
+  "copyright": "",
+  "license": "",
+  "properties": {
+    "hasConfig": false,
+    "inPanel": false,
+    "hasVersionManager": false
+  }
+}
\ No newline at end of file
diff --git a/widgets/BOXInteractive/nls/es/strings.js b/widgets/BOXInteractive/nls/es/strings.js
new file mode 100644
index 0000000..e73ade0
--- /dev/null
+++ b/widgets/BOXInteractive/nls/es/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "BOXInteractive"
+  })
+);
\ No newline at end of file
diff --git a/widgets/BOXInteractive/nls/strings.js b/widgets/BOXInteractive/nls/strings.js
new file mode 100644
index 0000000..b33916a
--- /dev/null
+++ b/widgets/BOXInteractive/nls/strings.js
@@ -0,0 +1,7 @@
+define({
+  root: ({
+    _widgetLabel: "BOXInteractive"
+  }),
+  "es": 1,
+  "zh-cn": 1
+});
\ No newline at end of file
diff --git a/widgets/BOXInteractive/nls/zh-cn/strings.js b/widgets/BOXInteractive/nls/zh-cn/strings.js
new file mode 100644
index 0000000..99f2103
--- /dev/null
+++ b/widgets/BOXInteractive/nls/zh-cn/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "BOX交互裁剪"
+  })
+);
\ No newline at end of file
diff --git a/widgets/crossTailoring/Widget.html b/widgets/crossTailoring/Widget.html
new file mode 100644
index 0000000..a7feb44
--- /dev/null
+++ b/widgets/crossTailoring/Widget.html
@@ -0,0 +1,77 @@
+<div>
+    crossTailoring
+    <div id="toolbar" class="params-setting-container">
+        <div class="params-setting-anchor" title="显示/隐藏参数面板"><span class="fui-expand"></span></div>
+        <div class="params-setting">
+            <table>
+                <tbody>
+                    <tr>
+                        <td><label>裁剪宽度:</label></td>
+                        <td>
+                            <input type="range" id="clip-width" min="1" max="100" step="1" data-bind="value: width, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" id="clip-width-label" min="1" max="100" step="1" data-bind="value: width, valueUpdate: 'input'" />
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><label>裁剪高度:</label></td>
+                        <td>
+                            <input type="range" id="clip-height" min="1" max="100" step="1" data-bind="value: height, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" id="clip-height-label" min="1" max="100" step="1" data-bind="value: height, valueUpdate: 'input'" />
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><label>绕X轴旋转:</label></td>
+                        <td>
+                            <input id="pitch" type="range" min="0" max="360" step="1.0" data-bind="value: pitch, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" min="0" max="360" step="1" data-bind="value: pitch, valueUpdate: 'input'">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><label>绕Y轴旋转:</label></td>
+                        <td>
+                            <input id="roll" type="range" min="0" max="360" step="1.0" data-bind="value: roll, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" min="0" max="360" step="1.0" data-bind="value: roll, valueUpdate: 'input'">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <label>绕Z轴旋转:</label>
+                        </td>
+                        <td>
+                            <input id="heading" type="range" min="0" max="360" step="1.0" data-bind="value: heading, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" min="0" max="360" step="1.0" data-bind="value: heading, valueUpdate: 'input'">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><label>拉伸:</label></td>
+                        <td>
+                            <input id="extrude" type="range" min="0.1" max="30" step="0.1" data-bind="value: extrudeDistance, valueUpdate: 'input'">
+                        </td>
+                        <td>
+                            <input type="number" min="0.1" max="30" step="0.5" data-bind="value: extrudeDistance, valueUpdate: 'input'">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td colspan="3">
+                            <input type="button" id="choose-clip-pos" class="button black" value="选取裁剪位置" />
+                            <input type="button" id="clear" class="button black" value="清除" style="margin-left: 10px;" />
+                        </td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+    <i class="layui-icon closeOUR">
+        &#x1006;
+    </i></span>
+</div>
\ No newline at end of file
diff --git a/widgets/crossTailoring/Widget.js b/widgets/crossTailoring/Widget.js
new file mode 100644
index 0000000..1c72023
--- /dev/null
+++ b/widgets/crossTailoring/Widget.js
@@ -0,0 +1,72 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/_base/array',
+    'dojo/_base/html',
+    'dojo/topic',
+    'jimu/BaseWidget',
+],
+    function (declare,
+        lang,
+        array,
+        html,
+        topic,
+        BaseWidget
+    ) {
+        return declare([BaseWidget], {
+            baseClass: 'jimu-widget-crossTailoring',
+            name: 'crossTailoring',
+            flag: false,
+            startup: function () {
+                var that = this;
+                topic.subscribe("begincrossTailoring", lang.hitch(this, this.begincrossTailoring));
+                topic.subscribe("closescrossTailoring", lang.hitch(this, this.closescrossTailoring));
+                // topic.publish('getbeginSlope', that.beginSlope);
+                $(`.${that.baseClass}`).find('.closeOUR').click(() => {
+                    $(`.${that.baseClass}`).hide();
+                    that.closescrossTailoring();
+                })
+
+
+                that.begincrossTailoring();
+
+            },
+            begincrossTailoring: function () {
+                console.log(`${this.name}--kaishi`);
+                var that = this;
+
+            },
+            closescrossTailoring: function (froms) {
+                console.log(`${this.name}--guanbi`);
+                var that = this;
+            },
+            onOpen: function () {
+
+            },
+
+            onClose: function () {
+                //面板关闭的时候触发 (when this panel is closed trigger)
+                console.log('jies')
+            },
+
+            onMinimize: function () {
+                this.resize();
+            },
+
+            onMaximize: function () {
+                this.resize();
+            },
+
+            resize: function () {
+
+            },
+
+            destroy: function () {
+                //销毁的时候触发
+                //todo
+                //do something before this func
+                this.inherited(arguments);
+            }
+
+        });
+    });
diff --git a/widgets/crossTailoring/css/style.css b/widgets/crossTailoring/css/style.css
new file mode 100644
index 0000000..b301115
--- /dev/null
+++ b/widgets/crossTailoring/css/style.css
@@ -0,0 +1,42 @@
+.jimu-widget-crossTailoring {
+  position: fixed !important;
+  top: 72px !important;
+  right: 388px !important;
+  width: 200px !important;
+  height: 40px !important;
+  background-color: rgb(255, 255, 255);
+  font-size: 14px;
+  color: rgb(0, 0, 0);
+  z-index: 12 !important;
+  border-radius: 10px;
+  /* display: none; */
+  box-shadow: 0 0 8px #fff;
+  padding: 0px 5px !important;
+}
+
+.jimu-widget-crossTailoring .closeOUR {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.jimu-widget-crossTailoring .closeOUR:hover {
+  color: red;
+}
+
+/* .jimu-widget-crossTailoring .but {
+  line-height: 30px;
+  width: 80px;
+  height: 30px;
+  font-size: 14px;
+  border-radius: 5px;
+  box-shadow: 2px 2px 15px -5px #378ef1;
+   border: 1px solid transparent;
+  background-color: #fff;
+}
+
+.jimu-widget-crossTailoring .but:hover {
+  box-shadow: 2px 2px 25px -5px #1679eb;
+} */
\ No newline at end of file
diff --git a/widgets/crossTailoring/manifest.json b/widgets/crossTailoring/manifest.json
new file mode 100644
index 0000000..2d51faa
--- /dev/null
+++ b/widgets/crossTailoring/manifest.json
@@ -0,0 +1,17 @@
+{
+  "name": "crossTailoring",
+  "2D": true,
+  "3D": true,
+  "platform": "HTML",
+  "version": "2.10",
+  "wabVersion": "2.10",
+  "author": "liuyg",
+  "description": "",
+  "copyright": "",
+  "license": "",
+  "properties": {
+    "hasConfig": false,
+    "inPanel": false,
+    "hasVersionManager": false
+  }
+}
\ No newline at end of file
diff --git a/widgets/crossTailoring/nls/es/strings.js b/widgets/crossTailoring/nls/es/strings.js
new file mode 100644
index 0000000..36b3ab0
--- /dev/null
+++ b/widgets/crossTailoring/nls/es/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "crossTailoring"
+  })
+);
\ No newline at end of file
diff --git a/widgets/crossTailoring/nls/strings.js b/widgets/crossTailoring/nls/strings.js
new file mode 100644
index 0000000..faea469
--- /dev/null
+++ b/widgets/crossTailoring/nls/strings.js
@@ -0,0 +1,7 @@
+define({
+  root: ({
+    _widgetLabel: "crossTailoring"
+  }),
+  "es": 1,
+  "zh-cn": 1
+});
\ No newline at end of file
diff --git a/widgets/crossTailoring/nls/zh-cn/strings.js b/widgets/crossTailoring/nls/zh-cn/strings.js
new file mode 100644
index 0000000..87ae357
--- /dev/null
+++ b/widgets/crossTailoring/nls/zh-cn/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "Cross裁剪"
+  })
+);
\ No newline at end of file
diff --git a/widgets/openAnalysis/Widget.html b/widgets/openAnalysis/Widget.html
new file mode 100644
index 0000000..910d0a4
--- /dev/null
+++ b/widgets/openAnalysis/Widget.html
@@ -0,0 +1,95 @@
+<div>
+    <!-- openAnalysis -->
+    <div id='loadingbaropenAnalysis' class="spinner">
+        <div class="spinner-container container1">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+        <div class="spinner-container container2">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+        <div class="spinner-container container3">
+            <div class="circle1"></div>
+            <div class="circle2"></div>
+            <div class="circle3"></div>
+            <div class="circle4"></div>
+        </div>
+    </div>
+    <button id="bnopenAnalysis"
+        style="position : absolute; left : 1%; top : 2%; display : none;background-color: #00a1cb;color:#fff;border: 0">
+        分析
+    </button>
+    <div id="toolbaropenAnalysis" style="position : absolute; left : 1%; top : 2%;color: #ffffff;height: auto;display : none;">
+        <div class="titleBox" style="margin-bottom: 10px">
+            <div class="titl" style="width: 80px;">开敞度分析</div>
+            <span aria-hidden="false" class="close2">×</span>
+        </div>
+        <div style="font-size: 12px;margin-bottom: 10px">观察者信息:</div>
+        <div class="middlebox">
+            <span class="tit">X :</span>
+            <input class="middle-input" id="longitudeopenAnalysis" step="0.0001" type="number" value="" />
+        </div>
+        <div class="middlebox">
+            <span class="tit">Y :</span>
+            <input class="middle-input" id="latitudeopenAnalysis" step="0.0001" type="number" value="" />
+        </div>
+        <div class="middlebox">
+            <span class="tit">Z :</span>
+            <input class="middle-input" id="heightopenAnalysis" min="0" step="1" type="number" value="" />
+        </div>
+        <div style="font-size: 12px;margin-bottom: 10px">参数设置:</div>
+        <div class="middlebox m">
+            <span class="tit">观察半径:</span>
+            <input class="min-solider" id="observerRsdiusopenAnalysis" max="1000" min="1" step="1" style="width:45%" type="range"
+                value="100" />
+            <input class="min-solider" id="RsdiusopenAnalysis" max="1000" min="1" step="1"
+                style="width:23%; height:20px ;margin: 0;" type="number" value="100" />
+        </div>
+        <div class="middlebox m">
+            <span class="tit">起始角度:</span>
+            <input class="min-solider" id="StartingAngleopenAnalysis" max="360" min="0" step="5" style="width:45%" type="range"
+                value="0" />
+            <input class="min-solider" id="SangleopenAnalysis" max="360" min="0" step="1" style="width:23%; height:20px ;margin: 0;"
+                type="number" value="0" />
+        </div>
+        <div class="middlebox m">
+            <span class="tit">终止角度:</span>
+            <input class="min-solider" id="EndAngleopenAnalysis" max="360" min="0" step="1" style="width:45%" type="range"
+                value="360" />
+            <input class="min-solider" id="EangleopenAnalysis" max="360" min="0" step="1" style="width:23%; height:20px ;margin: 0;"
+                type="number" value="360" />
+        </div>
+        <div class="middlebox m">
+            <span class="">可视部分颜色:</span>
+            <input id="VisibleColor" type="color" value="#00B7EF" />
+        </div>
+        <div class="middlebox m">
+            <span class="">隐藏部分颜色:</span>
+            <input id="HiddenColor" type="color" value="#E36C09" />
+        </div>
+        <div class="middlebox">
+            <span class="tit">显示类型:</span>
+            <select class="select-container " id="calMode1openAnalysis" style="width: 70%">
+                <option value="VisiblePart">可视部分</option>
+                <option value="HiddenPart">隐藏部分</option>
+                <option value="ShowAll">全部显示</option>
+            </select>
+        </div>
+        <div style="margin:10px ">
+            <span style="font-size: 12px">是否封口:</span> <input id="isClosedopenAnalysis" type="checkbox" style="margin-left: 10px" />
+            <span style="font-size: 10px;margin-left: 5px">(当为360度闭合半球时设置无效)</span>
+        </div>
+        <div class="boxchild ">
+            <button class="tbtn tbn1" id="activeopenAnalysis" type="button">分析</button>
+            <button class="tbtn " id="clearopenAnalysis" type="button">清除</button>
+        </div>
+    </div>
+    <i class="layui-icon closeOUR">
+        &#x1006;
+    </i></span>
+</div>
\ No newline at end of file
diff --git a/widgets/openAnalysis/Widget.js b/widgets/openAnalysis/Widget.js
new file mode 100644
index 0000000..7e8e237
--- /dev/null
+++ b/widgets/openAnalysis/Widget.js
@@ -0,0 +1,390 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/_base/array',
+    'dojo/_base/html',
+    'dojo/topic',
+    'jimu/BaseWidget',
+],
+    function (declare,
+        lang,
+        array,
+        html,
+        topic,
+        BaseWidget
+    ) {
+        return declare([BaseWidget], {
+            baseClass: 'jimu-widget-openAnalysis',
+            name: 'openAnalysis',
+            flag: false,
+            startup: function () {
+                var that = this;
+                topic.subscribe("beginopenAnalysis", lang.hitch(this, this.beginopenAnalysis));
+                topic.subscribe("closesopenAnalysis", lang.hitch(this, this.closesopenAnalysis));
+                // topic.publish('getbeginSlope', that.beginSlope);
+                $(`.${that.baseClass}`).find('.closeOUR').click(() => {
+                    $(`.${that.baseClass}`).hide();
+                    that.closesopenAnalysis();
+                })
+
+
+                // that.beginopenAnalysis();
+
+            },
+            beginopenAnalysis: function () {
+                console.log(Cesium.ViewDome, 111)//缺少Cesium.ViewDome支持
+                console.log(`${this.name}--kaishi`);
+                var that = this;
+
+                var viewer = that.map;
+                var scene = viewer.scene;
+                var widget = viewer.cesiumWidget;
+                var longitude, latitude, height;
+                var viewDomeArray = []; //存多个开敞度对象数组
+                var ViewDomeType = 0; //开敞度类型
+                var isClosed = false; //是否封口
+                var handler;
+                var iTime, Time; //定时器
+                var URL_CONFIG = window.MYURL_CONFIG;
+
+                viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
+                    key: URL_CONFIG.BING_MAP_KEY,//可至官网(https://www.bingmapsportal.com/)申请key
+                    url: URL_CONFIG.BINGMAP
+                }));
+                var promise = scene.open(URL_CONFIG.SCENE_CBD);
+                Cesium.when(promise, function (layers) {
+                    for (var i = 0; i < layers.length; i++) {
+                        layers[i].selectEnabled = false;
+                    }
+                    //图层加载完成,设置相机位置
+                    scene.camera.setView({
+                        destination: Cesium.Cartesian3.fromDegrees(116.4491, 39.9011, 180),
+                        orientation: {
+                            heading: 0.0912,
+                            pitch: -0.3177,
+                            roll: 0
+                        }
+                    });
+                    $("#activeopenAnalysis").on("click", function () {
+                        mousestyle();
+                        initViewDome();
+                        // handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
+                        // console.log(handler, 31313131313)
+                        // handler.setInputAction(function (e) {
+                        //     viewer.enableCursorStyle = true;
+                        //     $('body').removeClass('drawCurshizi');
+                        //     //获取点击位置笛卡尔坐标
+                        //     var position = scene.pickPosition(e.position);
+                        //     //将笛卡尔坐标转化为经纬度坐标
+                        //     let positions = [];
+                        //     var cartographic = Cesium.Cartographic.fromCartesian(position);
+                        //     longitude = Cesium.Math.toDegrees(cartographic.longitude);
+                        //     latitude = Cesium.Math.toDegrees(cartographic.latitude);
+                        //     height = cartographic.height;
+                        //     if (height < 0) {
+                        //         height = 0;
+                        //     }
+                        //     if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {
+                        //         positions.push(longitude);
+                        //         positions.push(latitude);
+                        //         positions.push(height);
+                        //     }
+                        //     //点击位置同步到显示框
+                        //     $("#longitudeopenAnalysis").val(longitude);
+                        //     $("#latitudeopenAnalysis").val(latitude);
+                        //     $("#heightopenAnalysis").val(height);
+                        //     updateViewDome(positions);
+                        //     handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+                        // }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+                    })
+
+                    function initViewDome() {  //初始化
+                        console.log(1121)
+                        // let VisibleColor = Cesium.Color.fromCssColorString($("#VisibleColoropenAnalysis").val());
+                        // let HiddenColor = Cesium.Color.fromCssColorString($("#HiddenColoropenAnalysis").val());
+                        // let viewDome = new Cesium.ViewDome(scene); //构造新的开敞度分析对象
+                        // viewDome.viewPosition = [longitude, latitude, height]; //视点位置,这里用的是CBD示例的中心位置
+                        // viewDome.distance = Number($("#observerRsdiusopenAnalysis").val());//可视距离
+                        // viewDome.domeType = ViewDomeType; //开敞度类型,分为可视部分、不可视部分, 全部显示
+                        // viewDome.visibleAreaColor = Cesium.Color.fromAlpha(VisibleColor, 0.5); //可视部颜色
+                        // viewDome.hiddenAreaColor = Cesium.Color.fromAlpha(HiddenColor, 0.5); //隐藏部分颜色
+                        // viewDome.startAngle = Number($("#StartingAngleopenAnalysis").val());//起始角度
+                        // viewDome.endAngle = Number($("#EndAngleopenAnalysis").val());//终止角度
+                        // viewDome.isClosed = isClosed;  //封口
+                        // viewDome.build(); //执行开敞度分析
+                        // viewDomeArray.push(viewDome)
+                        console.log(Cesium.ViewDome, 111)//缺少Cesium.ViewDome
+                        console.log(1131)
+                    }
+
+                    function move() {   //改变经纬度动态移动
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        if (longitude && latitude && height) {
+                            viewDomeArray[viewDomeArray.length - 1].viewPosition = [longitude, latitude, height];
+                        }
+                        clearTimeout(Time); //防止点击多次,执行一次
+                        Time = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].startAngle = Number($("#StartingAngleopenAnalysis").val()) //加这个才起作用
+                        }, 500);
+                    }
+
+                    function updateViewDome(p) {
+                        viewDomeArray[viewDomeArray.length - 1].viewPosition = p;
+                        viewDomeArray[viewDomeArray.length - 1].build(); //执行开敞度分析
+                        addpoint()
+                    }
+
+                    function mousestyle() { //鼠标样式
+                        viewer.enableCursorStyle = false;
+                        viewer._element.style.cursor = '';
+                        $('body').removeClass('drawCurshizi').addClass('drawCurshizi');
+                    }
+
+                    //结果清除
+                    function clear() {
+                        viewer.entities.removeAll();
+                        viewDomeArray[viewDomeArray.length - 1].destroy();//释放对象
+                        viewDomeArray.pop();
+                        if (viewDomeArray.length == 0) {
+                            return
+                        } else {
+                            let v = viewDomeArray[viewDomeArray.length - 1];
+                            $("#longitudeopenAnalysis").val(v.viewPosition[0]);
+                            $("#latitudeopenAnalysis").val(v.viewPosition[1]);
+                            $("#heightopenAnalysis").val(v.viewPosition[2]);
+                            longitude = v.viewPosition[0];
+                            latitude = v.viewPosition[1];
+                            height = v.viewPosition[2];
+                            addpoint()
+                        }
+                    }
+
+                    function addpoint() {//添加点
+                        if (longitude == undefined || latitude == undefined || height == undefined) {
+                            return
+                        }
+                        //首先移除之前添加的点
+                        viewer.entities.removeAll();
+                        //在位置添加对应点
+                        viewer.entities.add(new Cesium.Entity({
+                            point: new Cesium.PointGraphics({
+                                color: new Cesium.Color(1, 0, 0),
+                                pixelSize: 6,
+                                outlineColor: new Cesium.Color(0, 1, 1)
+                            }),
+                            position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height + 0.5)
+                        }));
+
+                    }
+
+                    $('#clearopenAnalysis').click(function () {
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        clear();
+                        handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+                    });
+                    $("#longitudeopenAnalysis").bind("input propertychange", function () {
+                        longitude = parseFloat($("#longitudeopenAnalysis").val());
+                        if (!longitude) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            move()
+                        }, 1000);
+                        addpoint()
+                    })
+                    $("#latitudeopenAnalysis").bind("input propertychange", function () {
+                        latitude = parseFloat($("#latitudeopenAnalysis").val());
+                        if (!latitude) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            move()
+                        }, 1000);
+                        addpoint()
+                    })
+                    $("#heightopenAnalysis").bind("input propertychange", function () {
+                        height = parseFloat($("#heightopenAnalysis").val());
+                        if (!height) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            move()
+                        }, 1000);
+                        addpoint()
+                    })
+                    $('#observerRsdiusopenAnalysis').bind('input propertychange', function () {
+                        $("#RsdiusopenAnalysis").val($("#observerRsdiusopenAnalysis").val());
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        if (Number($("#observerRsdiusopenAnalysis").val()) == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].distance = Number($("#observerRsdiusopenAnalysis").val())
+                        }, 500);
+                    });
+                    $('#RsdiusopenAnalysis').bind('input propertychange', function () {
+                        $("#observerRsdiusopenAnalysis").val($("#RsdiusopenAnalysis").val())
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        if (Number($("#observerRsdiusopenAnalysis").val()) == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].distance = Number($("#observerRsdiusopenAnalysis").val())
+                        }, 500);
+                    });
+
+                    $('#StartingAngleopenAnalysis').bind('input propertychange', function () {
+                        $("#SangleopenAnalysis").val($("#StartingAngleopenAnalysis").val());
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].startAngle = Number($("#StartingAngleopenAnalysis").val())
+                        }, 500);
+                    });
+                    $('#SangleopenAnalysis').bind('input propertychange', function () {
+                        $("#StartingAngleopenAnalysis").val($("#SangleopenAnalysis").val());
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].startAngle = Number($("#StartingAngleopenAnalysis").val())
+                        }, 500);
+                    });
+
+                    $('#EndAngleopenAnalysis').bind('input propertychange', function () {
+                        $("#EangleopenAnalysis").val($("#EndAngleopenAnalysis").val());
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].endAngle = Number($("#EndAngleopenAnalysis").val())
+                        }, 500);
+                    });
+                    $('#EangleopenAnalysis').bind('input propertychange', function () {
+                        $("#EndAngleopenAnalysis").val($("#EangleopenAnalysis").val());
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        clearTimeout(iTime);
+                        iTime = setTimeout(function () {
+                            viewDomeArray[viewDomeArray.length - 1].endAngle = Number($("#EndAngleopenAnalysis").val())
+                        }, 500);
+                    });
+
+                    $("#VisibleColoropenAnalysis").bind("input propertychange", function () {
+                        let VisibleColor = Cesium.Color.fromCssColorString($("#VisibleColoropenAnalysis").val())
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        viewDomeArray[viewDomeArray.length - 1].visibleAreaColor = Cesium.Color.fromAlpha(VisibleColor, 0.5); //可视部颜色
+                    })
+                    $("#HiddenColoropenAnalysis").bind("input propertychange", function () {
+                        let HiddenColor = Cesium.Color.fromCssColorString($("#HiddenColoropenAnalysis").val())
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        viewDomeArray[viewDomeArray.length - 1].hiddenAreaColor = Cesium.Color.fromAlpha(HiddenColor, 0.5);
+                    })
+
+                    $("#calMode1openAnalysis").on("input change", function () {
+                        var index = document.getElementById("calMode1openAnalysis").selectedIndex;
+                        switch (index) {
+                            case 0:
+                                ViewDomeType = Cesium.ViewDomeType.VISIBLEDOME;
+                                break;
+                            case 1:
+                                ViewDomeType = Cesium.ViewDomeType.HIDDENDOME;
+                                break;
+                            case 2:
+                                ViewDomeType = Cesium.ViewDomeType.ALLDOME;
+                                break;
+                            default:
+                                break;
+                        }
+                        if (viewDomeArray.length == 0) {
+                            return
+                        }
+                        viewDomeArray[viewDomeArray.length - 1].domeType = ViewDomeType
+                    });
+
+                    $("#isClosedopenAnalysis").click(function () {
+                        if ($(this).prop("checked")) {
+                            isClosed = true
+                        } else {
+                            isClosed = false
+                        }
+                        viewDomeArray[viewDomeArray.length - 1].isClosed = isClosed;
+                    });
+
+                    $('#toolbaropenAnalysis').show();
+                    $('#loadingbaropenAnalysis').remove();
+
+                }, function (e) {
+                    if (widget._showRenderLoopErrors) {
+                        var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
+                        widget.showErrorPanel(title, undefined, e);
+                    }
+                })
+
+                //关闭操作框
+                $(".close2").click(function () {
+                    $("#toolbaropenAnalysis").hide();
+                    $("#bnopenAnalysis").show()
+                });
+                $("#bnopenAnalysis").click(function () {
+                    $("#toolbaropenAnalysis").show();
+                    $("#bnopenAnalysis").hide()
+                });
+
+            },
+            closesopenAnalysis: function (froms) {
+                console.log(`${this.name}--guanbi`);
+                var that = this;
+            },
+            onOpen: function () {
+
+            },
+
+            onClose: function () {
+                //面板关闭的时候触发 (when this panel is closed trigger)
+                console.log('jies')
+            },
+
+            onMinimize: function () {
+                this.resize();
+            },
+
+            onMaximize: function () {
+                this.resize();
+            },
+
+            resize: function () {
+
+            },
+
+            destroy: function () {
+                //销毁的时候触发
+                //todo
+                //do something before this func
+                this.inherited(arguments);
+            }
+
+        });
+    });
diff --git a/widgets/openAnalysis/css/style.css b/widgets/openAnalysis/css/style.css
new file mode 100644
index 0000000..7113980
--- /dev/null
+++ b/widgets/openAnalysis/css/style.css
@@ -0,0 +1,42 @@
+.jimu-widget-openAnalysis {
+  position: fixed !important;
+  top: 72px !important;
+  right: 388px !important;
+  width: 300px !important;
+  height: 400px !important;
+  background-color: rgb(0, 0, 0);
+  font-size: 14px;
+  color: rgb(0, 0, 0);
+  z-index: 12 !important;
+  border-radius: 10px;
+  display: none;
+  box-shadow: 0 0 8px #fff;
+  padding: 0px 5px !important;
+}
+
+.jimu-widget-openAnalysis .closeOUR {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.jimu-widget-openAnalysis .closeOUR:hover {
+  color: red;
+}
+
+/* .jimu-widget-openAnalysis .but {
+  line-height: 30px;
+  width: 80px;
+  height: 30px;
+  font-size: 14px;
+  border-radius: 5px;
+  box-shadow: 2px 2px 15px -5px #378ef1;
+   border: 1px solid transparent;
+  background-color: #fff;
+}
+
+.jimu-widget-openAnalysis .but:hover {
+  box-shadow: 2px 2px 25px -5px #1679eb;
+} */
\ No newline at end of file
diff --git a/widgets/openAnalysis/manifest.json b/widgets/openAnalysis/manifest.json
new file mode 100644
index 0000000..04c3a69
--- /dev/null
+++ b/widgets/openAnalysis/manifest.json
@@ -0,0 +1,17 @@
+{
+  "name": "openAnalysis",
+  "2D": true,
+  "3D": true,
+  "platform": "HTML",
+  "version": "2.10",
+  "wabVersion": "2.10",
+  "author": "liuyg",
+  "description": "",
+  "copyright": "",
+  "license": "",
+  "properties": {
+    "hasConfig": false,
+    "inPanel": false,
+    "hasVersionManager": false
+  }
+}
\ No newline at end of file
diff --git a/widgets/openAnalysis/nls/es/strings.js b/widgets/openAnalysis/nls/es/strings.js
new file mode 100644
index 0000000..1c80902
--- /dev/null
+++ b/widgets/openAnalysis/nls/es/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "openAnalysis"
+  })
+);
\ No newline at end of file
diff --git a/widgets/openAnalysis/nls/strings.js b/widgets/openAnalysis/nls/strings.js
new file mode 100644
index 0000000..e6a85a0
--- /dev/null
+++ b/widgets/openAnalysis/nls/strings.js
@@ -0,0 +1,7 @@
+define({
+  root: ({
+    _widgetLabel: "openAnalysis"
+  }),
+  "es": 1,
+  "zh-cn": 1
+});
\ No newline at end of file
diff --git a/widgets/openAnalysis/nls/zh-cn/strings.js b/widgets/openAnalysis/nls/zh-cn/strings.js
new file mode 100644
index 0000000..9def83e
--- /dev/null
+++ b/widgets/openAnalysis/nls/zh-cn/strings.js
@@ -0,0 +1,5 @@
+define(
+   ({
+    _widgetLabel: "开敞度分析"
+  })
+);
\ No newline at end of file
diff --git a/widgets/searchL/css/style.css b/widgets/searchL/css/style.css
index 5057954..c4eeb26 100644
--- a/widgets/searchL/css/style.css
+++ b/widgets/searchL/css/style.css
@@ -236,4 +236,13 @@
 
 .layui-table-grid-down {
   display: none;
+}
+
+/* 鼠标样式 */
+.drawCur {
+  cursor: url(../../../images/addL/draw.cur), auto;
+}
+
+.drawCurshizi {
+  cursor: url(../../../images/addL/measure.cur), auto;
 }
\ No newline at end of file
diff --git a/widgets/slope/css/style.css b/widgets/slope/css/style.css
index e589dbd..509ef56 100644
--- a/widgets/slope/css/style.css
+++ b/widgets/slope/css/style.css
@@ -35,7 +35,3 @@
   left: 1.1%;
   margin: 10px;
 }
-
-.drawCur {
-  cursor: url(../../../images/addL/draw.cur), auto;
-}
\ No newline at end of file
diff --git "a/\345\256\236\344\276\213\344\270\264\346\227\266.html" "b/\345\256\236\344\276\213\344\270\264\346\227\266.html"
new file mode 100644
index 0000000..d3831c0
--- /dev/null
+++ "b/\345\256\236\344\276\213\344\270\264\346\227\266.html"
@@ -0,0 +1,299 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<meta charset="utf-8">
+		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
+		<title>Cross裁剪</title>
+		<link href="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
+		<link href="./css/pretty.css" rel="stylesheet">
+		<script src="./js/jquery.min.js"></script>
+		<script src="./js/config.js"></script>
+		<script src="./js/tooltip.js"></script>
+		<script type="text/javascript" src="http://www.supermapol.com/earth/Build/Cesium/Cesium.js"></script>
+		<style>
+			input[type=range] {
+				width: 180px;
+			}
+			
+			input[type=number] {
+				width: 50px;
+			}
+		</style>
+	</head>
+
+	<body>
+		<div id="cesiumContainer"></div>
+		<div id="toolbar" class="params-setting-container">
+			<div class="params-setting-anchor" title="显示/隐藏参数面板"><span class="fui-expand"></span></div>
+			<div class="params-setting">
+				<table>
+					<tbody>
+						<tr>
+							<td><label>裁剪宽度:</label></td>
+							<td>
+								<input type="range" id="clip-width" min="1" max="100" step="1" data-bind="value: width, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" id="clip-width-label" min="1" max="100" step="1" data-bind="value: width, valueUpdate: 'input'" />
+							</td>
+						</tr>
+						<tr>
+							<td><label>裁剪高度:</label></td>
+							<td>
+								<input type="range" id="clip-height" min="1" max="100" step="1" data-bind="value: height, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" id="clip-height-label" min="1" max="100" step="1" data-bind="value: height, valueUpdate: 'input'" />
+							</td>
+						</tr>
+						<tr>
+							<td><label>绕X轴旋转:</label></td>
+							<td>
+								<input id="pitch" type="range" min="0" max="360" step="1.0" data-bind="value: pitch, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" min="0" max="360" step="1" data-bind="value: pitch, valueUpdate: 'input'">
+							</td>
+						</tr>
+						<tr>
+							<td><label>绕Y轴旋转:</label></td>
+							<td>
+								<input id="roll" type="range" min="0" max="360" step="1.0" data-bind="value: roll, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" min="0" max="360" step="1.0" data-bind="value: roll, valueUpdate: 'input'">
+							</td>
+						</tr>
+						<tr>
+							<td>
+								<label>绕Z轴旋转:</label>
+							</td>
+							<td>
+								<input id="heading" type="range" min="0" max="360" step="1.0" data-bind="value: heading, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" min="0" max="360" step="1.0" data-bind="value: heading, valueUpdate: 'input'">
+							</td>
+						</tr>
+						<tr>
+							<td><label>拉伸:</label></td>
+							<td>
+								<input id="extrude" type="range" min="0.1" max="30" step="0.1" data-bind="value: extrudeDistance, valueUpdate: 'input'">
+							</td>
+							<td>
+								<input type="number" min="0.1" max="30" step="0.5" data-bind="value: extrudeDistance, valueUpdate: 'input'">
+							</td>
+						</tr>
+						<tr>
+							<td colspan="3">
+								<input type="button" id="choose-clip-pos" class="button black" value="选取裁剪位置" />
+								<input type="button" id="clear" class="button black" value="清除" style="margin-left: 10px;" />
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+		</div>
+
+		<script>
+			function onload(Cesium) {
+				var viewer = new Cesium.Viewer('cesiumContainer');
+				viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
+					url: 'https://dev.virtualearth.net',
+					mapStyle: Cesium.BingMapsStyle.AERIAL,
+					key: URL_CONFIG.BING_MAP_KEY
+				}));
+				var scene = viewer.scene;
+				scene.globe.depthTestAgainstTerrain = false;
+				var promise = scene.open(URL_CONFIG.SCENE_BIMBUILDING);
+				promise.then(function(layers) {
+					// 精准定位
+					scene.camera.setView({
+						destination: new Cesium.Cartesian3(-2180765.6717242915, 4379147.755349731, 4092644.516292509),
+						orientation: {
+							heading: 1.5751279310014885,
+							pitch: -1.493948327772495,
+							roll: 3.1415926535996626
+						}
+					});
+					var boxPosition, position, dim, width = 5,
+						height = 5,
+						heading = 0,
+						pitch = 0,
+						roll = 0,
+						extrudeDistance = 1.0,
+						startClip = false,
+						hasClipped = false;
+					var box = viewer.entities.add({ // 标识盒
+						position: Cesium.Cartesian3.fromDegrees(0, 0, 0),
+						show: false,
+						box: {
+							dimensions: new Cesium.Cartesian3(5, 5, 0.1),
+							fill: false,
+							outline: true,
+							outlineColor: Cesium.Color.WHITE,
+							outlineWidth: 5.0
+						}
+					});
+					var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
+					handler.setInputAction(function(movement) {
+						if(startClip) {
+							boxPosition = scene.pickPosition(movement.endPosition);
+							if(!boxPosition) {
+								return;
+							}
+							box.position = boxPosition;
+						}
+					}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+					handler.setInputAction(function(evt) {
+						if(startClip) {
+							position = scene.pickPosition(evt.position);
+							if(!position) {
+								return;
+							}
+							var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), Cesium.Math.toRadians(roll));
+							var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
+							box.orientation = orientation;
+							dim = new Cesium.Cartesian3(width, height, extrudeDistance);
+							updateClip();
+							startClip = false;
+							hasClipped = true;
+							box.show = false;
+						}
+					}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+					var viewModel = {
+						width: 5,
+						height: 5,
+						heading: 0.0,
+						pitch: 0.0,
+						roll: 0.0,
+						extrudeDistance: 1.0,
+						isMoving: false
+					};
+					Cesium.knockout.track(viewModel);
+					var toolbar = document.getElementById('toolbar');
+					Cesium.knockout.applyBindings(viewModel, toolbar);
+
+					Cesium.knockout.getObservable(viewModel, 'width').subscribe(
+						function(newValue) {
+							width = Number(newValue);
+							box.box.dimensions = new Cesium.Cartesian3(width, height, 0.1);
+							dim = new Cesium.Cartesian3(width, height, extrudeDistance);
+							if(!position) {
+								return;
+							}
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+
+					Cesium.knockout.getObservable(viewModel, 'height').subscribe(
+						function(newValue) {
+							height = Number(newValue);
+							box.box.dimensions = new Cesium.Cartesian3(width, height, 0.1);
+							dim = new Cesium.Cartesian3(width, height, extrudeDistance);
+							if(!position) {
+								return;
+							}
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+					Cesium.knockout.getObservable(viewModel, 'heading').subscribe(
+						function(newValue) {
+							heading = Number(newValue);
+							var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), Cesium.Math.toRadians(roll));
+							var orientation = Cesium.Transforms.headingPitchRollQuaternion(boxPosition, hpr);
+							box.orientation = orientation;
+							if(!position) {
+								return;
+							}
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+					Cesium.knockout.getObservable(viewModel, 'pitch').subscribe(
+						function(newValue) {
+							pitch = Number(newValue);
+							var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), Cesium.Math.toRadians(roll));
+							var orientation = Cesium.Transforms.headingPitchRollQuaternion(boxPosition, hpr);
+							box.orientation = orientation;
+							if(!position) {
+								return;
+							}
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+					Cesium.knockout.getObservable(viewModel, 'roll').subscribe(
+						function(newValue) {
+							roll = Number(newValue);
+							var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), Cesium.Math.toRadians(roll));
+							var orientation = Cesium.Transforms.headingPitchRollQuaternion(boxPosition, hpr);
+							box.orientation = orientation;
+							if(!position) {
+								return;
+							}
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+
+					Cesium.knockout.getObservable(viewModel, 'extrudeDistance').subscribe(
+						function(newValue) {
+							extrudeDistance = Number(newValue);
+							if(hasClipped) {
+								updateClip();
+							}
+						}
+					);
+
+					$("#choose-clip-pos").on("click", function() {
+						startClip = true;
+						box.show = true;
+					});
+					$("#clear").on("click", function() {
+						startClip = false;
+						box.show = false;
+						for(var i = 0, j = layers.length; i < j; i++) {
+							layers[i].clearCustomClipBox();
+						};
+						viewer.entities.removeAll();
+					});
+
+					// 折叠参数面板
+					$(".params-setting-anchor").click(function() {
+						$(".params-setting").toggleClass("params-setting-hide");
+					});
+
+					function updateClip() {
+						for(var i = 0, j = layers.length; i < j; i++) {
+							layers[i].setCustomClipCross({
+								position: position,
+								dimensions: dim,
+								heading: heading,
+								pitch: pitch,
+								roll: roll,
+								extrudeDistance: extrudeDistance
+							});
+						}
+					}
+				});
+			}
+			if (typeof Cesium !== 'undefined') {
+				window.startupCalled = true;
+				onload(Cesium);
+			}
+		</script>
+	</body>
+
+</html>
\ No newline at end of file

--
Gitblit v1.9.3