目标1:
交互获取两点确认矩形,以矩形中心为圆心,短边为半径画圆,并绘制矩形对角线在圆内的部分。预期效果如图:
代码
(defun C:DrawRectCir(
/
#iCmdEcho ;; 人机交互系统变量值
#iOsMode ;; 捕捉方式系统变量值
#ptRect1
#ptRect2
#ptRect3
#ptRect4 ;; 确定矩形的四个点坐标
#dLength ;; 矩形长度
#dWidth ;; 矩形宽度
#ptMid ;; 矩形中心点
#dRadius ;; 圆半径
#ptLine1
#ptLine2 ;; 用于绘制直线的点坐标
)
;; 获取当前的人机交互和捕捉的状态
(setq #iCmdEcho (getvar "CMDECHO"))
(setq #iOsMode (getvar "OSMODE"))
;; 关闭所有捕捉和人机交互
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
;; 获取矩形的边框点
(setq
#ptRect1 (getpoint "\n请指定矩形的第一个点:")
#ptRect3 (getcorner #ptRect1 "\n请指定矩形的另一个角点:")
);setq
;; 计算矩形中心
(setq #ptMid (polar #ptRect1 (angle #ptRect1 #ptRect3) (* (distance #ptRect1 #ptRect3) 0.5)))
;; 计算矩形的另外两个角点
(setq
#ptRect2 (list (car #ptRect3) (cadr #ptRect1) 0.0)
#ptRect4 (list (car #ptRect1) (cadr #ptRect3) 0.0)
);setq
;; 计算长宽以及半径
(setq
#dLength (max (abs (- (car #ptRect1) (car #ptRect3))) (abs (- (cadr #ptRect1) (cadr #ptRect3))))
#dWidth (min (abs (- (car #ptRect1) (car #ptRect3))) (abs (- (cadr #ptRect1) (cadr #ptRect3))))
#dRadius (* 0.5 #dWidth)
);setq
;; 生成多段线数据列表
(entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) (cons 10 #ptRect1) (cons 10 #ptRect2) (cons 10 #ptRect3) (cons 10 #ptRect4)))
;; 绘制圆
(entmake (list (cons 0 "CIRCLE") (cons 100 "AcDbEntity") (cons 100 "AcDbCircle") (cons 10 #ptMid) (cons 40 #dRadius)))
;; 计算对角线并绘制
(setq
#ptLine1 (polar #ptMid (angle #ptRect1 #ptRect3) #dRadius)
#ptLine2 (polar #ptMid (angle #ptRect3 #ptRect1) #dRadius)
);setq
(entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))
;; 计算对角线并绘制
(setq
#ptLine1 (polar #ptMid (angle #ptRect2 #ptRect4) #dRadius)
#ptLine2 (polar #ptMid (angle #ptRect4 #ptRect2) #dRadius)
);setq
(entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))
;; 还原程序运行前的捕捉和人机交互状态
(setvar "CMDECHO" #iCmdEcho)
(setvar "OSMODE" #iOsMode)
;; 消除函数返回值
(prin1)
)
目标2:
修改上述代码,实现短边对应的两段圆弧反向。预期效果如图:
代码:
(defun C:DrawRectArc(
/
#iCmdEcho ;; 人机交互系统变量值
#iOsMode ;; 捕捉方式系统变量值
#ptRect1
#ptRect2
#ptRect3
#ptRect4 ;; 确定矩形的四个点坐标
#dLength ;; 矩形长度
#dWidth ;; 矩形宽度
#ptMid ;; 矩形中心点
#dRadius ;; 圆半径
#ptLine1
#ptLine2 ;; 用于绘制直线的点坐标
#ptArc1
#ptArc2
#ptArc3
#ptArc4 ;; 绘制圆弧的点坐标
)
;; 获取当前的人机交互和捕捉的状态
(setq #iCmdEcho (getvar "CMDECHO"))
(setq #iOsMode (getvar "OSMODE"))
;; 关闭所有捕捉和人机交互
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
;; 获取矩形的边框点
(setq
#ptRect1 (getpoint "\n请指定矩形的第一个点:")
#ptRect3 (getcorner #ptRect1 "\n请指定矩形的另一个角点:")
);setq
;; 计算矩形的另外两个角点
(setq
#ptRect2 (list (car #ptRect3) (cadr #ptRect1) 0.0)
#ptRect4 (list (car #ptRect1) (cadr #ptRect3) 0.0)
);setq
;; 计算矩形中心
(setq #ptMid (inters #ptRect1 #ptRect3 #ptRect2 #ptRect4))
;; 计算长宽以及半径
(setq
#dLength (distance #ptRect1 #ptRect2)
#dWidth (distance #ptRect2 #ptRect3)
#dRadius (* 0.5 (min #dLength #dWidth))
);setq
;; 生成多段线数据列表
(entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) (cons 10 #ptRect1) (cons 10 #ptRect2) (cons 10 #ptRect3) (cons 10 #ptRect4)))
;; 计算对角线并绘制
(setq
#ptLine1 (polar #ptMid (angle #ptRect1 #ptRect3) #dRadius)
#ptLine2 (polar #ptMid (angle #ptRect3 #ptRect1) #dRadius)
);setq
(entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))
;; 计算对角线并绘制
(setq
#ptLine1 (polar #ptMid (angle #ptRect2 #ptRect4) #dRadius)
#ptLine2 (polar #ptMid (angle #ptRect4 #ptRect2) #dRadius)
);setq
(entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))
;; 计算圆弧相关点坐标
(setq
#ptArc1 (polar #ptMid (angle #ptMid #ptRect1) #dRadius)
#ptArc2 (polar #ptMid (angle #ptMid #ptRect2) #dRadius)
#ptArc3 (polar #ptMid (angle #ptMid #ptRect3) #dRadius)
#ptArc4 (polar #ptMid (angle #ptMid #ptRect4) #dRadius)
);setq
;; 绘制圆弧(需要判断那条边更长,以此来确定绘制圆弧的方向)
(if (> #dLength #dWidth)
(progn
(command "arc" #ptArc1 "e" #ptArc2 "r" #dRadius)
(command "arc" #ptArc3 "e" #ptArc2 "r" #dRadius)
(command "arc" #ptArc3 "e" #ptArc4 "r" #dRadius)
(command "arc" #ptArc1 "e" #ptArc4 "r" #dRadius)
);progn
(progn
(command "arc" #ptArc2 "e" #ptArc1 "r" #dRadius)
(command "arc" #ptArc2 "e" #ptArc3 "r" #dRadius)
(command "arc" #ptArc4 "e" #ptArc3 "r" #dRadius)
(command "arc" #ptArc4 "e" #ptArc1 "r" #dRadius)
);progn
);if
;; 还原程序运行前的捕捉和人机交互状态
(setvar "CMDECHO" #iCmdEcho)
(setvar "OSMODE" #iOsMode)
;; 消除函数返回值
(prin1)
)