几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(AutoLISP)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-04-27, 11:53 AM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 老顾,帮我看一下

老顾,帮我看一下
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相关问题
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 02:35 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多