这里写自定义目录标题

  • 运用python基于北京公交线网txt数据绘制cad
    • 导入pyautocad
    • 读取cad文件
    • 在cad控制台上打字
    • 读取图层信息
    • 读取多段线顶点坐标
    • 新建图层置为当前
    • cad上画图
    • 保存
    • 完整代码
    • 将txt线条打印到cad中

运用python基于北京公交线网txt数据绘制cad

文章前半部分为学习过程,后半部分为在cad中对北京市两千多条公交线路(单向)的绘制,先上效果图

导入pyautocad

pip install pyautocad

读取cad文件

from pyautocad import Autocad,APoint
import mathacad = Autocad(create_if_not_exists=True)  #必须把cad文件打开

在cad控制台上打字

acad.prompt('hello world')
print(acad.doc.Name)  #输出文件名

读取图层信息

layers_nums=acad.ActiveDocument.Layers.count  #图层总数
print(layers_nums)
layers_names=[acad.ActiveDocument.Layers.Item(i).Name for i in range(layers_nums)]  #图层名称
print(layers_names)

读取多段线顶点坐标

items=[]
for item in acad.iter_objects("PolyLine"):print(item.Coordinates)items.append(item.Coordinates)
print(len(items))

新建图层置为当前

layerobj=acad.ActiveDocument.Layers.Add('HIT_Layer')
acad.ActiveDocument.ActiveLayer=layerobj

cad上画图

#设置颜色
ClrNum=1
layerobj.color=ClrNum
# ClrNum为颜色索引号,其取值范围为[0,256];标准颜色的颜色索引号指定如下::1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑; 0 ByBlock、256 ByLayer;#画线l
p1=APoint(0,0)   #所有点必须这样表示
p2=APoint(100,100)
acad.model.AddLine(p1,p2)#画多段线pl
lon=[[55,66,77],[1,3,44],[755,74,1,20]]
lat=[[55,66,77],[1,3,44],[755,74,1,20]]
pnts=[]
for i in range(len(lon[2])):pnts.append(APoint(lon[2][i],lat[2][i]))
pnts = np.array([j for i in pnts for j in i], dtype=np.float)
pnts = Autocad.aDouble(pnts)
pline_obj = acad.model.AddPolyLine(pnts)#画图形
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
dp = APoint(10, 0)

保存

acad.ActiveDocument.Application.preferences.OpenSave.AutoSaveInterval = 0.51

完整代码

