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.
1613 lines
58 KiB
1613 lines
58 KiB
import { Component, OnInit, ElementRef, ViewChild, AfterViewInit, Input, OnDestroy } from '@angular/core'; |
|
import * as PIXI from 'pixi.js'; |
|
import { EventEmitter } from 'events'; |
|
import { EventManager } from '@angular/platform-browser'; |
|
// import { OutlineFilter } from 'pixi-filters'; |
|
import { AssetData, CanvasShareDataService, DisposalNodeData, FloorNodeData } from '../canvas-share-data.service'; |
|
import * as ObjectID from 'bson-objectid'; |
|
import { Charm } from './charm'; |
|
import { AxImageShape } from './model/axImageShape'; |
|
import { GameMode } from './model/gameMode'; |
|
import { MultipointIcon } from './model/multipointIcon'; |
|
import { PolygonIcon } from './model/polygonIcon'; |
|
import { PaintMode } from './model/paintModel'; |
|
import { AxShape } from './model/axShape'; |
|
import { PropertyInfo } from './model/PropertyInfo'; |
|
import { AxPreviewImageShape } from './model/axPreviewImageShape'; |
|
import { AxArrowConnector } from './model/axArrowConnector'; |
|
import { AxLegend, Legend } from './model/axLegend'; |
|
import { AxGrid } from './model/axGrid'; |
|
import { AxSelection } from './model/axSelection'; |
|
import { AxMessageSystem } from './model/axMessageSystem'; |
|
import { Grid2D } from './model/grid2D'; |
|
import { Viewport } from 'pixi-viewport'; |
|
import { EVENT_SELECTION_CHANGED } from './model/events'; |
|
|
|
|
|
@Component({ |
|
selector: 'app-working-area', |
|
templateUrl: './working-area.component.html', |
|
styleUrls: ['./working-area.component.scss'] |
|
}) |
|
/** |
|
* 工作区 |
|
*/ |
|
export class WorkingAreaComponent extends EventEmitter implements OnInit, AfterViewInit, OnDestroy { |
|
|
|
constructor(private eventManager: EventManager, public canvasData: CanvasShareDataService) { |
|
super(); |
|
console.log('组件构造函数'); |
|
} |
|
|
|
@ViewChild('content') |
|
content: ElementRef; |
|
/** |
|
* 父组件 |
|
*/ |
|
@Input() init: any; |
|
/** |
|
* pixijs 程序 |
|
*/ |
|
public app: PIXI.Application = null; |
|
/** |
|
* 相机 |
|
*/ |
|
public camera2D: Viewport = null; |
|
/** |
|
* 网格 |
|
*/ |
|
public grid2D: Grid2D = null; |
|
/** |
|
* 资源加载器 |
|
*/ |
|
public loader = PIXI.Loader.shared; |
|
/** |
|
* 背景图 |
|
*/ |
|
public backgroundImage: PIXI.Sprite = null; |
|
/** |
|
* 绘制图片形状时预览状态的图片 |
|
*/ |
|
public previewImage: AxPreviewImageShape = null; |
|
/** |
|
* 预览线段 |
|
*/ |
|
public previewLineSegment = new PIXI.Graphics(); |
|
/** |
|
* 预览原点 |
|
*/ |
|
public circleShadow = new PIXI.Graphics(); |
|
/** |
|
* 鼠标位置 |
|
*/ |
|
public mousePosition: PIXI.Point = new PIXI.Point(0, 0); |
|
/** |
|
* 绘画模式 |
|
*/ |
|
private paintMode: PaintMode = PaintMode.endPaint; |
|
/** |
|
* 选择器 |
|
*/ |
|
public selection: AxSelection = new AxSelection(); |
|
/** |
|
* 当前鼠标的点 |
|
*/ |
|
public currentClickPoint: PIXI.Graphics = new PIXI.Graphics(); |
|
/** |
|
* 绘制点集合 |
|
*/ |
|
public paintPoints: PIXI.Point[] = []; |
|
/** |
|
* 绘制中的多点图标 |
|
*/ |
|
public paintingIcon: MultipointIcon; |
|
/** |
|
* 绘制中的图形 |
|
*/ |
|
public paintingShape: AxShape = null; |
|
/** |
|
* 绘制中的连线 |
|
*/ |
|
public paintingLine: PIXI.Graphics = new PIXI.Graphics(); |
|
/** |
|
* 绿色描边 |
|
*/ |
|
// public outlineFilterGreen = new OutlineFilter(2, 0x00ff00); |
|
/** |
|
* 拷贝素材数据 |
|
*/ |
|
public copyData: any[] = []; |
|
/** |
|
* 确认绘制按钮 |
|
*/ |
|
private enterPaintEndButton = PIXI.Sprite.from('assets/images/enterPaintButton.png'); |
|
/** |
|
* 编辑点图片 |
|
*/ |
|
editorPointTexture: PIXI.Texture = PIXI.Texture.from('assets/images/handle-main.png'); |
|
backgroundTexture: PIXI.Texture = PIXI.Texture.from('assets/images/noImg.png'); |
|
/** |
|
* 框选工具图形 |
|
*/ |
|
private rectToolGraphics = new PIXI.Graphics(); |
|
/** |
|
* 初始鼠标位置 |
|
*/ |
|
private initialScreenMousePos: PIXI.Point = new PIXI.Point(); |
|
/** |
|
* 最终鼠标位置 |
|
*/ |
|
private finalScreenMousePos: PIXI.Point = new PIXI.Point(); |
|
/** |
|
* 允许编辑 |
|
*/ |
|
public allowEdit = true; |
|
/** |
|
* 动画控制器 |
|
*/ |
|
public animator; |
|
public animation; |
|
public animationIcon; |
|
public animationTime; |
|
// 是否按下Ctrl键 |
|
isCtrlKeyClicked = false; |
|
/** |
|
* 本软件版本号由四部分组成:<主版本号><次版本号><修订版本号><日期加希腊字母版本号> 例如:1.0.0.20210105_beta |
|
* Alpha版: 此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改。 |
|
* Beta版: 该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。 |
|
* RC版: 该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。 |
|
* Release版: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号®。 |
|
*/ |
|
public VERSION = '1.0.19.20210206_beta'; |
|
/** |
|
* 数据初始化 |
|
*/ |
|
ngOnInit(): void { |
|
console.log('组件OnInit'); |
|
PIXI.utils.skipHello(); |
|
this.sayHello(); |
|
this.eventManager.addGlobalEventListener('window', 'keydown', (event: any) => { |
|
|
|
}); |
|
this.eventManager.addGlobalEventListener('window', 'keyup', (event: any) => { |
|
// 按Del键删除选中的图标 |
|
if (event.keyCode === 46) { |
|
this.deleteSelectedShape(); |
|
} |
|
}); |
|
} |
|
ngOnDestroy(): void { |
|
console.log('组件OnDestroy'); |
|
this.selection.clear(); |
|
this.camera2D.destroy(); |
|
this.app.destroy(); |
|
} |
|
|
|
public setMulitSelect(b: boolean) { |
|
if (b) { |
|
this.isCtrlKeyClicked = true; |
|
this.camera2D.plugins.pause('drag'); |
|
} else { |
|
this.isCtrlKeyClicked = false; |
|
this.camera2D.drag(); |
|
} |
|
} |
|
/** |
|
* 删除选中的图标 |
|
*/ |
|
public deleteSelectedShape() { |
|
if (this.selection.size() > 0) { |
|
this.selection.all().forEach(axShape => { |
|
if (this.allowEdit && this.canvasData.gameMode === axShape.assetData.GameMode) { |
|
// 删除图例对象 |
|
const temp = this.backgroundImage.getChildByName('图例') as AxLegend; |
|
if (temp !== undefined |
|
&& temp !== null |
|
&& axShape.assetData.Name !== '图例') { |
|
const itemLegend = new Legend(axShape.assetData.Name, axShape.assetData.ImageUrl, 1); |
|
temp.deleteItem(itemLegend); |
|
} |
|
if (axShape.assetData.GameMode === GameMode.BasicInformation) { // 基本信息 |
|
// 删除楼层数据 |
|
delete this.canvasData.originaleveryStoreyData.data[axShape.assetData.Id]; |
|
// 删除建筑数据 |
|
delete this.canvasData.originalcompanyBuildingData.data[axShape.assetData.Id]; |
|
} else if (axShape.assetData.GameMode === GameMode.Assignment) { // 处置预案 |
|
delete this.canvasData.selectPanelPoint.Data.DefinedIncrement[axShape.assetData.Id]; |
|
delete this.canvasData.selectPanelPoint.Data.Increment[axShape.assetData.Id]; |
|
delete this.canvasData.selectPanelPoint.Data.Stock[axShape.assetData.Id]; |
|
} else if (axShape.assetData.GameMode === GameMode.Examinee) { // 考生考试 |
|
if (axShape.assetData.Tag === 1) { |
|
// 删除楼层数据 |
|
delete this.canvasData.examOriginaleveryStoreyData.data[axShape.assetData.Id]; |
|
} else { |
|
delete this.canvasData.selectPanelPoint.Data.DefinedIncrement[axShape.assetData.Id]; |
|
delete this.canvasData.selectPanelPoint.Data.Increment[axShape.assetData.Id]; |
|
delete this.canvasData.selectPanelPoint.Data.Stock[axShape.assetData.Id]; |
|
} |
|
} |
|
this.backgroundImage.removeChild(axShape); |
|
} |
|
}); |
|
this.selection.clear(); |
|
this.emit('canvasDataChanged'); |
|
this.canvasData.isChange = true; |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
} |
|
/** |
|
* 打招呼 |
|
*/ |
|
sayHello() { |
|
let _a; |
|
if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { |
|
const args = [ |
|
'\n %c 版本号 - ' + this.VERSION + '\n', |
|
'color: #ff66a5; background: #000000; padding:5px 0;', |
|
]; |
|
(_a = window.console).log.apply(_a, args); |
|
} else if (window.console) { |
|
window.console.log('\n %c 版本号 - ' + this.VERSION + '\n'); |
|
} |
|
} |
|
/** |
|
* 页面初始化 |
|
*/ |
|
ngAfterViewInit(): void { |
|
setTimeout(() => { |
|
this.createCanvas(); |
|
}); |
|
window.onresize = () => { |
|
this.resetCanvas(); |
|
}; |
|
} |
|
/** |
|
* |
|
* @param event 鼠标滑动事件,改用ViewPort控制 |
|
*/ |
|
// public mouseWheelHandel(event) { |
|
// const delX = this.mousePosition.x - this.backgroundImage.position.x; |
|
// const delY = this.mousePosition.y - this.backgroundImage.position.y; |
|
// const pivot = this.backgroundImage.toLocal(this.mousePosition); |
|
// const delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail))); |
|
// if (delta > 0) { |
|
// if (this.backgroundImage.scale.x >= 32) { |
|
// this.backgroundImage.scale.x = 32; |
|
// this.backgroundImage.scale.y = 32; |
|
// this.resizeItem(1 / this.backgroundImage.scale.x); |
|
// return; |
|
// } |
|
// this.backgroundImage.pivot.set(pivot.x, pivot.y); |
|
|
|
// this.backgroundImage.scale.x += this.backgroundImage.scale.x * 0.1; |
|
// this.backgroundImage.scale.y += this.backgroundImage.scale.y * 0.1; |
|
|
|
// this.backgroundImage.position.x += delX; |
|
// this.backgroundImage.position.y += delY; |
|
// } else if (delta < 0) { |
|
// if (this.backgroundImage.scale.x <= 0.1) { |
|
// this.backgroundImage.scale.x = 0.1; |
|
// this.backgroundImage.scale.y = 0.1; |
|
// this.resizeItem(1 / this.backgroundImage.scale.x); |
|
// return; |
|
// } |
|
// this.backgroundImage.pivot.set(pivot.x, pivot.y); |
|
|
|
// this.backgroundImage.scale.x -= this.backgroundImage.scale.x * 0.1; |
|
// this.backgroundImage.scale.y -= this.backgroundImage.scale.y * 0.1; |
|
|
|
// this.backgroundImage.position.x += delX; |
|
// this.backgroundImage.position.y += delY; |
|
// } |
|
// this.resizeItem(1 / this.backgroundImage.scale.x); |
|
// } |
|
// 重置图形缩放 |
|
public resizeItem(size: number) { |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape) { |
|
item.setItemScale(size); |
|
item.drawBorder(size); |
|
} |
|
}); |
|
} |
|
/** |
|
* |
|
* @param icon 移动到选中车辆到屏幕中心点,改用Viewport控制 |
|
*/ |
|
// public moveIconToScreenCenter(icon) { |
|
// if (icon.parent === this.backgroundImage && ( |
|
// icon.assetData.Type === 1 || |
|
// icon.assetData.Type === 2 || |
|
// icon.assetData.Type === 3 || |
|
// icon.assetData.Type === 4 |
|
// )) { |
|
// this.backgroundImage.pivot.set(icon.x, icon.y); |
|
// this.backgroundImage.position.set(771, 404); |
|
// clearTimeout(this.animationTime); |
|
// this.animation?.pause(); |
|
// this.animationIcon?.scale.set(1); |
|
// this.animation = this.animator.breathe(icon, 10, 10, 30, true, 0); |
|
// this.animationIcon = icon; |
|
// this.animationTime = setTimeout(() => { |
|
// this.animation?.pause(); |
|
// this.animationIcon?.scale.set(1); |
|
// }, 5000); |
|
// } |
|
// } |
|
|
|
|
|
/** |
|
* 创建2D相机 |
|
*/ |
|
private createViewport(): void { |
|
this.camera2D = new Viewport({ |
|
screenWidth: this.app.view.width, |
|
screenHeight: this.app.view.height, |
|
worldWidth: 20000, |
|
worldHeight: 20000, |
|
interaction: this.app.renderer.plugins.interaction, |
|
}); |
|
this.camera2D.pivot.set(0.5); |
|
this.camera2D.position = new PIXI.Point(0, 0); |
|
this.app.stage.addChild(this.camera2D); |
|
|
|
this.camera2D |
|
.clamp({ |
|
left: -10000, |
|
right: 10000, |
|
top: -10000, |
|
bottom: 10000, |
|
}) |
|
.drag() |
|
.pinch() |
|
.wheel() |
|
.clampZoom({ |
|
minScale: 0.12, |
|
maxScale: 16, |
|
}) |
|
.decelerate(); |
|
|
|
this.camera2D.on('wheel', event => { |
|
this.updateCamera2D(); |
|
}); |
|
|
|
this.camera2D.on('pointerdown', event => { |
|
if (this.isCtrlKeyClicked === true |
|
&& event.data.button === 0) { |
|
this.rectToolGraphics.visible = true; |
|
this.initialScreenMousePos = this.backgroundImage.toLocal(this.mousePosition); |
|
this.finalScreenMousePos = this.backgroundImage.toLocal(this.mousePosition); |
|
} |
|
}); |
|
this.camera2D.on('pointerup', event => { |
|
if (this.isCtrlKeyClicked === true) { |
|
this.rectToolGraphics.visible = false; |
|
const shapes: AxShape[] = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape |
|
&& item instanceof AxPreviewImageShape === false) { |
|
// 判断2个矩形是否相交 |
|
const rect1 = this.rectToolGraphics.getBounds(); |
|
const rect2 = item.getBounds(); |
|
if (this.isOverlap(rect1, rect2) && item.interactive) { |
|
shapes.push(item); |
|
} |
|
} |
|
}); |
|
this.rectToolGraphics.clear(); |
|
this.selectAll(shapes); |
|
} |
|
}); |
|
this.camera2D.on('pointerupoutside', event => { |
|
if (this.isCtrlKeyClicked === true) { |
|
this.rectToolGraphics.visible = false; |
|
const shapes: AxShape[] = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape |
|
&& item instanceof AxPreviewImageShape === false) { |
|
// 判断2个矩形是否相交 |
|
const rect1 = this.rectToolGraphics.getBounds(); |
|
const rect2 = item.getBounds(); |
|
if (this.isOverlap(rect1, rect2) && item.interactive) { |
|
shapes.push(item); |
|
} |
|
} |
|
}); |
|
this.rectToolGraphics.clear(); |
|
this.selectAll(shapes); |
|
} |
|
}); |
|
this.camera2D.on('pointermove', event => { |
|
if (this.isCtrlKeyClicked === true |
|
&& this.rectToolGraphics.visible === true) { |
|
this.finalScreenMousePos = this.backgroundImage.toLocal(this.mousePosition); |
|
|
|
const init = this.initialScreenMousePos; |
|
const final = this.finalScreenMousePos; |
|
|
|
this.rectToolGraphics.clear(); |
|
this.rectToolGraphics.lineStyle(1 / this.camera2D.scale.x, 0x00ff00, 1); |
|
this.rectToolGraphics.beginFill(0xccccf2, 0.25); |
|
if (final.x > init.x && final.y > init.y) { |
|
this.rectToolGraphics.drawRect(init.x, init.y, final.x - init.x, final.y - init.y); |
|
} else if (final.x > init.x && final.y < init.y) { |
|
this.rectToolGraphics.drawRect(init.x, final.y, final.x - init.x, init.y - final.y); |
|
} else if (final.x < init.x && final.y > init.y) { |
|
this.rectToolGraphics.drawRect(final.x, init.y, init.x - final.x, final.y - init.y); |
|
} else if (final.x < init.x && final.y < init.y) { |
|
this.rectToolGraphics.drawRect(final.x, final.y, init.x - final.x, init.y - final.y); |
|
} |
|
this.rectToolGraphics.endFill(); |
|
} |
|
}); |
|
// 右键事件 |
|
this.camera2D.on('rightclick', event => { |
|
event.stopPropagation(); |
|
this.deselectAll(); |
|
this.setPaintMode(PaintMode.endPaint); |
|
}); |
|
|
|
} |
|
/** |
|
* 更新2D相机 |
|
*/ |
|
private updateCamera2D() { |
|
this.grid2D.updateGrid(); |
|
this.resizeItem(1 / this.camera2D.scale.x); |
|
} |
|
/** |
|
* 重置相机 |
|
*/ |
|
public resetCamera2D() { |
|
this.camera2D.scale.set(1); |
|
this.camera2D.x = (this.app.view.width - this.backgroundImage.width) / 2; |
|
this.camera2D.y = (this.app.view.height - this.backgroundImage.height) / 2; |
|
this.updateCamera2D(); |
|
} |
|
/** |
|
* 缩放适应 |
|
*/ |
|
public zoomFit() { |
|
const imageWidth = this.backgroundImage.texture.width; |
|
const imageHeight = this.backgroundImage.texture.height; |
|
const appWidth = this.app.view.width - 470; |
|
const appHeight = this.app.view.height; |
|
const wScale = appWidth / imageWidth; |
|
const hScale = appHeight / imageHeight; |
|
let scale = wScale < hScale ? wScale : hScale; |
|
|
|
if (scale < 0.12) { |
|
scale = 0.12; |
|
} |
|
if (scale > 16) { |
|
scale = 16; |
|
} |
|
this.camera2D.scale.set(scale); |
|
if (wScale < hScale) { |
|
this.camera2D.x = 470 / 2; |
|
this.camera2D.y = (appHeight - (imageHeight * this.camera2D.scale.y)) / 2; |
|
} else { |
|
this.camera2D.x = 470 / 2 + (appWidth - (imageWidth * this.camera2D.scale.x)) / 2; |
|
this.camera2D.y = 0; |
|
} |
|
this.updateCamera2D(); |
|
} |
|
/** |
|
* 创建2D网格 |
|
*/ |
|
private createGrid2D(): void { |
|
this.grid2D = new Grid2D(this.camera2D, null); |
|
|
|
this.camera2D.addChild(this.grid2D); |
|
} |
|
/** |
|
* 创建画布 |
|
*/ |
|
private createCanvas(): void { |
|
this.app = new PIXI.Application({ |
|
width: this.content.nativeElement.clientWidth, |
|
height: this.content.nativeElement.clientHeight, |
|
antialias: true, |
|
transparent: false, |
|
resolution: 1, |
|
backgroundColor: 0xE9EAEA |
|
}); |
|
this.content.nativeElement.appendChild(this.app.view); |
|
this.app.view.style.border = '1px dashed blue'; |
|
this.animator = new Charm(PIXI); |
|
|
|
this.createViewport(); |
|
this.createGrid2D(); |
|
this.createBackgroundImage(); |
|
|
|
this.app.ticker.add((delta) => { |
|
this.animator.update(); |
|
this.mousePosition = this.app.renderer.plugins.interaction.mouse.global; |
|
// 预览图片 |
|
if (this.previewImage !== undefined && this.previewImage !== null) { |
|
this.previewImage.position = this.backgroundImage.toLocal(this.mousePosition); |
|
} |
|
|
|
if (this.circleShadow !== undefined && this.circleShadow !== null) { |
|
this.circleShadow.position = this.backgroundImage.toLocal(this.mousePosition); |
|
this.refreshPreviewLineSegment(this.currentClickPoint.position, this.circleShadow.position); |
|
this.refreshPreviewPoint(); |
|
} |
|
}); |
|
/** |
|
* 创建图标事件(数据处理) |
|
*/ |
|
this.on('createIcon', (axShape: AxShape) => { |
|
if (axShape.assetData.GameMode === GameMode.BasicInformation) { // 基本信息 |
|
// 添加楼层数据 |
|
this.canvasData.originaleveryStoreyData.data[axShape.assetData.Id] = axShape.assetData; |
|
// 添加建筑数据 |
|
this.canvasData.originalcompanyBuildingData.data[axShape.assetData.Id] = axShape.assetData; |
|
} else if (axShape.assetData.GameMode === GameMode.Assignment) { // 处置预案 |
|
if (this.canvasData.selectPanelPoint.Data === undefined |
|
|| this.canvasData.selectPanelPoint.Data === null) { |
|
this.canvasData.selectPanelPoint.Data = new FloorNodeData(); |
|
} |
|
this.canvasData.selectPanelPoint.Data.Stock[axShape.assetData.Id] = axShape.assetData; |
|
} else if (axShape.assetData.GameMode === GameMode.Examinee) { // 考生考试 |
|
if (axShape.assetData.Tag === 1) { |
|
this.canvasData.examOriginaleveryStoreyData.data[axShape.assetData.Id] = axShape.assetData; |
|
} else { |
|
if (this.canvasData.selectPanelPoint.Data === undefined |
|
|| this.canvasData.selectPanelPoint.Data === null) { |
|
this.canvasData.selectPanelPoint.Data = new FloorNodeData(); |
|
} |
|
this.canvasData.selectPanelPoint.Data.Stock[axShape.assetData.Id] = axShape.assetData; |
|
} |
|
} |
|
const temp = this.backgroundImage.getChildByName('图例') as AxLegend; |
|
if (temp !== undefined |
|
&& temp !== null |
|
&& axShape.assetData.Name !== '图例') { |
|
const itemLegend = new Legend(axShape.assetData.Name, axShape.assetData.ImageUrl, 1); |
|
temp.addItem(itemLegend); |
|
} |
|
this.emit('canvasDataChanged'); |
|
this.canvasData.isChange = true; |
|
this.updateCamera2D(); |
|
}); |
|
} |
|
/** |
|
* 重置画布 |
|
*/ |
|
public resetCanvas() { |
|
this.app.renderer.resize(this.content.nativeElement.clientWidth, this.content.nativeElement.clientHeight); |
|
} |
|
/** |
|
* 设置名称显示 |
|
* @param value true 显示 false 隐藏 |
|
* @param mode BasicInformation = 0 基本信息 Assignment想定作业 = 1 想定作业 |
|
*/ |
|
public setNameVisible(value: boolean, mode: GameMode): void { |
|
this.backgroundImage?.children.forEach(item => { |
|
if (item instanceof AxImageShape) { |
|
item.setNameVisible(value, mode); |
|
} else if (item instanceof MultipointIcon) { |
|
item.setNameVisible(value, mode); |
|
} else if (item instanceof PolygonIcon) { |
|
item.setNameVisible(value, mode); |
|
} else if (item instanceof AxArrowConnector) { |
|
item.setNameVisible(value, mode); |
|
} |
|
}); |
|
} |
|
/** |
|
* 根据id刷新图标 |
|
* @param id 图标数据id |
|
*/ |
|
public refreshIcon(id: string): void { |
|
const icon = this.backgroundImage.children.find(item => item.name === id); |
|
if (icon instanceof AxImageShape) { |
|
icon.refresh(); |
|
} else if (icon instanceof MultipointIcon) { |
|
icon.refresh(); |
|
} else if (icon instanceof PolygonIcon) { |
|
icon.refresh(); |
|
} else if (icon instanceof AxArrowConnector) { |
|
icon.redraw(); |
|
} else if (icon instanceof AxLegend) { |
|
icon.refresh(); |
|
} |
|
} |
|
/** |
|
* |
|
* @param value 缩放倍数 |
|
*/ |
|
public setIconScale(value: number): void { |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxImageShape) { |
|
item.image.scale.set(value); |
|
} else if (item instanceof MultipointIcon) { |
|
|
|
} else if (item instanceof PolygonIcon) { |
|
|
|
} |
|
}); |
|
} |
|
/** |
|
* 创建楼层图形 |
|
*/ |
|
public createFloorShape(floorData: any) { |
|
if (floorData === undefined || floorData === null) { return; } |
|
Object.keys(floorData).forEach((key) => { |
|
switch (floorData[key].InteractiveMode) { |
|
case 0: |
|
const singleIcon = new AxImageShape(floorData[key], this); |
|
singleIcon.allowEdit = this.allowEdit && this.canvasData.gameMode === singleIcon.assetData.GameMode; |
|
break; |
|
case 1: |
|
const icon = new MultipointIcon(floorData[key], this); |
|
icon.allowEdit = this.allowEdit && this.canvasData.gameMode === icon.assetData.GameMode; |
|
break; |
|
case 2: |
|
const polygonIcon = new PolygonIcon(floorData[key], this); |
|
polygonIcon.allowEdit = this.allowEdit && this.canvasData.gameMode === polygonIcon.assetData.GameMode; |
|
break; |
|
case 3: |
|
if (floorData[key].Name === '水带') { |
|
const waterLine = new AxArrowConnector(floorData[key], this, false, true); |
|
waterLine.allowEdit = this.allowEdit && this.canvasData.gameMode === waterLine.assetData.GameMode; |
|
} else if (floorData[key].Name === '距离') { |
|
const distance = new AxArrowConnector(floorData[key], this, true, true); |
|
distance.allowEdit = this.allowEdit && this.canvasData.gameMode === distance.assetData.GameMode; |
|
} else if (floorData[key].Name === '普通墙' || floorData[key].Name === '承重墙') { |
|
const wall = new AxArrowConnector(floorData[key], this, false, false); |
|
wall.allowEdit = this.allowEdit && this.canvasData.gameMode === wall.assetData.GameMode; |
|
} |
|
break; |
|
} |
|
}); |
|
// this.emit('backgroundScale', this.backgroundImage.scale.x); |
|
} |
|
/** |
|
* 创建节点图形 |
|
*/ |
|
public createNodeShape(nodeData: any) { |
|
if (nodeData !== undefined && nodeData !== null) { |
|
Object.keys(nodeData).forEach((key) => { |
|
if (nodeData[key] === undefined || nodeData[key] === null) { return; } |
|
Object.keys(nodeData[key]).forEach((tempKey) => { |
|
switch (nodeData[key][tempKey].InteractiveMode) { |
|
case 0: |
|
const singleIcon = new AxImageShape(nodeData[key][tempKey], this); |
|
singleIcon.allowEdit = this.allowEdit && this.canvasData.gameMode === singleIcon.assetData.GameMode; |
|
break; |
|
case 1: |
|
const icon = new MultipointIcon(nodeData[key][tempKey], this); |
|
icon.allowEdit = this.allowEdit && this.canvasData.gameMode === icon.assetData.GameMode; |
|
break; |
|
case 2: |
|
const polygonIcon = new PolygonIcon(nodeData[key][tempKey], this); |
|
polygonIcon.allowEdit = this.allowEdit && this.canvasData.gameMode === polygonIcon.assetData.GameMode; |
|
break; |
|
case 3: |
|
const pipeline = new AxArrowConnector(nodeData[key][tempKey], this, false, true); |
|
pipeline.allowEdit = this.allowEdit && this.canvasData.gameMode === pipeline.assetData.GameMode; |
|
break; |
|
} |
|
}); |
|
}); |
|
} |
|
} |
|
/** |
|
* 创建确认绘制结束按钮 |
|
*/ |
|
private createEnterPaintEndButton() { |
|
this.enterPaintEndButton.width = 60; |
|
this.enterPaintEndButton.height = 60; |
|
this.enterPaintEndButton.anchor.set(0.5); |
|
this.enterPaintEndButton.position = new PIXI.Point(0, 0); |
|
this.enterPaintEndButton.interactive = true; |
|
this.enterPaintEndButton.buttonMode = true; |
|
this.enterPaintEndButton |
|
.on('pointerdown', event => { |
|
event.stopPropagation(); |
|
this.enterPaint(); |
|
}); |
|
this.backgroundImage.addChild(this.enterPaintEndButton); |
|
this.enterPaintEndButton.zIndex = this.backgroundImage.children.length; |
|
this.enterPaintEndButton.visible = false; |
|
} |
|
/** |
|
* 创建背景图 |
|
*/ |
|
public createBackgroundImage() { |
|
this.backgroundImage = PIXI.Sprite.from('assets/images/noImg.png'); |
|
this.backgroundImage.anchor.set(0.5); |
|
this.backgroundImage.interactive = true; |
|
this.backgroundImage.name = 'background'; |
|
this.backgroundImage.sortableChildren = true; |
|
this.backgroundImage |
|
.on('pointerdown', event => { |
|
if (event.data.button !== 0) { return; } |
|
if (this.isCtrlKeyClicked === false) { |
|
switch (this.paintMode) { |
|
case PaintMode.endPaint: |
|
break; |
|
case PaintMode.singlePointIcon: |
|
const json = JSON.parse(JSON.stringify(this.canvasData.selectTemplateData.propertyInfos)); |
|
const list = []; |
|
json.forEach(element => { |
|
const property = new PropertyInfo(element); |
|
list.push(property); |
|
}); |
|
|
|
const assetData = { |
|
TemplateId: this.canvasData.selectTemplateData.id, |
|
CanConnect: this.canvasData.selectTemplateData.canConnect, |
|
Pipelines: new Array(), |
|
FloorId: this.canvasData.selectStorey.id, |
|
Angle: this.canvasData.selectTemplateData.angle, |
|
Color: this.canvasData.selectTemplateData.color, |
|
Enabled: this.canvasData.selectTemplateData.enabled, |
|
FillMode: this.canvasData.selectTemplateData.fillMode, |
|
FireElementId: this.canvasData.selectTemplateData.fireElementId, |
|
FixedSize: this.canvasData.selectTemplateData.fixedSize, |
|
Height: 32, |
|
Width: 32, |
|
Id: ObjectID.default.generate(), |
|
ImageUrl: this.canvasData.selectTemplateData.imageUrl, |
|
InteractiveMode: this.canvasData.selectTemplateData.interactiveMode, |
|
MultiPoint: null, |
|
Point: new PIXI.Point(this.previewImage.x, this.previewImage.y), |
|
Name: this.canvasData.selectTemplateData.name, |
|
PropertyInfos: list, |
|
Border: this.canvasData.selectTemplateData.border, |
|
DrawMode: this.canvasData.selectTemplateData.drawMode, |
|
Thickness: this.canvasData.selectTemplateData.thickness, |
|
IsFromBuilding: this.canvasData.selectTemplateData.isFromBuilding, |
|
GameMode: this.canvasData.gameMode, |
|
Tag: this.canvasData.selectTemplateData.tag |
|
}; |
|
const singleIcon = new AxImageShape(assetData, this); |
|
this.emit('createIcon', singleIcon); |
|
// this.emit('backgroundScale', this.backgroundImage.scale.x); |
|
break; |
|
case PaintMode.lineIcon: |
|
this.previewLineSegment.visible = true; |
|
this.currentClickPoint.position = new PIXI.Point(this.circleShadow.x, this.circleShadow.y); |
|
this.paintPoints.push(new PIXI.Point(this.circleShadow.x, this.circleShadow.y)); |
|
|
|
if (this.paintPoints.length >= 2) { |
|
this.enterPaintEndButton.position = this.circleShadow.position; |
|
this.enterPaintEndButton.visible = true; |
|
this.enterPaintEndButton.zIndex = this.backgroundImage.children.length; |
|
} |
|
|
|
if (this.paintingIcon !== null) { |
|
this.backgroundImage.removeChild(this.paintingIcon); |
|
} |
|
const jsonObject = JSON.parse(JSON.stringify(this.canvasData.selectTemplateData.propertyInfos)); |
|
const propertyList = []; |
|
jsonObject.forEach(element => { |
|
const property = new PropertyInfo(element); |
|
propertyList.push(property); |
|
}); |
|
const assetData1 = { |
|
TemplateId: this.canvasData.selectTemplateData.id, |
|
FloorId: this.canvasData.selectStorey.id, |
|
Angle: this.canvasData.selectTemplateData.angle, |
|
Color: this.canvasData.selectTemplateData.color, |
|
Enabled: this.canvasData.selectTemplateData.enabled, |
|
FillMode: this.canvasData.selectTemplateData.fillMode, |
|
FireElementId: this.canvasData.selectTemplateData.fireElementId, |
|
FixedSize: this.canvasData.selectTemplateData.fixedSize, |
|
Height: 32, |
|
Width: 32, |
|
Id: ObjectID.default.generate(), |
|
ImageUrl: this.canvasData.selectTemplateData.imageUrl, |
|
InteractiveMode: this.canvasData.selectTemplateData.interactiveMode, |
|
MultiPoint: JSON.parse(JSON.stringify(this.paintPoints)), |
|
Point: new PIXI.Point(0, 0), |
|
Name: this.canvasData.selectTemplateData.name, |
|
PropertyInfos: propertyList, |
|
Border: this.canvasData.selectTemplateData.border, |
|
DrawMode: this.canvasData.selectTemplateData.drawMode, |
|
Thickness: this.canvasData.selectTemplateData.thickness, |
|
IsFromBuilding: this.canvasData.selectTemplateData.isFromBuilding, |
|
GameMode: this.canvasData.gameMode, |
|
Tag: this.canvasData.selectTemplateData.tag |
|
}; |
|
// const assetData1 = { |
|
// ImageUrl: this.canvasData.selectTemplateData.imageUrl, |
|
// Point: new PIXI.Point(0, 0), |
|
// Width: 32, |
|
// Height: 32, |
|
// MultiPoint: this.paintPoints, |
|
// Name: this.canvasData.selectTemplateData.name |
|
// }; |
|
this.paintingIcon = new MultipointIcon(assetData1, this); |
|
// this.paintingIcon = new MultipointIcon(this.previewSinglePointIcon.texture, new PIXI.Point(0, 0), this.paintPoints, this, |
|
// this.canvasData.selectTemplateData.name); |
|
// this.emit('backgroundScale', this.backgroundImage.scale.x); |
|
break; |
|
case PaintMode.polygonIcon: |
|
this.previewLineSegment.visible = true; |
|
this.currentClickPoint.position = new PIXI.Point(this.circleShadow.x, this.circleShadow.y); |
|
this.paintPoints.push(new PIXI.Point(this.circleShadow.x, this.circleShadow.y)); |
|
if (this.paintPoints.length === 1) { |
|
this.enterPaintEndButton.position = this.circleShadow.position; |
|
} else if (this.paintPoints.length >= 3) { |
|
this.enterPaintEndButton.visible = true; |
|
this.enterPaintEndButton.zIndex = this.backgroundImage.children.length; |
|
} |
|
this.paintPoints.forEach((value, index, array) => { |
|
if (index === 0) { |
|
this.paintingLine.clear(); |
|
this.paintingLine.lineStyle(1, 0xffd900, 1); |
|
this.paintingLine.moveTo(value.x, value.y); |
|
} else { |
|
this.paintingLine.lineTo(value.x, value.y); |
|
} |
|
}); |
|
|
|
// if (this.paintingIcon !== null) { |
|
// this.backgroundImage.removeChild(this.paintingIcon); |
|
// } |
|
// this.paintingIcon = new PolygonIcon(this.paintPoints, this); |
|
break; |
|
case PaintMode.Pipeline: |
|
// if (this.canvasData.selectTemplateData.name === '水带-------') { |
|
// if (this.paintingShape !== null) { |
|
// this.currentClickPoint.position = new PIXI.Point(this.circleShadow.x, this.circleShadow.y); |
|
// this.paintPoints.push(new PIXI.Point(this.circleShadow.x, this.circleShadow.y)); |
|
// this.paintingShape.assetData.MultiPoint = JSON.parse(JSON.stringify(this.paintPoints)); |
|
// this.paintingShape.refresh(); |
|
// } |
|
// } else { |
|
this.previewLineSegment.visible = true; |
|
this.enterPaintEndButton.position = this.circleShadow.position; |
|
this.enterPaintEndButton.visible = true; |
|
this.enterPaintEndButton.zIndex = this.backgroundImage.children.length; |
|
this.currentClickPoint.position = new PIXI.Point(this.circleShadow.x, this.circleShadow.y); |
|
this.paintPoints.push(new PIXI.Point(this.circleShadow.x, this.circleShadow.y)); |
|
if (this.paintPoints.length < 2) { |
|
return; |
|
} |
|
if (this.paintingShape === null) { |
|
const jsonObject = JSON.parse(JSON.stringify(this.canvasData.selectTemplateData.propertyInfos)); |
|
const propertyList = []; |
|
jsonObject.forEach(element => { |
|
const property = new PropertyInfo(element); |
|
propertyList.push(property); |
|
}); |
|
const assetData2 = { |
|
TemplateId: this.canvasData.selectTemplateData.id, |
|
FloorId: this.canvasData.selectStorey.id, |
|
Angle: this.canvasData.selectTemplateData.angle, |
|
Color: this.canvasData.selectTemplateData.color, |
|
Enabled: this.canvasData.selectTemplateData.enabled, |
|
FillMode: this.canvasData.selectTemplateData.fillMode, |
|
FireElementId: this.canvasData.selectTemplateData.fireElementId, |
|
FixedSize: this.canvasData.selectTemplateData.fixedSize, |
|
Height: 32, |
|
Width: 32, |
|
Id: ObjectID.default.generate(), |
|
ImageUrl: this.canvasData.selectTemplateData.imageUrl, |
|
InteractiveMode: this.canvasData.selectTemplateData.interactiveMode, |
|
MultiPoint: JSON.parse(JSON.stringify(this.paintPoints)), |
|
Point: new PIXI.Point(0, 0), |
|
Name: this.canvasData.selectTemplateData.name, |
|
PropertyInfos: propertyList, |
|
Border: this.canvasData.selectTemplateData.border, |
|
DrawMode: this.canvasData.selectTemplateData.drawMode, |
|
Thickness: this.canvasData.selectTemplateData.thickness, |
|
IsFromBuilding: this.canvasData.selectTemplateData.isFromBuilding, |
|
GameMode: this.canvasData.gameMode, |
|
Tag: this.canvasData.selectTemplateData.tag |
|
}; |
|
if (this.canvasData.selectTemplateData.name === '距离') { |
|
this.paintingShape = new AxArrowConnector(assetData2, this, true, true); |
|
} else if (this.canvasData.selectTemplateData.name === '普通墙' || this.canvasData.selectTemplateData.name === '承重墙') { |
|
this.paintingShape = new AxArrowConnector(assetData2, this, false, false); |
|
} else if (this.canvasData.selectTemplateData.name === '水带') { |
|
this.paintingShape = new AxArrowConnector(assetData2, this, false, true); |
|
} |
|
} else { |
|
this.paintingShape.assetData.MultiPoint = JSON.parse(JSON.stringify(this.paintPoints)); |
|
this.paintingShape.redraw(); |
|
} |
|
// } |
|
// this.emit('backgroundScale', this.backgroundImage.scale.x); |
|
break; |
|
} |
|
} |
|
// else if (this.isCtrlKeyClicked === true) { |
|
// this.rectToolGraphics.visible = true; |
|
// this.initialScreenMousePos = this.backgroundImage.toLocal(this.mousePosition); |
|
// this.finalScreenMousePos = this.backgroundImage.toLocal(this.mousePosition); |
|
// } |
|
}) |
|
.on('pointerup', event => { |
|
|
|
}) |
|
.on('pointerupoutside', event => { |
|
|
|
}) |
|
.on('pointermove', event => { |
|
|
|
}) |
|
.on('pointerover', (event) => { |
|
if (this.previewImage !== null |
|
&& this.paintMode === PaintMode.singlePointIcon) { |
|
this.previewImage.visible = true; |
|
} |
|
}) |
|
.on('pointerout', (event) => { |
|
if (this.previewImage !== null |
|
&& this.paintMode === PaintMode.singlePointIcon) { |
|
this.previewImage.visible = false; |
|
} |
|
}); |
|
this.camera2D.addChild(this.backgroundImage); |
|
this.createPreviewImage(); |
|
this.createPreviewLineSegment(); |
|
this.createCircleShadow(); |
|
this.createEnterPaintEndButton(); |
|
this.backgroundImage.addChild(this.paintingLine); |
|
|
|
} |
|
/** |
|
* 判断矩形一是否包含矩形二 |
|
* @param rect1 矩形一 |
|
* @param rect2 矩形二 |
|
*/ |
|
public isOverlap(rect1, rect2): boolean { |
|
const l1 = { x: rect1.x, y: rect1.y }; |
|
const r1 = { x: rect1.x + rect1.width, y: rect1.y + rect1.height }; |
|
const l2 = { x: rect2.x, y: rect2.y }; |
|
const r2 = { x: rect2.x + rect2.width, y: rect2.y + rect2.height }; |
|
if ( |
|
l1.x > r2.x || |
|
l2.x > r1.x || |
|
l1.y > r2.y || |
|
l2.y > r1.y |
|
) { return false; } |
|
return true; |
|
} |
|
|
|
/** |
|
* 刷新背景图 |
|
*/ |
|
public async refreshBackgroundImage( |
|
imageUrl: string = this.canvasData.selectStorey.imageUrl, |
|
imageAngle: number = this.canvasData.selectStorey.imageAngle, |
|
imageWidth: number = this.canvasData.selectStorey.imageWidth, |
|
imageHeight: number = this.canvasData.selectStorey.imageHeight, |
|
): Promise<void> { |
|
if (imageAngle === undefined || imageAngle === null) { |
|
imageAngle = 0; |
|
} |
|
this.backgroundImage.scale.set(1); |
|
if (imageUrl === undefined || imageUrl === null || imageUrl === '') { |
|
this.backgroundImage.texture = this.backgroundTexture; |
|
} else { |
|
this.backgroundImage.texture = await PIXI.Texture.fromURL(imageUrl); |
|
} |
|
this.backgroundImage.x = this.backgroundImage.width / 2; |
|
this.backgroundImage.y = this.backgroundImage.height / 2; |
|
this.backgroundImage.angle = imageAngle; |
|
this.backgroundImage.width = imageWidth; |
|
this.backgroundImage.height = imageHeight; |
|
|
|
|
|
this.resetCamera2D(); |
|
} |
|
/** |
|
* 刷新 |
|
* @param imageUrl |
|
* @param imageAngle |
|
*/ |
|
public async refresh(): Promise<void> { |
|
await this.refreshBackgroundImage(this.canvasData.selectStorey.imageUrl, this.canvasData.selectStorey.imageAngle); |
|
// 清空所有图形 |
|
this.deselectAll(); |
|
const itemList = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape && item instanceof AxPreviewImageShape === false) { |
|
itemList.push(item.name); |
|
} |
|
}); |
|
|
|
itemList.forEach(item => { |
|
this.backgroundImage.getChildByName(item).destroy(); |
|
// let child = this.backgroundImage.getChildByName(item); |
|
// this.backgroundImage.removeChild(child); |
|
}); |
|
// 加载当前数据 |
|
this.createFloorShape(this.canvasData.originaleveryStoreyData.data); |
|
// 创建处置预案图形 |
|
this.createNodeShape(this.canvasData.selectPanelPoint.Data); |
|
this.createAxLegend(); |
|
if (this.canvasData.gameMode == GameMode.Assignment) { |
|
this.setLegendVisible(false); |
|
} |
|
this.updateCamera2D(); |
|
} |
|
/** |
|
* 加载无关联信息处置预案 |
|
* @data 处置预案数据 |
|
*/ |
|
public async loadNoRelevantInformationDisposalPlan(data: DisposalNodeData): Promise<void> { |
|
await this.refreshBackgroundImage(data.BackgroundImageUrl, data.BackgroundImageAngle); |
|
// 清空所有图形 |
|
this.deselectAll(); |
|
const itemList = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape && item instanceof AxPreviewImageShape === false) { |
|
itemList.push(item.name); |
|
} |
|
}); |
|
|
|
itemList.forEach(item => { |
|
this.backgroundImage.getChildByName(item).destroy(); |
|
}); |
|
// 创建处置预案图形 |
|
this.createNodeShape(this.canvasData.selectPanelPoint.Data); |
|
|
|
this.updateCamera2D(); |
|
} |
|
/** |
|
* 创建安信图例 |
|
*/ |
|
public createAxLegend() { |
|
const tempAssetData = { |
|
Id: '图例', |
|
Name: '图例', |
|
Color: '#066EED80', |
|
TemplateId: null, |
|
FloorId: this.canvasData.selectStorey.id, |
|
Angle: 0, |
|
Enabled: null, |
|
FillMode: null, |
|
FireElementId: null, |
|
FixedSize: null, |
|
Height: 32, |
|
Width: 32, |
|
ImageUrl: null, |
|
InteractiveMode: null, |
|
MultiPoint: null, |
|
Point: new PIXI.Point(0, 0), |
|
Border: null, |
|
DrawMode: null, |
|
Thickness: null, |
|
IsFromBuilding: null, |
|
GameMode: this.canvasData.gameMode, |
|
PropertyInfos: [ |
|
{ |
|
Tag: '', |
|
Order: 0, |
|
Enabled: true, |
|
Visible: true, |
|
Required: false, |
|
RuleName: '', |
|
RuleValue: '', |
|
PhysicalUnit: '', |
|
PropertyName: '列', |
|
PropertyType: 2, |
|
PropertyValue: 2, |
|
}, |
|
], |
|
Scale: 1, |
|
PivotX: 0, |
|
PivotY: 0, |
|
}; |
|
const shapeMap: Map<string, Legend> = new Map<string, Legend>(); |
|
let data = null; |
|
for (const item in this.canvasData.originaleveryStoreyData.data) { |
|
if (shapeMap.has(this.canvasData.originaleveryStoreyData.data[item].Name)) { |
|
shapeMap.get(this.canvasData.originaleveryStoreyData.data[item].Name).Count++; |
|
} else { |
|
if (item !== '图例') { |
|
shapeMap.set(this.canvasData.originaleveryStoreyData.data[item].Name, new Legend( |
|
this.canvasData.originaleveryStoreyData.data[item].Name, |
|
this.canvasData.originaleveryStoreyData.data[item].ImageUrl, |
|
1 |
|
)); |
|
} else { |
|
data = this.canvasData.originaleveryStoreyData.data[item]; |
|
} |
|
} |
|
} |
|
if (data === null) { |
|
const axLegend = new AxLegend(tempAssetData, this, shapeMap); |
|
const rect = this.backgroundImage.getLocalBounds(); |
|
const itemRect = axLegend.getLocalBounds(); |
|
axLegend.x = rect.right - itemRect.right; |
|
axLegend.y = rect.bottom - itemRect.bottom; |
|
axLegend.assetData.Point = new PIXI.Point(axLegend.x, axLegend.y); |
|
this.emit('createIcon', axLegend); |
|
} else { |
|
const axLegend = new AxLegend(data, this, shapeMap); |
|
} |
|
} |
|
// /** |
|
// * 清空画布 |
|
// */ |
|
// public destroyBackgroundImage(): void { |
|
// this.app.stage.removeChild(this.backgroundImage); |
|
// this.backgroundImage = null; |
|
// } |
|
/** |
|
// // * 设置背景图缩放 |
|
// // * @param scale 缩放系数 |
|
// // */ |
|
// public setBackgroundScale(scale: number): void { |
|
// this.backgroundImage?.scale.set(scale); |
|
// this.emit('backgroundScale', this.backgroundImage?.scale.x); |
|
// } |
|
// /** |
|
// * 设置背景图角度 |
|
// * @param imageAngle 角度值 |
|
// */ |
|
// public setBackgroundAngle(imageAngle: number) { |
|
// this.backgroundImage.angle = imageAngle; |
|
// } |
|
/** |
|
* 创建预览单点图标 |
|
*/ |
|
private createPreviewImage(): void { |
|
this.previewImage = new AxPreviewImageShape(this); |
|
this.previewImage.visible = false; |
|
} |
|
/** |
|
* 创建预览线段 |
|
*/ |
|
private createPreviewLineSegment() { |
|
this.previewLineSegment.visible = false; |
|
this.backgroundImage.addChild(this.currentClickPoint); |
|
this.backgroundImage.addChild(this.previewLineSegment); |
|
|
|
this.backgroundImage.addChild(this.rectToolGraphics); |
|
this.rectToolGraphics.visible = false; |
|
} |
|
/** |
|
* 刷新预览线段 |
|
* @param pointA 点A |
|
* @param pointB 点B |
|
*/ |
|
private refreshPreviewLineSegment(pointA: PIXI.Point, pointB: PIXI.Point) { |
|
this.previewLineSegment.clear(); |
|
this.previewLineSegment.lineStyle(1 / this.backgroundImage.scale.x, 0x00ff00, 1); |
|
this.previewLineSegment.moveTo(pointA.x, pointA.y); |
|
this.previewLineSegment.lineTo(pointB.x, pointB.y); |
|
} |
|
/** |
|
* 创建半径图标影子 |
|
* @param x 半径 |
|
*/ |
|
private createCircleShadow(): void { |
|
this.circleShadow.visible = false; |
|
this.backgroundImage.addChild(this.circleShadow); |
|
} |
|
/** |
|
* 刷新预览点 |
|
*/ |
|
private refreshPreviewPoint() { |
|
this.circleShadow.clear(); |
|
this.circleShadow.beginFill(0x00ff00); |
|
this.circleShadow.drawCircle(0, 0, 5 / this.backgroundImage.scale.x); |
|
this.circleShadow.endFill(); |
|
} |
|
/** |
|
* 开始绘制 |
|
*/ |
|
public beginPaint() { |
|
this.deselectAll(); |
|
this.setPaintMode(PaintMode.endPaint); |
|
this.setPaintMode(this.canvasData.selectTemplateData.interactiveMode); |
|
} |
|
/** |
|
* 初始化管线数据 |
|
*/ |
|
public initPipelineData(): void { |
|
this.paintPoints = []; |
|
this.paintingShape = null; |
|
} |
|
public beginPaintingArrows(): void { |
|
this.paintMode = PaintMode.Arrows; |
|
} |
|
/** |
|
* 设置绘制状态 |
|
* @param mode 状态 |
|
*/ |
|
public setPaintMode(mode: PaintMode) { |
|
if (this.paintMode === mode) { |
|
return; |
|
} |
|
this.paintMode = mode; |
|
switch (this.paintMode) { |
|
case PaintMode.singlePointIcon: |
|
this.previewImage.visible = true; |
|
this.previewImage.setImageUrl(this.canvasData.selectTemplateData.imageUrl); |
|
break; |
|
case PaintMode.lineIcon: |
|
this.circleShadow.visible = false; |
|
this.previewLineSegment.visible = false; |
|
this.paintPoints.splice(0, this.paintPoints.length); |
|
if (this.paintingIcon !== null) { |
|
this.backgroundImage.removeChild(this.paintingIcon); |
|
} |
|
this.previewImage.setImageUrl(this.canvasData.selectTemplateData.imageUrl); |
|
this.circleShadow.visible = true; |
|
break; |
|
case PaintMode.polygonIcon: |
|
this.circleShadow.visible = false; |
|
this.previewLineSegment.visible = false; |
|
this.paintingIcon = null; |
|
this.paintPoints.splice(0, this.paintPoints.length); |
|
this.paintingLine.clear(); |
|
this.circleShadow.visible = true; |
|
break; |
|
case PaintMode.Pipeline: |
|
|
|
break; |
|
case PaintMode.endPaint: |
|
if (this.previewImage !== null) { |
|
this.previewImage.visible = false; |
|
} |
|
// 重置组件状态 |
|
if (this.paintingIcon !== undefined |
|
&& this.paintingIcon !== null) { |
|
this.backgroundImage.removeChild(this.paintingIcon); |
|
} |
|
if (this.paintingShape !== null) { |
|
this.backgroundImage.removeChild(this.paintingShape); |
|
this.paintingShape = null; |
|
} |
|
this.enterPaintEndButton.visible = false; |
|
this.paintingLine.clear(); |
|
this.resetData(); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
/** |
|
* 获取绘制状态 |
|
*/ |
|
public getPaintMode(): PaintMode { |
|
return this.paintMode; |
|
} |
|
/** |
|
* 重置 |
|
*/ |
|
public resetData() { |
|
this.initPipelineData(); |
|
// |
|
this.circleShadow.visible = false; |
|
this.previewLineSegment.visible = false; |
|
} |
|
/** |
|
* 确认绘制 |
|
*/ |
|
private enterPaint(): void { |
|
this.previewLineSegment.visible = false; |
|
this.enterPaintEndButton.visible = false; |
|
switch (this.paintMode) { |
|
case PaintMode.singlePointIcon: |
|
break; |
|
case PaintMode.lineIcon: |
|
if (this.paintPoints.length >= 2) { |
|
this.emit('createIcon', this.paintingIcon); |
|
this.paintingIcon = null; |
|
} |
|
break; |
|
case PaintMode.polygonIcon: |
|
this.paintingLine.clear(); |
|
if (this.paintPoints.length >= 3) { |
|
const jsonList = JSON.parse(JSON.stringify(this.canvasData.selectTemplateData.propertyInfos)); |
|
const propertyList = []; |
|
jsonList.forEach(element => { |
|
const property = new PropertyInfo(element); |
|
propertyList.push(property); |
|
}); |
|
const assetData = { |
|
TemplateId: this.canvasData.selectTemplateData.id, |
|
FloorId: this.canvasData.selectStorey.id, |
|
Angle: this.canvasData.selectTemplateData.angle, |
|
Color: this.canvasData.selectTemplateData.color, |
|
Enabled: this.canvasData.selectTemplateData.enabled, |
|
FillMode: this.canvasData.selectTemplateData.fillMode, |
|
FireElementId: this.canvasData.selectTemplateData.fireElementId, |
|
FixedSize: this.canvasData.selectTemplateData.fixedSize, |
|
Height: 32, |
|
Width: 32, |
|
Id: ObjectID.default.generate(), |
|
ImageUrl: this.canvasData.selectTemplateData.imageUrl, |
|
InteractiveMode: this.canvasData.selectTemplateData.interactiveMode, |
|
MultiPoint: JSON.parse(JSON.stringify(this.paintPoints)), |
|
Point: new PIXI.Point(0, 0), |
|
Name: this.canvasData.selectTemplateData.name, |
|
PropertyInfos: propertyList, |
|
Border: this.canvasData.selectTemplateData.border, |
|
DrawMode: this.canvasData.selectTemplateData.drawMode, |
|
Thickness: this.canvasData.selectTemplateData.thickness, |
|
IsFromBuilding: this.canvasData.selectTemplateData.isFromBuilding, |
|
GameMode: this.canvasData.gameMode |
|
}; |
|
const polygonIcon = new PolygonIcon(assetData, this); |
|
this.emit('createIcon', polygonIcon); |
|
} |
|
break; |
|
case PaintMode.Pipeline: |
|
this.emit('createIcon', this.paintingShape); |
|
this.paintingShape = null; |
|
break; |
|
} |
|
this.paintPoints.splice(0, this.paintPoints.length); |
|
} |
|
/** |
|
* 复制 |
|
*/ |
|
public copy(): void { |
|
this.copyData = []; |
|
this.selection.all().forEach(item => { |
|
const newData = JSON.parse(JSON.stringify(item.assetData)); |
|
this.copyData.push(newData); |
|
}); |
|
} |
|
/** |
|
* 粘贴 |
|
*/ |
|
public paste(companyId: string, buildingId: string, floorId: string): void { |
|
const ids: string[] = []; |
|
if (this.copyData.length > 0) { |
|
this.copyData.forEach(item => { |
|
item.Point = new PIXI.Point(item.Point.x + 5, item.Point.y + 5); |
|
const newData = JSON.parse(JSON.stringify(item)); |
|
newData.Id = ObjectID.default.generate(), |
|
newData.CompanyId = companyId; |
|
newData.BuildingId = buildingId; |
|
newData.FloorId = floorId; |
|
newData.Point = new PIXI.Point(item.Point.x + 5, item.Point.y + 5); |
|
switch (item.InteractiveMode) { |
|
case PaintMode.singlePointIcon: |
|
const singleIcon = new AxImageShape(newData, this); |
|
this.emit('createIcon', singleIcon); |
|
break; |
|
case PaintMode.lineIcon: |
|
const lineIcon = new MultipointIcon(newData, this); |
|
this.emit('createIcon', lineIcon); |
|
break; |
|
case PaintMode.polygonIcon: |
|
const polygonIcon = new PolygonIcon(newData, this); |
|
this.emit('createIcon', polygonIcon); |
|
break; |
|
case PaintMode.Pipeline: |
|
if (item.Name === '距离') { |
|
const wall = new AxArrowConnector(newData, this, true, true); |
|
this.emit('createIcon', wall); |
|
} else if (item.Name === '普通墙' || item.Name === '承重墙') { |
|
const wall = new AxArrowConnector(newData, this, false, false); |
|
this.emit('createIcon', wall); |
|
} |
|
break; |
|
} |
|
ids.push(newData.Id); |
|
}); |
|
this.setHighlight(ids); |
|
} |
|
} |
|
//////////////////////////////////////////////////////////////////////// 通用///////////////////////////////////////////////////////////////////////////// |
|
/** |
|
* |
|
* @param id 图标ID |
|
* @param b 显示/隐藏 |
|
*/ |
|
public setIconVisible(ids: string[], b: boolean) { |
|
ids.forEach(item => { |
|
this.backgroundImage.getChildByName(item).visible = b; |
|
}); |
|
} |
|
//////////////////////////////////////////////////////////////////////// 采集平台加载逻辑/////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////// 编制平台加载逻辑/////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////// 考试系统加载逻辑/////////////////////////////////////////////////////////////////////// |
|
/** |
|
* 考生点击楼层 |
|
*/ |
|
public async onExamineeClickFloor() { |
|
await this.refreshBackgroundImage(this.canvasData.selectStorey.imageUrl, this.canvasData.selectStorey.imageAngle); |
|
// 清空所有图形 |
|
this.deselectAll(); |
|
const itemList = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape && item instanceof AxPreviewImageShape === false) { |
|
itemList.push(item.name); |
|
} |
|
}); |
|
|
|
itemList.forEach(item => { |
|
this.backgroundImage.getChildByName(item).destroy(); |
|
}); |
|
// 创建楼层图形 |
|
this.createFloorShape(this.canvasData.examOriginaleveryStoreyData.data); |
|
// 创建楼层图形 |
|
this.createFloorShape(this.canvasData.originaleveryStoreyData.data); |
|
// 创建处置预案图形 |
|
this.createNodeShape(this.canvasData.selectPanelPoint.Data); |
|
// 隐藏图标 |
|
this.setIconVisible(this.canvasData.hiddenBasicInfoFacilities, false); |
|
|
|
this.updateCamera2D(); |
|
} |
|
|
|
/** |
|
* 考官点击楼层-阅卷 |
|
*/ |
|
public async onExaminerClickFloor() { |
|
await this.refreshBackgroundImage(this.canvasData.selectStorey.imageUrl, this.canvasData.selectStorey.imageAngle); |
|
// 清空所有图形 |
|
this.deselectAll(); |
|
const itemList = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape && item instanceof AxPreviewImageShape === false) { |
|
itemList.push(item.name); |
|
} |
|
}); |
|
|
|
itemList.forEach(item => { |
|
this.backgroundImage.getChildByName(item).destroy(); |
|
}); |
|
// 创建楼层图形 |
|
this.createFloorShape(this.canvasData.examOriginaleveryStoreyData.data); |
|
// 创建楼层图形 |
|
this.createFloorShape(this.canvasData.originaleveryStoreyData.data); |
|
// 创建处置预案图形 |
|
this.createNodeShape(this.canvasData.selectPanelPoint.Data); |
|
// 隐藏图标 |
|
this.setIconVisible(this.canvasData.hiddenBasicInfoFacilities, false); |
|
|
|
this.updateCamera2D(); |
|
} |
|
/** |
|
* 考官点击楼层-创建试卷 |
|
*/ |
|
public async onExaminerClickFloor_CreateTestpaper() { |
|
await this.refreshBackgroundImage(this.canvasData.selectStorey.imageUrl, this.canvasData.selectStorey.imageAngle); |
|
// 清空所有图形 |
|
this.deselectAll(); |
|
const itemList = []; |
|
this.backgroundImage.children.forEach(item => { |
|
if (item instanceof AxShape && item instanceof AxPreviewImageShape === false) { |
|
itemList.push(item.name); |
|
} |
|
}); |
|
|
|
itemList.forEach(item => { |
|
this.backgroundImage.getChildByName(item).destroy(); |
|
}); |
|
// 创建楼层图形 |
|
this.createFloorShape(this.canvasData.originaleveryStoreyData.data); |
|
// 创建处置预案图形 |
|
this.createNodeShape(this.canvasData.selectPanelPoint.Data); |
|
// 隐藏图标 |
|
this.setNameVisible(false, 0); |
|
|
|
this.updateCamera2D(); |
|
} |
|
//////////////////////////////////////////////////////////////////// 选择逻辑 |
|
/** |
|
* 清空选择,选择单个形状 |
|
* @param shape 形状 |
|
*/ |
|
public selectSingle(shape: AxShape) { |
|
if (this.selection.first() !== null) { |
|
this.selection.all().forEach(item => { |
|
this.clearSelectEffect(item); |
|
}); |
|
this.selection.clear(); |
|
} |
|
this.selection.add(shape); |
|
this.setSelectEffect(shape); |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
/** |
|
* 选择 |
|
* @param shape 形状 |
|
*/ |
|
public select(shape: AxShape) { |
|
if (this.selection.first() !== null |
|
&& !this.isCtrlKeyClicked |
|
&& !this.selection.has(shape)) { |
|
this.selection.all().forEach(item => { |
|
this.clearSelectEffect(item); |
|
}); |
|
this.selection.clear(); |
|
} |
|
this.selection.add(shape); |
|
this.setSelectEffect(shape); |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
/** |
|
* 选择集合中的形状 |
|
* @param shape 形状集合 |
|
*/ |
|
public selectAll(shape: AxShape[]) { |
|
if (shape.length > 0) { |
|
this.selection.addArray(shape); |
|
this.selection.all().forEach(item => { |
|
this.setSelectEffect(item); |
|
}); |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
} |
|
/** |
|
* 先清空再选择全部 |
|
* @param shape 形状集合 |
|
*/ |
|
public selectAllWithClear(shape: AxShape[]) { |
|
if (this.selection.first() !== null) { |
|
this.selection.all().forEach(item => { |
|
this.clearSelectEffect(item); |
|
}); |
|
this.selection.clear(); |
|
} |
|
this.selection.addArray(shape); |
|
this.selection.all().forEach(item => { |
|
this.setSelectEffect(item); |
|
}); |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
/** |
|
* 选择集合中所有id的形状 |
|
* @param ids 形状id集合 |
|
*/ |
|
public setHighlight(ids: string[]): void { |
|
const shapes: AxShape[] = []; |
|
// 重新选择 |
|
ids.forEach(item => { |
|
const obj = this.backgroundImage.getChildByName(item); |
|
shapes.push(obj as AxShape); |
|
}); |
|
this.selectAllWithClear(shapes); |
|
} |
|
/** |
|
* 取消所有选择 |
|
*/ |
|
public deselectAll() { |
|
if (this.selection.first() !== null) { |
|
this.selection.all().forEach(item => { |
|
this.clearSelectEffect(item); |
|
}); |
|
this.selection.clear(); |
|
AxMessageSystem.send(EVENT_SELECTION_CHANGED); |
|
} |
|
} |
|
/** |
|
* 设置选中效果 |
|
* @param shape 形状 |
|
*/ |
|
public setSelectEffect(shape: AxShape) { |
|
shape.hideBorder(); |
|
shape.setPointVisiable(false); |
|
shape.showBorder(); |
|
shape.drawBorder(1 / this.backgroundImage.scale.x); |
|
shape.setPointVisiable(this.allowEdit); |
|
} |
|
/** |
|
* 设置形状选中效果 |
|
* @param shape 形状 |
|
*/ |
|
public clearSelectEffect(shape: AxShape) { |
|
shape.hideBorder(); |
|
shape.setPointVisiable(false); |
|
} |
|
//////////////////////////////////////////////////////////////////////////////////////////////// 图例 |
|
/** |
|
* 设置图例显示隐藏 |
|
* @param b true 显示,false隐藏 |
|
*/ |
|
public setLegendVisible(b: boolean): void { |
|
const legend = this.backgroundImage.getChildByName('图例') as AxLegend; |
|
legend.interactive = b; |
|
legend.visible = b; |
|
} |
|
}
|
|
|