Browse Source

设备台账BIM模型中坐标的更改

zhulizhen1111 4 years ago
parent
commit
1bef3ab3e2

+ 22 - 1
src/components/ledger/handsontables/device.vue

@@ -22,6 +22,8 @@
     </div>
     <!-- 二维码弹窗 -->
     <qrcode :dialog="myDialog" :qrcodeUrl="qrcodeUrl" :addBody="true" ref="qrcode"></qrcode>
+    <!-- bim坐标弹框 -->
+     <bimDialog :dialog="myDialog" :bimcodeobj="bimcodeobj" @closeBIM='closeBIM' :addBody="true" ref="bimdialog"></bimDialog>
     <!-- 型号弹窗 -->
     <firm
         :mess="{deviceId: deviceType.assetType}"
@@ -162,6 +164,7 @@
   import buildFloor from '@/utils/handsontable/buildFloorData'
 
   import qrcode from "@/components/ledger/lib/qrcode"
+  import bimDialog from '@/components/ledger/lib/bimDialog'
   import firm from "@/components/dialogs/list/firm"
   import supplyDialog from "@/components/dialogs/list/supplyDialog"
   import supplierDialog from "@/components/dialogs/list/supplierDialog"
@@ -205,7 +208,8 @@
       changeRea,
       lookPic,
       myCascader,
