IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python cad批量生成南方cass断面数据 -> 正文阅读

[Python知识库]python cad批量生成南方cass断面数据

import win32com.client
import pythoncom
from tkinter import filedialog, messagebox
import math
import operator
import numpy
from os import system


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 azimuth(x1, y1, x2, y2):  # 方位角
    angle = 0
    dx = x2 - x1
    dy = y2 - y1
    if dx == 0 and dy > 0:  # 判断象限
        angle = 0
    if dx == 0 and dy < 0:
        angle = 180
    if dy == 0 and dx > 0:
        angle = 90
    if dy == 0 and dx < 0:
        angle = 270
    if dx > 0 and dy > 0:
        angle = math.atan(dx / dy) * 180 / math.pi
    elif dx < 0 and dy > 0:
        angle = 360 + math.atan(dx / dy) * 180 / math.pi
    elif dx < 0 and dy < 0:
        angle = 180 + math.atan(dx / dy) * 180 / math.pi
    elif dx > 0 and dy < 0:
        angle = 180 + math.atan(dx / dy) * 180 / math.pi
    return math.radians(angle)


def calculationAngle(list1):
    angleList = []
    for zuobiao in list1:
        weizhi = list1.index(zuobiao)
        if weizhi != len(list1) - 1:
            xiaYiGeZuoBiao = list1[weizhi + 1]
            angle = azimuth(zuobiao[0], zuobiao[1], xiaYiGeZuoBiao[0], xiaYiGeZuoBiao[1])
            angleList.append([zuobiao, xiaYiGeZuoBiao, angle])
    return angleList


def vtpnt(x, y, z=0):
    """坐标点转化为浮点数"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))


def vtobj(obj):
    """转化为对象数组"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)


def vtFloat(list):
    """列表转化为浮点数"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, list)


def vtInt(list):
    """列表转化为整数"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, list)


def vtVariant(list):
    """列表转化为变体"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, list)


def distance(point1, point2):
    d = math.sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2)
    return d


def pointInLine(point1, point2, pointQ):
    x1, y1 = point1
    x2, y2 = point2
    xQ, yQ = pointQ
    maxX = max(x1, x2)
    maxY = max(y1, y2)
    minX = min(x1, x2)
    minY = min(y1, y2)
    if (abs(((xQ - x1) * (y2 - y1) - (x2 - x1) * (yQ - y1))) < 0.00001) and (xQ >= minX and xQ <= maxX) and (
            yQ >= minY and yQ <= maxY):
        return True
    else:
        return False


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 kilometerPile(pile):
    s = divmod(pile, 1000)
    Pile = "K" + rrd(s[0], 0) + "+" + rrd(s[1], 3)
    return Pile


acad = win32com.client.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument
doc.Utility.Prompt("\n醉后不知天在水\n满船清梦压星河\n")
mp = doc.ModelSpace  # 模型空间
messagebox.showinfo('提示', "请在屏幕拾取图元,以Enter键结束")
try:
    doc.SelectionSets.Item("SS1").Delete()
except:
    messagebox.showinfo('警告', "Delete selection failed")
slt = doc.SelectionSets.Add("SS1")
slt.SelectOnScreen()


def obLine(list1):
    x1, y1 = list1[0]
    point_1 = vtpnt(x1, y1)
    x2, y2 = list1[1]
    point_2 = vtpnt(x2, y2)
    lineObj = mp.AddLine(point_1, point_2)
    return lineObj


zdmCoordinates = []
hdmCoordinates = []
gcdBlock = []
for Select in slt:
    if Select.ObjectName == "AcDbBlockReference":
        if Select.Layer == "GCD":
            # gcd = Select.InsertionPoint
            # gcdCoordinates.append(list(gcd))
            gcdBlock.append(Select)

    if Select.ObjectName == "AcDbPolyline":
        if Select.Layer == "zdm":
            oldZdm = Select.Coordinates
            newZdm = list_change(oldZdm, 2)
            zdmCoordinates = calculationAngle(newZdm)
            # print(zdmCoordAngels)

        if Select.Layer == "hdm":
            oldHdm = Select.Coordinates
            newHdm = list_change(oldHdm, 2)
            hdmCoordAngels = calculationAngle(newHdm)
            hdmCoordinates += hdmCoordAngels
hdmToZdmIntersectCoord = []  # 交点
dZdm = 0
rawData = dict()
for zdmLineCoordinates in zdmCoordinates:
    dZdm += distance(zdmLineCoordinates[0], zdmLineCoordinates[1])  # 距离

    line1 = obLine(zdmLineCoordinates)  # 创建线段1

    for hdmLineCoordinates in hdmCoordinates:  # 循环横断面

        line2 = obLine(hdmLineCoordinates)
        i = line1.IntersectWith(line2, 0)  # 交点

        if i != ():
            d = distance(zdmLineCoordinates[1], i)  # 纵断面到直线右侧端点距离
            inPointDist = dZdm - d  # 直线距离

            gcdToHdmIntersectCoord = dict()  # 储存线段上的高程点

            for gcd in gcdBlock:
                gcdCoord = gcd.InsertionPoint
                rawData.update({gcdCoord: ""})
                startGcdInsHdmLine = pointInLine(hdmLineCoordinates[0], i[:-1], gcdCoord[:-1])
                if startGcdInsHdmLine:  # 左
                    gcdInLineDist = distance(gcdCoord, i)  # 高程点到交点距离
                    gcdToHdmIntersectCoord.update({gcdCoord: -gcdInLineDist})

                endGcdInsHdmLine = pointInLine(i[:-1], hdmLineCoordinates[1], gcdCoord[:-1])
                if endGcdInsHdmLine:  # 右
                    gcdInLineDist = distance(gcdCoord, i)  # 高程点到交点距离
                    gcdToHdmIntersectCoord.update({gcdCoord: gcdInLineDist})
            # ..
            hdmToZdmIntersectCoord.append([inPointDist, i, hdmLineCoordinates, gcdToHdmIntersectCoord])
            # 交点距离起始点距离、交点、纵断面坐标和角度;高程点坐标,距离交点的距离

hdmToZdmIntersectCoord.sort(key=operator.itemgetter(0))

n = 0
gcdCount = 0
with open("横断面.txt", "w") as f:
    for result in hdmToZdmIntersectCoord:

        gcdCoordDist = sorted(result[3].items(), key=lambda x: x[1], reverse=False)

        begin = ",".join(["BEGIN", rrd(result[0], 3) + ":" + str(n) + "\n"])
        f.writelines(begin)
        for val in gcdCoordDist:
            del rawData[val[0]]  # 从原数据 删除提取出来的高程

            writeGcdLine = ",".join([rrd(val[1], 3), rrd(val[0][-1], 3) + "\n"])
            f.writelines(writeGcdLine)
        n += 1
f.close()
# 数据检查
if len(rawData) != 0:
    with open("错误高程点.txt", "w") as log:
        diffentF = ["X", "\t", "Y", "\t", "Z" + "\n"]
        log.writelines(diffentF)
        for diffent in rawData.items():
            diffentT = "\t".join([rrd(x, 3) for x in diffent[0]])
            log.writelines(diffentT)
            log.write("\n")
    log.close()
    messagebox.showinfo("tip", "部分高程未被提取,请检查错误数据!")
    system("start 错误高程点.txt")
else:
    messagebox.showinfo("tip", "提取完成!")
    system("start 横断面.txt")

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:38:21  更:2021-08-23 16:40:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 12:57:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计