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
)的当前值。
该程序基本上是从点描述中获取信息,从文本项中获取文本并将文本项添加到点描述中。对话框允许用户 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
)的当前值。