陈鹏飞 5 years ago
parent
commit
eabe340d79
  1. 83
      src/app/ui/collection-tools/collection-tools.component.html
  2. 48
      src/app/ui/collection-tools/collection-tools.component.scss
  3. 268
      src/app/ui/collection-tools/collection-tools.component.ts
  4. 458
      src/app/working-area/working-area.component.ts

83
src/app/ui/collection-tools/collection-tools.component.html

@ -176,46 +176,95 @@
</div>
<p style="margin-top: 4px;margin-bottom: 0px;">是否高亮</p>
<div>
<input [(ngModel)]="isHighLight" type="checkbox" style="width: 18px;height: 18px;vertical-align: middle;margin-left: 9px;margin-right: 3px;">
<input class="input" [(ngModel)]="isHighLight" type="checkbox">
<span style="font-size: 14px;">选中高亮</span>
</div>
<div *ngFor="let item of PropertyInfos;index as key ">
<!-- 单行文本 -->
<div *ngIf="item.PropertyType == 0">
<p>{{item.PropertyName}}</p>
<input type="text" class="biginput" [value]="item.PropertyValue">
<input type="text" class="biginput" [value]="item.PropertyValue" (input)="assetInputChange(item,$event)">
</div>
<!-- 多行文本 -->
<div *ngIf="item.PropertyType == 1">
<p>{{item.PropertyName}}</p>
<textarea class="textarea" name="" id="" [value]="item.PropertyValue"></textarea>
<textarea class="textarea" name="" id="" [value]="item.PropertyValue" (input)="assetInputChange(item,$event)"></textarea>
</div>
<!-- 数值 -->
<div *ngIf="item.PropertyType == 2">
<p>{{item.PropertyName}}</p>
<input type="number" class="biginput" [value]="item.PropertyValue">
<input type="number" class="biginput" [value]="item.PropertyValue" (input)="assetInputChange(item,$event)">
</div>
<!-- 图片数量 -->
<div *ngIf="item.PropertyType == 4">
<div *ngIf="item.PropertyType == 4" style="height: 140px;">
<div style="position: relative;width: 100%;height: 21px;margin: 1px 0;">
<p style="width: 40%;display: inline-block;">{{item.PropertyName}}</p>
<span style="width: 26%;text-align:right;font-size: 13px;">{{imagesArr.length ? imagesArr.length : 0}} / {{item.PropertyValue}}</span>
<input type="file" style="width: 33%;position: absolute;right: 10px;top: 1px;opacity: 0;z-index: 100;cursor: pointer;">
<div style="width: 33%;height: 21px;line-height: 21px;text-align: center;position: absolute;right: 10px;top: 1px;z-index: 99;border: 1px solid rgb(208, 211, 214);border-radius: 2px;font-size: 13px;">添加</div>
</div>
<div style="position: relative;;width: 89%;border:1px solid rgb(208, 211, 214);height: 100px;margin: 6px auto;" class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide" style="text-align: center;" *ngFor="let img of imagesArr"><img (click)="lookImg()" [src]="img.PropertyValue + '?x-oss-process=image/resize,m_fixed,h_100,w_100'" alt=""></div>
<input *ngIf="isImgNumCss" accept="image/*" (change)="selectFile($event)" type="file" style="width: 33%;position: absolute;right: 10px;top: 1px;opacity: 0;z-index: 100;cursor: pointer;">
<div style="width: 33%;height: 21px;line-height: 21px;text-align: center;position: absolute;right: 10px;top: 1px;z-index: 99;border: 1px solid rgb(208, 211, 214);border-radius: 2px;font-size: 13px;cursor: pointer;" (click)="imgNumBeyond()">添加</div>
<div style="position: relative;;width: 89%;border:1px solid rgb(208, 211, 214);height: 100px;margin: 6px auto;" class="swiper-container">
<div class="swiper-wrapper" [ngClass]="{'noImgCss': imagesArr.length == 0}">
<div class="swiper-slide" style="text-align: center;" *ngFor="let img of imagesArr"><img (click)="lookImg()" [src]="img.PropertyValue + '?x-oss-process=image/resize,m_fixed,h_100,w_100'" alt=""></div>
</div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
<span style="position: absolute;right: 2px;top: 2px;cursor: pointer;z-index: 200;">
<mat-icon class="hoverred" (click)="deleteImg()">delete</mat-icon>
</span>
</div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
</div>
</div>
<!-- 方向 -->
<div *ngIf="item.PropertyType == 5" class="selectDiv">
<p style="display: inline-block;">{{item.PropertyName}}</p>
<select (change)="direction(item,$event)">
<option value ="0" [selected]="item.PropertyValue ==0"></option>
<option value ="1" [selected]="item.PropertyValue ==1">西</option>
<option value ="2" [selected]="item.PropertyValue ==2"></option>
<option value ="3" [selected]="item.PropertyValue ==3"></option>
<option value ="4" [selected]="item.PropertyValue ==4">东南</option>
<option value ="5" [selected]="item.PropertyValue ==5">西南</option>
<option value ="6" [selected]="item.PropertyValue ==6">东北</option>
<option value ="7" [selected]="item.PropertyValue ==7">西北</option>
</select>
</div>
<!-- 布尔值 是1或否0 -->
<div *ngIf="item.PropertyType == 6">
<p>{{item.PropertyName}}</p>
<input [checked]="item.PropertyValue == 1" class="input" type="radio" name="radio" (click)="assetRadioChange(item,'1')"><span></span>
<input [checked]="item.PropertyValue == 0" class="input" type="radio" name="radio" (click)="assetRadioChange(item,'0')"><span></span>
</div>
<!-- 供给区域 -->
<div *ngIf="item.PropertyType == 7" class="selectDiv">
<p style="display: inline-block;">{{item.PropertyName}}</p>
<select (change)="supplyArea(item,$event)">
<option value ="0" [selected]="item.PropertyValue ==0">全部</option>
<option value ="1" [selected]="item.PropertyValue ==1">高区</option>
<option value ="2" [selected]="item.PropertyValue ==2">中区</option>
<option value ="3" [selected]="item.PropertyValue ==3">低区</option>
<option value ="4" [selected]="item.PropertyValue ==4">高中区</option>
<option value ="5" [selected]="item.PropertyValue ==5">高低区</option>
<option value ="6" [selected]="item.PropertyValue ==6">中低区</option>
</select>
</div>
<!-- 供给类型 -->
<div *ngIf="item.PropertyType == 8" class="selectDiv">
<p style="display: inline-block;">{{item.PropertyName}}</p>
<select (change)="supplyType(item,$event)" value="4">
<option value ="0" [selected]="item.PropertyValue ==0">消火栓</option>
<option value ="1" [selected]="item.PropertyValue ==1">喷淋</option>
<option value ="2" [selected]="item.PropertyValue ==2">水幕</option>
<option value ="3" [selected]="item.PropertyValue ==3">泡沫</option>
<option value ="4" [selected]="item.PropertyValue ==4">消防</option>
</select>
</div>
</div>
</div>
</div>
<!-- 消防要素 -->
<div class="firecategories" style="height: 50%;">
<div class="title">
@ -227,8 +276,6 @@
<!-- 消防列表树写在这里 -->
</div>
</div>
</div>
</div>
</div>
<!--功能区 -->

