目标:
任意输入五个点,将5个点用pline线相连,并在最短边上绘制一个半圆弧,在最长边上绘制两个相等的圆弧。预期效果如图:
程序:
(defun C:DrawPlineArc(
/
#iCmdEcho ;; 人机交互系统变量值
#iOsMode ;; 捕捉方式系统变量值
#ptPline1 ;; 多段线的五个顶点
#ptPline2
#ptPline3
#ptPline4
#ptPline5
#lsPlineList ;; 多段线数据
#dDist1 ;; 多段线的五段距离
#dDist2
#dDist3
#dDist4
#dDist5
#lsData ;; 用于记录距离和点坐标
#dDistMax ;; 最大距离
#dDistMin ;; 最小距离
#ptMinSta ;; 最小距离起点
#ptMinEnd ;; 最小距离终点
#ptMaxSta ;; 最大距离起点
#ptMaxEnd ;; 最大距离终点
#ptMaxMid ;; 最大距离中点
#lsMaxPt ;; 最大距离关联的所有信息
#lsMinPt ;; 最小距离关联的所有信息
)
;; 获取当前的人机交互和捕捉的状态
(setq #iCmdEcho (getvar "CMDECHO"))
(setq #iOsMode (getvar "OSMODE"))
;; 关闭所有捕捉和人机交互
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
;; 获取多段线点坐标
(setq
#ptPline1 (getpoint "\n请确定PLine线第一点:")
#ptPline2 (getpoint #ptPline1 "\n请确定PLine线第二点:")
#ptPline3 (getpoint #ptPline2 "\n请确定PLine线第三点:")
#ptPline4 (getpoint #ptPline3 "\n请确定PLine线第四点:")
#ptPline5 (getpoint #ptPline4 "\n请确定PLine线第五点:")
);setq
;; 生成多段线数据列表
(setq #lsPlineList
(list
(cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline")
(cons 90 5) (cons 70 1)
(cons 10 #ptPline1) (cons 10 #ptPline2) (cons 10 #ptPline3) (cons 10 #ptPline4) (cons 10 #ptPline5)
); list
); setq
;; 生成多段线
(entmake #lsPlineList)
;; 计算多段线的五段距离
(setq
#dDist1 (distance #ptPline1 #ptPline2)
#dDist2 (distance #ptPline2 #ptPline3)
#dDist3 (distance #ptPline3 #ptPline4)
#dDist4 (distance #ptPline4 #ptPline5)
#dDist5 (distance #ptPline5 #ptPline1)
); setq
;; 将距离和对应的一对点坐标合成点对,并将所有的点对组成列表,方便后续数据处理
(setq #lsData '())
(setq
#lsData (cons (list #dDist1 #ptPline1 #ptPline2) #lsData)
#lsData (cons (list #dDist2 #ptPline2 #ptPline3) #lsData)
#lsData (cons (list #dDist3 #ptPline3 #ptPline4) #lsData)
#lsData (cons (list #dDist4 #ptPline4 #ptPline5) #lsData)
#lsData (cons (list #dDist5 #ptPline5 #ptPline1) #lsData)
);setq
;; 计算最大和最小距离
(setq
#dDistMax (max #dDist1 #dDist2 #dDist3 #dDist4 #dDist5)
#dDistMin (min #dDist1 #dDist2 #dDist3 #dDist4 #dDist5)
);setq
;; 获取距离最远的两个点坐标,以及两点中点
(setq #lsMaxPt (assoc #dDistMax #lsData))
(setq
#ptMaxSta (cadr #lsMaxPt)
#ptMaxEnd (caddr #lsMaxPt)
#ptMaxMid (polar #ptMaxSta (angle #ptMaxSta #ptMaxEnd) (* #dDistMax 0.5))
);setq
;; 获取距离最近的两个点坐标
(setq #lsMinPt (assoc #dDistMin #lsData))
(setq
#ptMinSta (cadr #lsMinPt)
#ptMinEnd (caddr #lsMinPt)
);setq
;; 开始绘制圆弧
(command "arc" #ptMaxSta "e" #ptMaxMid "a" 180 "")
(command "arc" #ptMaxMid "e" #ptMaxEnd "a" 180 "")
(command "arc" #ptMinSta "e" #ptMinEnd "a" 180 "")
;; 还原程序运行前的捕捉和人机交互状态
(setvar "CMDECHO" #iCmdEcho)
(setvar "OSMODE" #iOsMode)
;; 消除函数返回值
(prin1)
)