旧程序,期待改进。
(GET_POINTS ENT1)定义为获取ent1的点,返回((所有坐标列表)(最大坐标)(最小坐标))
-
- ;;;7/23/03
- ;;;复合线顶点编辑工具
- (defun C:PEDIT_EV (ANGLE1 ANGLE2 ANGLE3 DATA DATA_NEW DIST1 ENT1 MODIFY_MODE NUM1 POINT1 POINTS POINT_NUM1)
- ;;选取一条多段线
- (while (progn (while (not (setq ENT1 (car (entsel "\n\t选择要编辑的多段线:")))))
- (not (wcmatch (cdr (assoc '0 (entget ENT1))) "*POLYLINE"))
- )
- (princ "\n\t选择的不是多段线。")
- )
- (setq MODIFY_MODE "Add")
- (while (/= MODIFY_MODE "eXit")
- (princ (strcat "\n\tAdd增加点/Del删除点/Move移动点/eXit退出:"
- )
- )
- (setq DATA (grread NIL))
- (cond ((= 2 (car DATA))
- (cond ((= 120 (cadr DATA)) (setq MODIFY_MODE "eXit"))
- ((or (= 65 (cadr DATA)) (= 97 (cadr DATA))) (setq MODIFY_MODE "Add"))
- ((or (= 68 (cadr DATA)) (= 100 (cadr DATA))) (setq MODIFY_MODE "Del"))
- ((or (= 77 (cadr DATA)) (= 109 (cadr DATA))) (setq MODIFY_MODE "Move"))
- )
- )
- ((= 3 (car DATA))
- ;;与线上点最小距离
- (setq POINT1 (mapcar '* (cadr DATA) (list 1 1)))
- (setq POINTS (car (GET_POINTS ENT1)))
- (setq DIST1 (distance POINT1 (car POINTS))) ;与线上点最小距离
- (setq POINT_NUM1 0) ;与线上点最小距离的点序号
- (setq NUM1 0)
- (foreach TEMP POINTS
- (if (> DIST1 (distance TEMP POINT1))
- (progn (setq DIST1 (distance TEMP POINT1)) (setq POINT_NUM1 NUM1))
- )
- (setq NUM1 (1+ NUM1))
- )
- ;;进行处理
- (setq DATA (entget ENT1))
- (setq DATA_NEW (list))
- (setq NUM1 0)
- (foreach TEMP DATA
- (if (and (= 10 (car TEMP)) (= NUM1 POINT_NUM1))
- (cond ;;增加点
- ((= "Add" MODIFY_MODE)
- ;;angle1 前角
- ;;angle2 后角
- (if (= 0 POINT_NUM1)
- (setq ANGLE1 (angle (nth (+ POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
- (setq ANGLE1 (angle (nth POINT_NUM1 POINTS) (nth (- POINT_NUM1 1) POINTS)))
- )
- (if (= (- (length POINTS) 1) POINT_NUM1)
- (setq ANGLE2 (angle (nth (- POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
- (setq ANGLE2 (angle (nth POINT_NUM1 POINTS) (nth (+ POINT_NUM1 1) POINTS)))
- )
- (setq ANGLE3 (angle (nth POINT_NUM1 POINTS) POINT1)) ;
- (setq ANGLE1 (- ANGLE1 ANGLE3))
- (setq ANGLE2 (- ANGLE3 ANGLE2))
- (if ( ANGLE1 ANGLE2) (> (+ ANGLE1 ANGLE2) (+ pi pi))) ;外角时大于360度且前角大于后角
- )
- ;;条件为真时加在最近点前面
- (setq DATA_NEW (append DATA_NEW
- (list (append (list 10) POINT1))
- (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
- (list TEMP)
- )
- )
- ;;条件为假时加在最近点后面
- (setq DATA_NEW (append DATA_NEW
- (list TEMP)
- (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
- (list (append (list 10) POINT1))
- )
- )
- )
- )
- ;;移动点
- ((= "Move" MODIFY_MODE) (setq DATA_NEW (append DATA_NEW (list (append (list 10) POINT1)))))
- ;;删除点
- ;;就不用处理
- )
- (setq DATA_NEW (append DATA_NEW (list TEMP)))
- )
- (if (= 10 (car TEMP))
- (setq NUM1 (1+ NUM1))
- )
- )
- (if (not (entmod DATA_NEW))
- (*ERROR* "不能更新实体数据!")
- )
- )
- ((= 12 (car DATA)) (setq MODIFY_MODE "eXit"))
- )
- )
- (princ)
- )
|