python autocad comtypes+pyautocad二次开发 pywin32连不上高版本cad解决办法
·
好像只要pyautocad就行了
相关链接
reclosedev/pyautocad | DeepWiki
python连接AutoCAD;pyautocad连接错误;win32com连接AutoCAD出现问题_python pywin32连接cad-CSDN博客
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.ActiveDocument
print(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.19
acad = win32com.client.GetActiveObject("AutoCAD.Application.22")
doc = acad.ActiveDocument
print(f"成功连接到 AutoCAD 文档: {doc.Name}")
except Exception as e:
print("无法连接到 AutoCAD 2014,请确保 AutoCAD 已启动。", e)
# 如果特定版本连接失败,尝试通用方式连接
try:
acad = win32com.client.GetActiveObject("AutoCAD.Application")
doc = acad.ActiveDocument
print(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 Counter
def connect_to_autocad():
"""连接到AutoCAD"""
try:
acad = comtypes.client.GetActiveObject('AutoCAD.Application', dynamic=True)
return acad
except Exception as e:
print(f"连接失败: {e}")
return None
def 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.pi
return angle % 360
except Exception as e:
print(f"计算角度时出错: {e}")
return 0.0
def are_lines_tangent_to_arc(line1, line2, arc):
"""检查两条直线是否与圆弧相切"""
# 简化实现,实际应用中需要更精确的几何计算
return True
def get_intersection_points(line, arc):
"""获取直线与圆弧的交点"""
# 这里需要实现具体的几何计算
return []
def create_larger_arc(model, arc, line1, line2):
"""基于现有圆弧和两条直线创建更大的圆弧"""
try:
# 获取圆弧参数
center = arc.Center
radius = arc.Radius
# 计算新的起始角度和终止角度
start_angle = arc.StartAngle # 弧度
end_angle = arc.EndAngle # 弧度
# 创建新圆弧
larger_arc = model.AddArc(center, radius, start_angle, end_angle)
return larger_arc
except Exception as e:
print(f"创建较大圆弧时出错: {e}")
return None
def find_circle_like_objects(acad):
"""查找类圆形对象组合"""
objects = []
try:
doc = acad.ActiveDocument
print(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 traceback
traceback.print_exc()
pass
print(f"总共找到 {len(objects)} 个对象")
try:
print(f"图纸空间对象数: {doc.PaperSpace.Count if doc.PaperSpace else '无图纸空间'}")
except:
pass
if len(objects) == 0:
try:
print("\n尝试检查ModelSpace的属性:")
model_space = doc.ModelSpace
attrs = [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'):
continue
try:
# 替换原来的属性验证方式
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.EndPoint
lines.append(obj)
except Exception:
# 忽略不能访问必要属性的对象
continue
print(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.StartPoint
end = line.EndPoint
angle = 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.StartPoint
end = line.EndPoint
angle = 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_groups
def is_connected(arc, line):
"""检查圆弧和直线是否连接"""
try:
# 首先验证对象具有必要的属性
if not (hasattr(arc, 'StartPoint') and hasattr(arc, 'EndPoint')):
return False
if not (hasattr(line, 'StartPoint') and hasattr(line, 'EndPoint')):
return False
arc_start = arc.StartPoint
arc_end = arc.EndPoint
line_start = line.StartPoint
line_end = line.EndPoint
# 检查端点是否接近
tolerance = 0.001
distances = [
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 < tolerance
except Exception as e:
print(f" 连接检查出错: {e}")
return False
def 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_arc
except Exception as e:
print(f"替换对象时出错: {e}")
return None
# 主程序
if __name__ == "__main__":
# 连接AutoCAD
print("正在连接AutoCAD...")
acad = connect_to_autocad()
if not acad:
print("无法连接到AutoCAD,退出程序")
exit()
print("AutoCAD连接成功")
# 获取当前文档和模型空间
try:
doc = acad.ActiveDocument
print(f"活动文档: {doc.FullName}")
model = doc.ModelSpace
print("成功获取模型空间")
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的圆

更多推荐


所有评论(0)