MovePath.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # -*- coding: UTF-8 -*-
  2. from pyautocad import Autocad, APoint
  3. # 获取点到长方形的最短距离
  4. def getDoorBeginAndModuleUsePointDistince(x0,y0,width,height,x,y):
  5. includePoints = [(x,y)]
  6. if x<x0-width/2:
  7. if y>y0+height/2:
  8. includePoints.append((x0-width/2,y0+height/2))
  9. elif y>y0-height/2:
  10. includePoints.append((x0-width/2,y))
  11. else:
  12. includePoints.append((x0-width/2,y0-height/2))
  13. elif x<x0+width/2:
  14. if y>y0+height/2:
  15. includePoints.append((x,y0+height/2))
  16. elif y>y0-height/2:
  17. pass
  18. else:
  19. includePoints.append((x,y0-height/2))
  20. else:
  21. if y>y0+height/2:
  22. includePoints.append((x0+width/2,y0+height/2))
  23. elif y>y0-height/2:
  24. includePoints.append((x0+width/2,y))
  25. else:
  26. includePoints.append((x0+width/2,y0-height/2))
  27. return includePoints
  28. # 获取点到长方形指定点的最短距离,默认点在长方形下方
  29. def getMovePath(x0,y0,width,height,x,y,x1,y1):
  30. includePoints = [(x,y)]
  31. bottom = y0-height/2
  32. right = x0+width/2
  33. top = y0+height/2
  34. left = x0-width/2
  35. # 终点在模块最上边
  36. if y1 == top:
  37. if y>=top:
  38. includePoints.append((x1,y1))
  39. elif x<=left:
  40. includePoints.append((left,top))
  41. includePoints.append((x1,y1))
  42. elif x>=right:
  43. includePoints.append((right,top))
  44. includePoints.append((x1,y1))
  45. elif x+x1<=2*x0:
  46. includePoints.append((left,bottom))
  47. includePoints.append((left,top))
  48. includePoints.append((x1,y1))
  49. else:
  50. includePoints.append((right,bottom))
  51. includePoints.append((right,top))
  52. includePoints.append((x1,y1))
  53. elif y1 == bottom:
  54. if y<=bottom:
  55. includePoints.append((x1,y1))
  56. elif x<=left:
  57. includePoints.append((left,bottom))
  58. includePoints.append((x1,y1))
  59. elif x>=right:
  60. includePoints.append((right,bottom))
  61. includePoints.append((x1,y1))
  62. elif x+x1<=2*x0:
  63. includePoints.append((left,top))
  64. includePoints.append((left,bottom))
  65. includePoints.append((x1,y1))
  66. else:
  67. includePoints.append((right,top))
  68. includePoints.append((right,bottom))
  69. includePoints.append((x1,y1))
  70. elif x1 == left:
  71. if x<=left:
  72. includePoints.append((x1,y1))
  73. elif y>=top:
  74. includePoints.append((left,top))
  75. includePoints.append((x1,y1))
  76. elif y<=bottom:
  77. includePoints.append((left,bottom))
  78. includePoints.append((x1,y1))
  79. elif y+y1<=2*y0:
  80. includePoints.append((right,bottom))
  81. includePoints.append((left,bottom))
  82. includePoints.append((x1,y1))
  83. else:
  84. includePoints.append((right,top))
  85. includePoints.append((left,top))
  86. includePoints.append((x1,y1))
  87. else:
  88. if x>=right:
  89. includePoints.append((x1,y1))
  90. elif y>=top:
  91. includePoints.append((right,top))
  92. includePoints.append((x1,y1))
  93. elif y<=bottom:
  94. includePoints.append((right,bottom))
  95. includePoints.append((x1,y1))
  96. elif y+y1<=2*y0:
  97. includePoints.append((left,bottom))
  98. includePoints.append((right,bottom))
  99. includePoints.append((x1,y1))
  100. else:
  101. includePoints.append((left,top))
  102. includePoints.append((right,top))
  103. includePoints.append((x1,y1))
  104. return includePoints
  105. # 获取模块可用点到另一个模块使用点间的距离
  106. def getModuleMovePath(x10,y10,width1,height1,x1,y1,x20,y20,width2,height2,x2,y2):
  107. includePoints1 = getMovePath(x10,y10,width1,height1,x2,y2,x1,y1)
  108. includePoints2 = getMovePath(x20,y20,width2,height2,x1,y1,x2,y2)
  109. includePoints = []
  110. for item in range(len(includePoints1)):
  111. if(item>0):
  112. includePoints.append(includePoints1[item])
  113. for item in range(len(includePoints2)):
  114. if(item>0):
  115. includePoints.insert(0,includePoints2[item])
  116. return includePoints