我也写了一个,看看

- [FONT=courier new]
- ;;;--------------------------------------------------------
- ;;;函数: c:adv
- ;;;--------------------------------------------------------
- ;;;来源: 作者: caddog
- ;;;编制时间:2007.3
- ;;;功能: 添加多段线的顶点
- ;;;语法:
- ;;;参数
- ;;;返回值:
- ;;;备注 : 学习VBA看到ADDVERTEX,试着写了一个看看,没考虑弧
- ;;;--------------------------------------------------------
- (DEFUN C:ad (/ 2dp ename n obj p pp ss1 ss2 t1 var2dp StartWidth
- endWidth)
- (SETQ SS1 (ENTSEL "\n请选择一条多段线:"))
- (SETQ ENAME (CAR SS1))
- (SETQ OBJ (VLAX-ENAME->VLA-OBJECT ENAME))
- ;;如果是多段线则处理
- (IF (WCMATCH (VLA-GET-OBJECTNAME obj) "LWPOLYLINE,AcDbPolyline") ;_ 结束wcmatch
- (PROGN
- ;;显示多段线的夹点,便于用户查看
- (SETQ ss2 (SSADD ENAME))
- (SSSETFIRST NIL ss2)
- ;;提示用户选择插入点
- (SETQ P (GETPOINT "\n请选择插入点:"))
- ;;当点P有值时循环
- (WHILE p
- ;;确定用户所指定的插入点的位置,是在哪个顶点之后
- (SETQ PP (VLAX-CURVE-GETCLOSESTPOINTTO OBJ (TRANS P 1 0)))
- (SETQ N (+ (FIX (VLAX-CURVE-GETPARAMATPOINT OBJ PP)) 1))
- ;;取插入点外原来的起始宽度和终止宽度
- ;;试着用PEDIT命令添加顶点,观察加入点后宽度的变化可知
- ;;新加入顶点的起始/终止宽度均为原来的的终止宽度
- (VLA-GETWIDTH obj (- n 1) 'StartWidth 'endWidth)
- ;;创建安全数组,并将点取的坐标赋给它.注意ADDVERTEX方法只接受二维点
- (SETQ 2DP (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1)))
- (VLAX-SAFEARRAY-FILL 2DP (LIST (CAR P) (CADR P)))
- ;;转换安全数组为变体
- (SETQ VAR2DP (VLAX-MAKE-VARIANT 2DP))
- ;;调用ACTIVEX方法添加顶点
- (VLA-ADDVERTEX OBJ N VAR2DP)
- ;;调整宽度
- (VLA-SETWIDTH obj n endWidth endWidth)
- (SETQ P (GETPOINT "\n请选择插入点:"))
- ) ;_end while
- (PRINC)
- (SSSETFIRST NIL) ;_取消夹取的状态
- ) ;_end progn
- (PROGN
- (PRINC "\n您选择的不是多段线!")
- (PRINC)
- ) ;_end else progn
- ) ;_end if
- (princ)
- ) ;_end defun
- [/FONT]
|