import win32com.client
from tkinter import messagebox
import math
import numpy
numpy.set_printoptions(suppress=True)
from os import system
import tkinter as tk
window = tk.Tk()
window.title("断面提取2.1")
window.geometry('420x145+800+200') # 290 160为窗口大小,+1000 +10 定义窗口弹出时的默认展示位置
window.resizable(0, 0)
def rrd(point, f):
if type(point) == str:
return point
if f == 0:
point = str(int(point))
elif f > 0:
SP = str(numpy.around(point, f))
sy = SP.split(".")
n = len(sy[1])
if n < f:
sj = f - n
point = sy[0] + "." + sy[1] + "0" * sj
else:
point = SP
elif f < 0:
messagebox.showinfo("tip", "取位不可为负数!")
return point
def list_change(old_list, step=4, stop=None): # 列表,步长,保留元素到第几个索引位置
new_list = [old_list[x:x + step][:stop] for x in range(0, len(old_list), step)]
return new_list
def GeneralEquation(point1,point2,point3):
# 一般式 Ax+By+C=0
first_x, first_y = point1
second_x, second_y = point2
x, y = point3
A = second_y-first_y
B = first_x-second_x
C = second_x*first_y-first_x*second_y
d = abs(A * x + B * y + C) / math.sqrt(A ** 2 + B ** 2)
return d
def openMain():
def selection(): # 选择
try:
messagebox.showinfo('提示', "请在cad中选择数据")
doc.SelectionSets.Item("SS1").Delete()
except:
messagebox.showinfo('警告', "Delete selection failed")
slt = doc.SelectionSets.Add("SS1")
slt.SelectOnScreen()
return slt
t9 = text9_var.get()
t10 = text10_var.get()
acad = win32com.client.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument
mp = doc.ModelSpace # 模型空间
hdmData_1 = []
hdmData_2 = []
textData = []
slt = selection()
for select in slt:
objName = select.ObjectName
if objName == "AcDbPolyline" or objName == "AcDb2dPolyline":
hdmCoordintas = select.Coordinates
if objName == "AcDb2dPolyline":
hdmCoordintas = [list(hdmCoordintas)[x:x + 3][:-1] for x in range(0, len(hdmCoordintas), 3)]
hdmCoordintas = tuple(sum(hdmCoordintas,[]))
hdmData_1.append(hdmCoordintas)
hdmData_2.append(hdmCoordintas)
if objName == "AcDbText":
textPt = select.InsertionPoint
textWrite = select.TextString
textData.append([textPt,textWrite])
f = dict()
for data1 in hdmData_1:
for data2 in hdmData_2:
error = f.keys()
if data1[0:2] == data2[0:2] and data1[2:-1] != data2[2:-1] and data2 not in list(error):
f.update({data1:data2})
jcsj = sum([list(x) for x in f.keys()], [])
for datas in hdmData_1:
if datas[0] not in jcsj and datas[1] not in jcsj:
messagebox.showinfo("警告","断面数据错误,位置为[%s],请检查!"%str(datas[0:2]))
data3 = []
for v in f.items(): # 判断在左侧还是右侧
v1 = v[0][2]
v2 = v[1][2]
if v1 < v2:
data3.append([v[0],v[1]])
else:
data3.append([v[1], v[0]])
def takeSecond(elem):
return elem[0][1]
data3.sort(key=takeSecond)
textData.sort(key=takeSecond)
if len(data3) != len(textData):
messagebox.showinfo("警告","公里桩注记与横断面个数不同,请检查数据!")
exit()
with open("提取数据.txt", "w") as fwe:
for newText,newDatas in zip(textData,data3):
newNewText = newText[-1][1:].replace("+","") + "\n"
fwe.write(newNewText)
for newdata in newDatas:
f = list_change(newdata,2)
weizhi = 0
m = []
for v in f[1:]:
x1, y1 = f[weizhi] # 中点
dist = GeneralEquation([x1,y1],[x1,y1+100],v)
height = GeneralEquation([x1,y1],[x1+100,y1],v)
weizhi += 1
m.append(rrd(dist,int(t10)))
if v[1] < y1:
height = -height
m.append(rrd(height,int(t10)))
mm = " ".join(m) + t9 + "\n"
fwe.write(mm)
system("start 提取数据.txt")
lable10 = tk.Label(window, text="保留位数", width=15).grid(row=1, column=0)
text10_var = tk.StringVar() # 获取text_1输入的值
text10_var.set(r'2')
text10 = tk.Entry(window, textvariable=text10_var, bd=5).grid(row=1, column=1)
lable9 = tk.Label(window, text="添加中桩", width=15).grid(row=2, column=0)
text9_var = tk.StringVar() # 获取text_1输入的值
text9_var.set(r' 0.00 0.00')
text9 = tk.Entry(window, textvariable=text9_var, bd=5).grid(row=2, column=1)
tk.Button(window, text="Open", width=12, height=1, command=openMain, bg="Azure").grid(row=0, column=0)
window.mainloop()
09-06
2110
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-16
7825
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)