![]() |
老顾,帮我看一下
老顾,帮我看一下
www.dimcax.com 老顾,帮我看一下 老顾,我有个合并起来的程序不能同时运行,请帮我看一下: (defun c:xxl () (setvar "osmode" 0) (setvar "filedia" 1) (setq qqqq (ssget)) (setq n 0) (while (setq entt (ssname qqqq n)) ;根据索引值获取当中的对象名称 (setq enttabt (entget entt) ;根据对像名称获取属性信息 enttabtt (cdr (assoc 0 enttabt)) n (1+ n) ) (cond ((= enttabtt "line") (line_line)) ((= enttabtt "circle") (cir_cir)) ) ) ) 勤能补拙 是不是多大家看都烦了???不过我也做了点注解啊!哈哈 现在的问题是当同时选择圆和线的时候,程序只对线做处理,所以我怀疑是不是设置哪里有问题。前辈们给个解决方法啊,注意两个子程序已调试过没问题的了。 勤能补拙 再顶一下,当所选图形同时有line和circle时,还是只能处理直线,不能同时处理圆圈 勤能补拙 [here is the result command: (load "v:/xianliu.lsp") <<直线打桥位> 洪少开发实验室 <<圆圈打桥位> 洪少开发实验室 command: xxl select objects: specify opposite corner: 10 found select objects: 修改标准桥位个数(yes/no)?<no> 请指定桥位的宽度<5.0>: select objects: specify opposite corner: 10 found select objects: 1 15.9289 36.8577 (20.0 -15.0 0.0) 1.75614 5.0 (17.0645 0.656027 0.0) (16.1431 5.57039 0.0) break select object: specify first break point: specify second break point: command: -layer current layer: "0" enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: n enter name list for new layer(s): bridge enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: s enter layer name to make current or <select object>: bridge enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: c new color [truecolor/colorbook] : blue enter name list of layer(s) for color 5 (blue) <bridge>: enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: command: xxl unknown command "xxl". press f1 for help. command: 1 17.5 40.0 (-20.0 -15.0 0.0) 0.0 5.0 (-2.5 -15.0 0.0) (2.5 -15.0 0.0) break select object: specify first break point: specify second break point: command: -layer current layer: "bridge" enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: n enter name list for new layer(s): bridge layer "bridge" already exists. enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: s enter layer name to make current or <select object>: bridge enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: c new color [truecolor/colorbook] : blue enter name list of layer(s) for color 5 (blue) <bridge>: enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: command: xxl unknown command "xxl". press f1 for help. command: 1 22.0718 49.1436 (13.2075 21.2264 0.0) 3.97044 5.0 (-1.70691 4.95609 0.0) (-5.08554 1.27032 0.0) break select object: specify first break point: specify second break point: command: -layer current layer: "bridge" enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: n enter name list for new layer(s): bridge layer "bridge" already exists. enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: s enter layer name to make current or <select object>: bridge enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: c new color [truecolor/colorbook] : blue enter name list of layer(s) for color 5 (blue) <bridge>: enter an option [?/make/set/new/on/off/color/ltype/lweight/plot/freeze/thaw/lock/unlock/state]: command: xxl unknown command "xxl". press f1 for help. ==================================================== 类似吗? 图片: 把你的程序改了一下: 它选择一次后全部可自动进行,可给出不同的宽度, (if (not (tblsearch "layer" "bridge")) (command "-layer" "n" "bridge" "c" "blue" "bridge" "")) (defun c:xxl() (setvar "osmode" 0) (setvar "filedia" 1) (setq p1 (getpoint "选择打断第一点"))(setq p2 (getpoint p1 "选择打断第二点")) (setq pci "line" pci1 "circle") (setq ssa (ssget "w" p1 p2 (list (cons 0 pci))) ssb (ssget "w" p1 p2 (list (cons 0 pci1)))) (if (/= ssa nil) (progn (setq n 0) (repeat (sslength ssa) (line_line) (setq n (+ n 1)) ) ) (if (/= ssb nil) (progn (setq n 0) (repeat (sslength ssb) (cir_cir) (setq n (+ n 1)) ) ))) ) (defun line_line(/ chnumber width entse enttab stpt edpt dist ang x p1 ) ;;;当属性为line时,执行此子程序 (setq chnumber (getstring "\n 修改标准桥位个数(yes/no)?<no>")) ;指定桥位个数 (if (/= chnumber "y") (setq chnumber "n") ;当chnumber不为"y"时,为默认"n" ) (setq width (getreal "\n 请指定桥位的宽度<5.0>:")) ;指定桥位宽度 (if (= width nil) (setq width 5.0) ;当为nil时,默认为5 ) (setq entse (ssname ssa n)) ;选择创建选择集 (if (= entse nil)() (progn (setq enttab (entget entse)) ;根据对象名称获取属性信息 (setq stpt (cdr (assoc 10 enttab)) ) ;获取直线的起始点坐标 (setq edpt (cdr (assoc 11 enttab)) ) ;获取直线的终点坐标 (setq dist (distance stpt edpt)) ;获取该直线的长度 (setq ang (angle stpt edpt)) ;获取该直线的角度 (if (= "n" chnumber) ;当桥位个数为默认"n"时,执行 (cond ((< dist 20) (setq x 0)) ;当直线长度小于20时,x为0 ((< dist 80) (setq x 1)) ;当直线长度小于80时,x为1 ((< dist 180) (setq x 2)) ;当直线长度小于180时,x为2 ((< dist 250) (setq x 3)) ;当直线长度小于250时,x为3 ((> dist 250) (setq x (fix (/ dist 80.)))) ;当直线长度大于250时,x为长度除以80的整数值 ) (progn ;当表达式(= "n" chnumber)不成立时执行 (prompt (strcat "**length of selected line is " (itoa (fix dist)) "\n" )) ;命令行出现提示所选择的直线长度 (setq x (getint "\n 请输入桥位的个数:")) ;指定桥位的个数 )) (setq bgdist (/ (- dist (* width x)) (+ x 1.0))) ;求出直线打桥位后每一小段的距离 (repeat x ;循环x次(command处理) (setq p1 (polar stpt ang (/ bgdist 2)) ftpt (polar stpt ang bgdist)) ; (setq sdpt (polar ftpt ang width)) (command "break" p1 "f" ftpt sdpt ) (setq stpt sdpt) ) )) ) (defun cir_cir(/ cen rad a b c jd x sjd i pt1 pt2 pt3 pt4 ) (setvar "osmode" 0) (setvar "filedia" 1) (setq cen nil rad nil en nil len (getreal "\n 请输入断开的宽度<5>:")) (if (= len nil) (setq len 5)) (setq en (entget (ssname ssb n))) (setq cen (cdr (assoc 10 en))) (setq rad (cdr (assoc 40 en))) (setq a (* rad rad) b (/ len 2.0) c (sqrt (- a b)) jd (atan (/ b c))) (if (< rad 30)(setq x 1)(if (< rad 60)(setq x 2)(if (< rad 90)(setq x 3)(if (> rad 90)(setq x (fix (/ rad 30))))))) (setq sjd (/ 360 x)) (setq pt1 (polar cen (- 0 jd) rad) pt2 (polar cen (+ 0 jd) rad) i 1) (command "break" pt1 pt2) (repeat (- x 1) (setq pt3 (polar cen (- (* (/ pi 180) (* sjd i)) jd) rad) pt4 (polar cen (+ (* (/ pi 180) (* sjd i)) jd) rad) ) (command "zoom" "c" pt3 (* len 4) "break" pt3 pt4 "zoom" "p") (setq i (+ 1 i)) (prompt (rtos i 2 0)) ) ) gbg andyes,你写的那个程序是vb吗?我可一点都看不懂。。。 勤能补拙 老顾,好像还是不行吧,反正我操作的时候不是我想要的那种:比如图上有两个圆跟两条直线,执行程序命令后,选择所需打断的图形(选择两个圆及直线),程序自动判断圆的执行程序的子程序cir_cir,直线的执行程序的子程序line_line。也就是在我发程序基础修改合并起来,我的程序是只能单选直线或圆才执行,如果全选也是只执行线的那部份,请劳烦再看一看。拜托了! 勤能补拙 图片: 按你的想法又把程序改了一下:见下, 它是你用鼠标你去一个一个的选择,后它去给你打断,可分别给出宽度. (if (not (tblsearch "layer" "bridge")) (command "-layer" "n" "bridge" "c" "blue" "bridge" "")) (defun c:xxl() (setvar "osmode" 0) (setvar "filedia" 1) (setq ss (ssget ) nn (sslength ss) i 0) (repeat nn (setq en1 (ssname ss i) en (entget en1) ssa (cdr (assoc 0 en))) (if (= ssa "line") (line_line) (if (= ssa "circle") (cir_cir) )) (setq i (+ i 1)) ) ) (defun line_line(/ chnumber width entse enttab stpt edpt dist ang x p1 ) ;;;当属性为line时,执行此子程序 (setq chnumber (getstring "\n 修改标准桥位个数(yes/no)?<no>")) ;指定桥位个数 (if (/= chnumber "y") (setq chnumber "n") ;当chnumber不为"y"时,为默认"n" ) (setq width (getreal "\n 请指定桥位的宽度<5.0>:")) ;指定桥位宽度 (if (= width nil) (setq width 5.0) ;当为nil时,默认为5 ) (if (= en nil)() (progn (setq stpt (cdr (assoc 10 en)) ) ;获取直线的起始点坐标 (setq edpt (cdr (assoc 11 en)) ) ;获取直线的终点坐标 (setq dist (distance stpt edpt)) ;获取该直线的长度 (setq ang (angle stpt edpt)) ;获取该直线的角度 (if (= "n" chnumber) ;当桥位个数为默认"n"时,执行 (cond ((< dist 20) (setq x 0)) ;当直线长度小于20时,x为0 ((< dist 80) (setq x 1)) ;当直线长度小于80时,x为1 ((< dist 180) (setq x 2)) ;当直线长度小于180时,x为2 ((< dist 250) (setq x 3)) ;当直线长度小于250时,x为3 ((> dist 250) (setq x (fix (/ dist 80.)))) ;当直线长度大于250时,x为长度除以80的整数值 ) (progn ;当表达式(= "n" chnumber)不成立时执行 (prompt (strcat "**length of selected line is " (itoa (fix dist)) "\n" )) ;命令行出现提示所选择的直线长度 (setq x (getint "\n 请输入桥位的个数:")) ;指定桥位的个数 )) (setq bgdist (/ (- dist (* width x)) (+ x 1.0))) ;求出直线打桥位后每一小段的距离 (repeat x ;循环x次(command处理) (setq p1 (polar stpt ang (/ bgdist 2)) ftpt (polar stpt ang bgdist)) ; (setq sdpt (polar ftpt ang width)) (command "break" p1 "f" ftpt sdpt ) (setq stpt sdpt) ) )) ) (defun cir_cir(/ cen rad a b c jd x sjd i pt1 pt2 pt3 pt4 ) (setvar "osmode" 0) (setvar "filedia" 1) (setq cen nil rad nil len (getreal "\n 请输入断开的宽度<5>:")) (if (= len nil) (setq len 5)) (setq cen (cdr (assoc 10 en))) (setq rad (cdr (assoc 40 en))) (setq a (* rad rad) b (/ len 2.0) c (sqrt (- a b)) jd (atan (/ b c))) (if (< rad 30)(setq x 1)(if (< rad 60)(setq x 2)(if (< rad 90)(setq x 3)(if (> rad 90)(setq x (fix (/ rad 30))))))) (setq sjd (/ 360 x)) (setq pt1 (polar cen (- 0 jd) rad) pt2 (polar cen (+ 0 jd) rad) i 1) (command "break" pt1 pt2) (repeat (- x 1) (setq pt3 (polar cen (- (* (/ pi 180) (* sjd i)) jd) rad) pt4 (polar cen (+ (* (/ pi 180) (* sjd i)) jd) rad) ) (command "zoom" "c" pt3 (* len 4) "break" pt3 pt4 "zoom" "p") (setq i (+ 1 i)) (prompt (rtos i 2 0)) ) ) gbg 顾老师 太佩服你了 不是我本意.............................................. 勤能补拙 樓主..初步看了下,應該是你的分類執行中的循環有問題..這裡應該不用再用repeat循環函數了吧~ 欢迎大家跟我交流lisp相关问题 |
所有的时间均为北京时间。 现在的时间是 07:24 AM. |