lht 发表于 2007-12-5 22:59:00

[求助]请帮修改自编的多段线与曲线相互转换程序(lisp)

<p>自编一段多段线与曲线相互转换程序,想将转换后的线保持和原线一样的颜色、线型、线型比例、线宽和图层。但只能改变颜色,其它的不能改变,不知什么原因,请高手帮看看错在哪能里?<br/>程序如下:<br/>(defun c:lpsp ()</p><p>&nbsp;&nbsp;&nbsp; (setq ss (car(entsel"\n请选择曲线、多段线: ")))<br/>&nbsp;&nbsp;&nbsp; (setq endata (entget ss))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取出对象(多段线)ssn的信息列表赋于endata<br/>&nbsp;&nbsp;&nbsp; (setq s0 (cdr (assoc 0 endata)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取得原实体线型名称<br/>&nbsp;&nbsp;&nbsp; (entdel ss)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;删除要修改的线<br/>&nbsp;&nbsp;&nbsp; (if (= s0 "LWPOLYLINE") (progn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果是多段线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq kd 10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;判断坐标的参数为10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_spline")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;启动画曲线命令<br/>&nbsp;&nbsp;&nbsp; ))<br/>&nbsp;&nbsp;&nbsp; (if (= s0 "SPLINE") (progn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果是曲线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq kd 11)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;判断坐标的参数为11<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_pline")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;启动画多段线命令<br/>&nbsp;&nbsp;&nbsp; ))<br/>&nbsp;&nbsp;&nbsp; (setq n 0 ptn '())<br/>&nbsp;&nbsp;&nbsp; (repeat (length endata)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq pt (nth n endata))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;依次取得信息列表的子表<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x (car pt))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= x kd) (command (cdr pt)))&nbsp; ;判断是否是坐标点,是就画线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq n (+ n 1))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (if (= s0 "LWPOLYLINE") (command "" "" ""))&nbsp;&nbsp; ;多段线画线结束<br/>&nbsp;&nbsp;&nbsp; (if (= s0 "SPLINE") (command ""))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;曲线画线结束<br/>&nbsp;&nbsp;&nbsp; (setq f1 (cdr (assoc 62 endata)))&nbsp;&nbsp;&nbsp; ;取得ss的颜色<br/>&nbsp;&nbsp;&nbsp; (setq f2 (cdr (assoc 6 endata)))&nbsp;&nbsp;&nbsp;&nbsp; ;取得ss的线型<br/>&nbsp;&nbsp;&nbsp; (setq f3 (cdr (assoc 48 endata)))&nbsp;&nbsp;&nbsp; ;取得ss的线型比例<br/>&nbsp;&nbsp;&nbsp; (setq f4 (cdr (assoc 370 endata)))&nbsp;&nbsp; ;取得ss的线宽<br/>&nbsp;&nbsp;&nbsp; (setq f5 (cdr (assoc 8 endata)))&nbsp;&nbsp;&nbsp;&nbsp; ;取得ss的图层<br/>&nbsp;&nbsp;&nbsp; (command "_chprop" (entlast) "" "c" f1 "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;新线的颜色<br/>&nbsp;&nbsp;&nbsp; (command "_chprop" (entlast) "" "it" f2 "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;新线的线型<br/>&nbsp;&nbsp;&nbsp; (command "_chprop" (entlast) "" "s" f3 "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;新线的线型比例<br/>&nbsp;&nbsp;&nbsp; (command "_chprop" (entlast) "" "lw" f4 "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;新线的线宽<br/>&nbsp;&nbsp;&nbsp; (command "_chprop" (entlast) "" "la" f5 "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;新线的图层<br/>)<br/>&nbsp;</p>

ZZXXQQ 发表于 2007-12-5 23:47:00

LT写成it了。有时用大写字母有优势,可以看出是否写错了。

(defun c:lpsp ()
(setq ss (car(entsel "\n请选择曲线、多段线: ")))
(setq endata (entget ss))               ;取出对象(多段线)ssn的信息列表赋于endata
(setq s0 (cdr (assoc 0 endata)))      ;取得原实体线型名称
(entdel ss)                           ;删除要修改的线
(if (= s0 "LWPOLYLINE") (progn          ;如果是多段线
(setq kd 10)                        ;判断坐标的参数为10
(setq ff (= (cdr (assoc 70 endata)) 1))
(command "_spline")               ;启动画曲线命令
))
(if (= s0 "SPLINE") (progn            ;如果是曲线
(setq kd 11)                        ;判断坐标的参数为11
(setq ff (= (cdr (assoc 70 endata)) 1))
(command "_pline")                  ;启动画多段线命令
))
(setq n 0 ptn '())
(repeat (length endata)
(setq pt (nth n endata))          ;依次取得信息列表的子表
(setq x (car pt))               
(if (= x kd) (command (cdr pt)));判断是否是坐标点,是就画线
(setq n (+ n 1))
)
(if (= s0 "LWPOLYLINE") (command (if ff "c" "") "" ""))   ;多段线画线结束
(if (= s0 "SPLINE") (command (if ff "c" "")))             ;曲线画线结束
(setq f1 (cdr (assoc 62 endata)))    ;取得ss的颜色
(setq f2 (cdr (assoc 6 endata)))   ;取得ss的线型
(setq f3 (cdr (assoc 48 endata)))    ;取得ss的线型比例
(setq f4 (cdr (assoc 370 endata)))   ;取得ss的线宽
(setq f5 (cdr (assoc 8 endata)))   ;取得ss的图层
(command "_chprop" "L" "" "C" f1)          ;新线的颜色
(command "_chprop" "L" "" "LT" f2)         ;新线的线型
(command "_chprop" "L" "" "S" f3)          ;新线的线型比例
(command "_chprop" "L" "" "LW" f4)         ;新线的线宽
(command "_chprop" "L" "" "LA" f5 "")         ;新线的图层
(princ)
)

lht 发表于 2007-12-6 11:48:00

谢谢楼上朋友的细心,我总以为是什么大问题,谁知问题出在细节上。

zhuangxu_521 发表于 2011-10-27 14:19:47

东西不错。很实用
页: [1]
查看完整版本: [求助]请帮修改自编的多段线与曲线相互转换程序(lisp)