中化加油站项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

632 lines
23 KiB

import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { Game } from 'src/app/babylon/game';
import { LoginSatus } from 'src/app/babylon/controller/status/login-status';
import { StatusManager } from 'src/app/babylon/controller/status/status-manager';
import { InsitutionDataSimple } from 'src/app/babylon/model/data/institution/institution-data-simple';
import { ModeManager, ModeType } from 'src/app/babylon/controller/mode-manager';
import { ServeManager } from 'src/app/babylon/controller/serve-manager';
import { BuildingBasicInfosService } from 'src/app/service/babylon/building-basic-infos.service';
import { ObjectsService } from 'src/app/service/objects.service';
import { ToolbarWindow } from 'src/app/babylon/view/toolbar-window/toobar-window';
import { BuildingStatus } from 'src/app/babylon/controller/status/building-status';
import { BuildingUIItem } from 'src/app/babylon/view/building-window/building-ui-item';
import { BuildingType } from 'src/app/babylon/model/data/institution/building/building-data';
import { BuildingWindow } from 'src/app/babylon/view/building-window/building-window';
import { FacilityUIItem } from 'src/app/babylon/view/facility-window/facility-ui-item';
import { FacilityWindow } from 'src/app/babylon/view/facility-window/facility-window';
import { FacilityInfoUIItem } from 'src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item';
import { EventManager } from '@angular/platform-browser';
import { NzMessageService } from 'ng-zorro-antd/message';
import { LeftDomainComponent } from '../left-domain/left-domain.component';
import { JYZInfoMoudleType } from 'src/app/babylon/model/data/institution/jyz-show-data';
import { AllMarkData } from 'src/app/babylon/model/data/mark/all-mark-data';
import { MarkData } from 'src/app/babylon/model/data/mark/mark-data';
import { MarkWindow } from 'src/app/babylon/view/mark-window/mark-window';
import { AllMarkPlanData, MarkNodeData, MarkPlanData } from 'src/app/babylon/model/data/mark/mark-plan-data';
@Component({
selector: 'app-plan',
templateUrl: './plan.component.html',
styleUrls: ['./plan.component.scss', './publicPop.scss']
})
export class PlanComponent implements OnInit {
constructor(private element: ElementRef, private buildingBISrv: BuildingBasicInfosService, private objectsSrv: ObjectsService, private eventManager: EventManager, private message: NzMessageService) { }
static instance: PlanComponent;
public game: Game = new Game();
public beforeOneSatus; //当前 satus
public canvas: HTMLCanvasElement; //canvas 实例
public editMode: boolean = true; //编辑/查看 模式
public userMode: boolean = ModeManager.s_isMakeMode; //是否为 内部权限
public isShowLoading: boolean = true; //显隐 loading加载条
ngOnInit(): void {
PlanComponent.instance = this;
ServeManager.Init(this.buildingBISrv, this.objectsSrv);
this.canvas = this.element.nativeElement.querySelector('#center') as HTMLCanvasElement;
this.game.init(this.canvas);
let editMode = sessionStorage.getItem('isGasStation')
if (editMode == 'false') {
this.editMode = true
ModeManager.currentMode = ModeType.Edit
} else {
this.editMode = false
ModeManager.currentMode = ModeType.Look
}
//监听 delete键盘事件
this.eventManager.addGlobalEventListener('window', 'keydown', (event: any) => {
if (event.keyCode == 46) { //delete
if (this.beforeOnePropertyData) {
let isDelete = confirm("是否删除已选择模型?");
if (isDelete) { this.beforeOnePropertyData.askDelete(false) };
}
}
})
//监听 delete键盘事件
}
ngAfterViewInit(): void {
let simpleData: InsitutionDataSimple = new InsitutionDataSimple();
simpleData.id = 1; //来自选中的单位的信息 ,测试:1
simpleData.key = "ceshi"; //正式: id.tostring(),测试:"ceshi"
simpleData.name = "测试"; //来自选中的单位的信息 ,测试:"测试"
let has3dData = true;//是否有三维数据,来自选中单位的信息
let loginStatus = StatusManager.getStatus<LoginSatus>(LoginSatus);
if (ModeManager.institutionDemoKey == ModeManager.c_demoKey_null) { //无指定测试单位,则为正式启动,根据当前单位key寻找
if (has3dData) { //如果已经有三维数据,直接进入
this.beforeOneSatus = StatusManager.getStatus<LoginSatus>(LoginSatus);
this.beforeOneSatus.onSelectInsSuccess(simpleData)
} else { //如果没有三维数据
if (ModeManager.s_isMakeMode) //内部制作模式下,询问新建
{
let isAdd = confirm('没有单位' + simpleData.key + ',是否进行初始化?')
if (isAdd) {
let name = simpleData.key;
let id = 2;// 单位id
loginStatus.createInsitution(simpleData.key, name, id);
}
}
else //非内部制作模式,不开启
{
console.log("没有单位" + simpleData.key);
}
}
} else {
//let find = data.find(item => { return item.key === ModeManager.institutionDemoKey })
let find = simpleData; //测试单位
if (find) {
sessionStorage.setItem('unitId', find.key)
this.beforeOneSatus = StatusManager.getStatus<LoginSatus>(LoginSatus);
this.beforeOneSatus.onSelectInsSuccess(find)
} else {
//this.modelInit(data) //开发模式 选择单位 弹窗
}
}
}
ngOnDestroy(): void { //组件销毁前 销毁canvas
this.game.dispose();
this.game = null;
}
//开发模式 选择单位 弹窗
modelInit(InsList) { }
allFence: string[] = ["基本信息", "加油机", "油罐设备", "消防设施", "安全疏散", "输油管线", "油气回收", "应急预案"]; //头部 功能栏
selectFence: number = -1; //选中 头部功能栏
isShowChildComponent: boolean = false; //是否 显示左侧子组件
@ViewChild('leftDomain') leftDomain: LeftDomainComponent; //子组件引用
isOpenAwning: boolean = true; //是否 打开罩棚
selectMeasure: number = 0; //当前选择 测量工具
//切换 头部功能栏
toggleHeaderFence(type: number) {
this.beforeOneSatus = StatusManager.getStatus<BuildingStatus>(BuildingStatus);
let buildingWindow: BuildingWindow = this.beforeOneSatus.buildingWindow;
let fenceType: JYZInfoMoudleType = this.getFenceType(type)
this.isShowNature = false //隐藏属性栏
if (this.selectFence != type) {
if (this.selectFence === 7) { //初始化 应急预案模块
this.initializePlan()
}
this.isShowChildComponent && this.leftDomain && type != 4 ? this.leftDomain.initComponent(type) : null; //手动初始化子组件
this.selectFence = type
this.isShowChildComponent = true
buildingWindow.changeJYZInfoModel(fenceType, true)
} else { //取消选中
this.selectFence = -1
this.isShowChildComponent = false
buildingWindow.changeJYZInfoModel(fenceType, false)
if (type === 7) { //初始化 应急预案模块
this.initializePlan()
}
}
}
//获取 头部功能栏Type
getFenceType(type: number): JYZInfoMoudleType {
let fenceType
if (type === 0) {
fenceType = JYZInfoMoudleType.JBXX
} else if (type === 1) {
fenceType = JYZInfoMoudleType.JYJ
} else if (type === 2) {
fenceType = JYZInfoMoudleType.YG
} else if (type === 3) {
fenceType = JYZInfoMoudleType.XF
} else if (type === 4) {
fenceType = JYZInfoMoudleType.AQSS
} else if (type === 5) {
fenceType = JYZInfoMoudleType.SYG
} else if (type === 6) {
fenceType = JYZInfoMoudleType.YQHSGX
} else if (type === 7) {
fenceType = JYZInfoMoudleType.YJCZ
}
return fenceType
}
//子组件 创建预案/保存
noticeChildComponent(type: boolean) {
if (this.isShowChildComponent && this.leftDomain) {
if (type) { //创建预案
this.leftDomain.addDisposalPop = true
} else { //整体保存
this.leftDomain.saveDisposal()
}
}
}
//切换 头部罩棚
toggleHeaderAwning(isOpen: boolean) {
this.isOpenAwning = isOpen;
ToolbarWindow.instance.showZP(isOpen)
}
//切换 测量工具
toggleMeasure(type: number) {
if (this.selectMeasure != type) { //切换工具
this.selectMeasure = type
if (type === 1) {
ToolbarWindow.instance.measureDistance()
} else if (type === 2) {
ToolbarWindow.instance.measureHeight()
} else {
ToolbarWindow.instance.measureArea()
}
} else { //关闭测量工具
this.selectMeasure = 0
ToolbarWindow.instance.endMeasure()
}
}
buildingUIItems: BuildingUIItem[] = []; //左侧 建筑list
beforeOneBuildingID: string = null; //选中 左侧建筑ID
modelBuilding: modelBuilding = new modelBuilding(); //创建/编辑 建筑ngModel数据
addBuildingPop: boolean = false; //显隐 新增左侧建筑弹窗
editBuildingPop: BuildingUIItem = null; //显隐 编辑左侧建筑弹窗
isShowLeftBuilding: boolean = true; //显隐 建筑list
toggleLeftBuilding(e) { this.isShowLeftBuilding = e }; //显隐 建筑list
uploadList: File[] = []; //多选上传文件
//选择文件
selectFile(e) {
if (e.target.files.length) {
this.uploadList = [] //多选上传
Object.keys(e.target.files).forEach(item => { this.uploadList.push(e.target.files[item]) })
}
}
//选择建筑
selectLeftBuilding(e) {
let item: BuildingUIItem = e;
this.beforeOneBuildingID = item.getBuildingID()
item.select();
}
//创建/编辑建筑
addModelBuilding(e: modelBuilding) {
if (this.addBuildingPop) { //新增
let order = this.buildingUIItems.length + 1;
this.beforeOneSatus = StatusManager.getStatus<BuildingStatus>(BuildingStatus);
let buildingWindow: BuildingWindow = this.beforeOneSatus.buildingWindow;
let newBuildingData = this.beforeOneSatus.createOneBuildingInData(e.name, e.name, e.modelType);
buildingWindow.changeModel(this.uploadList, newBuildingData);
buildingWindow.createOneBuildingItem(newBuildingData, order);
this.modelBuilding = new modelBuilding();
this.buildingUIItems = this.beforeOneSatus.buildingWindow.buildingUIItems; //更新 建筑列表list
this.addBuildingPop = false; //关闭弹窗
} else if (this.editBuildingPop) { //编辑
this.editBuildingPop.setBuildingName(e.name);
this.editBuildingPop.changeModel(this.uploadList);
this.editBuildingPop = null; //关闭弹窗
}
}
//打开编辑建筑 弹窗
editModelBuilding(event, e: BuildingUIItem) {
event.stopPropagation()
this.modelBuilding.name = JSON.parse(JSON.stringify(e.getBuildingName()))
this.modelBuilding.modelType = JSON.parse(JSON.stringify(e.getBuildingType()))
this.editBuildingPop = e; //打开弹窗
}
//聚焦 建筑
positionModelBuilding(event, e: BuildingUIItem) {
event.stopPropagation()
e.lookAt()
}
//删除建筑
deleteModelBuilding(event, e: BuildingUIItem) {
event.stopPropagation()
let isTrue = confirm('您确定要删除吗')
if (isTrue) {
this.beforeOneSatus = StatusManager.getStatus<BuildingStatus>(BuildingStatus);
let buildingWindow: BuildingWindow = this.beforeOneSatus.buildingWindow;
buildingWindow.deleteBuilding(e)
this.buildingUIItems = this.beforeOneSatus.buildingWindow.buildingUIItems; //更新 建筑列表list
}
}
allFacilityUIItemes: FacilityUIItem[] = []; //右侧所有 图标
allMarkData: planIcons = new planIcons(); //右侧处置预案所有 图标
beforeOneIcon: string = null; //当前选择 图标
// 获取 底部图标栏list
getAllIcons(e: FacilityWindow) {
this.allFacilityUIItemes = e.allFacilityUIItemes
this.beforeOneIcon = null
}
//选择底部图标
selectBottomIcon(e: FacilityUIItem | MarkData) {
if (e instanceof FacilityUIItem) {
if (this.beforeOneIcon != e.getIconID()) {
this.beforeOneIcon = e.getIconID()
e.select()
} else {
this.beforeOneIcon = null
e.unSelect()
}
} else if (e instanceof MarkData) {
if (this.beforeOneIcon != e.key) {
this.beforeOneIcon = e.key
MarkWindow.instance.selectMarkDataPrefab(true, e)
} else {
this.beforeOneIcon = null
MarkWindow.instance.selectMarkDataPrefab(false, e)
}
}
}
//取消选择 底部图标
unSelectBottomIcon() {
if (this.beforeOneIcon) {
let e: FacilityUIItem = this.allFacilityUIItemes.find(item => { return item.getIconID() === this.beforeOneIcon })
e ? e.unSelect() : null
this.beforeOneIcon = null
}
}
//底部图标栏 滚动条
bottomScroll(e) {
let bootomDiv = this.element.nativeElement.querySelector('#bottomCenter')
e == 0 ? bootomDiv.scrollLeft = bootomDiv.scrollLeft + 50 : bootomDiv.scrollLeft = bootomDiv.scrollLeft - 50
}
isShowNature: boolean = false; //显隐设备 属性栏
beforeOnePropertyData: FacilityInfoUIItem = null; //当前选择 设备
naturePosition: naturePosition = new naturePosition(); //设备栏 定位位置
//选中 设备
selectProperty(e: FacilityInfoUIItem) {
this.isShowNature = true
this.beforeOnePropertyData = e
console.log(e.getPropertyData(), '选中设备')
if (this.isShowChildComponent && this.leftDomain) {
this.leftDomain.selectFacilityId = e.getID()
}
}
allMarkPlanData: AllMarkPlanData; //处置预案节点 数据
beforeEmergencyPlan: MarkPlanData = new MarkPlanData(-99, "请选择节点"); //当前选择 应急预案
beforePlanNode: MarkNodeData = new MarkNodeData(-99, "请选择节点"); //当前选择 预案节点
nzCurrent: number = -1; //当前选择 预案节点Index
isSuspend: boolean = false; //是否暂停 自动切换节点
timer: any; //定时器
progressList: number[] = []; //进度条 条/值
updateTimer: any; //更新进度条定时器
//初始化 应急预案模块
initializePlan() {
this.beforeEmergencyPlan = new MarkPlanData(-99, "请选择节点")
this.beforePlanNode = new MarkNodeData(-99, "请选择节点")
this.isSuspend = false //初始化暂停状态
window.clearTimeout(this.timer) //清除定时器
this.progressList = []
window.clearTimeout(this.updateTimer) //清除定时器
}
//公用 切换选中节点
publicToggleNode() {
return new Promise((resolve, reject) => {
this.beforePlanNode = this.beforeEmergencyPlan.nodes[this.nzCurrent]
this.leftDomain.selectPlanId = this.beforeEmergencyPlan.id
this.leftDomain.selectNodeId = this.beforePlanNode.id
MarkWindow.instance.selectMarkNode(this.beforeEmergencyPlan.id, this.beforePlanNode.id, false, true)
this.beforePlanNode = MarkWindow.instance.currentMarkNodeInfo.nodeData
this.updateProgress() //更新进度条
resolve(true)
})
}
//选中 底部一级节点 开启自动播放
selectChildNode(item: MarkPlanData) {
if (this.isShowChildComponent && this.leftDomain) {
if (item.nodes.length) {
let isTrue = confirm("即将开始播放节点")
if (isTrue) {
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.nzCurrent = 0
this.beforeEmergencyPlan = item
this.updateProgressList().then(res=>{
this.publicToggleNode().then(data=>{
!this.isSuspend? this.autoPlay() : null
})
})
}
} else {
this.message.info('暂无数据节点');
}
}
}
//更新进度条 值
updateProgress() {
if (this.progressList[this.nzCurrent] >= 100) {
this.progressList[this.nzCurrent] = 100
window.clearTimeout(this.updateTimer) //清除定时器
return
}
let time: number = this.beforePlanNode.getShowTime() || 1
this.updateTimer = window.setTimeout(()=>{
this.progressList[this.nzCurrent] = this.progressList[this.nzCurrent] + Math.ceil(100 / time)
this.updateProgress()
},1000)
}
//更新进度条 条数
updateProgressList() {
return new Promise((resolve, reject) => {
this.progressList = []
this.beforeEmergencyPlan.nodes.forEach(item=>{ this.progressList.push(0) })
resolve(true)
})
}
//自动播放-切换接点
autoPlay() {
let time: number = this.beforePlanNode.getShowTime() || 1
this.timer = window.setTimeout(()=>{
if (this.nzCurrent >= this.beforeEmergencyPlan.nodes.length - 1) {
this.isSuspend = false //初始化暂停状态
window.clearTimeout(this.timer) //清除定时器
this.message.info('已播放至最后一节点');
return
}
this.nzCurrent = this.nzCurrent + 1
this.publicToggleNode().then(data=>{
!this.isSuspend? this.autoPlay() : null
})
},time * 1000)
}
//切换预案节点
changePlanNode(event){
if (this.progressList.length != this.beforeEmergencyPlan.nodes.length) {
this.updateProgressList()
}
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.nzCurrent = event
this.progressList[this.nzCurrent] = 0
this.publicToggleNode()
}
//切换预案节点 上一个
toLast() {
if (this.beforeEmergencyPlan.id === -99 || this.beforePlanNode.id === -99) {
this.message.info('请选择节点');
return
}
if (this.nzCurrent <= 0) {
this.message.info('目前已经是第一节点');
return
}
if (this.progressList.length != this.beforeEmergencyPlan.nodes.length) {
this.updateProgressList()
}
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.nzCurrent = this.nzCurrent - 1
this.progressList[this.nzCurrent] = 0
this.publicToggleNode().then(data=>{
//!this.isSuspend? this.autoPlay() : null
})
}
//切换预案节点 暂停
suspend(isSuspend: boolean) {
if (this.beforeEmergencyPlan.id === -99 || this.beforePlanNode.id === -99) {
this.message.info('请选择节点');
return
}
if (this.progressList.length != this.beforeEmergencyPlan.nodes.length) {
this.updateProgressList()
}
this.isSuspend = isSuspend
let msg: string = this.isSuspend? "目前已暂停" : "目前已开始播放"
this.message.info(msg);
if (this.isSuspend) { //暂停
window.clearTimeout(this.timer) //清除定时器
window.clearTimeout(this.updateTimer) //清除定时器
} else { //开启
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.progressList.forEach((item,index)=>{ index >= this.nzCurrent? this.progressList[index] = 0 : null })
MarkWindow.instance.selectMarkNode(this.beforeEmergencyPlan.id, this.beforePlanNode.id, false, true)
this.updateProgress()
this.autoPlay()
}
}
//切换预案节点 初始化
initialize() {
if (this.beforeEmergencyPlan.id === -99 || this.beforePlanNode.id === -99) {
this.message.info('请选择节点');
return
}
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.updateProgressList().then(res=>{
this.nzCurrent = 0
this.publicToggleNode().then(data=>{
!this.isSuspend? this.autoPlay() : null
})
})
}
//切换预案节点 下一个
toNext() {
if (this.beforeEmergencyPlan.id === -99 || this.beforePlanNode.id === -99) {
this.message.info('请选择节点');
return
}
if (this.nzCurrent >= this.beforeEmergencyPlan.nodes.length - 1) {
this.message.info('目前已经是最后一个节点');
return
}
if (this.progressList.length != this.beforeEmergencyPlan.nodes.length) {
this.updateProgressList()
}
this.timer? window.clearTimeout(this.timer) : null //清除定时器
this.updateTimer? window.clearTimeout(this.updateTimer) : null //清除定时器
this.nzCurrent = this.nzCurrent + 1
this.progressList[this.nzCurrent] = 0
this.publicToggleNode().then(data=>{
//!this.isSuspend? this.autoPlay() : null
})
}
//获取进度条 flex分布
getProgressFlex(e: MarkNodeData):string {
let length: number = 0
this.beforeEmergencyPlan.nodes.forEach(item=>{
length = length + (item.getShowTime() || 1)
})
let percentage: number = (e.getShowTime() || 1) / length
return `${percentage * 100}%`
}
//选中应急预案 设备
selectSandTableMark(markData: MarkData, select: boolean) {
MarkWindow.instance.selectMarkData(markData, select)
}
selectRightTopFast: number = 0; //当前选择功能 快捷栏
selectAdsorb: boolean = false; //吸附状态
topLevelView: boolean = false; //顶视图状态
//获取设备
getDevice() {
ToolbarWindow.instance.getModelAndCreateFacilityData()
}
//清空设备
clearDevice() {
let isClear = confirm('您确定要清空吗?')
if (isClear) {
ToolbarWindow.instance.clearAllFacilityDataFromMesh()
}
}
//平移
translation() {
this.selectRightTopFast = 0
ToolbarWindow.instance.changeGizmoType_position();
}
//旋转
revolve() {
this.selectRightTopFast = 1
ToolbarWindow.instance.changeGizmoType_Rotation();
}
//缩放
scale() {
this.selectRightTopFast = 2
ToolbarWindow.instance.changeGizmoType_Scale();
}
//吸附
adsorb() {
ToolbarWindow.instance.changeMeshAdsorbY();
}
//获取吸附的状态
updateSelectAdsorb() {
this.selectAdsorb = ToolbarWindow.instance.isMeshAdsorb;
}
//切换至顶视图
toggleTopLevelView() {
this.topLevelView = !this.topLevelView
ToolbarWindow.instance.changeTopView(this.topLevelView)
}
//保存
preserve(type: boolean) {
if (type) {
ToolbarWindow.instance.onBtnSave();
} else {
ToolbarWindow.instance.saveShowMoudleData();
}
}
//通用 消息通知栏
openSnackBar(title: string) {
this.message.info(title);
}
/**
* 展示加载遮罩
* @param show
*/
showLoading(show: boolean) {
this.isShowLoading = show;
}
}
//属性栏 定位
export class naturePosition {
top: string = "1%"
left: string = "50%"
right: string = "5%"
}
// 处置预案 所有图标
export class planIcons {
iconsName: string[] = ["灾情", "内部力量", "外部力量", "其他"]
icons: MarkData[][] = [AllMarkData.CreateAllMarkData().marks_Disaster, AllMarkData.CreateAllMarkData().marks_Inside, AllMarkData.CreateAllMarkData().marks_Outside, AllMarkData.CreateAllMarkData().marks_Other,]
}
//创建/编辑 建筑dataType
export class modelBuilding {
name: string = "";
modelType: BuildingType = BuildingType.Normal;
}