index.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import Render from '../renderer'
  2. import Point from '../../core/point'
  3. import WallLine from '../../core/wallline'
  4. import Casement from '../../architecture/casement'
  5. import Door from '../../architecture/door/index'
  6. import DoubleDoor from '../../architecture/doubleDoor'
  7. import Column from '../../architecture/column'
  8. import FurnColumn from '../../furniture/column'
  9. import FurnFlue from '../../furniture/flue'
  10. import { CADElementTS } from '../../core/element'
  11. import Tagging from '../../label/tagging'
  12. import SlideDoor from '../../architecture/slideDoor'
  13. import GroundCase from '../../architecture/groundCase'
  14. import { methods as toEleMethods, ToEle } from './toEle'
  15. import { methods as roomMethods, RoomApi } from './room'
  16. import { methods as dataMethods, dataApi } from './toData'
  17. import { methods as pointOperMethods, PointOper } from './pointOper'
  18. import BayCase from '../../architecture/bayCase'
  19. import {AttachCAD} from '../../index'
  20. import Sign from '../../label/sign'
  21. import Direction from '../../label/direction'
  22. import Route from '../../label/route'
  23. export interface _Point { x: number, y:number, id: number }
  24. export interface _Line { p1: number, p2: number, id: number, border: boolean, exterior?: boolean }
  25. export interface _window { pos: Array<number>, line: number }
  26. export interface _door { pos: Array<number>, line: number, within: number, show?: boolean, ctl?: Array<number>, start: boolean }
  27. export interface _doubledoor { pos: Array<number>, line: number, within: number, show?: boolean, ctl?: Array<number>, start: boolean }
  28. export interface _slideDoor { pos: Array<number>, line: number, within: number }
  29. export interface _groundCase { pos: Array<number>, line: number }
  30. export interface _bayCase { pos: Array<number>, line: number, within: number, ctl?: Array<number> }
  31. export interface _column { pos: Array<number>, line: number }
  32. export interface _furnColumn { pos: Array<number>, angle: number }
  33. export interface _furnFlue { pos: Array<number>, angle: number }
  34. export interface _tagging { pos: Array<number>, title: string, content: string, showTitle: boolean, showContent: boolean}
  35. export interface _hole {pos: Array<number>, top: number}
  36. export type _Ground = Array<number>
  37. export interface _room { id: number, ground: _Ground, hole: Array<_hole>, close: boolean }
  38. export interface Data {
  39. show: boolean,
  40. id: number,
  41. room?: Array<{
  42. wall: Array<number>,
  43. ground: Array<number>
  44. }>,
  45. vertex: Array<_Point>,
  46. surplus: Array<_Point>,
  47. wall: Array<_Line>,
  48. window: Array<_window>,
  49. door: Array<_door>,
  50. column: Array<_column>,
  51. furnColumn: Array<_furnColumn>,
  52. doubleDoor: Array<_doubledoor>
  53. furnFlue: Array<_furnFlue>,
  54. slideDoor: Array<_slideDoor>
  55. groundCase: Array<_groundCase>,
  56. bayCase: Array<_bayCase>,
  57. tagging: Array<_tagging>,
  58. dire: number
  59. }
  60. export interface FloorData {
  61. floors: Array<Data>
  62. }
  63. export interface StorageProps{ dom: HTMLElement }
  64. export interface CADState {elements: Array<Point>}
  65. export interface rhole extends _hole {bottom: number}
  66. export type Walls = Array<{ id: number; ele: WallLine, border: boolean, exterior?: boolean, isOut?: boolean }>
  67. export type Points = Array<{ id: number; ele: Point }>
  68. export type Cases = Array<{ele: Casement}>
  69. export type Doors = Array<{ele: Door}>
  70. export type SlideDoors = Array<{ele: SlideDoor}>
  71. export type GroundCases = Array<{ele: GroundCase}>
  72. export type Columns = Array<{ele: Column}>
  73. export type FurnColumns = Array<{ele: FurnColumn}>
  74. export type FurnFlues = Array<{ele: FurnFlue}>
  75. export type Taggings = Array<{ele: Tagging}>
  76. export type BayCases = Array<{ele: BayCase}>
  77. export type DoubleDoors = Array<{ele: DoubleDoor}>
  78. export class _Processing {
  79. data: Data
  80. render: Render
  81. points: Points
  82. lines: Walls
  83. cases: Cases
  84. id: number
  85. show: boolean
  86. doors: Doors
  87. slideDoors: SlideDoors
  88. groundCases: GroundCases
  89. bayCases: BayCases
  90. doubleDoors: DoubleDoors
  91. columns: Columns
  92. taggings: Taggings
  93. insertModel: boolean
  94. furnColumns: FurnColumns
  95. furnFlues: FurnFlues
  96. direction: Direction
  97. sign: Sign
  98. rote: Route
  99. cad: AttachCAD
  100. constructor({dom}: StorageProps) {
  101. this.render = new Render({ layer: dom, processing: (this as unknown as ProcessingTS) })
  102. this.id = 1
  103. this.points = []
  104. this.lines = []
  105. this.cases = []
  106. this.doors = []
  107. this.columns = []
  108. this.slideDoors = []
  109. this.groundCases = []
  110. this.taggings = []
  111. this.bayCases = []
  112. this.furnColumns = []
  113. this.furnFlues = []
  114. this.doubleDoors = []
  115. this.manageShow()
  116. }
  117. private manageShow() {
  118. let show = false
  119. Object.defineProperty(this, 'show', {
  120. get: () => show,
  121. set: (val) => {
  122. console.log('---------', show)
  123. show = val
  124. this.render.svg.style.display = show ? 'block': 'none'
  125. }
  126. })
  127. }
  128. // 删除元素
  129. rep(this: ProcessingTS, ele: CADElementTS) {
  130. this.attrs.forEach(attr => {
  131. let index = this[attr].findIndex(({ele: e}) => e === ele)
  132. if (~index) {
  133. ele.__id = this[attr][index] && this[attr][index].id
  134. this[attr].splice(index, 1)
  135. }
  136. })
  137. if (!this.render) {
  138. console.error('掉用 rep')
  139. }
  140. this.render && this.render.remove(ele)
  141. }
  142. // Element加装Destroy方法
  143. retrofitElementDestroy (this: ProcessingTS,ele: CADElementTS) {
  144. let destroy = ele.destroy
  145. if (ele.__load_destroy) return;
  146. ele.__load_destroy = true
  147. ele.destroy = (...args) => {
  148. // 需要同步删除还是更新完属性后删除
  149. if ((args as any)[0]) {
  150. this.rep(ele)
  151. } else {
  152. ele.nextTick(() => this.rep(ele))
  153. }
  154. destroy.call(ele, ...args)
  155. ele.__load_destroy = false
  156. }
  157. }
  158. updateWallPoints(this: ProcessingTS, ele: WallLine, oldPoints: [Point, Point], newPoints: [Point, Point]) {
  159. }
  160. // Element加装Destroy方法
  161. retrofitElementIntercept (this: ProcessingTS, ele: WallLine) {
  162. return;
  163. }
  164. depLines() {
  165. let lines = [...this.lines]
  166. for (let i = 0; i< lines.length; i++) {
  167. let line = lines[i].ele
  168. let ret = lines.some(({ele: eline}) =>
  169. line !== eline && (
  170. (line.points[0] === eline.points[0] && line.points[1] === eline.points[1]) ||
  171. (line.points[1] === eline.points[0] && line.points[0] === eline.points[1])
  172. )
  173. )
  174. if (line.points[0] === line.points[1] || ret) {
  175. lines[i].ele.destroy()
  176. lines.splice(i--, 1)
  177. }
  178. }
  179. }
  180. destroy(this: ProcessingTS) {
  181. let elesArr = this.attrs.map(attr => this[attr])
  182. this.data = {
  183. id: 1,
  184. show: true,
  185. vertex: [],
  186. wall: [],
  187. window: [],
  188. column: [],
  189. door: [],
  190. surplus: [],
  191. slideDoor: [],
  192. tagging: [],
  193. groundCase: [],
  194. bayCase: [],
  195. doubleDoor: [],
  196. furnColumn: [],
  197. furnFlue: [],
  198. dire: 0
  199. }
  200. elesArr.forEach(eles => {
  201. while (eles.length)
  202. eles[0].ele.destroy(true)
  203. })
  204. this.render.destroy()
  205. this.render = null
  206. }
  207. }
  208. export type ProcessingTS = _Processing & ToEle & RoomApi & dataApi & PointOper
  209. export default _Processing as unknown as {
  210. new (data: StorageProps): ProcessingTS
  211. }
  212. export type That = {
  213. [k in any]: ((this: ProcessingTS, ...args) => any)
  214. }
  215. const apis = {
  216. ...toEleMethods,
  217. ...roomMethods,
  218. ...dataMethods,
  219. ...pointOperMethods
  220. }
  221. Object.keys(apis).forEach(
  222. k => _Processing.prototype[k] = apis[k]
  223. )