Parcourir la source

获取入口雷达、入口与模块、模块与模块间距离和撞点数

duh il y a 6 ans
Parent
commit
8cbdf73497
4 fichiers modifiés avec 232 ajouts et 42 suppressions
  1. 105 1
      phxb/test.py
  2. 47 12
      phxb/utils/GetAllModule.py
  3. 75 28
      phxb/utils/MovePath.py
  4. 5 1
      phxb/utils/main.py

+ 105 - 1
phxb/test.py

@@ -43,6 +43,7 @@ def getDoorBeginAndModuleUsePointDistince(x0,y0,width,height,x,y):
             includePoints.append((x0+width/2,y0-height/2))
     drawLines(includePoints)
 # 获取点到长方形指定点的最短距离,默认点在长方形下方
+# x0,y0为矩形中点,xy为起始点,x1,y1为终点
 def getMovePath(x0,y0,width,height,x,y,x1,y1):
     points = [(x,y),(x0-width/2,y0-height/2),(x0-width/2,y0+height/2),(x0+width/2,y0-height/2),(x0+width/2,y0+height/2),(x0,y0),(x1,y1)]
     drawPoints(points)
@@ -73,7 +74,103 @@ def getMovePath(x0,y0,width,height,x,y,x1,y1):
         else:
             includePoints.append((x0-width/2,y0-height/2))
             includePoints.append((x1,y1))
+    # drawLines(includePoints)
+    return includePoints
+# 获取点到长方形指定点的最短距离
+# x0,y0为矩形中点,xy为起始点,x1,y1为终点
+def getMovePath2(x0,y0,width,height,x,y,x1,y1):
+    includePoints = [(x,y)]
+    bottom = y0-height/2
+    right = x0+width/2
+    top = y0+height/2
+    left = x0-width/2
+    points = [(x,y),(left,bottom),(left,top),(right,bottom),(right,top),(x0,y0),(x1,y1)]
+    drawPoints(points)
+    # 终点在模块最上边
+    if y1 == top:
+        if y>=top:
+            includePoints.append((x1,y1))
+        elif x<=left:
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+        elif x>=right:
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+        elif x+x1<=2*x0:
+            includePoints.append((left,bottom))
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((right,bottom))
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+    elif y1 == bottom:
+        if y<=bottom:
+            includePoints.append((x1,y1))
+        elif x<=left:
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        elif x>=right:
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+        elif x+x1<=2*x0:
+            includePoints.append((left,top))
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((right,top))
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+    elif x1 == left:
+        if x<=left:
+            includePoints.append((x1,y1))
+        elif y>=top:
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+        elif y<=bottom:
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        elif y+y1<=2*y0:
+            includePoints.append((right,bottom))
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((right,top))
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+    else:
+        if x>=right:
+            includePoints.append((x1,y1))
+        elif y>=top:
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+        elif y<=bottom:
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+        elif y+y1<=2*y0:
+            includePoints.append((left,bottom))
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((left,top))
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+    drawLines(includePoints)
+    return includePoints
+# 获取模块可用点到另一个模块使用点间的距离
+def getModuleMovePath(x10,y10,width1,height1,x1,y1,x20,y20,width2,height2,x2,y2):
+    includePoints1 = getMovePath(x10,y10,width1,height1,x2,y2,x1,y1)
+    includePoints2 = getMovePath(x20,y20,width2,height2,x1,y1,x2,y2)
+    includePoints = []
+    for item in range(len(includePoints1)):
+        if(item>0):
+            includePoints.append(includePoints1[item])
+    for item in range(len(includePoints2)):
+        if(item>0):
+            includePoints.insert(0,includePoints2[item])
+    print(includePoints)
     drawLines(includePoints)
+    return includePoints
 # getDoorBeginAndModuleUsePointDistince(3300,1500,900,600,10,3000)
 # getDoorBeginAndModuleUsePointDistince(3300,2800,900,600,1000,3000)
 # getDoorBeginAndModuleUsePointDistince(3300,2800,900,600,3100,3800)
@@ -82,6 +179,13 @@ def getMovePath(x0,y0,width,height,x,y,x1,y1):
 # getMovePath(3300,2800,900,600,0,0,2850,2700)
 # getMovePath(3300,2800,900,600,3000,0,2850,2700)
 # getMovePath(3300,2800,900,600,3300,0,3500,3100)
+
+# getMovePath2(800,700,600,400,2000,2000,800,900)
+# getMovePath2(800,700,600,400,300,800,800,900)
+# getMovePath2(800,700,600,400,2000,0,800,900)
+# getMovePath2(800,700,600,400,1000,100,800,900)
+# getMovePath2(800,700,600,400,600,100,800,900)
+getModuleMovePath(800,700,600,400,900,500,1500,1100,400,800,1700,800)
 def testAppend():
     score = []
     for i in range(100):
