自定义Autolisp代码
女士们先生们,您好,首先,我想向大家问好,我昨天刚刚报名。这将是我的第一条帖子,所以如果我发布的问题有点难以解释,我会提前道歉。
首先,我的问题是关于AutoLisp的。我从学校开始就没有机会使用Autolisp,现在我在一家新公司找到了一份工作,需要创建一些标准,目前我不熟悉使用Autolisp的编码。然而,我正在这个网站上学习教程,它很棒,但我需要的是一些非常具体的东西,该公司可以立即用于我们的项目。下面是我的问题,如果有人能帮忙,那就太好了。事先谢谢。
1) 我想知道如何创建AutoLisp,当我选择某些图层时,它可以显示线的总长度。例如,我们为分区和基础设施设计天然气管线。因此,当我单击一条设计好的输气管线(如我们的输气管线)时,该图层被称为New Main and New service,我们希望有一个Autolisp,可以计算我们创建的每个图形文件中这些图层上每条管线的总长度。
如果有人知道如何开始这样的事情,那就太棒了。甚至只是给我指出正确的方向都会有帮助。
再次感谢。 欢迎登机!
幸运的是,运行lisp例程教程中使用的示例与您要求的基本相同:
http://www.cadtutor.net/forum/showthread.php?1390-如何在此存档中使用LISP例程&highlight=zone。lsp
此外,论坛会搜索类似的帖子,并在页面底部显示结果
玩得开心-大卫
-大卫 看一看http://www.lee-mac.com他有一些很好的日常生活习惯。 非常感谢大家的帮助。这对我们很有帮助。 你好,大卫,
区域。你提供的lsp链接效果很好。但是,此lisp例程仅提供图形中多段线的总长度。我想问一下,您是否知道如何修改此例程,以获得不仅多段线,而且直线、圆、圆弧、样条曲线和椭圆的总距离?我还想去掉面积选项,现在让例行程序得到总长度。
你可以试试我的总长度和面积计划。 虽然可以这样做,但“面积”命令不支持直线和圆弧图元。它们必须独立计算。你想要的最终结果是什么-大卫
我要找的是修改分区。你提供给我的lsp。
(定义c:区域(/ss la rv i tv op en)
(while(非ss)
(原理“\n点击所需图层上的任何对象”)
(setq ss(ssget)))
(initget“长度区域”)
(setq rv(getkword“\n您想测量长度/:”)
(和(非rv)
(setq rv“区域”)
(setq la(cdr(assoc 8(entget(ssname ss 0)))
ss(ssget“X”(列表(cons 0“*多段线))
(cons 8 la)))
i(ss长度ss)
电视0
op 0)
(while(not(minusp(setq i(1-i)))
(setq en(ssname ss i))
(命令“.AREA”“\u E”en)
(cond(=rv“长度”)
(setq tv(+tv(getvar“Peripherine”)))
(T)
(setq tv(+tv(getvar“AREA”))
(如果(/=(logand(cdr(assoc 70(entget en)))1)1)
(setq op(1+op ЮЮ)Ю)
(princ(strcat“总”rv
“对于层”la
“=”(rtos tv 2)
“in”(itoa(sslength ss))“多段线\n”
(如果(/=rv“长度”)
(strcat(itoa op)“带开放多段线”)“”)
(prin1))
这是区域lisp的例程。然而,我想删除“面积”选项,只保留“长度”选项。还希望弹出一个警报框,给出总长度,而不仅仅显示在命令对话框中。我喜欢这个区域的原因。lsp是因为它提供了所选图层上所有多段线的总长度,这就是我们所寻找的。原因是,它为我们提供了所选图层上每条输气管线的总英尺数,并使我们在设计输气管线后更快地检查图形文件信息。但我也希望它不仅能检查多段线,还能添加直线、圆弧、椭圆和样条曲线,就像上面LEE MAC的总长例程一样。
对不起,如果我不是很彻底,但我是新的Lisp例程,我觉得我知道我想要自定义例程做什么,但没有很好地解释它。再次感谢您的回复。 也许 吧:
(defun c:tot-lay (/ en ss l el i ed tl ra sa ea ia al as)
(while (not en)
(and (setq ss (ssget))
(= (sslength ss) 1)
(setq en (ssname ss 0))))
(setq l (cdr (assoc 8 (entget en))))
(setq el '("ARC" "CIRCLE" "LINE" "LWPOLYLINE" "POLYLINE" "SPLINE" "ELLIPSE"))
(foreach e el
(princ (strcat "\nSearching " e "s on LAyer " l))
(set (read e) 0)
(and (setq ss (ssget "X" (list (cons 0 e)
(cons 8 l))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en))
(cond ((and (= e "POLYLINE")
(= (logand (cdr (assoc 70 ed)) 16) 16)))
((= e "LINE")
(set (read e) (+ (eval (read e))
(distance (cdr (assoc 10 ed))
(cdr (assoc 11 ed))))))
((= e "ARC")
(setq ra (cdr (assoc 40 ed))
sa (cdr (assoc 50 ed))
ea (cdr (assoc 51 ed))
ia (if (> sa ea)
(+ (- (* 2 pi) sa) ea)
(- ea sa))
al (* (* pi 2 ra)
(/ ia (* pi 2))))
(set (read e) (+ (eval (read e)) al)))
(T (command "_.AREA" "_E" en)
(set (read e) (+ (eval (read e))
(getvar "PERIMETER")))))
(setq i (1+ i)))))
(setq tl 0 as "")
(foreach e el
(setq as (strcat "\n" e " = " (rtos (eval (read e)) 2 4) as))
(setq tl (+ tl (eval (read e))))
(set (read e) nil))
(setq as (strcat "\nLAyer " l " Total = " (rtos tl 2 4) "\n" as))
(alert as)
(prin1))
未使用椭圆和样条进行测试
-大卫 嘿,大卫,这是正确的方向。非常感谢,因为现在我们有工作要做。我感谢你的帮助。这个网站太棒了。
页:
[1]
2