48
src/app/ui/collection-tools/collection-tools.component.scss

@ -164,6 +164,9 @@
margin:1px 0 3px 8px;
font-size: 14px;
}
span{
font-size: 15px;
}
input{
height: 18px;
}
@ -186,14 +189,37 @@
.swiper-button-next{
right: 6px;
}
.swiper-button-next:after{
font-size: 20px;
}
// .swiper-button-next:after{
// font-size: 20px;
// }
.swiper-button-prev{
left: 6px;
}
.swiper-button-prev:after{
font-size: 20px;
// .swiper-button-prev:after{
// font-size: 20px;
// }
.swiper-container{
// --swiper-theme-color: #ff6600;/* 设置Swiper风格 */
// --swiper-navigation-color: #00ff33;/* 单独设置按钮颜色 */
--swiper-navigation-size:20px;/* 设置按钮大小 */
}
.hoverred:hover{
color: rgb(187, 28, 28);
}
.selectDiv{
height: 21px;
position: relative;
margin-bottom: 5px;
select{
width: 98px;
height: 22px;
vertical-align: middle;
position: absolute;
right: 10px;
top: 1px;
border: 1px solid rgb(208, 211, 214);
border-radius: 2px;
}
}
}
}
@ -209,4 +235,16 @@
div:focus {
outline: none;
}
//没有图片时显示无图片背景图
.noImgCss{
background: url(../../../assets/images/noImg.png) no-repeat center center;
background-size: 88% 100%;/*按比例缩放*/
}
.input{
width: 18px;
height: 18px;
vertical-align: middle;
margin-left: 9px;
margin-right: 3px;
}

268
src/app/ui/collection-tools/collection-tools.component.ts

