toData.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import Point from '../../core/point'
  2. import WallLine from '../../core/wallline'
  3. import {LineArchClass as LineArch} from '../../architecture/linearch'
  4. import { _Point, _Line, _window, _door, _column, Data, That, _tagging, _groundCase, _bayCase, _furnColumn, _furnFlue, _slideDoor, _doubledoor } from './index'
  5. import Door from '../../architecture/door/index'
  6. import Casement from '../../architecture/casement'
  7. import Column from '../../architecture/column'
  8. import Tagging from '../../label/tagging'
  9. import GroundCase from '../../architecture/groundCase'
  10. import BayCase from '../../architecture/bayCase'
  11. import DoubleDoor from '../../architecture/doubleDoor'
  12. import FurnColumn from '../../furniture/column'
  13. import FurnFlue from '../../furniture/flue'
  14. import { FurnClass as Furn } from '../../furniture/furn'
  15. import SlideDoor from '../../architecture/slideDoor'
  16. export interface dataApi {
  17. getNewPointId: () => number
  18. getNewLineId: () => number
  19. getLineId: (line: WallLine) => number
  20. getPointId: (point: Point) => number
  21. baseArchToData: (ele: LineArch) => _door
  22. roomArchToData: (ele: Furn) => _furnColumn
  23. pointToData: (ele: {ele: Point, id: number}) => _Point
  24. lineToData: (ele: {ele: WallLine, id: number}) => _Line
  25. doorToData: (ele: {ele: Door}) => _door
  26. DoubleDoorToData: (ele: {ele: DoubleDoor}) => _doubledoor
  27. slideDoorToData: (ele: {ele: Door}) => _slideDoor
  28. caseToData: (ele: {ele: Casement}) => _window
  29. groundCaseToData: (ele: {ele: GroundCase}) => _groundCase
  30. BayCaseToData: (ele: {ele: BayCase}) => _bayCase
  31. columnToData: (ele: {ele: Column}) => _column
  32. taggingToData: ({ele}: {ele: Tagging}) => _tagging,
  33. furnColumnToData: (ele: {ele: FurnColumn}) => _furnColumn,
  34. furnFlueToData: (ele: {ele: FurnFlue}) => _furnFlue
  35. toData: () => Data
  36. }
  37. const numRetain = (n: number, m = 2) => Number(n.toFixed(m))
  38. export const methods: That = {
  39. baseArchToData(ele: LineArch) {
  40. return {
  41. line: this.getLineId(ele.attachment),
  42. pos: [
  43. numRetain(ele.linePoints[0].x), numRetain(ele.linePoints[0].y),
  44. numRetain(ele.linePoints[1].x), numRetain(ele.linePoints[1].y)
  45. ],
  46. top: ele.top,
  47. bottom: ele.bottom
  48. }
  49. },
  50. roomArchToData(ele: FurnColumn) {
  51. return {
  52. pos: [
  53. numRetain(ele.points[0].x), numRetain(ele.points[0].y),
  54. numRetain(ele.points[1].x), numRetain(ele.points[1].y),
  55. numRetain(ele.points[2].x), numRetain(ele.points[2].y),
  56. numRetain(ele.points[3].x), numRetain(ele.points[3].y)
  57. ],
  58. top: ele.top,
  59. bottom: ele.bottom,
  60. angle: ele.angle
  61. }
  62. },
  63. pointToData({ele, id}) {
  64. return {
  65. id,
  66. x: numRetain(ele.x), y: numRetain(ele.y)
  67. }
  68. },
  69. lineToData({ele, id, border}) {
  70. return {
  71. id,
  72. p1: this.getPointId(ele.points[0]),
  73. p2: this.getPointId(ele.points[1]),
  74. border,
  75. exterior: ele.exterior
  76. }
  77. },
  78. doorToData ({ele}: {ele: Door}) {
  79. let data = this.baseArchToData(ele)
  80. data.within = ele.within
  81. data.show = ele.show
  82. data.ctl = [ele.ctl[0].x, -ele.ctl[0].y]
  83. data.start = ele.start
  84. return data
  85. },
  86. DoubleDoorToData ({ele}: {ele: Door}) {
  87. let data = this.baseArchToData(ele)
  88. data.within = ele.within
  89. data.show = ele.show
  90. return data
  91. },
  92. slideDoorToData ({ele}: {ele: SlideDoor}) {
  93. let data = this.baseArchToData(ele)
  94. data.within = ele.within
  95. data.show = ele.show
  96. return data
  97. },
  98. caseToData ({ele}: {ele: Casement}) {
  99. return this.baseArchToData(ele)
  100. },
  101. groundCaseToData ({ele}: {ele: GroundCase}) {
  102. return this.baseArchToData(ele)
  103. },
  104. BayCaseToData ({ele}: {ele: BayCase}) {
  105. let data = this.baseArchToData(ele)
  106. data.within = ele.within
  107. data.ctl = [ele.ctl[0].x, -ele.ctl[0].y, ele.ctl[1].x, -ele.ctl[1].y]
  108. return data
  109. },
  110. columnToData ({ele}: {ele:Column}) {
  111. let data = this.baseArchToData(ele)
  112. return {
  113. ...data,
  114. pos: [
  115. ...data.pos,
  116. numRetain(ele.points[3].x), numRetain(ele.points[3].y),
  117. numRetain(ele.points[2].x), numRetain(ele.points[2].y)
  118. ]
  119. }
  120. },
  121. taggingToData ({ele}: {ele: Tagging}) {
  122. return {
  123. pos: [ele.x, ele.y],
  124. title: ele.title,
  125. content: ele.content,
  126. showTitle: ele.showTitle,
  127. showContent: ele.showContent
  128. }
  129. },
  130. furnColumnToData ({ele}: {ele: FurnColumn}) {
  131. return this.roomArchToData(ele)
  132. },
  133. furnFlueToData ({ele}: {ele: FurnFlue}) {
  134. return this.roomArchToData(ele)
  135. },
  136. getNewPointId() {
  137. if (this.points.length === 0) {
  138. return 1
  139. } else {
  140. return Math.max(...this.points.map(({id}) => id)) + 1
  141. }
  142. },
  143. getNewLineId() {
  144. if (this.lines.length === 0) {
  145. return 1
  146. } else {
  147. return Math.max(...this.lines.map(({id}) => id)) + 1
  148. }
  149. },
  150. getLineId (line: WallLine) {
  151. let l = this.lines.find(({ele}) => ele === line)
  152. return l ? l.id : 0
  153. },
  154. getPointId (point: Point) {
  155. return this.points.find(({ele}) => ele === point).id
  156. },
  157. // 将ele转换为data
  158. toData (): Data {
  159. let vertex = this.points.map(a => this.pointToData(a))
  160. let column = this.columns.map(a => this.columnToData(a))
  161. let window = this.cases.map(a => this.caseToData(a))
  162. let door = this.doors.map(a => this.doorToData(a))
  163. let slideDoor = this.slideDoors.map(a => this.slideDoorToData(a))
  164. let groundCase = this.groundCases.map(a => this.groundCaseToData(a))
  165. let tagging = this.taggings.map(a => this.taggingToData(a))
  166. let bayCase = this.bayCases.map(a => this.BayCaseToData(a))
  167. let doubleDoor = this.doubleDoors.map(a => this.DoubleDoorToData(a))
  168. let furnColumn = this.furnColumns.map(a => this.furnColumnToData(a))
  169. let furnFlue = this.furnFlues.map(a => this.furnFlueToData(a))
  170. let wall = []
  171. this.lines.forEach(a => {
  172. try {
  173. wall.push(this.lineToData(a))
  174. } catch {
  175. }
  176. })
  177. return {
  178. id: this.id,
  179. show: this.show,
  180. vertex, wall,
  181. window, door, column,
  182. surplus: this.data.surplus,
  183. slideDoor, groundCase, tagging, doubleDoor,
  184. bayCase, furnColumn, furnFlue,
  185. dire: this.data.dire
  186. }
  187. }
  188. }