from pyautocad import Autocad,APoint
import mathacad = Autocad(create_if_not_exists=True)       #必须把cad文件打开
# acad.ActiveDocument.Application.Documents.Open("2.dwg")#在cad控制台上打字
acad.prompt('hello world')
print(acad.doc.Name)  #输出文件名# # 使用SummaryInfo对象访问图纸的属性(只适用于Windows),也可以使用SummaryInfo访问自动定义属性
# for doc in acad.app.Documents:
#     print(doc.Name)  # 文件名
#     print(doc.SummaryInfo.Author)
#     print(doc.SummaryInfo.Comments)
#     print(doc.SummaryInfo.HyperlinkBase)
#     print(doc.SummaryInfo.Keywords)
#     print(doc.SummaryInfo.LastSavedBy)
#     print(doc.SummaryInfo.RevisionNumber)
#     print(doc.SummaryInfo.Subject)
#     print(doc.SummaryInfo.Title)# 读取图层信息
layers_nums=acad.ActiveDocument.Layers.count  #图层总数
print(layers_nums)
layers_names=[acad.ActiveDocument.Layers.Item(i).Name for i in range(layers_nums)]  #图层名称
print(layers_names)
print(acad.ActiveDocument.Layers.Item(0))# 读取多段线顶点坐标
items=[]
for item in acad.iter_objects("PolyLine"):print(item.Coordinates)items.append(item.Coordinates)
print(len(items))#新建图层置为当前
layerobj=acad.ActiveDocument.Layers.Add('HIT_Layer')
acad.ActiveDocument.ActiveLayer=layerobj
#设置颜色
ClrNum=1
layerobj.color=ClrNum
# ClrNum为颜色索引号,其取值范围为[0,256];# 标准颜色的颜色索引号指定如下::1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑;# 0 ByBlock、256 ByLayer;#画线
p1=APoint(0,0)   #所有点必须这样表示
p2=APoint(100,100)
acad.model.AddLine(p1,p2)#画多段线
lon=[[55,66,77],[1,3,44],[755,74,1,20]]
lat=[[55,66,77],[1,3,44],[755,74,1,20]]
pnts=[]
for i in range(len(lon[2])):pnts.append(APoint(lon[2][i],lat[2][i]))
pnts = np.array([j for i in pnts for j in i], dtype=np.float)
pnts = Autocad.aDouble(pnts)# 将各点坐标顺序变换为行数据;# 添加样条曲线时参数仅支持1行多列的1维数组,即将各点x,y,z坐标顺序排列构成的数组。# 如报错可尝试增加该行代码 pnts = aDouble(pnts)
pline_obj = acad.model.AddPolyLine(pnts)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
dp = APoint(10, 0)# 更改标注的位置
for text in acad.iter_objects('Text'):print('text: %s at: %s' % (text.TextString, text.InsertionPoint))text.InsertionPoint = APoint(text.InsertionPoint) + dpfor obj in acad.iter_objects(['Circle', 'Line']):print(obj.ObjectName)# text = acad.model.AddText("{0}".format(text), p1, 15)             #添加文本,文本字符串,点的位置下显示文本,字体大小
# text.move(p1, p2)                                                 #文本從p1點移動到p2點
# acad.model.AddCircle(p1, 10)                                      #画圆,圆心,半径
# acad.model.AddArc(p1, 500, math.radians(90), math.radians(270))   #画圆弧,圆心,半径,开始弧度,结束弧度# 保存cad图到指定位置,第一個參數一定是保存的絕對路徑!!,64是保存的一種格式,筆者從1到100都試了一遍,
# 有一些是可以生成图的,都是CAD可以打開的文件類型格式。其實跟着筆者寫64就好!
# acad.doc.SaveAs("D:\\pycharm\\mycode\\this_pc_new\\dwg_read\\test.dwg", 64)
# acad.doc.SaveAs("{0}".format("D:\\pycharm\\mycode\\this_pc_new\\dwg_read\\test.dwg"), 64)
acad.ActiveDocument.Application.preferences.OpenSave.AutoSaveInterval = 0.51  #自动保存

将txt线条打印到cad中

遇到一个需求,统计北京市的所有公交线并置于cad中,目前有txt的文件,大概55.4m,这里放个字段的截图。

数据很大,不可能人工画,根据线路代码进行绘制,读取到一个新的线路代码就新建一个cad图层,直接上代码