@ -15,7 +15,7 @@ import Swiper from 'swiper';
export class CollectionToolsComponent implements OnInit {
constructor(private http:HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar) { }
mySwiper
selected = 'option1' //图标大小选择框
basicInfo:boolean = true //基本信息名称显隐
wantToWork:boolean = true //想定作业名称显隐
@ -66,9 +66,45 @@ export class CollectionToolsComponent implements OnInit {
"RuleName": "",
"RuleValue": "",
"PhysicalUnit": "",
"PropertyName": "名称/编号",
"PropertyName": "单行文本",
"PropertyType": 0,
"PropertyValue": "99999"
},{
"Tag": "",
"Order": 0,
"Enabled": true,
"Visible": true,
"Required": false,
"RuleName": "",
"RuleValue": "",
"PhysicalUnit": "",
"PropertyName": "多行文本",
"PropertyType": 1,
"PropertyValue": "99999"
},{
"Tag": "",
"Order": 0,
"Enabled": true,
"Visible": true,
"Required": false,
"RuleName": "",
"RuleValue": "",
"PhysicalUnit": "",
"PropertyName": "数值",
"PropertyType": 2,
"PropertyValue": "666"
}, {
"Tag": "",
"Order": 0,
"Enabled": true,
"Visible": true,
"Required": false,
"RuleName": "",
"RuleValue": "",
"PhysicalUnit": "张",
"PropertyName": "布尔值",
"PropertyType": 6,
"PropertyValue": "1"
}, {
"Tag": "",
"Order": 0,
@ -105,6 +141,66 @@ export class CollectionToolsComponent implements OnInit {
"PropertyName": "图片",
"PropertyType": 3,
"PropertyValue": "/api/Objects/PlanPlatform/5e7c0ff1bb3cf106508afaed.png"
}, {
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "图片",
"PropertyType": 3,
"PropertyValue": "/api/Objects/PlanPlatform/5e7abccbefc8471c94ff19ff.png"
}, {
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "图片",
"PropertyType": 3,
"PropertyValue": "/api/Objects/PlanPlatform/5e7d68e5e72823213c55e4cf.png"
},{
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "方向",
"PropertyType": 5,
"PropertyValue": "4"
},{
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "供给区域",
"PropertyType": 7,
"PropertyValue": "4"
},{
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "供给类型",
"PropertyType": 8,
"PropertyValue": "4"
}],
"IsFromBuilding": false,
"InteractiveMode": 0
@ -115,11 +211,17 @@ export class CollectionToolsComponent implements OnInit {
sliderValue:number = 0//滑竿的值
isHighLight:boolean = false//是否高亮选择框
PropertyInfos = [] //去除图片链接真正用于循环的内容
imagesArrNum //素材属性图片数量上限
imagesArr = [] //属性中的图片链接集合
clickedIndex //点击图片的索引值
clickedIndex //点击图片时的索引值
//传入素材对象,设置右侧属性栏内容
canvasAssetObj //传入的素材属性对象
isImgNumCss = false //控制上传文件input显隐
setAssetsProperty(obj){
let _this = this
this.canvasAssetObj = obj
this.assetName = obj.Name
this.assetWidth = obj.Width
this.assetHeight = obj.Height
@ -131,14 +233,16 @@ export class CollectionToolsComponent implements OnInit {
}else{
this.PropertyInfos.push(item)
}
if(item.PropertyType == 4){
this.imagesArrNum = item.PropertyValue
}
})
//如果存在图片则加载轮播图
if(this.imagesArr.length){
setTimeout(() => {
var mySwiper = new Swiper('.swiper-container',{
this.mySwiper = new Swiper('.swiper-container',{
loop: false,
grabCursor: true,
// grabCursor: true,
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
@ -149,12 +253,15 @@ export class CollectionToolsComponent implements OnInit {
_this.clickedIndex = this.clickedIndex
},
}
});
});
}, 0);
}
//判断此时图片数量是否达到上限
if(this.imagesArr.length < this.imagesArrNum){//如果不超出
this.isImgNumCss = true
}else{
this.isImgNumCss = false
}
}
//素材宽度输入框改变
@ -173,22 +280,159 @@ export class CollectionToolsComponent implements OnInit {
assetHighLightIunput(){
}
//动态属性素材input框值改变
assetInputChange(i,e){
let index = this.canvasAssetObj.PropertyInfos.findIndex((item)=>{
return i.PropertyName == item.PropertyName
})
this.canvasAssetObj.PropertyInfos[index].PropertyValue = e.target.value
}
//动态属性素材布尔值框改变radio
assetRadioChange(i,boolean){
let index = this.canvasAssetObj.PropertyInfos.findIndex((item)=>{
return i.PropertyName == item.PropertyName
})
this.canvasAssetObj.PropertyInfos[index].PropertyValue = boolean
}
//查看图片详情
lookImg(){
const dialogRef = this.dialog.open(ViewDetails, {//调用open方法打开对话框并且携带参数过去
data: {imagesArr:this.imagesArr,index:this.clickedIndex}
});
dialogRef.afterClosed().subscribe(data=>{
});
}
//上传素材图片
selectFile(e){
let imgFile = e.target.files[0] || null //上传的文件
this.startUploading(imgFile)
}
objectName:any //上传对象名
startUploading (imgFile) {
let _this = this
let file = imgFile || null //获取上传的文件
let fileSize = file.size || null //上传文件的总大小
let shardSize = 5 * 1024 * 1024 //5MB一个分片
let companyId = sessionStorage.getItem("companyId")
if (file && fileSize <= shardSize) { //上传文件<=5MB时
let formData = new FormData()
formData.append("file",file)
this.http.post(`api/Objects/WebPlan2D/${companyId}`,formData).subscribe((data:any)=>{
this.objectName = data.objectName
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.snackBar.open('上传成功','确定',config)
//在原始素材对象和需要循环图片的对象中分别push最新上传的图片
let imgObj = {
"Tag": null,
"Order": 0,
"Enabled": false,
"Visible": false,
"Required": false,
"RuleName": null,
"RuleValue": null,
"PhysicalUnit": null,
"PropertyName": "图片",
"PropertyType": 3,
"PropertyValue": "/api/Objects/WebPlan2D/" + this.objectName
}
this.imagesArr.push(imgObj)
this.canvasAssetObj.PropertyInfos.push(imgObj)
setTimeout(() => {
this.mySwiper.update();
this.mySwiper.slideTo(this.imagesArr.length - 1)
}, 0);
//判断上传素材属性图片是否超出数量 超出数量则隐藏input框
if(this.imagesArr.length < this.imagesArrNum){//不超出input才会显示
this.isImgNumCss = true
}else{
this.isImgNumCss = false
}
//此处需要把 this.canvasAssetObj这个传入对象 返回给canvas ↓↓↓↓↓↓↓↓↓↓
})
} else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传
let config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.snackBar.open('上传图片文件不允许大于5mb','确定',config);
}
}
//不能上传图片提示
imgNumBeyond(){
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.snackBar.open('图片数量已达上限','确定',config);
}
//删除素材属性图片
deleteImg(){
if(this.imagesArr.length == 0){
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.snackBar.open('没有可删除的图片,请先上传','确定',config)
}else{
//在素材原始对象中将删除的图片去掉
this.canvasAssetObj.PropertyInfos = [...this.canvasAssetObj.PropertyInfos.filter((item)=>{
return item.PropertyValue != this.imagesArr[this.mySwiper.activeIndex].PropertyValue
})]
//在图片循环数组中将图片去掉
this.imagesArr.splice(this.mySwiper.activeIndex, 1);
//更新swiper视图
setTimeout(() => {
this.mySwiper.update();
}, 0);
//此处需要把 this.canvasAssetObj这个传入对象 返回给canvas ↓↓↓↓↓↓↓↓↓↓
}
}
//动态属性方向select选择框
direction(i,e){
let index = this.canvasAssetObj.PropertyInfos.findIndex((item)=>{
return i.PropertyName == item.PropertyName
})
this.canvasAssetObj.PropertyInfos[index].PropertyValue = e.target.value
}
//动态属性供给区域select选择框
supplyArea(i,e){
let index = this.canvasAssetObj.PropertyInfos.findIndex((item)=>{
return i.PropertyName == item.PropertyName
})
this.canvasAssetObj.PropertyInfos[index].PropertyValue = e.target.value
}
//动态属性供给类型select选择框
supplyType(i,e){
let index = this.canvasAssetObj.PropertyInfos.findIndex((item)=>{
return i.PropertyName == item.PropertyName
})
this.canvasAssetObj.PropertyInfos[index].PropertyValue = e.target.value
}
ngOnInit(): void {
this.getAllLibrary()
this.getSitePlan()
this.getAllBuildings()
this.setAssetsProperty(this.proObject) //测试
function xxx(args) {
console.log(args)
}
xxx({
name:"xxxx"
})
}
//点击基本信息名称
@ -754,7 +998,6 @@ export class EditBuilding {
}
//查看图片大图
//查看图片大图和视频
@Component({
selector: 'viewdetails',
templateUrl: './viewdetails.html',
@ -773,7 +1016,6 @@ export class ViewDetails {
setTimeout(() => {
var mySwiper = new Swiper('.swiper-container',{
loop: false,
grabCursor: true,
initialSlide :this.data.index,//默认索引
// 如果需要前进后退按钮
navigation: {

458
src/app/working-area/working-area.component.ts

@ -15,21 +15,21 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
content: ElementRef;
// 画布程序
app: PIXI.Application;
public app: PIXI.Application;
// 加载器
loader = PIXI.Loader.shared;
public loader = PIXI.Loader.shared;
// 根目录
backgroundImage: PIXI.Sprite;
public backgroundImage: PIXI.Sprite;
// 单点图标影子
singlePointIconShadow = new PIXI.Sprite();
public singlePointIconShadow = new PIXI.Sprite();
// 线图标影子
lineIconShadow = new PIXI.Graphics();
public lineIconShadow = new PIXI.Graphics();
// 圆形影子
circleShadow = new PIXI.Graphics();
public circleShadow = new PIXI.Graphics();
// 鼠标位置
mousePosition: PIXI.Point;
public mousePosition: PIXI.Point;
/// 绘画模式
paintMode: PaintMode;
public paintMode: PaintMode;
ngOnInit(): void {
@ -104,9 +104,15 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
// this.lineIconShadow.lineTo(100, 100);
});
}
/// <summary>
/// 创建单点图标
/// <summary>
/**
*
* @param source
* @param x
* @param y
* @param width
* @param height
* @param alpha
*/
private createSinglePointIcon(source: PIXI.Texture, x: number, y: number, width: number, height: number, alpha: number): PIXI.Sprite {
const singlePointIcon = new PIXI.Sprite(source);
singlePointIcon.x = x;
@ -136,9 +142,9 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
})
.on('mousemove', event => {
if (event.currentTarget.dragging) {
const newPosition = event.currentTarget.data.getLocalPosition(event.currentTarget.parent);
event.currentTarget.x = newPosition.x;
event.currentTarget.y = newPosition.y;
const newPosition = event.currentTarget.data.getLocalPosition(event.currentTarget.parent);
event.currentTarget.x = newPosition.x;
event.currentTarget.y = newPosition.y;
}
})
.on('rightclick', event => {
@ -152,27 +158,111 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
/// <>
private createLineIcon(source: PIXI.Texture, x: number, y: number, points: PIXI.Point[]) {
const container = new PIXI.Container();
container.x = x;
container.y = y;
points.forEach(item => {
const icon = new PIXI.TilingSprite(source, 100, 64);
icon.anchor.set(0, 0.5);
icon.x = item.x;
icon.y = item.y;
container.addChild(icon);
container.name = '多点连线';
// 画点
points.forEach((item, index, array) => {
const iconPoint = new PIXI.Graphics();
iconPoint.lineStyle(0);
iconPoint.beginFill(0xFFFF0B, 1);
iconPoint.drawCircle(item.x, item.y, 15);
iconPoint.drawCircle(0, 0, 15);
iconPoint.x = item.x;
iconPoint.y = item.y;
iconPoint.endFill();
container.addChild(iconPoint);
});
// 画线图标
for (let i = 0, count = points.length - 1; i < count; i++) {
const pointA = points[i];
const pointB = points[i + 1];
const angle = Math.atan2((pointB.y - pointA.y), (pointB.x - pointA.x)) * (180 / Math.PI);
const a = pointB.x - pointA.x;
const b = pointB.y - pointA.y;
const distance = Math.sqrt(a * a + b * b);
const icon = new PIXI.TilingSprite(source, distance, 64);
icon.anchor.set(0, 0.5);
icon.x = pointA.x;
icon.y = pointA.y;
icon.angle = angle;
container.addChild(icon);
}
this.backgroundImage.addChild(container);
// 添加事件
container.children.forEach(item => {
if (item instanceof PIXI.Graphics) {
item.interactive = true;
item.on('mousedown', event => {
event.stopPropagation();
event.currentTarget.data = event.data;
event.currentTarget.alpha = 0.5;
event.currentTarget.dragging = true;
})
.on('mouseup', event => {
event.currentTarget.alpha = 1;
event.currentTarget.dragging = false;
event.currentTarget.data = null;
})
.on('mouseupoutside', event => {
event.currentTarget.alpha = 1;
event.currentTarget.dragging = false;
event.currentTarget.data = null;
})
.on('mousemove', event => {
if (event.currentTarget.dragging) {
const newPosition = event.currentTarget.data.getLocalPosition(event.currentTarget.parent);
event.currentTarget.x = newPosition.x;
event.currentTarget.y = newPosition.y;
}
})
.on('rightclick', event => {
});
} else if (item instanceof PIXI.TilingSprite) {
item.interactive = true;
item.on('mousedown', event => {
event.stopPropagation();
event.currentTarget.parent.data = event.data;
event.currentTarget.parent.alpha = 0.5;
event.currentTarget.parent.dragging = true;
event.currentTarget.parent.dragPoint = event.data.getLocalPosition(event.currentTarget.parent.parent);
event.currentTarget.parent.dragPoint.x -= event.currentTarget.parent.x;
event.currentTarget.parent.dragPoint.y -= event.currentTarget.parent.y;
})
.on('mouseup', event => {
event.currentTarget.parent.alpha = 1;
event.currentTarget.parent.dragging = false;
event.currentTarget.parent.data = null;
})
.on('mouseupoutside', event => {
event.currentTarget.parent.alpha = 1;
event.currentTarget.parent.dragging = false;
event.currentTarget.parent.data = null;
})
.on('mousemove', event => {
if (event.currentTarget.parent.dragging) {
const newPosition = event.currentTarget.parent.data.getLocalPosition(event.currentTarget.parent.parent);
event.currentTarget.parent.x = newPosition.x - event.currentTarget.parent.dragPoint.x;
event.currentTarget.parent.y = newPosition.y - event.currentTarget.parent.dragPoint.y;
}
})
.on('rightclick', event => {
});
}
});
}
/// <summary>
/// 创建背景图
/// <summary>
/**
*
* @param texture
* @param points
*/
private createLineIconTest(texture: PIXI.Texture, points: PIXI.Point[]) {
const icon = new MultipointIcon(texture, points);
this.backgroundImage.addChild(icon);
}
/**
*
*/
private createBackgroundImage(): void {
this.backgroundImage = PIXI.Sprite.from('assets/images/noImg.png');
this.backgroundImage.anchor.set(0.5);
@ -204,7 +294,9 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
break;
case PaintMode.LineIcon:
// tslint:disable-next-line: max-line-length
this.createLineIcon(this.singlePointIconShadow.texture, pos.x, pos.y, [new PIXI.Point(0, 0), new PIXI.Point(100, 0), new PIXI.Point(100, 100)]);
// this.createLineIcon(this.singlePointIconShadow.texture, 0, 0, [new PIXI.Point(0, -100), new PIXI.Point(100, 0), new PIXI.Point(0, 100)]);
// tslint:disable-next-line: max-line-length
this.createLineIconTest(this.singlePointIconShadow.texture, [new PIXI.Point(0, -100), new PIXI.Point(100, 0), new PIXI.Point(0, 100), new PIXI.Point(-100, 0)]);
break;
case PaintMode.PolygonIcon:
break;
@ -242,17 +334,26 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
});
this.app.stage.addChild(this.backgroundImage);
}
/// <summary>
/// 替换背景图
/// 参数{source:string} 可以是一个url地址,也可以是本地assets下的一个图片路径
/// <summary>
public changeBackgroundImage(source: string): void {
this.backgroundImage.texture = PIXI.Texture.from(source);
/**
*
* @param imageUri url地址,assets下的一个图片路径
* @param imageAngle
*/
public changeBackgroundImage(imageUri: string, imageAngle: number): void {
this.backgroundImage.texture = PIXI.Texture.from(imageUri);
this.backgroundImage.angle = imageAngle;
this.backgroundImage.visible = true;
}
/// <summary>
/// 创建单点图标影子
/// <summary>
/**
*
* @param imageAngle
*/
public setBackgroundAngle(imageAngle: number) {
this.backgroundImage.angle = imageAngle;
}
/**
*
*/
private createSinglePointIconShadow(): void {
this.singlePointIconShadow = PIXI.Sprite.from('assets/images/noImg.png');
this.singlePointIconShadow.width = 32;
@ -262,43 +363,50 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
this.singlePointIconShadow.visible = false;
this.app.stage.addChild(this.singlePointIconShadow);
}
/// <summary>
/// 改变单点图标影子
/// <summary>
private changeSinglePointIconShadow(source: string): void {
this.singlePointIconShadow.texture = PIXI.Texture.from(source);
/**
*
* @param uri
*/
private changeSinglePointIconShadow(uri: string): void {
this.singlePointIconShadow.texture = PIXI.Texture.from(uri);
this.singlePointIconShadow.visible = true;
}
/// <>
/// 创建线图标影子
/// <>
/**
* 线
*/
private createLineIconShadow() {
this.app.stage.addChild(this.lineIconShadow);
}
/// <summary>
/// 开始绘画单点图标
/// <summary>
public beginPaintSinglePointIcon(source: string): void {
/**
*
* @param imageUri
*/
public beginPaintSinglePointIcon(imageUri: string): void {
this.cancelPaint();
this.paintMode = PaintMode.SinglePointIcon;
this.changeSinglePointIconShadow(source);
this.changeSinglePointIconShadow(imageUri);
}
// 开始绘画多边形
public beginPaintPolygonIcon(source: string): void {
/**
*
*/
public beginPaintPolygonIcon(): void {
this.cancelPaint();
this.paintMode = PaintMode.PolygonIcon;
}
// 开始绘画线
public beginPaintLineIcon(source: string): void {
/**
*
* @param imageUri
*/
public beginPaintLineIcon(imageUri: string): void {
this.cancelPaint();
this.paintMode = PaintMode.LineIcon;
this.changeSinglePointIconShadow(source);
this.changeSinglePointIconShadow(imageUri);
// this.lineIconShadow.lineStyle(1, 0xffd900, 1);
}
/// <summary>
/// 取消绘画
/// <summary>
/**
*
*/
private cancelPaint(): void {
switch (this.paintMode) {
case PaintMode.PaintEnd:
@ -316,24 +424,25 @@ export class WorkingAreaComponent implements OnInit, AfterViewInit {
break;
}
}
/// <summary>
/// 画圆
/// <summary>
/**
*
* @param x
*/
paintShadowCircle(x: number): void {
this.circleShadow.beginFill(0xFFCC5A);
this.circleShadow.drawCircle(0, 0, x);
this.app.stage.addChild(this.circleShadow);
}
/// <summary>
/// 取消画圆
/// <summary>
/**
*
*/
cancelPaintShadowCircle(): void {
this.app.stage.removeChild(this.circleShadow);
}
}
/// <summary>
/// 绘制模式
/// <summary>
/**
*
*/
enum PaintMode {
SinglePointIcon,
LineIcon,
@ -341,3 +450,218 @@ enum PaintMode {
PolygonIcon,
PaintEnd,
}
/**
* 线
*/
class MultipointIcon extends PIXI.Container {
public pointsData: PIXI.Point[];
public pointsGraphics: PIXI.Graphics[] = [];
public iconsTilingSprite: PIXI.TilingSprite[] = [];
/**
*
* @param texture
* @param points
*/
constructor(texture: PIXI.Texture, points: PIXI.Point[]) {
super();
this.pointsData = points;
// 画线图标
for (let i = 0, count = this.pointsData.length - 1; i < count; i++) {
const pointA = this.pointsData[i];
const pointB = this.pointsData[i + 1];
const angle = Math.atan2((pointB.y - pointA.y), (pointB.x - pointA.x)) * (180 / Math.PI);
const a = pointB.x - pointA.x;
const b = pointB.y - pointA.y;
const distance = Math.sqrt(a * a + b * b);
const icon = new PIXI.TilingSprite(texture, distance, 64);
icon.anchor.set(0, 0.5);
icon.x = pointA.x;
icon.y = pointA.y;
icon.angle = angle;
this.iconsTilingSprite.push(icon);
this.addChild(icon);
}
// 画点
this.pointsData.forEach((item, index, array) => {
const iconPoint = new PIXI.Graphics();
iconPoint.lineStyle(0);
iconPoint.beginFill(0xFFFF0B, 1);
iconPoint.drawCircle(0, 0, 15);
iconPoint.x = item.x;
iconPoint.y = item.y;
iconPoint.endFill();
iconPoint.visible = false;
this.pointsGraphics.push(iconPoint);
this.addChild(iconPoint);
});
// 添加圆点事件
this.pointsGraphics.forEach((item, index, array) => {
item.interactive = true;
item.on('mousedown', event => {
event.stopPropagation();
event.currentTarget.data = event.data;
event.currentTarget.alpha = 0.5;
event.currentTarget.dragging = true;
})
.on('mouseup', event => {
event.currentTarget.alpha = 1;
event.currentTarget.dragging = false;
event.currentTarget.data = null;
})
.on('mouseupoutside', event => {
event.currentTarget.alpha = 1;
event.currentTarget.dragging = false;
event.currentTarget.data = null;
})
.on('mousemove', event => {
if (event.currentTarget.dragging) {
const newPosition = event.currentTarget.data.getLocalPosition(event.currentTarget.parent);
event.currentTarget.x = newPosition.x;
event.currentTarget.y = newPosition.y;
if (index === 0) {// 第一个点
this.iconsTilingSprite[index].x = newPosition.x;
this.iconsTilingSprite[index].y = newPosition.y;
const pointA = array[index];
const pointB = array[index + 1];
const angle = Math.atan2((pointB.y - pointA.y), (pointB.x - pointA.x)) * (180 / Math.PI);
const a = pointB.x - pointA.x;
const b = pointB.y - pointA.y;
const distance = Math.sqrt(a * a + b * b);
this.iconsTilingSprite[index].angle = angle;
this.iconsTilingSprite[index].width = distance;
} else if (index < array.length - 1) {// 不是第一个点,也不是最后一个点
this.iconsTilingSprite[index].x = newPosition.x;
this.iconsTilingSprite[index].y = newPosition.y;
const pointA = array[index]; // 当前点
const pointB = array[index + 1]; // 后一个点
const pointC = array[index - 1]; // 前一个点
const angle = Math.atan2((pointB.y - pointA.y), (pointB.x - pointA.x)) * (180 / Math.PI);
const a = pointB.x - pointA.x;
const b = pointB.y - pointA.y;
const distance = Math.sqrt(a * a + b * b);
this.iconsTilingSprite[index].angle = angle;
this.iconsTilingSprite[index].width = distance;
const angleC = Math.atan2((pointA.y - pointC.y), (pointA.x - pointC.x)) * (180 / Math.PI);
const aC = pointA.x - pointC.x;
const bC = pointA.y - pointC.y;
const distanceC = Math.sqrt(aC * aC + bC * bC);
this.iconsTilingSprite[index - 1].angle = angleC;
this.iconsTilingSprite[index - 1].width = distanceC;
} else if (index === array.length - 1) { // 最后一个点
const pointA = array[index]; // 当前点
const pointC = array[index - 1]; // 前一个点
const angleC = Math.atan2((pointA.y - pointC.y), (pointA.x - pointC.x)) * (180 / Math.PI);
const aC = pointA.x - pointC.x;
const bC = pointA.y - pointC.y;
const distanceC = Math.sqrt(aC * aC + bC * bC);
this.iconsTilingSprite[index - 1].angle = angleC;
this.iconsTilingSprite[index - 1].width = distanceC;
}
}
})
.on('rightclick', event => {
});
});
// 添加选中事件
this.iconsTilingSprite.forEach((item, index, array) => {
item.interactive = true;
item.on('mousedown', event => {
event.stopPropagation();
event.currentTarget.parent.data = event.data;
event.currentTarget.parent.alpha = 0.5;
event.currentTarget.parent.dragging = true;
event.currentTarget.parent.dragPoint = event.data.getLocalPosition(event.currentTarget.parent.parent);
event.currentTarget.parent.dragPoint.x -= event.currentTarget.parent.x;
event.currentTarget.parent.dragPoint.y -= event.currentTarget.parent.y;
this.setPointVisiable(true);
})
.on('mouseup', event => {
event.currentTarget.parent.alpha = 1;
event.currentTarget.parent.dragging = false;
event.currentTarget.parent.data = null;
})
.on('mouseupoutside', event => {
event.currentTarget.parent.alpha = 1;
event.currentTarget.parent.dragging = false;
event.currentTarget.parent.data = null;
})
.on('mousemove', event => {
if (event.currentTarget.parent.dragging) {
const newPosition = event.currentTarget.parent.data.getLocalPosition(event.currentTarget.parent.parent);
event.currentTarget.parent.x = newPosition.x - event.currentTarget.parent.dragPoint.x;
event.currentTarget.parent.y = newPosition.y - event.currentTarget.parent.dragPoint.y;
}
})
.on('rightclick', event => {
});
});
}
/**
*
* @param value
*/
public setPointVisiable(value: boolean) {
this.pointsGraphics.forEach((item) => {
item.visible = value;
});
}
}
interface IEventData {
// 事件唯一ID
uuid: number;
callback: (data: any) => void;
}
/**
*
*/
export default class Event {
public static eventUuid = 0;
public static eventList: { [eventName: string]: IEventData[] } = {};
public static register(eventName: string, callback: (data: any) => void): number {
this.eventUuid = this.eventUuid + 1;
if (this.eventList[eventName] === undefined) {
this.eventList[eventName] = [];
}
this.eventList[eventName][this.eventUuid] = { uuid: this.eventUuid, callback };
return this.eventUuid;
}
public static unregister(eventName: string, tag: number) {
if (tag == null) {
this.eventList[eventName] = undefined;
} else {
if (this.eventList[eventName] !== undefined && this.eventList[eventName][tag] !== undefined) {
this.eventList[eventName][tag] = undefined;
}
}
}
public static dispatch(eventName: string, data: any) {
const eventList: IEventData[] = this.eventList[eventName];
if (eventList !== undefined) {
for (const key in eventList) {
if (eventList[key].callback !== undefined) {
eventList[key].callback(data);
}
}
}
}
}

Loading…
Cancel
Save