【Python】自动操作Autocad的pyautocad库(一)

本文介绍利用Python实现自动绘制CAD图。记录了pyautocad库的使用方法,包括在虚拟环境搭建相关环境及该库的安装。还提及AutoCAD软件安装,选择2014版本以避免兼容性问题。同时介绍了AutoCAD基础知识、基本操作和功能,如绘图、标注等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

利用python实现自动绘制CAD图。对于好久没有触碰autoCAD的笔者来说,利用python实现自动操作autoCAD,学会使用pyautocad库的同时,也想好好把autoCAD的基本使用操作重新捡起来学习,所以这篇博客记录pyautocad库的使用方法的同时也会附带autoCAD的相关用法。

1 模块与软件安装

1.1 pyautocad库

看过笔者前面博客的应该知道,笔者尤其钟爱在虚拟环境进行相关环境的搭建,这里也不例外:

pip install --upgrade pyautocad -i https://pypi.douban.com/simple

如下图所示,关键模块已安装完毕:(目前最新版本为:pyautocad-0.2.0)
在这里插入图片描述

1.2autoCAD软件安装

目前autoCAD已经更新到2020了,但笔者担心太新的版本存在文件的不兼容性(不知道是不是担心过多了),于是笔者折中选择了2014版本的autoCAD,尽量安装在非系统盘上,如笔者选择安装在D盘上。(详细安装这里不展开说明)
链接:https://pan.baidu.com/s/1lOsY6f3k9iCzQQa7bKHv1g
提取码:uz8v

2 pyautocad基本使用

在使用pyautocad进行cad自动绘图前,必须先打开autoCAD,否则会报如下错误:
在这里插入图片描述

"""
说明:
# 1 导入APoint类是非常必要的,画图都是靠点来画,而且CAD中所有的点都必须用APoint类进行包裹。APoint(10,30),
# 其中10代表点的x坐标,30代表点的y坐标。

# 2 导入相关模块
from pyautocad import APoint, APoint
import math

# 3 画直线,p1是画线的第一个点,p2是第二个点
acad.model.AddLine(p1,p2)

# 4 添加文本,第一个参数就是添加的文本字符串,第二p是被APoint类包裹的点,也就是说在哪个坐标下显示文本,15是文本字体大小
text = acad.model.AddText("{0}".format(text), p, 15)
# 文本从p1点移动到p2点
text.move(p1, p2)

# 5 画圆,第一个参数p就是APoint类包裹的点,也就是圆心位置,第二参数10是半径大小
acad.model.AddCircle(p, 10)

# 6 画圆弧,第一个参数是在哪个点画圆弧,第二个参数是半径,第三个是开始弧(弧度制,不是角度制),第四个点是结束弧。
acad.model.AddArc(p, radius, math.radians(90), math.radians(270))

# 7 保存cad图到指定位置,第一个参数一定是保存的绝对路径!!,64是保存的一种格式,笔者从1到100都试了一遍,有一些是可以生成图的,都是CAD可以打开的文件类型格式。其实跟着笔者写64就好!
acad.doc.SaveAs("{0}".format(save_path), 64)
"""

实例

from pyautocad import Autocad, APoint
import re
import math

# 打开cad文件
# 自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的cad文件。
# 如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件
acad = Autocad(create_if_not_exists=True)
# acad.prompt() 用来在cad控制台中打印文字
acad.prompt("Hello, Autocad from Python")
# acad.doc.Name储存着cad最近打开的图形名
print(acad.doc.Name)

p1 = APoint(0, 0)
p2 = APoint(50, 25)
for i in range(5):
    text = acad.model.AddText('Hi %s!' % i, p1, 2.5)
    acad.model.AddLine(p1, p2)  # 画线:指定起点和终点
    acad.model.AddCircle(p1, 10)  # 指定圆心;半径
    p1.y += 10  # P1的y坐标累加10

dp = APoint(10, 0)
# !!!!!!!遍历cad图形对象以及访问/修改对象属性
for text in acad.iter_objects('Text'):
    print('text: %s at: %s' % (text.TextString, text.InsertionPoint))
    text.InsertionPoint = APoint(text.InsertionPoint) + dp

for obj in acad.iter_objects(['Circle', 'Line']):
    print(obj.ObjectName)

绘图结果如下:
在这里插入图片描述
在这里插入图片描述

3 AutoCAD的基础知识和基本操作

AutoCAD是由美国Autodesk公司开发的通用计算机辅助设计(Computer Aided Design, CAD)软件,具有易于掌控、使用方便、体系结构开放等优点,能够绘制二维图形与三维图形、标注尺寸、渲染图形以及打印输入图纸,目前已广泛应用于机械、建筑、电子、航天、造船、土木工程等领域。

基本功能有:

  1. 绘制和编辑图形
  2. 标注图形尺寸
  3. 渲染三维图形
  4. 数据库管理功能
  5. Internet功能
  6. 输出和打印图形

推荐链接:https://wenku.baidu.com/view/821d25c1a1116c175f0e7cd184254b35effd1a42.html

