python autocad comtypes+pyautocad二次开发 pywin32连不上高版本cad解决办法
好像只要pyautocad就行了
相关链接
reclosedev/pyautocad | DeepWiki
python连接AutoCAD;pyautocad连接错误;win32com连接AutoCAD出现问题_python pywin32连接cad-CSDN博客
帮助 | Autodesk
pywin32
win32到最后还是连不上line的子属性
,在连接不同版本的AutoCAD时需要指定相应的版本号。
- AutoCAD 2010:
AutoCAD.Application.18
- AutoCAD 2011:
AutoCAD.Application.18
- AutoCAD 2012:
AutoCAD.Application.18
- AutoCAD 2013:
AutoCAD.Application.19
- AutoCAD 2014:
AutoCAD.Application.19
- AutoCAD 2015:
AutoCAD.Application.20
- AutoCAD 2016:
AutoCAD.Application.20
- AutoCAD 2017:
AutoCAD.Application.21
- AutoCAD 2018:
AutoCAD.Application.22
- AutoCAD 2019:
AutoCAD.Application.23
- AutoCAD 2020:
AutoCAD.Application.24
- AutoCAD 2021:
AutoCAD.Application.24
- AutoCAD 2022:
AutoCAD.Application.24
只能连2014的版本
import win32com.client# 连接到正在运行的 AutoCAD
try:acad = win32com.client.GetActiveObject("AutoCAD.Application")doc = acad.ActiveDocumentprint(f"成功连接到 AutoCAD 文档: {doc.Name}")
except Exception as e:print("无法连接到 AutoCAD,请确保 AutoCAD 已启动。", e)exit()# 获取模型空间
ms = doc.ModelSpace# 存储所有 LINE 实体
lines = []# 遍历模型空间中的所有实体
for i in range(ms.Count):entity = ms.Item(i)if entity.ObjectName == "AcDbLine": # 判断是否为直线lines.append(entity)else :print("entity.ObjectName:"+entity.ObjectName)
连接其他的版本
import win32com.client# 连接到正在运行的 AutoCAD 2014
try:# 针对 AutoCAD 2014 使用 Application.19acad = win32com.client.GetActiveObject("AutoCAD.Application.22")doc = acad.ActiveDocumentprint(f"成功连接到 AutoCAD 文档: {doc.Name}")
except Exception as e:print("无法连接到 AutoCAD 2014,请确保 AutoCAD 已启动。", e)# 如果特定版本连接失败,尝试通用方式连接try:acad = win32com.client.GetActiveObject("AutoCAD.Application")doc = acad.ActiveDocumentprint(f"通过通用方式连接到 AutoCAD 文档: {doc.Name}")except Exception as e2:print("无法通过任何方式连接到 AutoCAD。", e2)exit()# 获取模型空间
ms = doc.ModelSpace# 存储所有 LINE 实体
lines = []# 遍历模型空间中的所有实体
for i in range(ms.Count):entity = ms.Item(i)if entity.ObjectName == "AcDbLine": # 判断是否为直线lines.append(entity)else:print("entity.ObjectName:" + entity.ObjectName)
python -m win32com.client.makepy
comtypes.client
import math
import comtypes.client
from collections import Counterdef connect_to_autocad():"""连接到AutoCAD"""try:acad = comtypes.client.GetActiveObject('AutoCAD.Application', dynamic=True)return acadexcept Exception as e:print(f"连接失败: {e}")return Nonedef calculate_angle(line):"""计算直线的角度"""try:start_point = [line.StartPoint[0], line.StartPoint[1]]end_point = [line.EndPoint[0], line.EndPoint[1]]dx = end_point[0] - start_point[0]dy = end_point[1] - start_point[1]angle = math.atan2(dy, dx) * 180 / math.pireturn angle % 360except Exception as e:print(f"计算角度时出错: {e}")return 0.0def are_lines_tangent_to_arc(line1, line2, arc):"""检查两条直线是否与圆弧相切"""# 简化实现,实际应用中需要更精确的几何计算return Truedef get_intersection_points(line, arc):"""获取直线与圆弧的交点"""# 这里需要实现具体的几何计算return []def create_larger_arc(model, arc, line1, line2):"""基于现有圆弧和两条直线创建更大的圆弧"""try:# 获取圆弧参数center = arc.Centerradius = arc.Radius# 计算新的起始角度和终止角度start_angle = arc.StartAngle # 弧度end_angle = arc.EndAngle # 弧度# 创建新圆弧larger_arc = model.AddArc(center, radius, start_angle, end_angle)return larger_arcexcept Exception as e:print(f"创建较大圆弧时出错: {e}")return Nonedef find_circle_like_objects(acad):"""查找类圆形对象组合"""objects = []try:doc = acad.ActiveDocumentprint(f"当前文档: {doc.Name}")print(f"模型空间对象数: {doc.ModelSpace.Count}")# 尝试不同的遍历方法for obj in doc.ModelSpace:objects.append(obj)if len(objects) == 0:print("尝试使用枚举器遍历...")try:enumerator = doc.ModelSpace.GetEnumerator()while enumerator.MoveNext():objects.append(enumerator.Current)except Exception as e:print(f"枚举器方法也失败: {e}")except Exception as e:print(f"获取对象时出错: {e}")import tracebacktraceback.print_exc()passprint(f"总共找到 {len(objects)} 个对象")try:print(f"图纸空间对象数: {doc.PaperSpace.Count if doc.PaperSpace else '无图纸空间'}")except:passif len(objects) == 0:try:print("\n尝试检查ModelSpace的属性:")model_space = doc.ModelSpaceattrs = [attr for attr in dir(model_space) if not attr.startswith('_')]print(f"ModelSpace的可用属性: {attrs[:20]}")doc.Regen(1)print("已尝试刷新文档")except Exception as e:print(f"检查ModelSpace属性时出错: {e}")circle_like_groups = []# 更严格地筛选对象,确保它们具有正确的属性arcs = []lines = []for obj in objects:if not hasattr(obj, 'ObjectName'):continuetry:# 替换原来的属性验证方式if obj.ObjectName == 'AcDbArc':try:# 使用getattr方式安全访问属性center = getattr(obj, 'Center', None)radius = getattr(obj, 'Radius', None)start_point = getattr(obj, 'StartPoint', None)end_point = getattr(obj, 'EndPoint', None)start_angle = getattr(obj, 'StartAngle', None)end_angle = getattr(obj, 'EndAngle', None)# 检查所有必需属性是否存在if all(prop is not None for prop in [center, radius, start_point, end_point, start_angle, end_angle]):arcs.append(obj)else:missing = []if center is None: missing.append('Center')if radius is None: missing.append('Radius')if start_point is None: missing.append('StartPoint')if end_point is None: missing.append('EndPoint')if start_angle is None: missing.append('StartAngle')if end_angle is None: missing.append('EndAngle')print(f"警告: 圆弧对象缺少属性: {', '.join(missing)}")except Exception as e:print(f"访问圆弧属性时出错: {e}")elif obj.ObjectName == 'AcDbLine':# 验证线对象的基本属性_ = obj.StartPoint_ = obj.EndPointlines.append(obj)except Exception:# 忽略不能访问必要属性的对象continueprint(f"\n找到 {len(arcs)} 个圆弧对象")print(f"找到 {len(lines)} 个直线对象")# 显示所有圆弧信息for i, arc in enumerate(arcs):try:print(f"圆弧 {i+1}:")print(f" 中心点: ({arc.Center[0]:.3f}, {arc.Center[1]:.3f})")print(f" 半径: {arc.Radius:.3f}")print(f" 起始点: ({arc.StartPoint[0]:.3f}, {arc.StartPoint[1]:.3f})")print(f" 终止点: ({arc.EndPoint[0]:.3f}, {arc.EndPoint[1]:.3f})")print(f" 起始角度: {arc.StartAngle*180/math.pi:.2f}°")print(f" 终止角度: {arc.EndAngle*180/math.pi:.2f}°")except Exception as e:print(f" 读取圆弧信息时出错: {e}")# 显示所有直线信息for i, line in enumerate(lines):try:start = line.StartPointend = line.EndPointangle = calculate_angle(line)print(f"直线 {i+1}:")print(f" 起始点: ({start[0]:.3f}, {start[1]:.3f})")print(f" 终止点: ({end[0]:.3f}, {end[1]:.3f})")print(f" 角度: {angle:.2f}°")except Exception as e:print(f" 读取直线信息时出错: {e}")# 查找可能的组合:一个圆弧 + 两条直线for i, arc in enumerate(arcs):print(f"\n检查圆弧 {i+1} 的连接直线:")connected_lines = []for j, line in enumerate(lines):# 检查直线是否与圆弧连接is_conn = is_connected(arc, line)if is_conn:print(f" 直线 {j+1} 与圆弧连接")connected_lines.append(line)print(f" 圆弧 {i+1} 共找到 {len(connected_lines)} 条连接直线")if len(connected_lines) > 0:print(f" 连接直线详细信息:")for k, line in enumerate(connected_lines):try:start = line.StartPointend = line.EndPointangle = calculate_angle(line)print(f" 直线 {k+1}: 起始点({start[0]:.3f}, {start[1]:.3f}), "f"终止点({end[0]:.3f}, {end[1]:.3f}), 角度{angle:.2f}°")except Exception as e:print(f" 读取直线信息时出错: {e}")if len(connected_lines) >= 2:try:angle1 = calculate_angle(connected_lines[0])angle2 = calculate_angle(connected_lines[1])angle_diff = abs(angle1 - angle2)print(f" 检查角度差异: 直线1({angle1:.2f}°) - 直线2({angle2:.2f}°) = {angle_diff:.2f}°")# 非90度检查(考虑角度周期性)is_non_90 = not (abs(angle_diff - 90) < 1 or abs(angle_diff - 270) < 1)print(f" 是否非90度角: {is_non_90}")if is_non_90:circle_like_groups.append({'arc': arc,'lines': connected_lines[:2]})print(f" => 添加到类圆形对象组合")else:print(f" => 由于是90度角,不添加到类圆形对象组合")except Exception as e:print(f" 计算角度时出错: {e}")elif len(connected_lines) > 0:print(f" => 连接直线少于2条,不构成类圆形对象组合")return circle_like_groupsdef is_connected(arc, line):"""检查圆弧和直线是否连接"""try:# 首先验证对象具有必要的属性if not (hasattr(arc, 'StartPoint') and hasattr(arc, 'EndPoint')):return Falseif not (hasattr(line, 'StartPoint') and hasattr(line, 'EndPoint')):return Falsearc_start = arc.StartPointarc_end = arc.EndPointline_start = line.StartPointline_end = line.EndPoint# 检查端点是否接近tolerance = 0.001distances = [distance(arc_start, line_start),distance(arc_start, line_end),distance(arc_end, line_start),distance(arc_end, line_end)]min_distance = min(distances)return min_distance < toleranceexcept Exception as e:print(f" 连接检查出错: {e}")return Falsedef distance(point1, point2):"""计算两点间距离"""try:return math.sqrt((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)except Exception:return float('inf') # 返回无穷大表示无法计算距离def replace_with_larger_arc(model, group):"""用更大的圆弧替换原有对象组合"""try:arc = group['arc']lines = group['lines']# 创建更大的圆弧larger_arc = create_larger_arc(model, arc, lines[0], lines[1])# 删除原对象# 注意:实际操作前应该确认# model.Delete(arc)# model.Delete(lines[0])# model.Delete(lines[1])return larger_arcexcept Exception as e:print(f"替换对象时出错: {e}")return None# 主程序
if __name__ == "__main__":# 连接AutoCADprint("正在连接AutoCAD...")acad = connect_to_autocad()if not acad:print("无法连接到AutoCAD,退出程序")exit()print("AutoCAD连接成功")# 获取当前文档和模型空间try:doc = acad.ActiveDocumentprint(f"活动文档: {doc.FullName}")model = doc.ModelSpaceprint("成功获取模型空间")except Exception as e:print(f"获取文档或模型空间时出错: {e}")exit()# 查找类圆形对象print("\n开始查找类圆形对象...")circle_like_groups = find_circle_like_objects(acad)print(f"\n最终结果: 找到 {len(circle_like_groups)} 个类圆形对象组合")# 处理每个组合for i, group in enumerate(circle_like_groups):print(f"处理第 {i+1} 个组合...")try:arc = group['arc']lines = group['lines']print(f" 圆弧半径: {arc.Radius}")print(f" 直线1角度: {calculate_angle(lines[0])}")print(f" 直线2角度: {calculate_angle(lines[1])}")except Exception as e:print(f" 显示组合信息时出错: {e}")
画圆不能用前面那个要用pyautocad
import comtypes.client
from pyautocad import APoint # 您的连接方式
acad = comtypes.client.GetActiveObject('AutoCAD.Application', dynamic=True) # 获取活动文档和模型空间
doc = acad.ActiveDocument
model = doc.ModelSpace # 画圆
p1 = APoint(0, 0) # 圆心坐标
model.AddCircle(p1, 10) # 半径为10的圆