LISP-自动标签编号系统
大家好,我是这个论坛的新手,LISP。
但我正在实习,我的老板想让我在写代码的时候学到更多?
这就是我做的:
这是一个自动编号系统,有一个领导者,但我想它相当不稳定?大多数情况下,它是有效的,但通常只有第二次。第一次键入posnumber时,它会重复appload?
(defun c:POSNumbering ( )
(princ "\nAutolabel - Dutch Offshore Innovators - Clint de Bruijn")
(setq NN (getint "\nStarting Number:") )
(setq number (itoa NN))
(while
(setq p1 (getpoint "\nPick a POINT on the screen:") )
(setq p1x (car p1))
(setq p1y (cadr p1))
(setq b (car p1))
(setq c (cadr p1))
(princ b)
(princ ",")
(princ c)
(setq p2 (getpoint "\nPick a POINT on the screen:") )
(setq p2x (car p2))
(setq p2y (cadr p2))
(princ b)
(princ ",")
(princ c)
(command "leader" p1 p2 "" "" "N")
(setq p3 (list (+ p2x 500) (+ p2y 400)))
(setq p4 (list (+ p2x 500) (+ p2y -400)))
(setq p5 (list (+ p2x -500) (+ p2y 400)))
(setq p6 (list (+ p2x -500) (+ p2y -400)))
(if (and (>= p2x p1x) (>= p2y p1y)) (command "rectangle" p2 p3))
(if (and (> p2x p1x) (< p2y p1y)) (command "rectangle" p2 p4))
(if (and (< p2x p1x) (> p2y p1y)) (command "rectangle" p2 p5))
(if (and (<= p2x p1x) (<= p2y p1y)) (command "rectangle" p2 p6))
(setq p7 (list (+ p2x 250) (+ p2y 200)))
(setq p8 (list (+ p2x 250) (+ p2y -200)))
(setq p9 (list (+ p2x -250) (+ p2y 200)))
(setq p10 (list (+ p2x -250) (+ p2y -200)))
(if (and (>= p2x p1x) (>= p2y p1y)) (command "Text" "Middle" p7 "200" "0" number ""))
(if (and (> p2x p1x) (< p2y p1y)) (command "Text" "Middle" p8 "200" "0" number ""))
(if (and (< p2x p1x) (> p2y p1y)) (command "Text" "Middle" p9 "200" "0" number ""))
(if (and (<= p2x p1x) (<= p2y p1y)) (command "Text" "Middle" p10 "200" "0" number ""))
(setq number (itoa (setq NN (+ NN 1))))
)
)
代码标记(您可以修改帖子-只需单击编辑帖子)。。。
现在谈谈你的问题。。。
您可以将当前的osmode设置(OSNAP)保存在一些随机(setq)变量中。。。(setq osm(getvar‘osmode))
然后,您可以将“osmode(OSNAP)variable Previor calculations”设置为0-关闭OSNAP。。。(setvar“osmode 0)
在计算(例程)结束时,您可以将保存的“osmode”设置恢复到其以前的状态。。。(setvar‘osmode osm)
本地化所有使用的变量p1、p2,。。。包括现在提出的用于OSNAP的osm。。。(defun c:yourcommandfunction(/var1 var2…varn)
在例程类型(princ)的末尾,静默退出以避免在命令提示下返回nil。。。
如果您希望不必在“osmode”中使用此技巧,但强烈建议您在每个命令调用中提供的每个点参数之前指定“\u non”字符串,如(命令“矩形”p1 p2),以便正确的行应如(命令“\u.rectangle”“\u non”p1“\u non”p2)。。。尝试在所有命令前加上“_”标志,以避免不同版本的AutoCAD软件之间的语言障碍“_”标志;和“”用于调用命令的内置版本的签名。。。
作为开场白,这一切从我现在开始。。。
M、 R。 这是一个很好的代码,第一次这样做。似乎需要注意:1)确保本地化变量,2)确保添加错误捕获。Lee Mac有一个很棒的自动标记LISP例程,它也使用reactor,所以如果你想找一个例子,请点击这里http://lee-mac.com/autolabelattributes.html. 你好
创建带有框架的MleaderStyle,如以下视频所示,代码与您的代码相比只需几行
请参阅此链接中的视频:http://store1.up-00.com/2016-03/145874939933891.gif
Your code here... 再深入一点,你可以检查所有MLeader并查看数字,比如他们是否在1层上,然后返回下一个要接受或忽略的数字。记住最后一个数字总是很难。发布dwg可能在复活节期间有一段时间。
此版本将检查最后一个数字,需要两个defuns 1表示不存在前导,第二个查找最后一个数字。它逐层检查引线,可以添加其他选项。同时下载getvals。getvals。lsp
(defun c:test (/ n p)
(princ "\nAutolabel - Dutch Offshore Innovators - Clint de Bruijn")
(if (setq n (getint "\nStarting Number:"))
(while (setq p (getpoint "\nFirst point:"))
(command "_.Mleader" "_non" p "_non" (getpoint "\nNext point:" p) (itoa n))
(setq n (1+ n))
)
)
(princ)
)
你好,M.R。
谢谢你的回复,代码现在已经正确发布了
对不起,你所说的对我来说就像中文,如果你已经花了7个小时来理解这个代码的编码原理。。
I'ts sounds lazy,but I learn more from complete codes as examples(I'ts听起来很懒,但我从完整的代码示例中了解了更多信息。。。
出于某种原因,'''''progeCAD不起作用?当您键入defun时,代码不会引导或崩溃。
谢谢你的帮助!
克林特·格里茨 尊敬的野马队:,
感谢您的回复!
你说的错误捕捉是什么意思?它是如何工作的?
我知道李的网站,他做了一些令人难以置信的好工作!但非常不幸的是,他的代码与progeCAD不兼容?他的自动文本引导正是我一直在寻找的地方
克林特·格里茨 亲爱的Tharwat,
此外,这段代码在progecad中不起作用,但我非常感谢您付出了如此多的努力来制作“视频”作为示例。
我认为progecad对我来说有两个问题?
1. ''_.'' 不起作用?
2.mleader不是progecad中的命令:l
谢谢您的回复!
克林特·格里茨 你好,比格尔,
当然,我可以发布一个dwg,但我不知道怎么做,我不明白它的意义?
就像这个线程上的其他东西一样,你的代码也不管用
我真的认为progecad对lsp格式非常敏感?
格里茨,
克林特 我知道其他一些CAD程序不支持DCL,这是getvals正在使用的。
Progecad使用Intellicad引擎,lisp和dcl工作,因此不确定为什么它不工作,需要一份Progecad副本进行测试。为了在Intellicad中工作,我们确实需要稍微修改一些代码。
试试看,不确定Intellicad是否支持将lisp直接复制到命令行Autocad是否会将(defun lastnum 1)后面的4行一次复制到命令行,您应该会看到一个响应ss行应该表示类似于选择集的内容
将此行中的x替换为0,然后1 2等,并粘贴到命令行
(setq num(atoi(cdr(assoc 304(entget(ssname ss(setq x(-x 1 107;)Ю)Ю)Ю))))
您应该再次看到mleader编号
粘贴这两行,dcl应该弹出。如果没有,您可能没有将lsp保存到progecad可以找到它的位置。
(如果(非AH:getval1)(加载“getvals”))
(AH:getval1“Next pt num is”6 4)
页:
[1]
2