<think>好的,用户现在遇到了个DeprecationWarning,关于datetime.utcnow()被弃用,需要修改成使用时区感知对象。首先,我需要理解这个警告的背景。Python的datetime模块在早期版本中确实有utcnow()和utcfromtimestamp()这样的方法,但它们返回的是原生datetime对象,没有时区信息。从Python 3.2开始,引入了timezone类,鼓励使用时区感知的对象,而Python 3.11开始弃用这些旧方法,计划未来移除。 用户的需求是修改他们的代码以避免这个警告,并遵循最新的最佳实践。我需要先确认用户当前的Python版本,因为解决方案可能略有不同。如果用户使用的是Python 3.11或更高版本,那么使用datetime.UTC是正确的,但如果是较旧的版本,比如3.9或3.10,可能需要用timezone.utc替代,因为datetime.UTC是在3.11中添加的。 接下来,我应该提供具体的修改示例。首先,替换utcnow()。原来的代码可能是这样的: import datetime current_time = datetime.datetime.utcnow() 修改后应该是: current_time = datetime.datetime.now(datetime.timezone.utc) 或者对于Python 3.11+: current_time = datetime.datetime.now(datetime.UTC) 同样,对于utcfromtimestamp(),原来的代码: dt = datetime.datetime.utcfromtimestamp(timestamp) 应该改为: dt = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) 或者使用replace方法添加时区信息: dt = datetime.datetime.utcfromtimestamp(timestamp).replace(tzinfo=datetime.timezone.utc) 不过更推荐使用fromtimestamp并指定时区。 此外,用户可能需要了解时区感知对象的好处,比如避免隐式转换,更明确地处理时间。可能还需要提醒他们在处理时间时始终使用时区感知对象,特别是在涉及不同时区的应用中。 另外,用户可能关心这些修改后的代码在不同Python版本中的兼容性。如果他们的代码需要支持Python 3.11之前的版本,应该使用datetime.timezone.utc而不是datetime.UTC,因为后者只在3.11+存在。同时,可以建议他们检查代码中其他可能使用了弃用方法的地方,进行统修改。 最后,总结修改步骤,强调使用now()方法并传入时区参数,以及如何调整相关函数调用。可能还需要提醒用户测试修改后的代码,确保时区处理正确,尤其是在与其他系统交互或进行时间计算时。</think>遇到 `DeprecationWarning: datetime.datetime.utcnow() is deprecated` 警告时,表示你正在使用的 `datetime.utcnow()` 方法已被弃用,需改用**时区感知(timezone-aware)**的日期时间对象。以下是具体修改方法和原理说明: --- ### **问题原因** - **弃用背景**:Python 3.11+ 开始弃用 `utcnow()` 和 `utcfromtimestamp()`,因为它们返回的是**无时区信息(naive)**的 `datetime` 对象,容易导致时间计算歧义(例如跨时区操作时)。 - **官方建议**:使用带有明确时区标识的**时区感知对象**(如 `datetime.datetime.now(datetime.UTC)`)。 --- ### **修改方法** #### 1. 替换 `utcnow()` **原代码**: ```python from datetime import datetime current_time = datetime.utcnow() # 会触发警告 ``` **修改后**: ```python from datetime import datetime, UTC # Python 3.11+ 可直接用 UTC current_time = datetime.now(UTC) # 明确指定 UTC 时区 ``` 若 Python 版本 < 3.11,使用 `timezone.utc`: ```python from datetime import datetime, timezone current_time = datetime.now(timezone.utc) # 兼容旧版本 ``` --- #### 2. 替换 `utcfromtimestamp()` **原代码**: ```python dt = datetime.utcfromtimestamp(timestamp) # 弃用方法 ``` **修改后**: ```python dt = datetime.fromtimestamp(timestamp, tz=timezone.utc) # 添加时区参数 ``` 或手动添加时区信息: ```python dt = datetime.utcfromtimestamp(timestamp).replace(tzinfo=timezone.utc) # 兼容但非推荐写法 ``` --- ### **关键区别** | 方法 | 返回值类型 | 时区信息 | 安全性 | |---------------------|------------------|----------|--------------| | `utcnow()` | naive datetime | ❌ 无 | 易导致歧义 | | `datetime.now(UTC)` | aware datetime | ✅ 有 | 明确时区标识 | --- ### **其他注意事项** 1. **兼容性**: - 若需兼容 Python 3.11 以下版本,使用 `timezone.utc` 而非 `UTC`。 - 检查代码中所有 `naive` 时间对象(无时区),尽量替换为 `aware` 对象。 2. **序列化与存储**: - 时区感知对象在序列化(如JSON)或存入数据时,需确保接收方支持时区信息。 3. **第三方适配**: - 部分(如 `pytz`)可能需额外处理时区,建议统使用标准的 `datetime.timezone`。 --- ### **总结步骤** 1. 将 `utcnow()` 替换为 `datetime.now(UTC)`(或 `datetime.now(timezone.utc)`)。 2. 将 `utcfromtimestamp()` 替换为 `fromtimestamp(timestamp, tz=timezone.utc)`。 3. 确保所有时间操作均基于时区感知对象。 修改后代码会明确标识 UTC 时区,避免因隐式时间处理导致的逻辑错误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值