@@ -89,6 +193,6 @@ def testAppend():
         s.append(i)
         score.append(s)
         print(score)
-testAppend()
+# testAppend()
 
 

+ 47 - 12
phxb/utils/GetAllModule.py

@@ -17,6 +17,7 @@ distinceWithOthers={}
 # 旋转后需删除的组件
 needDeleteBlockReferences=[]
 scores=[]
+# 分别存储位置,雷达长度,入口与模块长度,模块间长度,撞点个数
 currentScore=[]
 # acad.prompt("Hello, Autocad from Python\n")
 # conf.myprint(acad.doc.Name)
@@ -41,6 +42,7 @@ def addCurrentScoreToScores():
   for item in currentScore:
     temp.append(item)
   scores.append(temp)
+# 方案不合适返回0,否则返回方案评分
 def moveBlockReference(position):
   positoins.clear()
   useAreaPositions.clear()
@@ -93,8 +95,11 @@ def moveBlockReferenceWithNewIndex(position,moduleIndex):
   positoins.clear()
   useAreaPositions.clear()
   currentScore.clear()
-  currentScore.append(position)
-  currentScore.append(moduleIndex)
+  firstScoreItem = []
+  for item in position:
+    firstScoreItem.append(item)
+  firstScoreItem.append(moduleIndex)
+  currentScore.append(firstScoreItem)
   conf.myprint(conf.moduleLengths)
   blockReferences = []
   for blockReference in acad.iter_objects("BlockReference"):
@@ -112,6 +117,9 @@ def moveBlockReferenceWithNewIndex(position,moduleIndex):
   conf.myprint("currentScore size =",len(currentScore),",scores size=",len(scores))
   addCurrentScoreToScores()
   conf.myprint("scores=",scores)
+  for blockReference in needDeleteBlockReferences:
+      blockReference.delete()
+  needDeleteBlockReferences.clear()
   return moveResult
 # 重置已使用墙的长度
 def resetConfUsed():
@@ -197,16 +205,16 @@ def drawPointCircle(points):
     for point in points:
       acad.model.AddCircle(APoint(point[0],point[1]), 50)
 
-# 判断可用区域中点是否超出房间
-def isUseCenterOverRoom(useCenterPosition):
-  if useCenterPosition[0] < 0 or useCenterPosition[0]>conf.roomLengths[0] or useCenterPosition[1] < 0 or useCenterPosition[1]>conf.roomLengths[1]:
+# 判断可用区域是否超出房间
+def isUseAreaOverRoom(useCenterPosition,useCenterPositionOffset):
+  if useCenterPosition[0]- useCenterPositionOffset[0]/2< 0 or useCenterPosition[0]+useCenterPositionOffset[0]/2>conf.roomLengths[0] or useCenterPosition[1]-useCenterPositionOffset[1]/2 < 0 or useCenterPosition[1]+useCenterPositionOffset[1]/2>conf.roomLengths[1]:
     return True
   return False
 # 从插入点开始顺时针记录已摆放的组件
 def tempStoragePosition(x,y,wallIndex,blockIndex,blockReference):
   position = getCenterPoint(wallIndex, x, y, blockIndex);
   # 判断可用区域中点是否超出房间
-  if(isUseCenterOverRoom(position[3])):
+  if(isUseAreaOverRoom(position[3],position[4])):
     mirrorPy(blockReference,position)
   useCenterPosition = (position[3],position[4])
   doorFeasible = isPositionFeasibleWithDoor(position)
@@ -217,7 +225,7 @@ def tempStoragePosition(x,y,wallIndex,blockIndex,blockReference):
   result = 1
   for item in positoins:
     # 判断实体是否相交
-    result = isPositionFeasible(position,positoins[item],1)
+    result = isPositionFeasible(position,positoins[item],0)
     if(result == 1):
       # 判断当前实体是否与已摆放的可用区域相交
       result = isPositionFeasible(position,useAreaPositions[item],1)
@@ -235,9 +243,26 @@ def tempStoragePosition(x,y,wallIndex,blockIndex,blockReference):
 def isPositionFeasible(position1,position2,type):
   areaName = "可用区域"
   if type==0:
-    acad.model.AddLine(APoint(position1[0][0],position1[0][1]),APoint(position2[0][0],position2[0][1]))
-    acad.model.AddCircle(APoint(position1[0][0],position1[0][1]), 50)
+    # acad.model.AddLine(APoint(position1[0][0],position1[0][1]),APoint(position2[0][0],position2[0][1]))
+    # acad.model.AddCircle(APoint(position1[0][0],position1[0][1]), 50)
     areaName = "实体区域"
