duh 6 سال پیش
والد
کامیت
e335d02f92
4فایلهای تغییر یافته به همراه199 افزوده شده و 42 حذف شده
  1. 84 15
      phxb/test.py
  2. 39 21
      phxb/utils/GetAllModule.py
  3. 70 0
      phxb/utils/MovePath.py
  4. 6 6
      phxb/utils/main.py

+ 84 - 15
phxb/test.py

@@ -6,20 +6,89 @@ acad = Autocad(create_if_not_exists = True)
 acad.prompt("Hello, Autocad from Python\n")
 print(acad.doc.Name)
 
-p1 = APoint(0, 300)#点的位置坐标
-p2 = APoint(500, 250)
-for i in range(50):
-    text = acad.model.AddText('大家好 %s!' % i, p1, 1.5)#添加文本
-    acad.model.AddLine(p1, p2)#添加线
-    acad.model.AddCircle(p1, 100)#添加圆
-    p1.y += 100
+def drawPoints(points):
+    for point in points:
+        acad.model.AddCircle(APoint(point[0],point[1]), 50)
+def drawLines(includePoints):
+    if(len(includePoints)>1):
+        for item in range(len(includePoints)):
+            if(item>0):
+                acad.model.AddLine(APoint(includePoints[item-1][0],includePoints[item-1][1]),APoint(includePoints[item][0],includePoints[item][1]))
+
+# 获取点到长方形的最短距离
+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:
+            includePoints.append((x0-width/2,y0+height/2))
+        elif y>y0-height/2:
+            includePoints.append((x0-width/2,y))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+    elif x<x0+width/2:
+        if y>y0+height/2:
+            includePoints.append((x,y0+height/2))
+        elif y>y0-height/2:
+            pass
+        else:
+            includePoints.append((x,y0-height/2))
+    else:
+        if y>y0+height/2:
+            includePoints.append((x0+width/2,y0+height/2))
+        elif y>y0-height/2:
+            includePoints.append((x0+width/2,y))
+        else:
+            includePoints.append((x0+width/2,y0-height/2))
+    drawLines(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:
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0+width/2,y0-height/2))
+            includePoints.append((x1,y1))
+    # 指定点在第2边,暂只考虑从左边开始接近
+    elif y1 == y0+height/2:
+        if x<x0-width/2:
+            includePoints.append((x0-width/2,y0+height/2))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+            includePoints.append((x0-width/2,y0+height/2))
+            includePoints.append((x1,y1))
+    # 指定点在第3边
+    else:
+        if x<x0-width/2:
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+            includePoints.append((x1,y1))
+    drawLines(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 testAppend():
+    score = []
+    for i in range(100):
+        s = []
+        s.append(i)
+        score.append(s)
+        print(score)
+testAppend()
 
-dp = APoint(10, 0)
-#打印点信息
-for text in acad.iter_objects('Text'):
-    print('text: %s at: %s' % (text.TextString, text.InsertionPoint))
-    text.InsertionPoint = APoint(text.InsertionPoint) + dp
 
-#打印圆,线名称
-for obj in acad.iter_objects(['Circle', 'Line']):
-    print(obj.ObjectName)

+ 39 - 21
phxb/utils/GetAllModule.py

@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 from pyautocad import Autocad, APoint
-from utils import conf
+from utils import conf,MovePath
 import math
 
 #这个true表示没有文件则打开一个,CAD有弹窗时会打开或者创建失败
@@ -16,6 +16,8 @@ distinceWithDoor = {}
 distinceWithOthers={}
 # 旋转后需删除的组件
 needDeleteBlockReferences=[]
+scores=[]
+currentScore=[]
 # acad.prompt("Hello, Autocad from Python\n")
 # conf.myprint(acad.doc.Name)
 def printObjects():
@@ -34,10 +36,17 @@ def printTheTypeObject(type):
   #按类型查找出所有某种图元
   for text in acad.iter_objects(type):
     conf.myprint(text.name)
+def addCurrentScoreToScores():
+  temp = []
+  for item in currentScore:
+    temp.append(item)
+  scores.append(temp)
 def moveBlockReference(position):
   positoins.clear()
   useAreaPositions.clear()
   conf.myprint(conf.moduleLengths)
+  currentScore.clear()
+  currentScore.append(position)
   moveResult = 1
   for blockReference in acad.iter_objects("BlockReference"):
     conf.myprint(blockReference.name)
@@ -48,6 +57,9 @@ def moveBlockReference(position):
         result = moveBlockReferenceToWall(blockReference,position[conf.names.index(item)])
         if(result == 0):
           moveResult = result
+  conf.myprint("currentScore size =",len(currentScore),",scores size=",len(scores))
+  addCurrentScoreToScores()
+  conf.myprint("scores=",scores)
   for blockReference in needDeleteBlockReferences:
     blockReference.delete()
   needDeleteBlockReferences.clear()
@@ -80,6 +92,9 @@ def moveBlockReferenceWithNewIndex(position,moduleIndex):
   moveResult = 1
   positoins.clear()
   useAreaPositions.clear()
+  currentScore.clear()
+  currentScore.append(position)
+  currentScore.append(moduleIndex)
   conf.myprint(conf.moduleLengths)
   blockReferences = []
   for blockReference in acad.iter_objects("BlockReference"):
@@ -94,6 +109,9 @@ def moveBlockReferenceWithNewIndex(position,moduleIndex):
     result = moveBlockReferenceToWall(blockReferences[index],position[moduleIndex.index(index)])
     if(result == 0):
         moveResult = result
+  conf.myprint("currentScore size =",len(currentScore),",scores size=",len(scores))
+  addCurrentScoreToScores()
+  conf.myprint("scores=",scores)
   return moveResult
 # 重置已使用墙的长度
 def resetConfUsed():
@@ -239,41 +257,41 @@ def getDistince(point1,point2):
   return math.sqrt(detarX**2+detarY**2)
 def getDoorBeginPoint():
   return ((conf.doorAlign[0]+conf.doorLength+conf.doorAlign[1])/2,0)
+def drawLines(includePoints):
+  lineLength = 0;
+  if(len(includePoints)>1):
+    for item in range(len(includePoints)):
+      if(item>0):
+        acad.model.AddLine(APoint(includePoints[item-1][0],includePoints[item-1][1]),APoint(includePoints[item][0],includePoints[item][1]))
+        lineLength += getDistince((includePoints[item-1][0],includePoints[item-1][1]),(includePoints[item][0],includePoints[item][1]))
+  return lineLength
 def getDoorBeginAndModuleUsePointDistince(position,wallIndex):
   doorBeginPoint = getDoorBeginPoint()
-  usePoint = position[2]
-  useCenterPoint = (position[0][0],position[0][1])
-  d1 = getDistince(doorBeginPoint,useCenterPoint);
-  d2 = getDistince(doorBeginPoint,usePoint)
-  if(d1 < d2):
-    #不可直接连接
-    conf.myprint("wallIndex=",wallIndex)
-    if(wallIndex == 0):
-      # 先连c
-      acad.model.AddLine(APoint(doorBeginPoint[0],doorBeginPoint[1]),APoint(position[0][0]-position[1][0]/2,position[0][1]+position[1][1]/2))
-      acad.model.AddLine(APoint(position[0][0]-position[1][0]/2,position[0][1]+position[1][1]/2),APoint(usePoint[0],usePoint[1]))
-    else:
-      # 只有0,3需要绕过,先连b
-      # acad.model.AddLine(APoint(doorBeginPoint[0],doorBeginPoint[1]),APoint(position[0][0]+position[1][0]/2,position[0][1]-position[1][1]/2))
-      # acad.model.AddLine(APoint(position[0][0]+position[1][0]/2,position[0][1]-position[1][1]/2),APoint(usePoint[0],usePoint[1]))
-      acad.model.AddLine(APoint(doorBeginPoint[0],doorBeginPoint[1]),APoint(usePoint[0],usePoint[1]-position[1][1]))
-  else:
-    acad.model.AddLine(APoint(doorBeginPoint[0],doorBeginPoint[1]),APoint(usePoint[0],usePoint[1]))
+  includePoints = MovePath.getDoorBeginAndModuleUsePointDistince(position[0][0],position[0][1],position[1][0],position[1][1],doorBeginPoint[0],doorBeginPoint[1])
+  currentScore.append(drawLines(includePoints))
+  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))
   # distinceWithDoor[len(distinceWithDoor)] = getDistince(doorBeginPoint,usePoint)
 # 以mirrorPoint和可用区域重点为对称抽翻转py
 def mirrorPy(py,position):
   insertPoint = py.InsertionPoint
   centerPoint = position[0]
   newCenterPoint = [position[3][0],position[3][1]]
