将1楼的代码改进后,帖于下:

- ;;反应器练习------标记点位
- ;;日期:2007-05-25
- (defun C:RCT-CIRC2 ()
- (if (and (setq P0 (getpoint "\n输入圆心:"))
- (setq R (getdist P0 "\n输入半径:"))
- )
- (progn
- ;;绘制圆
- (command "_.circle" "non" P0 "non" R)
- (setq R (* 1.25 R))
- (setq EC (entlast))
- (setq V_C (list (vlax-ename->vla-object EC)))
- ;;计算点位
- (setq P1 (polar P0 0 R))
- (setq P2 (polar P0 (* 0.5 pi) R))
- (setq P3 (polar P0 pi R))
- (setq P4 (polar P0 (* -0.5 pi) R))
- ;;第1条直线
- (command "_.line" "non" P1 "non" P3 "")
- (setq EL1 (entlast))
- (setq H1 (cdr (assoc 5 (entget EL1))))
- ;;第2条直线
- (command "_.line" "non" P2 "non" P4 "")
- (setq EL2 (entlast))
- (setq H2 (cdr (assoc 5 (entget EL2))))
- ;;创建反应器
- (setq VRL
- (vlr-pers
- (vlr-object-reactor
- V_C
- (list H1 H2)
- '((:vlr-modified . C-21))
- )
- )
- )
- )
- )
- (princ)
- )
- (defun C-21 (NOTIFIER REACTOR PARAMETE / P0 P1 P2 P3 P4 P0X P0Y P0Z V_L1
- V_L2)
- ;;获取圆心坐标
- (setq P0 (vla-get-center NOTIFIER))
- (setq P0 (vlax-variant-value P0))
- (setq P0 (vlax-safearray->list P0))
- ;;获取圆半径之后乘以1.25
- (setq C_R (* 1.25 (vla-get-radius NOTIFIER)))
- ;;获取直线对象
- (setq E1 (handent (car (vlr-data REACTOR)))
- E2 (handent (cadr (vlr-data REACTOR)))
- )
- ;;直线起终点坐标计算
- (setq P1 (vlax-3d-point (polar P0 0 C_R))
- P2 (vlax-3d-point (polar P0 (* 0.5 pi) C_R))
- P3 (vlax-3d-point (polar P0 pi C_R))
- P4 (vlax-3d-point (polar P0 (* 1.5 pi) C_R))
- )
- ;;修改直线位置
- (vla-put-startpoint (vlax-ename->vla-object E1) P1)
- (vla-put-endpoint (vlax-ename->vla-object E1) P3)
- (vla-put-startpoint (vlax-ename->vla-object E2) P2)
- (vla-put-endpoint (vlax-ename->vla-object E2) P4)
- (princ)
- )
请体会对象句柄在其中的应用。 |