+    # 画出实体区域间的可用点连线
+    moduleIncludePoints = MovePath.getModuleMovePath(position1[0][0],position1[0][1],position1[1][0],position1[1][1],position1[2][0],position1[2][1],position2[0][0],position2[0][1],position2[1][0],position2[1][1],position2[2][0],position2[2][1])
+    conf.myprint("moduleIncludePoints=",moduleIncludePoints)
+    # 模块间距离
+    moduleDistince = drawLines(moduleIncludePoints)
+    if(len(currentScore) == 3):
+      currentScore.append(moduleDistince)
+    else:
+      moduleDistince += currentScore.pop(3)
+      currentScore.insert(3,moduleDistince)
+    # 撞点个数
+    knockPointNo = len(moduleIncludePoints)-2
+    if(len(currentScore) == 4):
+      currentScore.append(knockPointNo)
+    else:
+      knockPointNo += currentScore.pop(4)
+      currentScore.insert(4,knockPointNo)
   if(abs(position1[0][0]-position2[0][0]) < (position1[1][0]+position2[1][0])/2 and abs(position1[0][1]-position2[0][1]) < (position1[1][1]+position2[1][1])/2):
     conf.myprint(areaName,"sorry! can not put here",currentPosition,"position1=",position1,"position2=",position2)
     return 0
@@ -268,9 +293,19 @@ def drawLines(includePoints):
 def getDoorBeginAndModuleUsePointDistince(position,wallIndex):
   doorBeginPoint = getDoorBeginPoint()
   includePoints = MovePath.getDoorBeginAndModuleUsePointDistince(position[0][0],position[0][1],position[1][0],position[1][1],doorBeginPoint[0],doorBeginPoint[1])
-  currentScore.append(drawLines(includePoints))
+  doorBeginAndModuleUsePointDistince = drawLines(includePoints)
+  if(len(currentScore) == 1):
+    currentScore.append(doorBeginAndModuleUsePointDistince)
+  elif(currentScore[1] > doorBeginAndModuleUsePointDistince):
+    currentScore.pop(1)
+    currentScore.insert(1,doorBeginAndModuleUsePointDistince)
   includePoints = MovePath.getMovePath(position[0][0],position[0][1],position[1][0],position[1][1],doorBeginPoint[0],doorBeginPoint[1],position[2][0],position[2][1])
-  currentScore.append(drawLines(includePoints))
+  moveLength = drawLines(includePoints)
+  if(len(currentScore) == 2):
+    currentScore.append(moveLength)
+  else:
+    moveLength += currentScore.pop(2)
+    currentScore.insert(2,moveLength)
   # distinceWithDoor[len(distinceWithDoor)] = getDistince(doorBeginPoint,usePoint)
 # 以mirrorPoint和可用区域重点为对称抽翻转py
 def mirrorPy(py,position):
@@ -286,7 +321,7 @@ def mirrorPy(py,position):
     newUsePoint[1]=position[2][1]+position[1][1]*direction
   else:
     mirrorPoint = (centerPoint[0],insertPoint[1])
-    direction =  1 if (insertPoint[1]-centerPoint[1])>0 else -1;
+    direction =  1 if (insertPoint[0]-centerPoint[0])>0 else -1;
     newCenterPoint[0]=position[3][0]+position[4][0]*direction
     newUsePoint[0]=position[2][0]+position[1][0]*direction
   position[3] = newCenterPoint

+ 75 - 28
phxb/utils/MovePath.py

@@ -3,8 +3,6 @@ from pyautocad import Autocad, APoint
 
 # 获取点到长方形的最短距离
 def getDoorBeginAndModuleUsePointDistince(x0,y0,width,height,x,y):
-    points = [(x,y),(x0-width/2,y0-height/2),(x0-width/2,y0+height/2),(x0+width/2,y0-height/2),(x0+width/2,y0+height/2),(x0,y0)]
-    # drawPoints(points)
     includePoints = [(x,y)]
     if x<x0-width/2:
         if y>y0+height/2:
@@ -30,41 +28,90 @@ def getDoorBeginAndModuleUsePointDistince(x0,y0,width,height,x,y):
     return includePoints
 # 获取点到长方形指定点的最短距离,默认点在长方形下方
 def getMovePath(x0,y0,width,height,x,y,x1,y1):
-    points = [(x,y),(x0-width/2,y0-height/2),(x0-width/2,y0+height/2),(x0+width/2,y0-height/2),(x0+width/2,y0+height/2),(x0,y0),(x1,y1)]
-    # drawPoints(points)
     includePoints = [(x,y)]