-      batchDialog
+      batchDialog,
+      bimDialog
     },
     created() {
       buildFloor.getData(this.buildFloorData)
@@ -253,6 +257,7 @@
         },
         myDialog: {
           qrcode: false, //二维码弹窗
+          bimcode:false,//bim弹窗
           firm: false, //厂商弹窗
           supply: false, //选择供应合同
           supplier: false, //供应商选择
@@ -282,6 +287,7 @@
         showType: 'Visible',
         linkNameFalg: true,
         qrcodeUrl: "", //二维码图片地址
+        bimcodeobj:"",//BIM对象
         loading: false,
         deviceType: {}, //族3位编码及名称
         floorData: [],
@@ -385,6 +391,7 @@
           };
           getDataDictionary(params, res => {
             this.tableHeader = res.Content;
+            console.log(this.tableHeader)
             this.tableHeader.forEach(item => {
               if (item.Path) {
                 this.inputMap[item.Path] = item
@@ -397,6 +404,11 @@
           });
         }
       },
+      //关闭弹窗
+      closeBIM(){
+        this.myDialog.bimcode = false
+        
+      },
       //获取主体数据
       getTableData() {
         this.loading = true
@@ -1063,6 +1075,15 @@
                       this.$message("此设备没有设备二维码");
                   }
                   return false
+              //BIM模型中坐标
+              case 'BIMLocation':
+                  this.bimcodeobj = this.tableData[row.row];
+                  if (Object.keys(this.bimcodeobj).length>0) {
+                      this.myDialog.bimcode = true;
+                  } else {
+                      this.$message("此设备没有BIM模型中坐标");
+                  }
+                  return false
               //关联系统
               case 'LinkSystem':
                   this.curDevice = infos.EquipID;

+ 277 - 0
src/components/ledger/lib/bimDialog.vue

@@ -0,0 +1,277 @@
+<template>
+    <el-dialog
+        title='修改BIM模型中的坐标'
+        v-if='dialog.bimcode'
+        custom-class='custom-dialog'
+        :visible.sync='dialog.bimcode'
+        width='900px'
+        @close='handleClose'
+    >
+        <div id='bim-code' v-if='Object.keys(bimcodeobj).length>0'>
+            <div class='eq'>
+                <span class='eq-name'>设备名称 &nbsp;&nbsp;</span>
+                {{bimcodeobj.EquipLocalName || bimcodeobj.EquipName|| '--'}}
+            </div>
+            <div>
+                <noAllDataFloor @change='changeFloor' ref='floors' @getFloorMap='getFloorMap'></noAllDataFloor>
+                <span v-if='isShow' class='errMsg'>请选择设备所属建筑楼层</span>
+            </div>
+            <div class='canvas-box' v-loading='canvasLoading'>
+                <canvas v-show='isdata' :id='`floorCanvas${id}`' :width='cadWidth' :height='cadHeight' ref='canvas' tabindex='0'></canvas>
+                <p v-show='!isdata'>当前楼层暂无平面图,请前往“建筑楼层管理”中给楼层添加平面图</p>
+            </div>
+        </div>
+        <div slot='footer' class='footer'>
+            <el-button @click='handleClose'>取 消</el-button>
+            <el-button type='primary' @click='save'>确 定</el-button>
+        </div>
+    </el-dialog>
+</template>
+<script>
+import noAllDataFloor from './noAllDataFloor'
+import { LocationPointScene, FloorView, Opt } from '@saga-web/cad-engine/lib'
+import { SColor, SPoint } from '@saga-web/draw/lib'
+import { floorQueryOutline, updateEquip } from '@/api/scan/request'
+import { SGraphyItem } from '@saga-web/graphy/lib'
+export default {
+    components: {
+        noAllDataFloor,
+    },
+    props: {
+        dialog: {
+            type: Object,
+            default: function () {
+                return {
+                    bimcode: false,
+                }
+            },
+        },
+        bimcodeobj: {
+            default: {},
+        },
+    },
+    data() {
+        return {
+            cadWidth: 800,
+            cadHeight: 400,
+            Buildfloor: '',
+            value: [],
+            isdata: true,
+            floorData: {},
+            canvasLoading: false,
+            isShow: false,
+            id: 'ty',
+            view: '',
+            drawMainScene: '',
+            floorToMap: {},
+        }
+    },
+    created() {},
+    mounted() {
+        console.log(this.bimcodeobj)
+        this.init()
+    },
+    methods: {
+        init() {
+            this.isShow = true
+            this.$nextTick(function () {
+                if (this.bimcodeobj.FloorId) {
+                    this.isShow = false
+                }
+                if (this.$refs.floors) {
+                    this.$refs.floors.setValue([this.bimcodeobj.BuildingId, this.bimcodeobj.FloorId])
+                }
+            })
+        },
+        //切换楼层
+        changeFloor(value) {
+            this.Buildfloor = value
+            this.isShow = true
+            if (value.length > 1) {
+                this.isShow = false
+                this.floorData = this.floorToMap[value[1]]
+            } else {
+                this.isShow = false
+                this.floorData = {}
+            }
+            this.getFloorData()
+        },
+        // 初始化canvas
+        initGraphy(Id, type) {
+            // type=1 => id:模型id 这里不需要
+            // type=2 => id:floormap jsonz格式
+            // type = 3 => id:floormap png或者jpg格式
+            let that = this
+            that.clearGraphy()
+            that.drawMainScene = new LocationPointScene()
+            that.canvasLoading = true
+            if (type == 2) {
+                that.drawMainScene.loadUrl(`/image-service/common/file_get?systemId=revit&key=${Id}`).then((res) => {
+                    that.getGraphtSuc(res)
+                })
+            } else if (type == 3) {
+                that.drawMainScene.loadImg(`/image-service/common/image_get?systemId=dataPlatform&key=${Id}`, (res) => {
+                    that.getGraphtSuc(res)
+                })
+            }
+        },
+        // 获取底图成功
+        getGraphtSuc(res) {
+            this.canvasLoading = false
+            if (res == 'error') {
+                this.FloorMap = ''
+                this.$message.warning('数据解析异常')
+                return
+            }
+            if (res.Result == 'failure') {
+                this.showTools = false
+                this.$message.warning(res.Message)
+                return
+            }
+            this.view.scene = this.drawMainScene
+            let obj = {
+                X: this.bimcodeobj.LocationJson.X,
+                Y: -this.bimcodeobj.LocationJson.Y,
+            }
+            //回写编辑
+            this.drawMainScene.addMarker(obj)
+            this.view.fitSceneToView()
+            this.drawMainScene.isSpaceSelectable = false
+            this.drawMainScene.spaceClick(this, this.canvasClick)
+            if (this.floorData.Outline && this.floorData.Outline.length) {
+                let newArr = this.floorData.Outline.map((t) => {
+                    return new SPoint(t.X, t.Y)
+                })
+                this.drawMainScene.addSceneMark(newArr)
+            }
+        },
+        //获取楼层数据
+        getFloorData() {
+            console.log(this.floorData)
+            if (this.floorData && this.floorData.StructureInfo && this.floorData.StructureInfo.FloorMap) {
+                this.isdata = true
+                let floorMap = this.floorData.StructureInfo.FloorMap
+                if (floorMap.split('.')[1].toString() == 'png' || floorMap.split('.')[1].toString() == 'jpg') {
+                    this.initGraphy(floorMap, 3)
+                } else {
+                    this.initGraphy(floorMap, 2)
+                }
+            } else {
+                //暂无数据
+                this.isdata = false
+                this.clearGraphy()
+            }
+        },
+        //关闭弹窗
+        handleClose() {
+            this.view = ''
+            this.drawMainScene = ''
+            this.$emit('closeBIM')
+        },
+        //保存事件
+        save() {
+            if (this.drawMainScene) {
+                if (this.drawMainScene.markerList.length) {
+                    let obj = this.drawMainScene.markerList[0]
+                    console.log(obj)
+                    let param = {
+                        Content: [
+                            {
+                                EquipID: this.bimcodeobj.EquipID,
+                                BuildingId: this.Buildfloor[0],
+                                FloorId: this.Buildfloor[1],
+                                BIMLocation: `${obj.x.toFixed(2)},${(obj.y * -1).toFixed(2)},${this.bimcodeobj.BIMLocation.split(',')[2]}`,
+                            },
+                        ],
+                        Projection: ['BIMLocation', 'BuildingId', 'FloorId'],
+                    }
+                    updateEquip(param, (res) => {
+                        console.log(res)
+                        if (res.Result == 'success') {
+                            this.$message.success('保存成功')
+                            this.handleClose()
+                        }
+                    })
+                }
+            }
+        },
+        // 清空平面图
+        clearGraphy() {
+            if (this.view) {
+                this.view.scene = null
+                return
+            }
+            let id = `floorCanvas${this.id}`
+            this.view = new FloorView(id)
+        },
+        //得到floormap
+        getFloorMap(val) {
+            this.floorToMap = val
+            this.floorData = this.floorToMap[this.bimcodeobj.FloorId]
+            this.getFloorData()
+        },
+        // canvas点击事件
+        canvasClick(item, event) {
+            if (item instanceof SGraphyItem) {
+                this.clearMark()
+                let obj = {
+                    X: event[0].x,
+                    Y: event[0].y,
+                }
+                this.drawMainScene.addMarker(obj)
+            }
+        },
+        //清空标记
+        clearMark() {
+            if (this.drawMainScene) {
+                this.drawMainScene.markerList.forEach((t) => {
+                    this.drawMainScene.removeItem(t)
+                })
+                this.drawMainScene.markerList = []
+            }
+        },
+    },
+    watch: {
+        bimcodeobj: {
+            immediate: true,
+            handler(val) {
+                this.init()
+            },
+        },
+    },
+}
+</script>
+<style lang="less" scoped>
+#bim-code {
+    height: 500px;
+    .eq {
+        padding-bottom: 10px;
+        .eq-name {
+            color: #999999;
+            padding-left: 10px;
+        }
+    }
+    .errMsg {
+        color: red;
+        padding-left: 10px;
+    }
+    #buildFloor {
+        clear: both;
+        margin-bottom: 10px;
+    }
+    .canvas-box {
+        border: 1px solid #ccc;
+        clear: both;
+        width: 800px;
+        height: 400px;
+        margin-left: 10px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+    }
+}
+</style>
+<style lang="less" >
+#bim-code {
+}
+</style>

