您的位置:首页 > 编程语言 > Python开发

python 在测绘作业中的一些小应用(与cad交互)-2

2018-02-02 22:50 603 查看
接上一篇,转为问题2:

# -*- coding: utf-8 -*-
import dxfgrabber
import numpy as np
from dxfwrite import DXFEngine as dxf1
dxf=dxfgrabber.readfile(r'C:\Users\Y\Desktop\heigh.dxf')
allline=[l for l in dxf.entities if l.layer=='V-NODE'] #指定图层
l1=[line for line in allline if line.dxftype=='LINE']
lines=[]
for i in l1:
if i.start[2]!=0 and i.end[2]!=0:
lines.append([list(i.start),list(i.end)])#?*2*3
def iscross(p1 ,p2,p3,p4):
if p1[2]==p2[2]==p3[2]==p4[2]:
return True
with open(r"C:\Users\Y\Desktop\crossPoint.txt","w+") as file:
for i in range(0,len(lines)-1,2):#两两直线(0,1),(2,3)
if iscross(lines[i][0],lines[i][1],lines[i+1][0],lines[i+1][1]):
if np.dot(np.array(lines[i+1][1])-np.array(lines[i+1][0]),np.array(lines[i][1])-np.array(lines[i][0]))==0:
if lines[i][0][0]-lines[i][1][0]==0: #判断哪个是x轴(delta X?=0),i还是i+1
centerX=lines[i][0][0]
centerY=lines[i+1][0][1]
centerZ=lines[i][0][2]
elif lines[i+1][0][0]-lines[i+1][1][0]==0:
centerX=lines[i+1][0][0]
centerY=lines[i][0][1]
centerZ=lines[i][0][2]
file.writelines(str(centerX)+","+str(centerY)+","+str(centerZ))
file.writelines("\n")
#把点画到原图上
drawing = dxf1.drawing(r'C:\Users\Y\Desktop\heigh.dxf')
point=dxf1.point((centerX,centerY,centerZ))
point['layer'] = 'V-NODE'
point['color']=256
drawing.add(point)
drawing.save()


简单粗暴,直接附上代码,平场高程中的十字丝两条直线长度是相同的,且满足中垂线,这种更简单了,但是笔者的程序更具有普适性,只要你两条线垂直,那么交点的坐标便可得到,如果想让其更具有普适性,那么就是利用直线AX+BY+C=0的前面的系数的外积求得不垂直情况下交点的坐标。因为平场的高程点很多,笔者程序得到的最后结果有4万多个坐标,如果手动实现将是一项浩大的工程,所以python 大法好。如果笔者的同学还有一些关于测绘(cass 、cad上一些重复性劳动),笔者会利用所学,编写小程序来解决。—-将不断更新,敬请期待!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: