AutoLisp从入门到放弃(二十)

绘制等边三角形三边半圆弧以及内切圆。

目标:

人机交互输入两个点,根据输入点确定的直线为边绘制一个正三角形,分别以三角形的三边为直径绘制半圆弧,并在每一个半圆内绘制内切圆。预期效果如下图:
在这里插入图片描述

程序:

(defun C:DrawTriangleArcCir(
    /
    #iCmdEcho               ;; 人机交互系统变量值
    #iOsMode                ;; 捕捉方式系统变量值
    #ptTri1                 ;; 三角形底边的第一个点
    #ptTri2                 ;; 三角形底边的第二个点
    #ptTri3                 ;; 三角形的第三个点
    #lsPlineList            ;; 绘制多段线的数据列表
    #ptTemp1                ;; 计算过程中的临时点坐标
    #ptTemp2                ;; 计算过程中的临时点坐标
    #ssName                 ;; 用作矩阵操作的选择集
    #ptArrayBase            ;; 矩阵操作时的基点
    )
    ;; 获取当前的人机交互和捕捉的状态
    (setq #iCmdEcho (getvar "CMDECHO"))
    (setq #iOsMode (getvar "OSMODE"))

    ;; 关闭所有捕捉和人机交互
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)

    ;; 获取正三角形的底边两点
    (setq 
        #ptTri1 (getpoint "\n请确定三角形底边的起点:")
        #ptTri2 (getpoint #ptTri1 "\n请确定三角形底边的终点:")
    );setq

    ;; 根据两点计算三角形的第三个点坐标
    (setq #ptTri3 
        (polar 
            #ptTri2 
            (+ (angle #ptTri1 #ptTri2) (/ (* 120 PI) 180))
            (distance #ptTri1 #ptTri2)
        ); polar
    ); setq

     ;; 生成多段线数据列表
    (setq #lsPlineList 
        (list 
            (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") 
            (cons 90 3) (cons 70 1) 
            (cons 10 #ptTri1) (cons 10 #ptTri2) (cons 10 #ptTri3)
        ); list
    ); setq

    ;; 生成三角形
    (entmake #lsPlineList)

    ;; 分别绘制每条边上的圆弧和圆
    (command "arc" #ptTri1 "e" #ptTri2 "a" 180 "")

    ;; 初始化选择集
    (setq #ssName (ssadd)) 
    (setq #ssName (ssadd (entlast) #ssName))

    (setq #ptTemp1
        (polar #ptTri1 (angle #ptTri1 #ptTri2) (* (distance #ptTri1 #ptTri2) 0.5))
    ); setq

    (setq #ptTemp2
        (polar #ptTemp1 (+ (angle #ptTri1 #ptTri2) (* 1.5 PI)) (* (distance #ptTri1 #ptTri2) 0.5))
    ); setq

    (command "circle" "2p" #ptTemp1 #ptTemp2)
    (setq #ssName (ssadd (entlast) #ssName))

    ;; 获取正三角形的中心作为环形矩阵的基点
    (setq #ptTemp2
        (polar #ptTri2 
            (+ (angle #ptTri1 #ptTri2) (/ (* 120 PI) 180))
            (* (distance #ptTri1 #ptTri2) 0.5)
        ); polar
    ); setq
    (setq #ptArrayBase (inters #ptTri3 #ptTemp1 #ptTri1 #ptTemp2))
    (command "array" #ssName "" "P" #ptArrayBase "3" "" "")

    ;; 还原程序运行前的捕捉和人机交互状态
    (setvar "CMDECHO" #iCmdEcho)
    (setvar "OSMODE" #iOsMode)

    ;; 消除函数返回值
    (prin1)
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值