# -*- coding: UTF-8 -*- from pyautocad import Autocad, APoint from utils import conf,MovePath import math #这个true表示没有文件则打开一个,CAD有弹窗时会打开或者创建失败 acad = Autocad(create_if_not_exists = False) # 组件实体点位置 positoins={} currentPosition = {} # 组件使用点位置 useAreaPositions={} # 组件与门距离 distinceWithDoor = {} # 组件间距离 distinceWithOthers={} # 旋转后需删除的组件 needDeleteBlockReferences=[] scores=[] # 分别存储位置,雷达长度,入口与模块长度,模块间长度,撞点个数 currentScore=[] # acad.prompt("Hello, Autocad from Python\n") # conf.myprint(acad.doc.Name) def printObjects(): #遍历cad图形对象 for obj in acad.iter_objects(): conf.myprint(obj.ObjectName) def printBlockObjects(): #遍历cad图形对象 for obj in acad.iter_objects("BlockReference"): conf.myprint(obj.name,obj.HasAttributes) if obj.HasAttributes: attrs = obj.GetAttributes() for attrib in attrs: conf.myprint(" {}: {}".format(attrib.TagString, attrib.TextString)) def printTheTypeObject(type): #按类型查找出所有某种图元 for text in acad.iter_objects(type): conf.myprint(text.name) # 保存正确方案的分数 def addCurrentScoreToScores(moveResult): temp = [] for item in currentScore: temp.append(item) if moveResult > 0: scores.append(temp) # 根据scores给方案打分 def scoreModule(): moduleScores = [] tempLength = len(scores[0])-1 # socres中目前存储 位置、入口雷达半径、入口与模块连线长度、模块间连线长度,入口与模块间撞点,模块与模块间撞点 maxs = [0]*tempLength mins = [0]*tempLength detarLength = [0]*tempLength fullSocres = [10,10,10,5,5] fullSocresDirect = [1,-1,-1,-1,-1] # 先获取最大值和最小值 for item in scores: for itemIndex in range(tempLength): if item[itemIndex+1]>maxs[itemIndex]: maxs.pop(itemIndex) maxs.insert(itemIndex,item[itemIndex+1]) elif item[itemIndex+1]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() includePoints = MovePath.getDoorBeginAndModuleUsePointDistince(position[0][0],position[0][1],position[1][0],position[1][1],doorBeginPoint[0],doorBeginPoint[1]) 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]) 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): 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][1]*direction newUsePoint[1]=position[2][1]+position[1][1]*direction else: mirrorPoint = (centerPoint[0],insertPoint[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 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) # printObjects() # printBlockObjects() # printTheTypeObject("BlockReference") # moveBlockReference('222') # a=[0,1,2] # moveBlockReferenceWithNewIndex('001',a) # conf.myprint(isWorkable('222')) # getCenterPoint(3,4162.85,0,2) # print(getDistince((0,3),(4,0))) # print(getDoorBeginPoint())