drawTool.js 7.4 KB
import createBillboard from './createBillboard';
import createPolyline from './createPolyline';
import createPolygon from './createPolygon';
import createCircle from './createCircle';
import createRectangle from './createRectangle';
export default {
    drawTool: class DrawTool {
        constructor(obj) {
            if (!obj.viewer || !obj) {
                console.warn("缺少必要参数!--viewer");
                return;
            }
            this.viewer = obj.viewer;
            this.hasEdit = obj.hasEdit;
            this.toolArr = [];
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
            this.show = obj.drawEndShow;
            // this.lastSelectEntity = null;
        }
        startDraw(opt) {
            var that = this;
            if (opt.type == "polyline") {
                var polyline = new createPolyline(this.viewer, opt.style);
                polyline.start(function (evt) {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        polyline.startModify(opt.modifySuccess);
                        that.lastSelectEntity = polyline;
                    }
                    if (opt.success) opt.success(evt);
                    if (that.show == false) polyline.setVisible(false);
                });
                this.toolArr.push(polyline);
            }
            if (opt.type == "polygon") {
                var polygon = new createPolygon(this.viewer, opt.style);
                polygon.start(function () {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        polygon.startModify();
                        that.lastSelectEntity = polygon;
                    }
                    if (opt.success) opt.success(polygon);
                    if (that.show == false) polygon.setVisible(false);
                });
                this.toolArr.push(polygon);
            }
            if (opt.type == "billboard") {
                var billboard = new createBillboard(this.viewer, opt.style);
                billboard.start(function () {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        billboard.startModify();
                        that.lastSelectEntity = billboard;
                    }
                    if (opt.success) opt.success(billboard);
                    if (that.show == false) billboard.setVisible(false);
                });
                this.toolArr.push(billboard);
            }
            if (opt.type == "circle") {
                var circle = new createCircle(this.viewer, opt.style);
                circle.start(function () {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        circle.startModify();
                        that.lastSelectEntity = circle;
                    }
                    if (opt.success) opt.success(circle);
                    if (that.show == false) circle.setVisible(false);
                });
                this.toolArr.push(circle);
            }
            if (opt.type == "rectangle") {
                var rectangle = new createRectangle(this.viewer, opt.style);
                rectangle.start(function () {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        rectangle.startModify();
                        that.lastSelectEntity = rectangle;
                    }
                    if (opt.success) opt.success(rectangle);
                    if (that.show == false) rectangle.setVisible(false);
                });
                this.toolArr.push(rectangle);
            }
            //重写材质
            if (opt.type == "flowPolyline") {
                var polyline = new CreatePolyline(this.viewer, opt.style);
                polyline.start(function () {
                    if (that.hasEdit) {
                        that.unbindEdit();
                        polyline.startModify();
                    }
                    if (opt.success) opt.success(polyline);
                });
                this.toolArr.push(polyline);
            }
        }
        createByPositions(opt) {
            if (this.hasEdit) {
                this.bindEdit();
            }
            if (!opt) opt = {};
            if (opt.type == "polyline") {
                var polyline = new CreatePolyline(this.viewer, opt.style);
                polyline.createByPositions(opt.positions, opt.success);
                this.toolArr.push(polyline);
            }
            if (opt.type == "polygon") {
                var polygon = new CreatePolygon(this.viewer, opt.style);
                polygon.createByPositions(opt.positions, opt.success);
                this.toolArr.push(polygon);
            }
            if (opt.type == "billboard") {
                var billboard = new CreateBillboard(this.viewer, opt.style);
                billboard.createByPositions(opt.positions, function(){
                    if(opt.success) opt.success(billboard)
                });
                this.toolArr.push(billboard);
            }
        }
        destroy() {
            for (var i = 0; i < this.toolArr.length; i++) {
                var obj = this.toolArr[i];
                obj.destroy();
            }
        }
        bindEdit() {
            var that = this;
            this.handler.setInputAction(function (evt) { //单机开始绘制
                var pick = that.viewer.scene.pick(evt.position);
                if (Cesium.defined(pick) && pick.id) {
                    for (var i = 0; i < that.toolArr.length; i++) {
                        if (pick.id.objId == that.toolArr[i].objId && (that.toolArr[i].state == 1||that.toolArr[i].state == 2)) {
                            if (that.lastSelectEntity) {
                                that.lastSelectEntity.endModify();
                            }
                            that.toolArr[i].startModify();
                            that.lastSelectEntity = that.toolArr[i];
                            break;
                        }
                    }
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        }
        unbindEdit() {
            for (var i = 0; i < this.toolArr.length; i++) {
                this.toolArr[i].endModify();
            }
        }
        getCatesian3FromPX(px, viewer, entitys) {
            var picks = viewer.scene.drillPick(px); 
            this.viewer.scene.render();
            var cartesian;
            var isOn3dtiles = false;
            for (var i = 0; i < picks.length; i++) {
                var isContinue = false;
                for (var step = 0; step < entitys.length; step++) {
                    if (entitys[step] && picks[i].id && entitys[step].objId == picks[i].id.objId) {
                        isContinue = true;
                        break;
                    }
                }
                if (isContinue) continue;
                if ((picks[i] && picks[i].primitive) || picks[i] instanceof Cesium.Cesium3DTileFeature) { //模型上拾取
                    isOn3dtiles = true;
                }
            }
            if (isOn3dtiles) {
                cartesian = viewer.scene.pickPosition(px);
            } else {
                var ray = viewer.camera.getPickRay(px);
                if (!ray) return null;
                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
            }
            return cartesian;
        }
    }
}