-    # 指定点在第0边;按下右上左方向
-    if y1 == y0-height/2:
-        includePoints.append((x1,y1))
-    # 指定点在第1边;按下右上左方向
-    elif x1 == x0+width/2:
-        if x>x0+width/2:
+    bottom = y0-height/2
+    right = x0+width/2
+    top = y0+height/2
+    left = x0-width/2
+    # 终点在模块最上边
+    if y1 == top:
+        if y>=top:
+            includePoints.append((x1,y1))
+        elif x<=left:
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+        elif x>=right:
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+        elif x+x1<=2*x0:
+            includePoints.append((left,bottom))
+            includePoints.append((left,top))
             includePoints.append((x1,y1))
         else:
-            includePoints.append((x0+width/2,y0-height/2))
+            includePoints.append((right,bottom))
+            includePoints.append((right,top))
             includePoints.append((x1,y1))
-    # 指定点在第2边,暂只考虑从左边开始接近
-    elif y1 == y0+height/2:
-        if x<x0-width/2:
-            includePoints.append((x0-width/2,y0+height/2))
+    elif y1 == bottom:
+        if y<=bottom:
+            includePoints.append((x1,y1))
+        elif x<=left:
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        elif x>=right:
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+        elif x+x1<=2*x0:
+            includePoints.append((left,top))
+            includePoints.append((left,bottom))
             includePoints.append((x1,y1))
         else:
-            includePoints.append((x0-width/2,y0-height/2))
-            includePoints.append((x0-width/2,y0+height/2))
+            includePoints.append((right,top))
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+    elif x1 == left:
+        if x<=left:
+            includePoints.append((x1,y1))
+        elif y>=top:
+            includePoints.append((left,top))
+            includePoints.append((x1,y1))
+        elif y<=bottom:
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        elif y+y1<=2*y0:
+            includePoints.append((right,bottom))
+            includePoints.append((left,bottom))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((right,top))
+            includePoints.append((left,top))
             includePoints.append((x1,y1))
-    # 指定点在第3边
     else:
-        if x<x0-width/2:
+        if x>=right:
+            includePoints.append((x1,y1))
+        elif y>=top:
+            includePoints.append((right,top))
+            includePoints.append((x1,y1))
+        elif y<=bottom:
+            includePoints.append((right,bottom))
+            includePoints.append((x1,y1))
+        elif y+y1<=2*y0:
+            includePoints.append((left,bottom))
+            includePoints.append((right,bottom))
             includePoints.append((x1,y1))
         else:
-            includePoints.append((x0-width/2,y0-height/2))
+            includePoints.append((left,top))
+            includePoints.append((right,top))
             includePoints.append((x1,y1))
     return includePoints
-# getDoorBeginAndModuleUsePointDistince(3300,1500,900,600,10,3000)
-# getDoorBeginAndModuleUsePointDistince(3300,2800,900,600,1000,3000)
-# getDoorBeginAndModuleUsePointDistince(3300,2800,900,600,3100,3800)
-# getDoorBeginAndModuleUsePointDistince(3300,2800,900,600,4000,900)
-# getMovePath(3300,2800,900,600,0,0,3500,2500)
-# getMovePath(3300,2800,900,600,0,0,2850,2700)
-# getMovePath(3300,2800,900,600,3000,0,2850,2700)
-# getMovePath(3300,2800,900,600,3300,0,3500,3100)
+# 获取模块可用点到另一个模块使用点间的距离
+def getModuleMovePath(x10,y10,width1,height1,x1,y1,x20,y20,width2,height2,x2,y2):
+    includePoints1 = getMovePath(x10,y10,width1,height1,x2,y2,x1,y1)
+    includePoints2 = getMovePath(x20,y20,width2,height2,x1,y1,x2,y2)
+    includePoints = []
+    for item in range(len(includePoints1)):
+        if(item>0):
+            includePoints.append(includePoints1[item])
+    for item in range(len(includePoints2)):
+        if(item>0):
+            includePoints.insert(0,includePoints2[item])
+    return includePoints

+ 5 - 1
phxb/utils/main.py

@@ -158,5 +158,9 @@ myprocess(4, 3)
 # acad = Autocad(create_if_not_exists = False)
 # acad.prompt("Hello, Autocad from Python\n")
 # print(acad.doc.Name)
-# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile.dwg",'001',[0,1,2])
+# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile.dwg",'222',[1,2,0])
+# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile3.dwg",'222',[1,2,0])
+# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile4.dwg",'222',[1,2,0])
+# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile5.dwg",'110',[1,0,2])
+# moveMultipleTemplate(r"F:\autocad_temp\newfile2\newfile5.dwg",'222',[1,2,0])
 # moveSingleTemplate(r"F:\autocad_temp\newfile1113\newfile2.dwg",'310')