+ 149 - 0
src/components/ledger/lib/noAllDataFloor.vue

@@ -0,0 +1,149 @@
+<template>
+    <div id="buildFloor">
+        <span class="buildFloor">建筑楼层</span>
+        <el-cascader placeholder="请选择建筑楼层" :options="options" v-model="value" filterable size="small" :style="isWidth ? '' : 'width:160px;'" @change="changeCascader"></el-cascader>
+    </div>
+</template>
+<script>
+    import tools from "@/utils/scan/tools"
+    import { floorQuery, buildingQuery } from '@/api/scan/request'
+    import { mapGetters, mapActions } from "vuex"
+    export default {
+        props: {
+            isWidth: {
+                type: Boolean,
+                default: true
+            },
+            type: {
+                type: String,
+                default: "yes"
+            }
+        },
+        computed: {
+            ...mapGetters("layout", [
+                "projectId",
+                "secret",
+                "userId"
+            ])
+        },
+        data() {
+            return {
+                options: [],
+                param: {
+                    ProjId: '',
+                    secret: ''
+                },
+                value: [],
+                floorToMap:{}
+            };
+        },
+        created() {
+            this.param.ProjId = this.projectId
+            this.param.secret = this.secret
+            this.getData()
+        },
+        watch: {
+            projectId() {
+                this.options = [];
+                this.param.ProjId = this.projectId
+                this.param.secret = this.secret
+                this.getData()
+                this.changeCascader([])
+            }
+        },
+        methods: {
+            //设置默认选项
+            setValue(val) {
+                if (val && val.length) {
+                    this.value = val
+                }
+            },
+            //获取数据
+            getData() {
+                let data, buildParams = {
+                    PageNumber: 1,
+                    PageSize: 1000,
+                    Orders: "BuildLocalName asc",
+                    Projection: [
+                        "BuildID",
+                        "BuildLocalName"
+                    ]
+                }, floorParams = {
+                    Orders: "FloorSequenceID desc",
+                    PageNumber: 1,
+                    PageSize: 1000
+                }
+                let promise1 = new Promise((resolve, reject) => {
+                    buildingQuery(buildParams, res => {
+                        resolve(res)
+                    })
+                })
+                let promise2 = new Promise((resolve, reject) => {
+                    floorQuery(floorParams, res => {
+                        resolve(res)
+                    })
+                })
+                Promise.all([promise1, promise2]).then(values => {
+                    let builData = values[0].Content, floorData = values[1].Content
+                    data = builData.map(build => {
+                        return {
+                            value: build.BuildID,
+                            label: build.BuildLocalName
+                        }
+                    })
+                    data.unshift({
+                        value: "noKnow",
+                        label: "未明确建筑"
+                    })
+                    data.forEach(build => {
+                        floorData.forEach(floor => {
+                            this.floorToMap[floor.FloorID] = floor;
+                            if (build.value == floor.BuildID && floor.FloorID && floor.FloorLocalName && this.type == "yes") {   
+                                if (build.children) {
+                                    build.children.push({
+                                        value: floor.FloorID,
+                                        label: floor.FloorLocalName,
+                                        FloorSequenceID: floor.FloorSequenceID
+                                    })
+                                } else {
+                                    build.children = []
+                                    build.children.push({
+                                        value: 'noKnow',
+                                        label: "未明确楼层"
+                                    },{
+                                        value: floor.FloorID,
+                                        label: floor.FloorLocalName,
+                                        FloorSequenceID: floor.FloorSequenceID
+                                    })
+                                }
+                            }
+                        })
+                    })
+                    console.log(this.floorToMap)
+                    this.$emit('getFloorMap',this.floorToMap)
+                    this.options = data
+                })
+            },
+            //改变item
+            changeCascader(value) {
+                this.$emit("change", value)
+            }
+        }
+    };
+</script>
+<style lang="less">
+    .el-cascader .el-input .el-input__inner {
+        vertical-align: bottom;
+    }
+</style>
+<style lang="less" scoped>
+    #buildFloor {
+        margin-left: 10px;
+        float: left;
+    }
+    .buildFloor {
+        color: #999999;
+        font-size: 14px;
+        margin-right: 12px;
+    }
+</style>