+  newUsePoint = [position[2][0],position[2][1]]
+  conf.myprint("newUsePoint after mirror =",newUsePoint)
   if((insertPoint[0]-centerPoint[0])*(insertPoint[1]-centerPoint[1])>0):
     mirrorPoint = (insertPoint[0],centerPoint[1])
     direction =  1 if (insertPoint[1]-centerPoint[1])>0 else -1;
-    newCenterPoint[1]=position[3][1]+position[4][0]*direction
+    newCenterPoint[1]=position[3][1]+position[4][1]*direction
+    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;
-    newCenterPoint[0]=position[3][0]+position[4][1]*direction
+    newCenterPoint[0]=position[3][0]+position[4][0]*direction
+    newUsePoint[0]=position[2][0]+position[1][0]*direction
   position[3] = newCenterPoint
+  position[2] = newUsePoint
+  conf.myprint("newUsePoint after mirror =",newUsePoint)
   py.mirror(APoint(mirrorPoint[0],mirrorPoint[1]),APoint(centerPoint[0],centerPoint[1]))
   conf.myprint("delete blockReference name",py.name)
   needDeleteBlockReferences.append(py)

+ 70 - 0
phxb/utils/MovePath.py

@@ -0,0 +1,70 @@
+# -*- coding: UTF-8 -*-
+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:
+            includePoints.append((x0-width/2,y0+height/2))
+        elif y>y0-height/2:
+            includePoints.append((x0-width/2,y))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+    elif x<x0+width/2:
+        if y>y0+height/2:
+            includePoints.append((x,y0+height/2))
+        elif y>y0-height/2:
+            pass
+        else:
+            includePoints.append((x,y0-height/2))
+    else:
+        if y>y0+height/2:
+            includePoints.append((x0+width/2,y0+height/2))
+        elif y>y0-height/2:
+            includePoints.append((x0+width/2,y))
+        else:
+            includePoints.append((x0+width/2,y0-height/2))
+    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:
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0+width/2,y0-height/2))
+            includePoints.append((x1,y1))
+    # 指定点在第2边,暂只考虑从左边开始接近
+    elif y1 == y0+height/2:
+        if x<x0-width/2:
+            includePoints.append((x0-width/2,y0+height/2))
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+            includePoints.append((x0-width/2,y0+height/2))
+            includePoints.append((x1,y1))
+    # 指定点在第3边
+    else:
+        if x<x0-width/2:
+            includePoints.append((x1,y1))
+        else:
+            includePoints.append((x0-width/2,y0-height/2))
+            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)

