Lisp:尝试从对话框中获取信息并将其与其他字符串一起添加时出现“stringtype nil”错误

Lisp: `stringtype nil` error trying to get info from a dialogue box and add it with other strings

该程序基本上是从点描述中获取信息,从文本项中获取文本并将文本项添加到点描述中。对话框允许用户 select 一些参数,比如它是用于地段、地段和区块,还是其他。我已经为这个程序工作了好几天了,它非常接近工作。我可以毫无问题地通过对话框,并且我可以用一些树获得预期的效果(那些树只是从点和文本项中获取信息并将它们像很多一样加在一起)。当我要求用户输入一个数字(在这种情况下它是一个块号即块 1)时出现问题.现在我认为这可能是由于试图添加一个包含 space " " 的字符串,或者对话框中的输入可能不是字符串

这是我引用的 strcat 函数: (vlax-put-property p_obj 'rawdescription (strcat p_desc " BLOCK " type1 " " obj))

这是从框中获取信息的程序:

(action_tile "type1" "(setq type1 $value)")

下面是相关的代码片段,不是整个程序

这里是组合函数

(defun c:txcm_block ( / c_doc p_desc p_obj t_obj t1 t_strg text1 ts obj type1 number)
(vl-load-com)
(while
(setq c_doc (vla-get-ActiveDocument (vlax-get-acad-object))
        p_obj (vlax-ename->vla-object (car (entsel "\nSelect Point: ")))
        t_strg (vlax-ename->vla-object (car (entsel "\nPick Text.. "))))
  (setq obj (vla-get-textstring t_strg))
          (setq p_desc(vlax-get p_obj 'rawdescription))
          (vlax-put-property p_obj 'rawdescription (strcat p_desc " BLOCK " type1 " " obj))
)
(princ)
)

对话功能如下:

(defun c:nest2 ( / dcl_id2 number1 flag2)

(setq dcl_id2 (load_dialog "textcombine(input).dcl"))

(setq flag2 4)

(if (not (new_dialog "nest2" dcl_id2)) (exit))

(while (> flag2 2)

(set_tile "type1" "Enter Block Number")
(mode_tile "type1" 2)
(action_tile "type1" "(setq type1 $value)")

(action_tile
    "accept"
    "(done_dialog 4)"
)
(action_tile
    "cancel"
     "(done_dialog 0)
      (setq result nil)
      (c:txcm)"
)
(setq flag2 (start_dialog))


(if (= flag2 4)
 
    (progn   

    (setq result T)
    (c:txcm_block)

    )
)

)
(unload_dialog dcl_id2)
)

这里是嵌套的 DCL 代码:

nest2 : dialog {
       
 label = "Block Number";

    : edit_box
    {
    label = "Enter Block Number: ";
    mnemonic = "N";
    key = "type1";
    alighnment = centered;
    edit_limit = 30;
    edit_width = 30;
    }
    : button    
    {
    key = "accept";
    label = "Ok";
    is_default = true;
    fixed_width = true;
    alignment = right;
        allow_accept = true;
    }
    : button    
    {
    key = "cancel";
    label = "Go Back";
    fixed_width = true;
    alignment = centered;
    }

 
    : errtile
    {
    width = 17;
    }
         }

如有任何帮助,我们将不胜感激!我已经在互联网上到处都是,但我觉得我被困住了。如果您需要更多信息,请告诉我!

您确实在 (c:nest2) 中设置了变量 type1,并且确实从 (c:nest2) 调用了 (c:txcm_block),但是 (c:txcm_block) 声明了 type1 作为其局部变量,因此 type1 在进入 (c:txcm_block).

时设置为 NIL

NIL 不是字符串,所以 strcat 自然会抱怨和保释。

type1(c:txcm_block)中的局部变量声明列表中删除,并放入(c:nest2)中的局部变量声明列表中。

一般来说,要处理这种情况,请使用调试器 “错误中断”,然后检查 执行跟踪 和此时检查感兴趣的变量(如 type1)的当前值。