cad横断面图转文本

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()
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值