- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一次提问,所以希望我能很好地描述这个问题。
我们公司有一个 Autolisp 代码,几个人使用相同版本的 AutoCAD,但对于某些用户,lisp 已停止正常运行。
lisp的功能如下:
(defun c:pointnumber()
(setvar "ATTDIA" 0)
(setq sc (getreal "\nEnter scale: "))
(setq px (getstring "\nSet prefix for point number: "))
(setq nr (getint "\nThe number for the first point: "))
(setq ic (getint "\nIncrement of the number: "))
(setq point 1)
(while (/= point nil)
(setq point (getpoint "\nChoose a point: "))
(if (/= point nil)
(progn
(setq inr (itoa nr))
(if (< nr 100) (setq md "0"))
(if (< nr 10) (setq md "00"))
(if (> nr 99) (setq md ""))
(setq ph (strcat px md inr))
(command "insert" "pointnumber" point sc sc 0 ph)
(setq nr (+ nr ic))
)
)
)
(setvar "ATTDIA" 1)(princ)
)
最佳答案
您当前的代码存在许多问题:其中一些可能仅仅被认为是不好的做法,如果用户使用无效数据进行响应,一些将导致程序失败,而另一些将导致程序失败或出现意外行为,具体取决于执行程序的 AutoCAD 环境的设置。
1. 攻击
您所描述的行为的罪魁祸首可能是 ATTREQ
系统变量,它确定用户是否会收到作为 INSERT
一部分的属性值提示。命令。如 ATTREQ=0
当程序运行时,块将插入其默认属性值。
您可以通过存储此系统变量的当前值并将其设置为 1
来确保环境之间的行为一致。在调用 INSERT
之前命令(确保发出属性提示),然后在命令之后或程序结束时恢复原始值。
例如:
(defun c:test ( / atr )
(setq atr (getvar 'attreq))
(setvar 'attreq 1)
;; ... Do your thing
(setvar 'attreq atr)
(princ)
)
2. 操作系统模式
"_non"
或
"_none"
对象捕捉修改器以指示 AutoCAD 忽略后续点输入的所有对象捕捉模式,例如:
(command "insert" "pointnumber" "_non" point sc sc 0 ph)
3. 用户输入
if
轻松实现。声明或
initget
功能,例如:
(initget 7) ;; Prevents Enter, zero, or negative numbers
(setq sc (getreal "\nEnter scale: "))
或者:
(initget 6)
(if
(and
(setq sc (getreal "\nEnter scale: "))
(setq px (getstring "\nSet prefix for point number: "))
(setq nr (getint "\nThe number for the first point: "))
(setq ic (getint "\nIncrement of the number: "))
)
;; ... Do your thing
)
或者,您可以使用我在
Prompting with a Default Option 的教程中描述的方法之一,为每个提示配置默认值。 , 例如:
(setq sc (cond ((getreal "\nSpecify scale <1.0>: ")) (1.0)))
4. 局部变量与全局变量
(defun c:pointnumber ( / ic inr md nr ph point px sc ) ;; Local variables
;; ...
)
5. 检查块存在
INSERT
命令假定该块的定义已存在于事件图形中,或者具有该文件名的图形存在于工作目录或 AutoCAD 支持文件搜索路径中 - 如果两个条件都不满足,
INSERT
命令在程序执行过程中会出错。
(if
(or
(tblsearch "block" "pointnumber") ;; Checks for existing definition
(findfile "pointnumber.dwg") ;; Checks for drawing file
)
;; ...
)
您也可以使用
cond
函数代替
if/else
的序列表达式。
ATTDIA
系统变量。
;; Define function, declare local variables
(defun c:pointnumber ( / *error* bn ic nr ns pt px sc vl vr )
;; Define local error function to reset system variables on error
(defun *error* ( msg )
(mapcar 'setvar vr vl) ;; Reset list of system variables
(if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
(princ (strcat "\nError: " msg))
) ;; end if
(princ)
) ;; end defun
;; Define block name
(setq bn "pointnumber")
(if (or (tblsearch "block" bn) ;; Definition in drawing
(findfile (strcat bn ".dwg")) ;; Drawing file in support path
) ;; end or
(progn
(initget 6) ;; Prevents 0 & negatives
(setq sc (cond ((getreal "\nSpecify scale <1.0>: ")) (1.0))
px (getstring "\nSpecify prefix <none>: ")
) ;; end setq
(initget 4) ;; Prevents negatives
(setq nr (cond ((getint "\nSpecify starting number <1>: ")) (1)))
(initget 6) ;; Prevents 0 & negatives
(setq ic (cond ((getint "\nSpecify increment <1>: ")) (1)))
(setq vr '(attreq attdia cmdecho) ;; List of system variables
vl (mapcar 'getvar vr) ;; Store current values
) ;; end setq
(mapcar 'setvar vr '(1 0 0)) ;; Set system variables appropriately
(while (setq pt (getpoint "\nSpecify point <exit>: "))
(setq ns (itoa nr)
nr (+ nr ic)
)
(repeat (- 3 (strlen ns)) (setq ns (strcat "0" ns))) ;; Pad to 3 digits
(command "_.-insert" bn "_S" sc "_R" "0" "_non" pt (strcat px ns))
) ;; end while
(mapcar 'setvar vr vl) ;; Reset list of system variables to their original values
) ;; end progn
;; Else the block was not defined/found
(princ (strcat "\nThe block \"" bn "\" is not defined in the active drawing and cannot be found."))
) ;; end if
(princ) ;; Suppress the value returned by the last evaluated expression
) ;; end defun
还有其他可能的改进也可以实现,例如:
INSERT
消除对标准 AutoCAD 命令(在本例中为 insertblock
命令)调用的依赖方法或 entmake
/entmakex
将 DXF 数据直接写入绘图数据库的函数。BATTMAN
命令在每个图形的基础上进行修改)。关于attributes - Autolisp 没有为某些用户正确设置 block 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65489757/
您可以在 AutoCAD 知识网站上阅读此内容: "注意:您可以定义多个具有相同名称的用户函数,但每个定义接受不同数量或类型的参数。" 有人用过这个功能吗?我试过了,但根本不起作用。我只能调用最新定义
;;----------------=={ Add Objects to Block }==----------------;; ;;
我一直在寻找一种有效的方法来删除点列表中的连续重复项。 我最初的想法是遍历列表的元素,与第 (n-1) 个元素进行比较,如果相等则将其删除。但是,删除列表中的元素并使用另一个函数会使其效率低下并非易事
选择一个点时,就有一种方法可以过滤OSNAP,只能捕捉特定实体类型,而不是其他类型的实体。例如 仅对齐线。 setq startpt (*SNAP FILTER CODE* "LINE" (getpo
在指定条件下,我想打印此函数中的函数名称。但我不知道如何得到它。在 C++ 中,我可以使用预处理器宏 __FUNCTION__。我在 AutoLISP 中有类似的东西吗? 最佳答案 这绝对是可能的。我
我想从存储在绘图表或表对象中的信息的比较中提取某些信息,如您更喜欢这样调用它,如果比较成功,则将相关值存储到变量中。我是 Visual lisp 或 Auto Lisp 的新手。所以请你帮我解决这个问
下面我粘贴了我的 drawmycoil.lsp 文件中的代码。 (defun drwcoil () (setq helices_center '(0 0)) ; this is the cente
我无法访问存储在列表 STPT1 和 ENDPT1 中的信息,它们是 x(0),y (1) 和 z(2) 坐标。 例如,在得到一个点后:(45.4529 21.6384 0.0) 当我使用 Visua
第一次提问,所以希望我能很好地描述这个问题。 我们公司有一个 Autolisp 代码,几个人使用相同版本的 AutoCAD,但对于某些用户,lisp 已停止正常运行。 lisp的功能如下: 用户运行
我想对多个 CAD 文件(例如文件夹中的所有文件)运行 autoLISP。基本上,打开文件 (DWG),运行 LISP(包括保存文件)并关闭。我是 LISP 的新手,但对 Python 不太陌生。 是
(defun gml2dwg (odabir) ;; RANDOM CODE ;; ;; This is the part where I should open a filepath
我正在尝试构建一个非常基本的 AutoLisp 界面。我在这方面完全是个初学者,所以在从头开始编写代码失败后,我转向正确地学习 DCL。我遵循了本教程: http://www.afralisp.net
我正在尝试插入具有自定义属性的 block 。如何设置这些变量? 落叶树 block 中有一个名为“可见性”的自定义属性,具有各种不同的样式(可见性 1、可见性 2、可见性 3 等)。 例如,我将如何
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
我已经在 autolisp 中创建了我的整个应用程序,好吧,是时候编译和保护我的代码了......,在 autolisp 中,要使用 DCL,你只需要加载它们,使用: (setq sample (lo
我正在为 IntelliCAD 联盟的成员开发一个基于 LISP 的架构包。根据我在网站上找到的建议,我使用 Kelvinator 对一些代码进行格式化和伪装。现在我正在尝试使用 Protect.ex
我们为使用 AutoCAD 的客户构建了一个网络服务。他们有一个在 AutoCAD 中运行的宏,用于构建 SOAP 请求。但是他们还没有想出如何实际发送() SOAP 请求给我们。 所以 XML 已经
不确定是否有人可以提供帮助。我正在使用一种名为 AutoLISP 的语言进行编程......基于 LISP,但有一些额外功能。它在名为 AutoCAD 的程序中使用。 无论如何,我有一些代码可以从网络
我正在做一个 AutoLisp 项目,它使用长关联结构来进行繁重的几何处理 - 所以我很好奇关联列表密集使用计时结果。实现有多简单/复杂?它使用某种数据结构或普通的点对列表?b-tree 或其他东西有
我想知道任何人都可以解释 autolisp/visual lisp 的以下功能背后的设计原理吗?在我看来,它们似乎与公认的软件实践背道而驰……我是不是漏掉了什么? 默认情况下所有变量都是全局变量(即除
我是一名优秀的程序员,十分优秀!