Autolisp例程仅在某些情况下有效

时间:2019-08-13 14:54:02

标签: autocad autolisp

我不得不更改Autocad中几个块的文本样式和宽度属性。每dwg上有10到30 dg的块,将近100 dg,我不介意手动将每个块转换为新标准。

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/attribute-width-change/td-p/1525357 该链接具有一个脚本,可以将所有块(标题块和几个电子符号)的宽度都更改为1,并且作为第一步,它可以完成我想要的操作(由于bad ; error: bad argument type: lentityp nil Command:而失败,将其更改为手动选择并仅选择我要修复的块)。但是,我还需要将测试样式从“标准”更改为“标准” https://www.afralisp.net/reference/dxf-group-codes.php 检查此链接后,我发现“文本样式名称”为代码dxf 7 所以我将脚本更改为以下内容。

(defun C:StandardFromDWGTEXT (/ ss sslen cnt blck ent entinfo)
  (setq ss (ssget))
  (setq cnt 0)
  (setq sslen (sslength ss))
  (while (< cnt sslen)
    (setq blck (ssname ss cnt))
    (setq ent (entnext blck))
    (setq entinfo (entget ent))
    (while
      (and ent (= (cdr (assoc 0 entinfo)) "ATTRIB"))
       (entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))
;;;    (entupd ent)
;;;    (setq ent (entnext ent))
;;;    (setq entinfo (entget ent))    
       (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))
       (entupd ent)
       (setq ent (entnext ent))
       (setq entinfo (entget ent))      
    )
    (setq cnt (1+ cnt))
  )
  (princ)
)

现在,它仅适用于我注释掉的行(停止使用它们,但这也意味着它仅更改文本样式,而不更改宽度),并且仅更改一半的文本样式。我设法通过任意重新加载auto-cad来遍历所有文件,有时在它不起作用时(不起作用,这意味着我希望它没有任何变化)在可视化的lisp编辑器中打开脚本,然后单击load active window对其进行了修复。我把它放在我旁边,但是出于学习的目的,因为我已经不得不两次更改标准,所以我很有可能不得不再次做一次,我想尝试并解决这个问题。

考虑将脚本的宽度更改为1可以100%的时间来解决问题,我认为问题不在于将其添加到启动套件/在可视化的Lisp编辑器中打开它,而在于我对代码的添加本身。但是我添加的更改文字样式的行 (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))与更改文本宽度的行似乎没有什么不同。

如果有人有任何见解,我将不胜感激。我有其他编程语言的经验,但是对于Autolisp / lisp来说是一个新手。

2 个答案:

答案 0 :(得分:2)

有一些问题可能会破坏您的代码:

  • (setq ss (ssget))

    如果没有过滤器列表参数仅允许归因于块,则您的选择可以包括 any 实体类型,这意味着{{ 1}}调用将为所有没有子实体的对象返回entnext。因此,这将导致nil调用返回您所看到的以下错误:

      

    错误:错误的参数类型:lentityp nil

    解决方案是包括一个过滤器列表,仅允许选择属性块:

    entget

    (setq ss (ssget "_:L" '((0 . "INSERT") (66 . 1)))) 模式字符串还排除锁定层上的实体。

  • _:L

    如果不测试有效选择,变量(setq sslen (sslength ss))可能是ss,这将导致nil返回错误:

      

    错误:错误的参数类型:lselsetp nil

  • (sslength ss)
    (entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))

    在这里,第二个(entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))表达式代替了 原始 DXF数据列表中的DXF组7替换DXF组41之后已修改的DXF数据。将得到逆转对宽度因子的修改的结果。


针对上述问题实施修复(并进行一些其他调整)可能会产生以下代码:

subst

答案 1 :(得分:0)

错误

  

不好;错误:错误的参数类型:lentityp nil

是将空变量用于实体的结果。

使用(setq ent (entnext blck))时,应检查输入是否为空。

(setq ent (entnext blck))
    (if ent
      (progn
        (setq entinfo (entget ent))

在对AutoLisp进行故障排除时,您看到lentityp或stringp = nil,则将您正在使用的变量设置为nil,并且您需要查找位置和原因。