+ 6 - 6
phxb/utils/main.py

@@ -14,8 +14,8 @@ _originFile = "origin.dwg"
 
 templateIndex = {'md_xs','md_py','md_rc'}
 doorName = 'ssdr_800'
-correctFilePath = "newfile4\\"
-errorFilePath = "errorfile4\\"
+correctFilePath = "newfile2\\"
+errorFilePath = "errorfile2\\"
 
 # 这个true表示没有文件则打开一个,CAD有弹窗时会打开或者创建失败
 # print(acad.doc.Name)
@@ -152,11 +152,11 @@ def moveMultipleTemplate(fileName,position,moduleIndex):
 # openOriginFile()
 # tempStorageModules()
 # print(is_open(_rootPath+_originFile))
-# myprocess(4, 3)
+myprocess(4, 3)
 # openFile(r"F:\autocad_temp\newfile023.dwg")
 # is_open(r"F:\autocad_temp\origin11.dwg")
-acad = Autocad(create_if_not_exists = False)
-acad.prompt("Hello, Autocad from Python\n")
+# 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])
-moveSingleTemplate(r"F:\autocad_temp\newfile1113\newfile2.dwg",'310')
+# moveSingleTemplate(r"F:\autocad_temp\newfile1113\newfile2.dwg",'310')