from pyautocad import Autocad,APoint
import math
from tqdm import tqdm
from numba import jit
import numpy as np#读取公交线路信息
s = []
code=[]
lon=[]
lat=[]
f= open('bus.txt','r')
for lines in f:ls = lines.strip('\n').replace(' ','').replace('、','/').replace('?','').split('/')for i in ls:s.append(i)
f.close()
del s[0]
for i in s:b = i.split(',', 2)if b[0] not in code:code.append(b[0])lon.append([])lat.append([])lon[-1].append(b[1])lat[-1].append(b[2])# 高德火星坐标系转化为WGS84地理坐标系
def gcj2wgs(jingdu,weidu):lon = float(jingdu)lat = float(weidu)a = 6378245.0  # 克拉索夫斯基椭球参数长半轴aee = 0.00669342162296594323  # 克拉索夫斯基椭球参数第一偏心率平方PI = 3.14159265358979324  # 圆周率# 以下为转换公式x = lon - 105.0y = lat - 35.0# 经度dLon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))dLon += (20.0 * math.sin(6.0 * x * PI) + 20.0 * math.sin(2.0 * x * PI)) * 2.0 / 3.0dLon += (20.0 * math.sin(x * PI) + 40.0 * math.sin(x / 3.0 * PI)) * 2.0 / 3.0dLon += (150.0 * math.sin(x / 12.0 * PI) + 300.0 * math.sin(x / 30.0 * PI)) * 2.0 / 3.0# 纬度dLat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))dLat += (20.0 * math.sin(6.0 * x * PI) + 20.0 * math.sin(2.0 * x * PI)) * 2.0 / 3.0dLat += (20.0 * math.sin(y * PI) + 40.0 * math.sin(y / 3.0 * PI)) * 2.0 / 3.0dLat += (160.0 * math.sin(y / 12.0 * PI) + 320 * math.sin(y * PI / 30.0)) * 2.0 / 3.0#转换radLat = lat / 180.0 * PImagic = math.sin(radLat)magic = 1 - ee * magic * magicsqrtMagic = math.sqrt(magic)dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI)dLon = (dLon * 180.0) / (a / sqrtMagic * math.cos(radLat) * PI)wgsLon = lon - dLonwgsLat = lat - dLatreturn wgsLon, wgsLat# 度数坐标系转换成小数坐标系
def deg2flo(jingdu,weidu):lon=str(jingdu)lat=str(weidu)flon=float(lon[:3])+float(lon[3:])/60flat = float(lat[:2]) + float(lat[2:])/60return flon,flat# WGS84国际坐标系转GCJ02(火星坐标系)
def wgs2gcj(jingdu, weidu):lon = float(jingdu)lat = float(weidu)a = 6378245.0  # 克拉索夫斯基椭球参数长半轴aee = 0.00669342162296594323  # 克拉索夫斯基椭球参数第一偏心率平方PI = 3.14159265358979324  # 圆周率# 以下为转换公式x = lon - 105.0y = lat - 35.0# 经度dLon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))dLon += (20.0 * math.sin(6.0 * x * PI) + 20.0 * math.sin(2.0 * x * PI)) * 2.0 / 3.0dLon += (20.0 * math.sin(x * PI) + 40.0 * math.sin(x / 3.0 * PI)) * 2.0 / 3.0dLon += (150.0 * math.sin(x / 12.0 * PI) + 300.0 * math.sin(x / 30.0 * PI)) * 2.0 / 3.0# 纬度dLat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))dLat += (20.0 * math.sin(6.0 * x * PI) + 20.0 * math.sin(2.0 * x * PI)) * 2.0 / 3.0dLat += (20.0 * math.sin(y * PI) + 40.0 * math.sin(y / 3.0 * PI)) * 2.0 / 3.0dLat += (160.0 * math.sin(y / 12.0 * PI) + 320 * math.sin(y * PI / 30.0)) * 2.0 / 3.0# 转换radLat = lat / 180.0 * PImagic = math.sin(radLat)magic = 1 - ee * magic * magicsqrtMagic = math.sqrt(magic)dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI)dLon = (dLon * 180.0) / (a / sqrtMagic * math.cos(radLat) * PI)wgsLon = lon + dLonwgsLat = lat + dLatreturn wgsLon, wgsLat#画线
acad = Autocad(create_if_not_exists=True)       #必须把cad文件打开
acad.ActiveDocument.Application.Documents.Open("aa.dwg")
for i in tqdm(range(len(code))):     #公交线数量layerobj = acad.ActiveDocument.Layers.Add(str(code[i]))  # 新建图层置为当前   PolyLineacad.ActiveDocument.ActiveLayer = layerobjpnts = []      #多段线坐标转换for j in range(len(lon[i])):[wgsLon,wgsLat]=wgs2gcj(lon[i][j],lat[i][j])  #坐标转换pnts.append(APoint(float(wgsLon)/5.8705*499.29, float(wgsLat)/6.3795*702.64))# pnts.append(APoint(float(wgsLon), float(wgsLat)))pnts = np.array([m for n in pnts for m in n], dtype=np.float)pnts = Autocad.aDouble(pnts)pline_obj = acad.model.AddPolyLine(pnts)acad.ActiveDocument.Application.preferences.OpenSave.AutoSaveInterval = 0.51  #自动保存

