eleAttr.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. import {AttachCAD} from '../index'
  2. import Column from '../architecture/column'
  3. import Door from '../architecture/door/index'
  4. import Casement from '../architecture/casement'
  5. import Arch from '../architecture/linearch'
  6. import FurnColumn from '../furniture/column'
  7. import {FurnClass as Furn} from '../furniture/furn'
  8. import WallLine from '../core/wallline'
  9. import Point from '../core/point'
  10. import {
  11. lineDis,
  12. lineCenter,
  13. getDisPointLinePoints,
  14. segmentsIntrFine,
  15. isContainPoint,
  16. Line,
  17. lineStretch
  18. } from '../geometry'
  19. import SlideDoor from '../architecture/slideDoor'
  20. // 拦截arch门窗柱子墙线条添加方法, 添加额外属性
  21. export default (cad: AttachCAD) => {
  22. let addCase = cad.processing.addCase
  23. let addDoor = cad.processing.addDoor
  24. let addColumn = cad.processing.addColumn
  25. let addLine = cad.processing.addLine
  26. let addSlideDoor = cad.processing.addSlideDoor
  27. let addFurnColumn = cad.processing.addFurnColumn
  28. let addFurnFlue = cad.processing.addFurnFlue
  29. // 添加与宽度相关的属性
  30. let addWidthAttr = (ele: Column | Door | Casement | SlideDoor ) => {
  31. Object.defineProperties(ele, {
  32. // 修改宽度
  33. ewidth: {
  34. get: () => Number(lineDis({points: ele.linePoints}).toFixed(2)),
  35. set: (val) => {
  36. if (val <= 0 || val === ele.ewidth) return;
  37. let center = lineCenter({points: ele.linePoints})
  38. let [p1, p2] = getDisPointLinePoints(ele.attachment, center, val / 2)
  39. if (lineDis({points: [ele.linePoints[0], p1]}) > lineDis({points: [ele.linePoints[0], p2]})) {
  40. ele.linePoints[0].x = p2.x
  41. ele.linePoints[0].y = p2.y
  42. ele.linePoints[1].x = p1.x
  43. ele.linePoints[1].y = p1.y
  44. } else {
  45. ele.linePoints[0].x = p1.x
  46. ele.linePoints[0].y = p1.y
  47. ele.linePoints[1].x = p2.x
  48. ele.linePoints[1].y = p2.y
  49. }
  50. }
  51. },
  52. // 最大宽度
  53. maxWidth: {
  54. get: () => {
  55. let archs = [...Arch.attaArch.get(ele.attachment), ele.attachment]
  56. let p1MinPoints: Array<{dis: number, point: Point}> = []
  57. let p2MinPoints: Array<{dis: number, point: Point}> = []
  58. let item = (arch: any, i, j) : {dis: number, point: Point} => {
  59. let points = arch.linePoints || arch.points
  60. return {
  61. dis: lineDis({points: [ele.linePoints[i], points[j]]}),
  62. point: points[j]
  63. }
  64. }
  65. archs.forEach(arch => {
  66. if (arch !== ele) {
  67. p1MinPoints.push(item(arch, 0, 0))
  68. p1MinPoints.push(item(arch, 0, 1))
  69. p2MinPoints.push(item(arch, 1, 0))
  70. p2MinPoints.push(item(arch, 1, 1))
  71. }
  72. })
  73. p1MinPoints.sort((a, b) => a.dis - b.dis)
  74. p2MinPoints.sort((a, b) => a.dis - b.dis)
  75. let points = (p1MinPoints[0].dis > p2MinPoints[0].dis ?
  76. [ele.linePoints[1], p2MinPoints[0].point] :
  77. [ele.linePoints[0], p1MinPoints[0].point]) as [Point, Point];
  78. return Number((lineDis({points}) * 2 + lineDis({points: ele.linePoints})).toFixed(2))
  79. }
  80. },
  81. minWidth: {
  82. get: () => 0.2
  83. }
  84. })
  85. }
  86. // 为柱子添加厚度的属性
  87. let addTickAttr = (ele: Column) => {
  88. Object.defineProperties(ele, {
  89. tick: {
  90. get: () => Math.max(
  91. Number(lineDis({points: [ele.points[0], ele.points[3]]}).toFixed(2)),
  92. Number(lineDis({points: [ele.points[1], ele.points[2]]}).toFixed(2)),
  93. ),
  94. set: (val) => {
  95. if (val <= 0 || val === ele.oldVal) return;
  96. ele.oldVal = val
  97. ele.thickness = val
  98. ele.updatePeripheral()
  99. }
  100. },
  101. maxTick: {
  102. get() {
  103. let line1 = {points: [ele.points[0], ele.points[3]]} as {points: [Point, Point]}
  104. let line2 = {points: [ele.points[1], ele.points[2]]} as {points: [Point, Point]}
  105. let lines = cad.processing.lines.map(line => line.ele)
  106. let j1points = []
  107. let j2points = []
  108. for (let i = 0; i < lines.length; i++) {
  109. if (lines[i] === ele.attachment) continue;
  110. let point1 = segmentsIntrFine(lines[i], line1)
  111. let point2 = segmentsIntrFine(lines[i], line2)
  112. if (point1 && isContainPoint(lines[i], point1)) {
  113. j1points.push(point1)
  114. }
  115. if (point2 && isContainPoint(lines[i], point2)) {
  116. j2points.push(point2)
  117. }
  118. }
  119. j1points.sort((a, b) => lineDis({points: [ele.points[0], a]}) - lineDis({points: [ele.points[0], b]}))
  120. j2points.sort((a, b) => lineDis({points: [ele.points[1], a]}) - lineDis({points: [ele.points[1], b]}))
  121. let minp1len = 0;
  122. for(let i = 0; i < j1points.length; i++) {
  123. if ( isContainPoint({points: [ele.points[0], j1points[i]]}, ele.points[3]) ||
  124. isContainPoint({points: [ele.points[0], ele.points[3]]}, j1points[i]) ) {
  125. minp1len = lineDis({points: [ele.points[0], j1points[i]]})
  126. break;
  127. }
  128. }
  129. let minp2len = 0;
  130. for(let i = 0; i < j2points.length; i++) {
  131. if ( isContainPoint({points: [ele.points[1], j2points[i]]}, ele.points[2]) ||
  132. isContainPoint({points: [ele.points[1], ele.points[2]]}, j2points[i]) ) {
  133. minp2len = lineDis({points: [ele.points[1], j2points[i]]})
  134. break;
  135. }
  136. }
  137. let len = !minp1len ? minp2len :
  138. !minp2len ? minp1len :
  139. minp1len < minp2len ? minp1len : minp2len
  140. return Number((len).toFixed(2)) || 10
  141. }
  142. },
  143. minTick: {
  144. get: () => 0.2
  145. }
  146. })
  147. }
  148. // 为门窗添加高度的属性
  149. let addHeightAttr = (ele: Column | Door | SlideDoor ) => {
  150. Object.defineProperties(ele, {
  151. eheight: {
  152. get: () => {
  153. return Number((ele.top - ele.bottom).toFixed(2))
  154. },
  155. set: (val) => {
  156. ele.in3D.changeHeight(val)
  157. }
  158. },
  159. maxHeight: {
  160. get: () => {
  161. let rooms = cad.processing.getRoomsByLine(ele.attachment)
  162. if (rooms.length) {
  163. return Number((rooms[0].top - rooms[0].bottom).toFixed(2))
  164. } else {
  165. return 5
  166. }
  167. }
  168. },
  169. minHeight: {
  170. get: () => 0.2
  171. }
  172. })
  173. }
  174. // 为线条添加修改高度的属性
  175. let addTopAttr = (ele: WallLine) => {
  176. Object.defineProperties(ele, {
  177. top: {
  178. get: () => {
  179. let hole = cad.processing.getHolesByLine(ele)[0]
  180. if (hole) {
  181. return hole.top
  182. } else {
  183. let room = cad.processing.getRoomsByLine(ele)[0]
  184. return room.top
  185. }
  186. },
  187. set: (val) => {
  188. val !== ele.top && ele.updateRoomTop(val)
  189. }
  190. },
  191. maxTop: {
  192. get: () => 10
  193. },
  194. minTop: {
  195. get: () => 0.5
  196. }
  197. })
  198. }
  199. // 最线条添加修改底边的属性
  200. let addBottomAttr = (ele: WallLine) => {
  201. Object.defineProperties(ele, {
  202. bottom: {
  203. get: () => {
  204. let room = cad.processing.getRoomsByLine(ele)[0]
  205. if (room) {
  206. return room.bottom
  207. } else {
  208. let hole = cad.processing.getHolesByLine(ele)[0]
  209. return hole.bottom
  210. }
  211. },
  212. set: (val) => {
  213. if (val !== ele.bottom) {
  214. let lines = cad.processing.lines.filter(({ele: cele}) => ~cele.points.indexOf(ele.points[0]) && ~cele.points.indexOf(ele.points[1]))
  215. // let rooms = lines.map(({room}) => room)
  216. console.error(lines)
  217. lines.forEach(({ele}) => ele.updateRoomBottom(val))
  218. }
  219. }
  220. },
  221. minBottom: {
  222. get: () => -2.5
  223. },
  224. maxBottom: {
  225. get: () => -0.5
  226. }
  227. })
  228. }
  229. let addFurnTopAttr = (ele: Furn) => {
  230. Object.defineProperties(ele, {
  231. top: {
  232. get: () => ele.top,
  233. set: (val) => {
  234. ele.top = val
  235. }
  236. },
  237. maxTop: {
  238. get: () => ele.room.top
  239. },
  240. minTop: {
  241. get: () => 0.5
  242. }
  243. })
  244. }
  245. let addFurnBottomAttr = (ele: Furn) => {
  246. Object.defineProperties(ele, {
  247. bottom: {
  248. get: () => ele.bottom,
  249. set: (val) => {
  250. ele.bottom = val
  251. }
  252. },
  253. maxTop: {
  254. get: () => ele.room.bottom
  255. },
  256. minTop: {
  257. get: () => -0.5
  258. }
  259. })
  260. }
  261. let addFurnWidthAttr = (ele: Furn) => {
  262. Object.defineProperties(ele, {
  263. // 修改宽度
  264. ewidth: {
  265. get: () => Number(lineDis({points: [ele.points[0], ele.point[1]]}).toFixed(2)),
  266. set: (val) => {
  267. if (val <= 0 || val === ele.ewidth) return;
  268. let newLine1 = lineStretch( { points: [ele.points[0], ele.points[1]] }, val )
  269. let newLine2 = lineStretch( { points: [ele.points[2], ele.points[3]] }, val )
  270. let points = newLine1.points.concat(newLine2.points)
  271. if (ele.check(points)) {
  272. ele.stop = false
  273. ele.points.forEach((point, i) => {
  274. point.x = points[i].x
  275. point.y = points[i].y
  276. })
  277. ele.nextTick(() => ele.stop = true)
  278. }
  279. }
  280. },
  281. // 最大宽度
  282. maxWidth: {
  283. get: () => {
  284. return 10
  285. }
  286. },
  287. minWidth: {
  288. get: () => 0.25
  289. }
  290. })
  291. }
  292. let addFurnTickAttr = (ele: Furn) => {
  293. Object.defineProperties(ele, {
  294. tick: {
  295. get: () => Number(lineDis({points: [ele.points[1], ele.point[2]]}).toFixed(2)),
  296. set: (val) => {
  297. if (val <= 0 || val === ele.tick) return;
  298. let newLine1 = lineStretch( { points: [ele.points[0], ele.points[3]] }, val )
  299. let newLine2 = lineStretch( { points: [ele.points[1], ele.points[2]] }, val )
  300. let points = [newLine1.points[0], newLine2.points[0], newLine2.points[1], newLine1.points[1]]
  301. if (ele.check(points)) {
  302. ele.stop = false
  303. ele.points.forEach((point, i) => {
  304. point.x = points[i].x
  305. point.y = points[i].y
  306. })
  307. ele.nextTick(() => ele.stop = true)
  308. }
  309. }
  310. },
  311. // 最大宽度
  312. maxTick: {
  313. get: () => {
  314. return 10
  315. }
  316. },
  317. minTick: {
  318. get: () => 0.25
  319. }
  320. })
  321. }
  322. cad.processing.addCase = function(...args) {
  323. let ret = addCase.call(this, ...args)
  324. addWidthAttr(ret.ele)
  325. addHeightAttr(ret.ele)
  326. return ret
  327. }
  328. cad.processing.addDoor = function(...args) {
  329. let ret = addDoor.call(this, ...args)
  330. addWidthAttr(ret.ele)
  331. addHeightAttr(ret.ele)
  332. return ret
  333. }
  334. cad.processing.addSlideDoor = function(...args) {
  335. let ret = addSlideDoor.call(this, ...args)
  336. addWidthAttr(ret.ele)
  337. addHeightAttr(ret.ele)
  338. return ret
  339. }
  340. cad.processing.addColumn = function(...args) {
  341. let ret = addColumn.call(this, ...args)
  342. addWidthAttr(ret.ele)
  343. addTickAttr(ret.ele)
  344. return ret
  345. }
  346. cad.processing.addLine = function(...args) {
  347. let ret = addLine.call(this, ...args)
  348. addTopAttr(ret.ele)
  349. addBottomAttr(ret.ele)
  350. return ret
  351. }
  352. cad.processing.addFurnColumn = function(...args) {
  353. let ret = addFurnColumn.call(this, ...args)
  354. addFurnTopAttr(ret.ele)
  355. addFurnBottomAttr(ret.ele)
  356. addFurnWidthAttr(ret.ele)
  357. addFurnTickAttr(ret.ele)
  358. return ret
  359. }
  360. cad.processing.addFurnFlue = function(...args) {
  361. let ret = addFurnFlue.call(this, ...args)
  362. addFurnTopAttr(ret.ele)
  363. addFurnBottomAttr(ret.ele)
  364. addFurnWidthAttr(ret.ele)
  365. addFurnTickAttr(ret.ele)
  366. return ret
  367. }
  368. let destroy = cad.destroy
  369. cad.destroy = function(...args) {
  370. addCase = null
  371. addDoor = null
  372. addColumn = null
  373. addLine = null
  374. addFurnFlue = null
  375. addFurnColumn = null
  376. destroy.apply(this, args)
  377. }
  378. }