eleAttr.ts 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. import {AttachCAD} from './core/index'
  2. import Column from './core/architecture/column'
  3. import Door from './core/architecture/door/index'
  4. import Casement from './core/architecture/casement'
  5. import Arch from './core/architecture/linearch'
  6. import WallLine from './core/core/wallline'
  7. import Point from './core/core/point'
  8. import {FurnClass as Furn} from './core/furniture/furn'
  9. import {
  10. lineDis,
  11. lineCenter,
  12. getDisPointLinePoints,
  13. segmentsIntrFine,
  14. isContainPoint,
  15. lineStretch
  16. } from './core/geometry'
  17. import processing from './core/base/processing/index'
  18. function attrAdd(cad, processing) {
  19. let addCase = processing.addCase
  20. let addDoor = processing.addDoor
  21. let addColumn = processing.addColumn
  22. let addLine = processing.addLine
  23. let addSlideDoor = processing.addSlideDoor
  24. let addBayCase = processing.addBayCase
  25. let addGroundCase = processing.addGroundCase
  26. let addFurnColumn = processing.addFurnColumn
  27. let addFurnFlue = processing.addFurnFlue
  28. let adddDoubleDoor = processing.adddDoubleDoor
  29. // 添加与宽度相关的属性
  30. let addWidthAttr = (ele: Column | Door | Casement ) => {
  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 = [ele.attachment] as any
  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
  83. }
  84. })
  85. }
  86. // 添加与宽度相关的属性
  87. let addStartAttr = (ele: Column | Door | Casement ) => {
  88. Object.defineProperties(ele, {
  89. // 修改宽度
  90. estart: {
  91. get() {
  92. return ele.start
  93. },
  94. set: (val) => {
  95. if (val) {
  96. cad.processing.doors.forEach(door => {
  97. door.ele.start = false
  98. })
  99. }
  100. ele.start = val
  101. cad.preservation()
  102. }
  103. }
  104. })
  105. }
  106. // 为柱子添加厚度的属性
  107. let addTickAttr = (ele: Column) => {
  108. Object.defineProperties(ele, {
  109. tick: {
  110. get: () => Math.max(
  111. Number(lineDis({points: [ele.points[0], ele.points[3]]}).toFixed(2)),
  112. Number(lineDis({points: [ele.points[1], ele.points[2]]}).toFixed(2)),
  113. ),
  114. set: (val) => {
  115. if (val <= 0 || val === ele.oldVal) return;
  116. ele.oldVal = val
  117. ele.thickness = val
  118. ele.updatePeripheral()
  119. }
  120. },
  121. maxTick: {
  122. get() {
  123. return 10;
  124. let line1 = {points: [ele.points[0], ele.points[3]]} as {points: [Point, Point]}
  125. let line2 = {points: [ele.points[1], ele.points[2]]} as {points: [Point, Point]}
  126. let lines = ele.attachment.wallLines
  127. let j1points = []
  128. let j2points = []
  129. for (let i = 0; i < lines.length; i++) {
  130. if (lines[i] === ele.attachment) continue;
  131. let point1 = segmentsIntrFine(lines[i], line1)
  132. let point2 = segmentsIntrFine(lines[i], line2)
  133. if (point1 && isContainPoint(lines[i], point1 as unknown as Point)) {
  134. j1points.push(point1)
  135. }
  136. if (point2 && isContainPoint(lines[i], point2 as unknown as Point)) {
  137. j2points.push(point2)
  138. }
  139. }
  140. j1points.sort((a, b) => lineDis({points: [ele.points[0], a]}) - lineDis({points: [ele.points[0], b]}))
  141. j2points.sort((a, b) => lineDis({points: [ele.points[1], a]}) - lineDis({points: [ele.points[1], b]}))
  142. let minp1len = 0;
  143. for(let i = 0; i < j1points.length; i++) {
  144. if ( isContainPoint({points: [ele.points[0], j1points[i]]}, ele.points[3]) ||
  145. isContainPoint({points: [ele.points[0], ele.points[3]]}, j1points[i]) ) {
  146. minp1len = lineDis({points: [ele.points[0], j1points[i]]})
  147. break;
  148. }
  149. }
  150. let minp2len = 0;
  151. for(let i = 0; i < j2points.length; i++) {
  152. if ( isContainPoint({points: [ele.points[1], j2points[i]]}, ele.points[2]) ||
  153. isContainPoint({points: [ele.points[1], ele.points[2]]}, j2points[i]) ) {
  154. minp2len = lineDis({points: [ele.points[1], j2points[i]]})
  155. break;
  156. }
  157. }
  158. let len = !minp1len ? minp2len :
  159. !minp2len ? minp1len :
  160. minp1len < minp2len ? minp1len : minp2len
  161. return Number((len).toFixed(2)) || 10
  162. }
  163. },
  164. minTick: {
  165. get: () => 0
  166. }
  167. })
  168. }
  169. processing.addCase = function(...args) {
  170. let ret = addCase.call(this, ...args)
  171. addWidthAttr(ret.ele)
  172. return ret
  173. }
  174. processing.addBayCase = function(...args) {
  175. let ret = addBayCase.call(this, ...args)
  176. addWidthAttr(ret.ele)
  177. return ret
  178. }
  179. processing.addGroundCase = function(...args) {
  180. let ret = addGroundCase.call(this, ...args)
  181. addWidthAttr(ret.ele)
  182. return ret
  183. }
  184. processing.addDoor = function(...args) {
  185. let ret = addDoor.call(this, ...args)
  186. addWidthAttr(ret.ele)
  187. addStartAttr(ret.ele)
  188. return ret
  189. }
  190. processing.addSlideDoor = function(...args) {
  191. let ret = addSlideDoor.call(this, ...args)
  192. addWidthAttr(ret.ele)
  193. return ret
  194. }
  195. processing.adddDoubleDoor = function(...args) {
  196. let ret = adddDoubleDoor.call(this, ...args)
  197. addWidthAttr(ret.ele)
  198. return ret
  199. }
  200. processing.addColumn = function(...args) {
  201. let ret = addColumn.call(this, ...args)
  202. addWidthAttr(ret.ele)
  203. addTickAttr(ret.ele)
  204. return ret
  205. }
  206. processing.addLine = function(...args) {
  207. let ret = addLine.call(this, ...args)
  208. return ret
  209. }
  210. let addFurnWidthAttr = (ele: Furn) => {
  211. Object.defineProperties(ele, {
  212. // 修改宽度
  213. ewidth: {
  214. get: () => Number(lineDis({points: [ele.points[0], ele.points[1]]}).toFixed(2)),
  215. set: (val) => {
  216. if (val <= 0 || val === ele.ewidth) return;
  217. let newLine1 = lineStretch( { points: [ele.points[0], ele.points[1]] }, val )
  218. let newLine2 = lineStretch( { points: [ele.points[2], ele.points[3]] }, val )
  219. let points = newLine1.points.concat(newLine2.points)
  220. if (ele.check(points)) {
  221. ele.directUpdate(points)
  222. }
  223. }
  224. },
  225. // 最大宽度
  226. maxWidth: {
  227. get: () => {
  228. return 10
  229. }
  230. },
  231. minWidth: {
  232. get: () => 0
  233. }
  234. })
  235. }
  236. let addFurnTickAttr = (ele: Furn) => {
  237. Object.defineProperties(ele, {
  238. tick: {
  239. get: () => {
  240. return Number(lineDis({points: [ele.points[1], ele.points[2]]}).toFixed(2))
  241. },
  242. set: (val) => {
  243. if (val <= 0 || val === ele.tick ) return;
  244. let newLine1 = lineStretch( { points: [ele.points[0], ele.points[3]] }, val )
  245. let newLine2 = lineStretch( { points: [ele.points[1], ele.points[2]] }, val )
  246. let points = [newLine1.points[0], newLine2.points[0], newLine2.points[1], newLine1.points[1]]
  247. if (ele.check(points)) {
  248. ele.directUpdate(points)
  249. }
  250. }
  251. },
  252. // 最大宽度
  253. maxTick: {
  254. get: () => {
  255. return 10
  256. }
  257. },
  258. minTick: {
  259. get: () => 0
  260. }
  261. })
  262. }
  263. let addFurnAngleAttr = (ele: Furn) => {
  264. Object.defineProperties(ele, {
  265. maxAngle: {
  266. get: () => 360
  267. },
  268. minAngle: {
  269. get: () => 0
  270. }
  271. })
  272. }
  273. processing.addFurnColumn = function(...args) {
  274. let ret = addFurnColumn.call(this, ...args)
  275. addFurnWidthAttr(ret.ele)
  276. addFurnTickAttr(ret.ele)
  277. addFurnAngleAttr(ret.ele)
  278. return ret
  279. }
  280. processing.addFurnFlue = function(...args) {
  281. let ret = addFurnFlue.call(this, ...args)
  282. addFurnWidthAttr(ret.ele)
  283. addFurnTickAttr(ret.ele)
  284. addFurnAngleAttr(ret.ele)
  285. return ret
  286. }
  287. }
  288. // 拦截arch门窗柱子墙线条添加方法, 添加额外属性
  289. export default (cad: AttachCAD) => {
  290. const addProcessing = cad.addProcessing
  291. cad.addProcessing = (...args) => {
  292. let processing = addProcessing.call(cad, ...args)
  293. attrAdd(cad, processing)
  294. return processing
  295. }
  296. }