我正在为这个错误而苦苦挣扎,我是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)
)
我尝试了很多不同的解决方案并在网上搜索,但没有找到想要的结果。所以我希望有人能为我指出正确的方向。
提前。 :)
答案 0 :(得分:2)
strcat
需要字符串,但是(assoc 142 b)
返回列表(142 . 3000.0)
,因此您需要将列表转换为字符串。取决于实体您选择的值和类型应使用rtos
,itoa
或vl-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上搜索了它,但没有发现太多。