Слияние кода завершено, страница обновится автоматически
from pyautocad import APoint,Autocad
from sqlalchemy import create_engine
from adjust_dict import adjust
import pandas as pd
import win32com.client
import time, os
# def check_exsit(process_name):
# WMI = win32com.client.GetObject('winmgmts:')
# processCodeCov = WMI.ExecQuery('select * from Win32_Process where Name="%s"' % process_name)
# if len(processCodeCov) > 0:
# flag = True
# print('%s is exists' % process_name)
# else:
# flag = False
# print("%s is not exists" % process_name)
# return flag
def prove(input_action, type1):
"""
验证输入的每个值是否可以转换成有效值
:param type1: 数据转换的类型
:param input_action: 输入input函数
:return:
"""
while True:
try:
value = type1(input(input_action))
except ValueError:
print("请输入有效数据!!!")
else:
return value
def paint_circle(acad, meter, deviate):
p1 = APoint(meter, meter)
acad.model.AddCircle(p1, meter)
acad.model.AddCircle(p1, meter - deviate)
def paint_rectangle(acad, Point: APoint, length, width):
"""
画出具体每个芯片,根据中心点去画
:param length: 芯片的长
:param width: 芯片的宽
:param Point: 芯片矩形的中心点
:return:
"""
p1 = APoint(Point.x - (length / 2), Point.y - (width / 2))
p2 = APoint(Point.x - (length / 2), Point.y + (width / 2))
p3 = APoint(Point.x + (length / 2), Point.y - (width / 2))
p4 = APoint(Point.x + (length / 2), Point.y + (width / 2))
list1 = [p1, p2, p3, p4]
# 画图
list2 = [list1[0]]
for point1 in list1:
if point1.x == list2[0].x or point1.y == list2[0].y:
continue
else:
list2.append(point1)
for point1 in list2:
for point2 in list1:
if point1.x == point2.x and point1.y == point2.y:
continue
elif point1.x != point2.x and point1.y == point2.y:
acad.model.AddLine(point1, point2)
elif point1.x == point2.x and point1.y != point2.y:
acad.model.AddLine(point1, point2)
else:
continue
def get_position(acad, type, x, y, diameter, num_dict, deviate, length1, width1, interval, flag, width_interval):
"""
计算每个芯片中心点位置,并调用paint_rectangle
:param interval: 最小间隔
:param width_interval: 得到的上下间隔
:param flag: 重新计算标志
:param diameter: 圆直径
:param acad: 创建的AutoCAD
:param x: 圆心的X坐标
:param y: 圆心的Y坐标
:param type: 判断情况1、还是情况2
:param num_dict: 上一步所得字典
:param width1: 芯片宽
:param length1: 芯片长
:param deviate: 最小偏离值
:return:
"""
Point_list = []
# 根据字典去计算每行的排布
if type == 1:
for i in num_dict.keys():
if num_dict[i] == 1:
y1 = y - i * width1 - i * width_interval
y2 = y + i * width1 + i * width_interval
Point_list.append(APoint(x, y1))
Point_list.append(APoint(x, y2))
else:
loop1 = 2 * (((diameter / 2 - deviate) ** 2 - ((i + 0.5) * width1 + i * width_interval) ** 2) ** 0.5)
length_interval1 = (loop1 - num_dict[i] * length1) / (num_dict[i] + 1)
if length_interval1 < interval:
length_interval1 = (loop1 - num_dict[i] * length1) / (num_dict[i] - 1)
if length_interval1 < interval:
length_interval1 = interval
y1 = y - i * width1 - i * width_interval
y2 = y + i * width1 + i * width_interval
# 可以被整除,弦上为双数
if num_dict[i] % 2 == 0:
for num in range(0, int(num_dict[i] // 2)):
x1 = x - (num + 0.5) * length1 - (num + 0.5) * length_interval1
x2 = x + (num + 0.5) * length1 + (num + 0.5) * length_interval1
if i == 0:
Point_list.append(APoint(x1, y))
Point_list.append(APoint(x2, y))
else:
Point_list.append(APoint(x1, y1))
Point_list.append(APoint(x1, y2))
Point_list.append(APoint(x2, y1))
Point_list.append(APoint(x2, y2))
else:
Point_list.append(APoint(x, y1))
Point_list.append(APoint(x, y2))
for num in range(0, int((num_dict[i] + 1) // 2)):
x1 = x - num * length1 - num * length_interval1
x2 = x + num * length1 + num * length_interval1
if i == 0:
Point_list.append(APoint(x1, y))
Point_list.append(APoint(x2, y))
else:
Point_list.append(APoint(x1, y1))
Point_list.append(APoint(x1, y2))
Point_list.append(APoint(x2, y1))
Point_list.append(APoint(x2, y2))
else:
for i in num_dict.keys():
if num_dict[i] == 1:
y1 = y - (i - 0.5) * width1 - (i - 0.5) * width_interval
y2 = y + (i - 0.5) * width1 + (i - 0.5) * width_interval
Point_list.append(APoint(x, y1))
Point_list.append(APoint(x, y2))
else:
loop2 = 2 * (((diameter / 2 - deviate) ** 2 - (
(i - 0.5) * width_interval + i * width1) ** 2) ** 0.5)
length_interval2 = (loop2 - num_dict[i] * length1) / (num_dict[i] + 1)
if length_interval2 < interval:
length_interval2 = (loop2 - num_dict[i] * length1) / (num_dict[i] - 1)
if length_interval2 < interval:
length_interval2 = interval
y1 = y - (i - 0.5) * width1 - (i - 0.5) * width_interval
y2 = y + (i - 0.5) * width1 + (i - 0.5) * width_interval
# 弦上为双数
if num_dict[i] % 2 == 0:
for num in range(0, int(num_dict[i] // 2)):
x1 = x - (num + 0.5) * length1 - (num + 0.5) * length_interval2
x2 = x + (num + 0.5) * length1 + (num + 0.5) * length_interval2
Point_list.append(APoint(x1, y1))
Point_list.append(APoint(x1, y2))
Point_list.append(APoint(x2, y1))
Point_list.append(APoint(x2, y2))
else:
Point_list.append(APoint(x, y1))
Point_list.append(APoint(x, y2))
for num in range(1, int((num_dict[i] + 1) // 2)):
x1 = x - num * length1 - num * length_interval2
x2 = x + num * length1 + num * length_interval2
Point_list.append(APoint(x1, y1))
Point_list.append(APoint(x1, y2))
Point_list.append(APoint(x2, y1))
Point_list.append(APoint(x2, y2))
# 每点画图
for point in Point_list:
# print(point.x, point.y)
paint_rectangle(acad, point, length1, width1)
def get_info_1(diameter1, length1, width1, interval, deviate, serial_number, union_number):
"""
情况1:计算直径上的极限数量,以及每一行的极限数量,总数等
得出满足总数=串数*并数 的num_dict
:param interval: 间隔
:param union_number: 并数
:param serial_number: 串数
:param diameter1: 直径
:param length1: 芯片长度
:param width1: 芯片宽度
:param deviate: 偏离值
:return: 直径极限数量,该情况总数,每行排布多少的字典,行数
"""
# 极限的行数
rows = (diameter1 / 2 - deviate - width1 / 2) // (width1 + interval)
rows_num = int(rows)
# print(f"极限行数:{rows}")
# print(f"情况1:极限行数:{rows_num}")
# 循环行数为 row 的情况,获得满足情况的num_dict
for row in range(0, rows_num + 1):
num_dict = {}
total_num = 0
if row == 0:
width_interval = diameter1 / 2 - deviate - 0.5 * width1
else:
width_interval = (diameter1 / 2 - deviate - (row + 0.5) * width1) / (row + 1)
width_interval = interval if (width_interval - interval) * row < 1.2 * interval else width_interval
# print(f"极限行数:{rows_num};行间间隔:{width_interval}")
for i in range(0, row + 1):
num1 = (diameter1 / 2 - deviate) ** 2
num2 = ((i + 0.5) * width1 + i * width_interval) ** 2 # 短边平方
loop = ((num1 - num2) ** 0.5) * 2 # 弦长
# print(f"行数:{i};半径-偏移:{num1};短边平方{num2};弦长:{loop}")
num = int((loop + interval) // (length1 + interval))
num = num if num <= serial_number else serial_number
if serial_number * union_number % 2 != 0 and i == 0 and num % 2 == 0:
num -= 1
if i == 0:
total_num += num
else:
total_num += 2 * num
num_dict[i] = num
# print(f"数量:{num};间距:{round(width_interval,2)}")
if total_num >= serial_number * union_number:
# print(total_num)
decrease_num = total_num - serial_number * union_number
print(f"1需要减少的数量:{decrease_num}")
print(f"原字典:{num_dict}")
num_dict = adjust(num_dict, 1, decrease_num)
print(f"修改后:{num_dict}")
total_num -= decrease_num
return 0, total_num, num_dict, width_interval, decrease_num
elif row == rows_num and total_num < serial_number * union_number:
return 0, total_num, None, None, None
return 0, None, None, None, None
def get_info_2(diameter1, length1, width1, interval, deviate, serial_number, union_number):
# 极限行数
rows = ((diameter1 / 2) - deviate + (interval / 2)) // (width1 + interval)
rows_num = int(rows)
# print(f"极限行数:{rows}")
# 循环行数为 row 的情况,获得满足情况的num_dict
for row in range(0, rows_num + 1):
num_dict = {}
total_num = 0
# 当最上面一个芯片两个顶点在圆上,上边与圆仍有差距,计算时应减去
width_interval = (diameter1 / 2 - deviate - (row + 1) * width1) / (row + 1.5)
width_interval = interval if width_interval < interval else width_interval
for i in range(1, row + 1):
num1 = (diameter1 / 2 - deviate) ** 2 # 半径-偏移的平方
num2 = (i * width1 + (i - 0.5) * width_interval) ** 2 # 短边平方
loop = ((num1 - num2) ** 0.5) * 2 # 弦长
num = int((loop + interval) // (length1 + interval))
num = num if num <= serial_number else serial_number
total_num += 2 * num
num_dict[i] = num
if total_num >= serial_number * union_number:
decrease_num = total_num - serial_number * union_number
print(f"2需要减少的数量:{decrease_num}")
num_dict = adjust(num_dict, 2, decrease_num)
total_num -= decrease_num
return 0, total_num, num_dict, width_interval, decrease_num
elif row == rows_num and total_num < serial_number * union_number:
return 0, total_num, None, None, None
return 0, None, None, None, None
def code_yz(Substrate_code):
# 判断输入有效性
engine = create_engine("mssql+pyodbc://pereader:pereader@172.18.65.31:1433/SortingDB?"
"driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True)
data = pd.read_sql(f"SELECT * FROM RD_Substrate_Code WHERE Substrate_Code='{Substrate_code}'",
engine)
result = data[['ID', 'Substrate_Code', 'LES_mm']]
return result
def Main(type, diameter, length1, width1, interval, deviate, serial_number, union_number):
if not os.path.exists('./Download'):
os.makedirs('./Download')
# flag_exe = check_exsit('acad.exe')
# if flag_exe:
# # 使用系统杀死可能残余进程
# os.system('taskkill /IM acad.exe /F')
# win32com.client.Dispatch("AutoCAD.Application") #(程序退出,autocad自动关闭)
max_num1, total_num1, num_dict1, width_interval1, flag1 = get_info_1(diameter, length1, width1, interval, deviate,
serial_number, union_number)
max_num2, total_num2, num_dict2, width_interval2, flag2 = get_info_2(diameter, length1, width1, interval, deviate,
serial_number, union_number)
print(f"情况1:极限数量:{max_num1};总数:{total_num1};\n数据字典:{num_dict1};间隔:{width_interval1}")
print(f"情况2:极限数量:{max_num2};总数:{total_num2};\n数据字典:{num_dict2};间隔:{width_interval2}")
# 画矩形测试
if type == '1':
# 自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的cad文件。
# 如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件
acad = Autocad(create_if_not_exists=True)
paint_circle(acad, diameter / 2, deviate)
get_position(acad, 1, diameter / 2, diameter / 2, diameter, num_dict1, deviate, length1, width1,
interval, flag1, width_interval1)
acad.ActiveDocument.SaveAs("D:/CAD_paint/Download/PyAutoCAD_SaveAs")
time.sleep(1)
acad.ActiveDocument.Close()
DrawingObj = acad.ActiveDocument.Application.Documents.Add("")
elif type == '2':
# 自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的cad文件。
# 如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件
acad = Autocad(create_if_not_exists=True)
paint_circle(acad, diameter / 2, deviate)
get_position(acad, 2, diameter / 2, diameter / 2, diameter, num_dict2, deviate, length1, width1,
interval, flag2, width_interval2)
acad.ActiveDocument.SaveAs("D:/CAD_paint/Download/PyAutoCAD_SaveAs")
time.sleep(1)
acad.ActiveDocument.Close()
acad.ActiveDocument.Application.Documents.Add("")
else:
print(f"不能画图!")
# # 使用系统杀死此次进程
# os.system('taskkill /IM acad.exe /F')
time.sleep(0.5)
if __name__ == '__main__':
check_exsit('chrome.exe')
# Main(1, 15, 34 * 0.0254, 17 * 0.0254, 1.8958, 1.1000, 10, 4)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )