好像只要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.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的圆

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