绘制等边三角形三边半圆弧以及内切圆。
目标:
人机交互输入两个点,根据输入点确定的直线为边绘制一个正三角形,分别以三角形的三边为直径绘制半圆弧,并在每一个半圆内绘制内切圆。预期效果如下图:
程序:
(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)
)