列出并提示AutoLISP中的特定对象实体

时间:2018-09-18 08:36:16

标签: autocad-plugin autolisp

我正在为这个错误而苦苦挣扎,我是AutoLISP的新手。

错误消息: 错误的参数类型:stringp(142。3000.0)

当前的唯一目标是提示选定的特定对象实体。

我的代码如下:

(defun c:getObjectLenght()
    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))
    (setq c (assoc 142 b))
    (prompt (strcat "\nThe value of 142 is: " c))
(princ)
)

我尝试了很多不同的解决方案并在网上搜索,但没有找到想要的结果。所以我希望有人能为我指出正确的方向。

提前。 :)

2 个答案:

答案 0 :(得分:2)

strcat需要字符串,但是(assoc 142 b)返回列表(142 . 3000.0),因此您需要将列表转换为字符串。取决于实体您选择的值和类型应使用rtositoavl-princ-to-string

我想您需要的是

(strcat "\nThe value of 142 is: " (vl-princ-to-string (cdr(assoc 42 b ) ) ))

答案 1 :(得分:1)

据我所知,assoc函数的用途是在关联列表中查找键值,这就像字典搜索一样,您需要提供键来搜索特定值,然后再检查here
并应用assoc函数后,其输出为列表格式,请参见以下示例。

(assoc  8 (entget (car (entsel)) ))

选择实体输出后 (8 . "0")
这是您案例名称中所选实体的层名称可能不同

再检查一个例子

(assoc  10 (entget (car (entsel)) ))

选择实体后,输出为 (10 3.25 5.5 0.0)
输出值是所选实体的插入坐标。

请注意,Strcat功能仅使用 字符串检查更多here

在第5行的函数中,您尝试使用列表连接字符串,说明发生错误的原因。

正如您提到的错误,我认为您需要加入值3000.0.

为此,您可以如下更改功能。

(defun c:getObjectLenght()
    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))
    (setq c  (if (assoc 142 b)  (rtos (cdr (assoc 142 b)))  "Not Found" ) )
    ;Note that rtos function use to convert decimal value into sting.
    ; And if condition use in case entity not contain Key value 142 so to avoid error.
    (prompt (strcat "\nThe value of 142 is: " c))
(princ)
)

我从没碰到过DXF代码assoc 142,我在google上搜索了它,但没有发现太多。