Blame view

src/components/funAreaSelect/funAreaSelect.js 8.15 KB
96108619   Zhang Zhuo   更新添加文字功能 -张卓
1
2
  import React, { Component } from "react"
  import AreaSelect from "../areaSelete/areaSelete"
e2460342   Zhang Zhuo   更改 -张卓
3
  export default class FunAreaSelect extends Component {
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
4
5
6
    constructor(props) {
      super(props);
      this.state = {
5290cb53   Zhang Zhuo   更新第一版本 -张卓
7
        id: new Date().getTime() + "fun",
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
8
        serviceData: [],
e2460342   Zhang Zhuo   更改 -张卓
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        mode: "polygon",//polygon    react
        disabled: "false",//判断是否可以移动  false是可以移动
        circleRadius: 5,//圆半径
        circleBorderWidth: 2,//圆边线的半径宽
        circleBorderColor: "#28B1D9",//圆边线的颜色
        circleInColor: "#28B1D9",//圆里里面的颜色
        circleSelectColor: "#FFF",
        lineColor: "#28B1D9",//线的颜色
        lineWidth: 2,//线的宽度
        areaColor: "rgba(40, 177, 217, 0.2)",//选中区域颜色
        disabled: "false",//判断是否可以移动  false是可以移动
        title: "",//文字的内容
        titleColor: "#000",//文字的颜色
        titleFont: "14px bold 黑体",//文字的字体
        titleLineHeight: "",//文字的行高
5290cb53   Zhang Zhuo   更新第一版本 -张卓
24
25
26
27
28
        titleBackgroundColor: "",//字的北京颜色支持rgba
        titlePadding: "10px",//文字的padding
        titleTextAlign: "center",
        titleWidth: 100,
        titleFillColor: "",
e2460342   Zhang Zhuo   更改 -张卓
29
        position: [10, 10],//文字的位置
5290cb53   Zhang Zhuo   更新第一版本 -张卓
30
        inputStyle:{}
96108619   Zhang Zhuo   更新添加文字功能 -张卓
31
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
32
    }
e2460342   Zhang Zhuo   更改 -张卓
33
34
35
36
37
38
39
40
41
42
43
44
    static getDerivedStateFromProps(props, state) {
      var obj = {};
      for (var key in props) {
        if (props[key] && props[key] !== state[key]) {
          obj[key] = props[key]
        }
      }
      if (Object.keys(obj).length > 0) {
        return obj;
      } else {
        return null
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
45
46
    }
    componentDidMount() {
e2460342   Zhang Zhuo   更改 -张卓
47
      let { mode } = this.state;
e2460342   Zhang Zhuo   更改 -张卓
48
      if (mode === "react") {
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
49
        this.setReact()
e2460342   Zhang Zhuo   更改 -张卓
50
51
52
      } else if (mode === "polygon") {
        this.setPolygon()
      } else {
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
53
        this.setPolygon()
96108619   Zhang Zhuo   更新添加文字功能 -张卓
54
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
55
    }
e2460342   Zhang Zhuo   更改 -张卓
56
    isNull() {//判断画布是否为空
5290cb53   Zhang Zhuo   更新第一版本 -张卓
57
      let { id } = this.state;
e2460342   Zhang Zhuo   更改 -张卓
58
59
60
61
62
63
      var canvasEl = document.getElementById(this[id].state.id)//获取canvas的id 这id是动态的所以要用ref进行获取
      var blank = document.createElement('canvas');//系统获取一个空canvas对象
      blank.width = canvasEl.width;
      blank.height = canvasEl.height;
      return canvasEl.toDataURL() == blank.toDataURL();//比较值相等则为空
    }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
64
    setReact() {//设置矩形
5290cb53   Zhang Zhuo   更新第一版本 -张卓
65
      let { id } = this.state;
e2460342   Zhang Zhuo   更改 -张卓
66
67
      this.count = 0;//用来判断是否生成了一个框
      var canvasEl = document.getElementById(this[id].state.id)//获取canvas的id 这id是动态的所以要用ref进行获取
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
68
      var mousemoveFc = (e) => {
e2460342   Zhang Zhuo   更改 -张卓
69
        var serviceData = this.state.serviceData;
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
70
71
72
73
74
75
76
        var left1 = e.layerX;
        var top1 = e.layerY;
        if (this.count === 0) {//如果是第一次画就正常
          serviceData[1][1] = top1;
          serviceData[2] = [left1, top1];
          serviceData[3][0] = left1;
        } else {//不是第一次,也就是有框了这时候你直接就可以拖拽
e2460342   Zhang Zhuo   更改 -张卓
77
78
79
          if (this[id].selectedIndex || this[id].selectedIndex === 0) {
            serviceData[this[id].selectedIndex] = [left1, top1]
            switch (this[id].selectedIndex) {
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
              case 0:
                serviceData[1][0] = left1;
                serviceData[3][1] = top1;
                break;
              case 1:
                serviceData[0][0] = left1;
                serviceData[2][1] = top1;
                break;
              case 2:
                serviceData[1][1] = top1;
                serviceData[3][0] = left1;
                break;
              case 3:
                serviceData[0][1] = top1;
                serviceData[2][0] = left1;
                break;
            }
e2460342   Zhang Zhuo   更改 -张卓
97
            this.props.change(serviceData)
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
98
99
100
101
102
          }
        }
        this.setState({
          serviceData
        }, () => {
e2460342   Zhang Zhuo   更改 -张卓
103
          this[id].draw()
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
104
        })
96108619   Zhang Zhuo   更新添加文字功能 -张卓
105
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
106
      canvasEl.addEventListener("mousedown", (e) => {
e2460342   Zhang Zhuo   更改 -张卓
107
        if (e.button === 2) return
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
108
109
110
        var left = e.layerX;
        var top = e.layerY;
        var arr = [left, top]
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
111
        if (this.state.serviceData.length === 0) {//刚按下的时候进行初始化
e2460342   Zhang Zhuo   更改 -张卓
112
          this.count++;//这个参数每次点击就加加这样就可以判断上面是否画图了
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
113
114
115
116
          let serviceData = [[...arr], [...arr], [...arr], [...arr]]
          this.setState({
            serviceData
          }, () => {
e2460342   Zhang Zhuo   更改 -张卓
117
            this[id].draw();
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
118
          })
e2460342   Zhang Zhuo   更改 -张卓
119
          canvasEl.addEventListener("mousemove", mousemoveFc)
5290cb53   Zhang Zhuo   更新第一版本 -张卓
120
121
        } else {
          if (this[id].selectBox(left, top)) {
e2460342   Zhang Zhuo   更改 -张卓
122
123
124
            this.count++;
            canvasEl.addEventListener("mousemove", mousemoveFc)
          }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
125
        }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
126
127
128
129
      })
      canvasEl.addEventListener("mouseup", (e) => {
        canvasEl.removeEventListener("mousemove", mousemoveFc)
      })
e2460342   Zhang Zhuo   更改 -张卓
130
      canvasEl.oncontextmenu = (e) => { e.preventDefault() }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
131
132
    }
    setPolygon() {//设置多边形
5290cb53   Zhang Zhuo   更新第一版本 -张卓
133
      let { id } = this.state
e2460342   Zhang Zhuo   更改 -张卓
134
135
136
137
138
139
      if (this.state.serviceData.length > 1) {
        this.serviceDataFlag = true//用来看外面传来的是否有数据,有数据就不用在添加
      } else {
        this.polygonCount = 0
      }
      var canvasEl = document.getElementById(this[id].state.id)//获取canvas的id 这id是动态的所以要用ref进行获取
5290cb53   Zhang Zhuo   更新第一版本 -张卓
140
      var onclickRE = (e) => {
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
141
142
143
144
145
146
147
        var left = e.layerX;
        var top = e.layerY;
        let { serviceData } = this.state;
        serviceData.push([left, top])
        this.setState({
          serviceData
        }, () => {
e2460342   Zhang Zhuo   更改 -张卓
148
          this[id].draw()
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
149
        })
96108619   Zhang Zhuo   更新添加文字功能 -张卓
150
      }
e2460342   Zhang Zhuo   更改 -张卓
151
      if (!this.serviceDataFlag) {
5290cb53   Zhang Zhuo   更新第一版本 -张卓
152
        canvasEl.addEventListener("click", onclickRE);
e2460342   Zhang Zhuo   更改 -张卓
153
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
154
155
156
      canvasEl.oncontextmenu = (e) => {
        e.preventDefault()
        if (e.button === 2) {
e2460342   Zhang Zhuo   更改 -张卓
157
158
          if (this.polygonCount == 0) {//这里判断一下防止点击多右键多次传值
            this.polygonCount++
e2460342   Zhang Zhuo   更改 -张卓
159
160
            this.sendFather(this.state.serviceData)
          }
5290cb53   Zhang Zhuo   更新第一版本 -张卓
161
          canvasEl.removeEventListener("click", onclickRE);
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
162
        }
96108619   Zhang Zhuo   更新添加文字功能 -张卓
163
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
164
    }
e2460342   Zhang Zhuo   更改 -张卓
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    isInPolygon(checkPoint, polygonPoints, childEl) {//判断多边形是否在点内
      var counter = 0;
      var xinters;
      var p1, p2;
      var pointCount = polygonPoints.length;
      p1 = polygonPoints[0];
      for (var i = 1; i <= pointCount; i++) {
        p2 = polygonPoints[i % pointCount];
        if (
          checkPoint[0] > Math.min(p1[0], p2[0]) &&
          checkPoint[0] <= Math.max(p1[0], p2[0])
        ) {
          if (checkPoint[1] <= Math.max(p1[1], p2[1])) {
            if (p1[0] != p2[0]) {
              xinters =
                (checkPoint[0] - p1[0]) *
                (p2[1] - p1[1]) /
                (p2[0] - p1[0]) +
                p1[1];
              if (p1[1] == p2[1] || checkPoint[1] <= xinters) {
                counter++;
              }
            }
          }
        }
        p1 = p2;
      }
      if (counter % 2 == 0) {
        if (childEl.selectBox(checkPoint[0], checkPoint[1])) {
          return true;
        }
        return false;
      } else {
        return true;
      }
    }
5290cb53   Zhang Zhuo   更新第一版本 -张卓
201
202
203
204
205
206
    wenziChange(val){
      this.setState({
        title:val
      })
      this.props.wenziChange(val)
    }
e2460342   Zhang Zhuo   更改 -张卓
207
208
209
210
211
212
213
    change(val) {//当改变的时候在向父组件发送值
      this.sendFather(val)
    }
    sendFather(serviceData) {//向父组件发送变化的值
      if (this.state.disabled !== "true") {
        this.props.change(serviceData)
      }
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
214
215
    }
    render() {
e2460342   Zhang Zhuo   更改 -张卓
216
217
218
219
220
221
222
223
224
225
226
227
      let { serviceData, disabled, circleRadius,
        circleBorderWidth,
        circleBorderColor,
        circleInColor,
        circleSelectColor,
        lineColor,
        lineWidth,
        areaColor,
        title,
        titleColor,
        titleFont,
        titleLineHeight,
5290cb53   Zhang Zhuo   更新第一版本 -张卓
228
229
230
231
232
233
234
        titleBackgroundColor,
        titlePadding,
        titleTextAlign,
        titleWidth,
        titleFillColor,
        inputStyle,
        position, id } = this.state
e2460342   Zhang Zhuo   更改 -张卓
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
      return <AreaSelect
        serviceData={serviceData}
        disabled={disabled}
        circleRadius={circleRadius}
        circleBorderWidth={circleBorderWidth}
        circleBorderColor={circleBorderColor}
        circleSelectColor={circleSelectColor}
        circleInColor={circleInColor}
        lineColor={lineColor}
        lineWidth={lineWidth}
        areaColor={areaColor}
        title={title}
        titleColor={titleColor}
        titleFont={titleFont}
        titleLineHeight={titleLineHeight}
5290cb53   Zhang Zhuo   更新第一版本 -张卓
250
251
252
253
254
        titleBackgroundColor={titleBackgroundColor}
        titlePadding={titlePadding} 
        titleTextAlign={titleTextAlign} 
        titleWidth={titleWidth} 
        titleFillColor={titleFillColor} 
e2460342   Zhang Zhuo   更改 -张卓
255
        position={position}
5290cb53   Zhang Zhuo   更新第一版本 -张卓
256
257
258
        inputStyle={inputStyle}
        listId={this.props.listId}
        ref={(inst) => { this[id] = inst }} wenziChange={(val)=>this.wenziChange(val)} change={(val) => this.change(val)}></AreaSelect>
6bd5ee16   Zhang Zhuo   更新多功能组件 -张卓
259
    }
96108619   Zhang Zhuo   更新添加文字功能 -张卓
260
  }