python基于北京公交线txt数据画cad相关推荐

  1. Python基于分隔符的文本数据存取

    Python基于分隔符的文本数据存取 CSV模块读写 Numpy库读写 使用pandas库读写 三种方式的区别 基于分隔符的文本数据文件以行尾各条数据的分隔,以各种分隔符(同一个文本数据文件中通常只使 ...

  2. 决策树详解python基于Kaggle的Titanic数据实现决策树分类

    决策树详解&&python基于Kaggle的Titanic数据实现决策树分类 一 决策树算法详解 1.前期准备 实验目的准备 2.决策树概述 2.1 决策树 2.2 ID3算法原理 2 ...

  3. python 实战决策树之txt数据导入

    首先将txt数据导入 两种方法 第一 将txt 转化为csv 注意 输出路径 不能更改 这能在根目录下 否则会报错 然后再通过np读取到 第二种  直接txt读取 但是 形式不一样 第二种属于元组 n ...

  4. 通过导入txt数据画出python turtle图形_【Python】txt文件读取绘画

    import turtle as t #绘画库 t.title('自动轨迹绘制') #标题 t.setup(800,600,0,0) t.pencolor('red') t.pensize(5) #数 ...

  5. python用表格中的数据画柱状图_Python数据可视化:5种绘制柱状图表的方法(附源码)...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于数据Magic,作者我不是小样 前言 python里面有很多优秀的可 ...

  6. Python pandas 读取csv/txt数据文件 python读取csv/txt文件

    导读 主要利用pandas.read_csv接口对csv格式文件或txt文件进行读取,由于CSV格式文件使用非常频繁,功能强大,参数众多,因此在这里专门做详细介绍 使用示例 # 基础用法 import ...

  7. Python正则化匹配读取txt数据转为list列表

    1. txt文本数据 今有txt存放的文本数据格式为 要求将其数据提取出来,形成坐标点形式 2. 实现代码 #!/usr/bin/python # -*-coding:utf-8 -*- __auth ...

  8. python用表格中的数据画柱状图_[python]统计excel表格某列中每项出现的次数并画柱状图...

    一.需求: 需要统计该列中每个院系的总数并画成柱状图 有三个这样的表格,需要统计这三个表格所有的每个院系的数量 二.步骤: 1.读xls文件 xls_file17 = xl.open_workbook ...

  9. python数据处理_读取txt数据并绘图

    1.导入相关模块 import matplotlib.pyplot as plt #绘图模块 from scipy import interpolate #插值模块 import numpy as n ...

最新文章

  1. Charles 河畔的大圆顶
  2. JAVA网络IO编程
  3. java请求header_java中处理header请求以及跟cookie相关的一些细节
  4. Elastic-Job任务类
  5. ATL学习笔记〔一〕
  6. [Spark]-RDD详解之变量操作
  7. jupyter notebook选择conda环境
  8. es6 core-decorators.js
  9. NUll is null like
  10. 《基于MFC的OpenGL编程》Part 18 Reading objects from the OBJ File Format
  11. LeetCode 504. Base 7
  12. c语言编译错误c267,为啥编译出现HAHA.C(31): error C267: 'adc0832': requires ANSI-style prototype.......
  13. 三星s9 android p内测,三星开启国行Galaxy S9/S9+安卓9.0内测,限额一万名!
  14. 计算机无法安装dx11,dx11组件是什么?提示缺少dx11组件的具体安装步骤
  15. 报错 OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
  16. 基于php的实验室设备管理系统
  17. Swing Copters摇摇欲坠游戏再次风靡全球,再次虐心,摔手机
  18. Amazon AWS 中国区的那些坑
  19. java中eof错误是啥意思_EOFException异常详解
  20. uniapp中的分享功能实现(APP,小程序,公众号)

热门文章

  1. Excel 按组内序号取数
  2. java反射set_java反射
  3. 我的大学成长之路(CUST)
  4. cocos2dx-JniHelper 使用
  5. HTML中定位之绝对定位position:absolute;
  6. LINUX 下制作 WINDOWS U盘启动盘
  7. MySQL5.7下载安装
  8. 【Discuz】去除以管理员身份登录之后,右下角应用更新提醒的方法
  9. 100%绝对是良心之作 300元以下机箱推荐
  10. CSS技巧:单标签实现抖音LOGO。