python +pyautocad 在CAD中 画一个线段带箭头

python +pyautocad 在CAD中 画一个线段带箭头

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pyautocad import Autocad, APoint, aDouble
import math

pyacad = Autocad(create_if_not_exists=True)
pyacad.prompt("Hello! Autocad from pyautocad.")
print(pyacad.doc.Name)

def cad_arrow(dotted_start, dotted_end):
    '''
    画箭头
    :param x1: 起点x
    :param y1: 起点x
    :param x2: 终点x
    :param y2: 终点y

    '''

    plineObj = draw_Line(dotted_start ,dotted_end)

    # 指定颜色
    # version = pyacad.Application.Version[:2]  # 当前CAD的版本号
    # clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
    # clr.SetRGB(0, 0, 0)  # 创建蓝色
    # plineObj.TrueColor = clr  # 指定颜色


     #设置线宽
    segmentIndex = 0  # 多段线的段号,从0起计数。
    startWidth =0  # 段起点处线宽
    endWidth =0.8  # 段终点处线宽
    plineObj.SetWidth(segmentIndex, startWidth, endWidth)  # 为多段线plineObj的第3段设置变宽度线宽


    pyacad.ActiveDocument.preferences.LineweightDisplay = 1  # 显示线宽


    pyacad.ActiveDocument.Application.ZoomAll()
    pyacad.ActiveDocument.Application.Update()


def draw_Line(dotted_start ,dotted_end):
    '''
    画线
    :param dotted_start:  点起点
    :param dotted_end:   点终点

    '''
    pnts = [APoint(*dotted_start), APoint(*dotted_end)]
    pnts = [j for i in pnts for j in i]  # 将各点坐标顺序变换为1行多列的1维数组。

    pnts = aDouble(pnts)  # 数据类型转化为双精度浮点数

    plineObj=pyacad.model.AddPolyLine(pnts)
    return plineObj






def calculate_point_on_segment(x1, y1, x2, y2, d=2.5):
    '''
    起点/终点 距离2.5处的点

    :param x1: 起点
    :param y1: 起点
    :param x2: 终点
    :param y2: 终点
    :param d:  起点/终点 距离2.5处
    :return: 起点/终点 距离2.5处 点坐标
    '''
    dx = x2 - x1
    dy = y2 - y1
    L = math.sqrt(dx**2 + dy**2)
    dx /= L
    dy /= L
    x1_s = x1 + d * dx
    y1_s = y1 + d * dy
    x2_e = x2 - d * dx
    y2_e = y2 - d * dy
    return [(x1_s,y1_s),(x2_e,y2_e)]

def draw_line_segments_arrows(dotted_start,dotted_end):
    '''
    画线段带双向箭头
    :param dotted_start:
    :param dotted_end:
    '''

    draw_Line(dotted_start ,dotted_end)

    po= calculate_point_on_segment(*dotted_start, *dotted_end,d=2.5 )

    cad_arrow(dotted_start, po[0])

    cad_arrow(dotted_end,po[1])



dotted_start ,dotted_end=(1,1),(60, 50)

draw_line_segments_arrows(dotted_start,dotted_end)


dotted_start ,dotted_end=(44,88),(90, 100)

draw_line_segments_arrows(dotted_start,dotted_end)

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值