- UID
- 777310
- 积分
- 62
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2018-7-9
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2019-10-10 16:34:59
|
显示全部楼层
大家好,我还是要认真学习论坛里的老师发的贴。
;;reac命令,修改反应器练习
(defun C:310-命令自动,修改反应器练习310 (/) ; cp r1 r2 p1 p2 p3 p4 vc eh1 eh2 eh_l vc_l)
(vl-load-com) ;该函数加载 Visual LISP 提供的扩展,实现对 ActiveX 和 AutoCAD 反应器的支持,
;同时还提供了 ActiveX 实用程序、数据转换函数、词典处理函数和曲线测量函数。
(setvar "cmdecho" 0) ;cmdecho-控制在 AutoLISP 的 command 函数运行时 AutoCAD 是否回显提示和输入。
(setvar "osmode" 0) ;关闭对象捕捉
(setq CP (getpoint "\n指定圆的中心点: ")) ;请求输入圆心坐标
(setq R1 (getdist CP "\n输入圆的半径: ")) ;请求输入圆的半径
(setq R2 (* 1.2 R1)) ;设定r2为圆半径的1.2倍
(setq P1 (polar CP 0 R2) ;利用极坐标法计算以圆心为起点,弧度为0,长度为r2的p1点坐标
P2 (polar CP (* pi 0.5) R2) ;利用极坐标法计算以圆心为起点,弧度为pi/2,长度为r2的p2点坐标
P3 (polar CP pi R2) ;利用极坐标法计算以圆心为起点,弧度为pi,长度为r2的p3点坐标
P4 (polar CP (* pi 1.5) R2) ;利用极坐标法计算以圆心为起点,弧度为3/2*pi,长度为r2的p4点坐标
)
(command "layer" "m" "cuxian" "") ;新建cuxian图层
(command "layer" "lw" 0.3 "cuxian" "") ;更改cuxian层线宽为0.3
(command "circle" CP R1) ;画出用户输入的圆
(setq VC (VLAX-ENAME->VLA-OBJECT (entlast)))
;将AutoLISP类型的对象名转换为VLA对象,
;entlast 函数经常用于获得刚用 command 函数加入到图形中的新图元的图元名。
;该函数选择的图元不一定要显示在屏幕上,也不一定要处于解冻状态。本次主要获得用户输入的圆。
(command "layer" "m" "xixian" "") ;新建xixian图层
(command "layer" "c" 1 "xixian" "l" "center" "xixian" "")
;更改xixian为红色点划线
(command "line" P1 P3 "") ;用直线连接p1,p3点
(setq EH1 (cdr (assoc 5 (entget (entlast)))))
;assoc-从关联表中搜索一个元素,如果找到则返回该关联表条目,
;entget-获得对象(图元)的定义数据。
;cdr-返回去掉了第一个元素的表,当 list 参数是点对表时,cdr 返回点对表的第二个元素,而不是以表的形式返回它。
(command "line" P2 P4 "") ;用直线连接p2,p4点
(setq EH2 (cdr (assoc 5 (entget (entlast)))))
(setq EH_L (list EH1 EH2)) ;句柄表,它们将是反应器的关联数据
(setq VC_L (list VC)) ;vla对象表,它们将是反应器的所有者
(VLR-PERS
(VLR-OBJECT-REACTOR VC_L EH_L '((:VLR-MODIFIED . CHANGE310)))
)
;反应器链接到圆c上,两直线为关联数据,当修改圆c时调用函数change
(VLR-PERS
(VLR-OBJECT-REACTOR VC_L NIL '((:VLR-MODIFIED . SHOW)))
)
;反应器链接到圆c上,无关联数据,当修改圆c时调用函数show
(setvar "cmdecho" 1)
(setvar "osmode" 4133)
(princ)
)
;;;change函数
(defun CHANGE310 (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST /)
;ec ec_l r2 eh_l e1_l e2_l p1 p2 p3 p4 )
(vl-load-com)
(setq EC (VLAX-VLA-OBJECT->ENAME NOTIFIER-OBJECT)
EC_L (entget EC)
CP (cdr (assoc 10 EC_L))
R2 (* 1.2 (cdr (assoc 40 EC_L)))
) ;新数据
(setq EH_L (VLR-DATA REACTOR-OBJECT)) ;获取反应器的关联数据: 句柄表
(setq E1_L (entget (handent (car EH_L))) ;读出直线一图元表
E2_L (entget (handent (cadr EH_L))) ;直线二图元表
)
(setq P1 (polar CP 0 R2)
P2 (polar CP (* pi 0.5) R2)
P3 (polar CP pi R2)
P4 (polar CP (* pi 1.5) R2)
) ;从新计算直线个端点
(setq E1_L (subst (vl-list* 10 P1) (assoc 10 E1_L) E1_L))
;修改直线一的起点
(setq E1_L (subst (vl-list* 11 P3) (assoc 11 E1_L) E1_L))
;修改直线一的端点
(entmod E1_L) ;更新直线一的图元表
(setq E2_L (subst (vl-list* 10 P2) (assoc 10 E2_L) E2_L))
(setq E2_L (subst (vl-list* 11 P4) (assoc 11 E2_L) E2_L))
(entmod E2_L) ;更新直线二的图元表
)
;;;show函数
(defun SHOW (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / R1)
(vl-load-com)
(setq R1 (VLA-GET-DIAMETER NOTIFIER-OBJECT)) ;获取直径
(setq R1 (rtos R1 2 4)) ;转换为字符串
(alert (strcat "圆的内径是: " R1)) ;报告操作结果
) |
|