导出值时出现问题
嗨(再次),有人能帮我解决这个Lisp程序吗??只需选择一个文本和多个闭合线。然后,提取到。csv,带有每条线的“面积”,文本位于。。。但有点不对劲。。。
(defun c:pad ()
(setq file (getfiled "Output File" "" "csv" 9))
(setq elist (entget (car (entsel "\nSelecione a estaca: "))))
(setq exlist (assoc 1 elist))
(while
(setq pl (entsel "\nSelecione a pline: "))
(command "area" "o" pl)
(setq area (getvar "area"))
(setq arealst (cons area arealst)))
(setq file (open file "w"))
(mapcar
(function
(lambda (x)
(write-line
(strcat (rtos (car x)) "," (rtos (cdr exlist)))file)))arealst)
(close file)
(princ)
)
它返回我“错误的参数类型:consp”最后一个区域值 我会这样处理:
(defun c:pad (/ file tEnt pl arealst)
(if (and (setq file (getfiled "Output File" "" "csv" 9))
(setq tEnt (car (entsel "\nSelecione a estaca: ")))
(wcmatch (cdr (assoc 0 (setq elst (entget tEnt)))) "*TEXT"))
(progn
(while (and (setq pl (car (entsel "\nSelecione a pline: ")))
(wcmatch (cdr (assoc 0 (entget pl))) "*POLYLINE"))
(setq arealst
(cons
(vla-get-Area
(vlax-ename->vla-object pl)) arealst)))
(if arealst
(progn
(setq file (open file "w"))
(mapcar
(function
(lambda (x)
(write-line
(strcat (rtos x) "," (cdr (assoc 1 elst))) file))) arealst)
(close file))))
(princ "\n<< Incorrect Selection >>"))
(princ))
[列表]
[*]我不信任“区域”命令,所以我会选择VL方法。
[*]注意我是如何构造mapcar表达式的。
[*]本地化变量!-否则,arealst变量将出错!
如果你对我发布的代码有任何问题,尽管问
李 你的代码运行得很好。。。就像我希望我的代码能工作一样。我的代码怎么了?
所有这些“vl-”。。是visual lisp cmd? 从错误判断——我认为这与使用“area”命令检索您的区域有关——这就是我避免使用它的原因。
但是,您的mapcar语句也不起作用,因为文本的DXF 1值是一个字符串,所以您不能在其上使用rtos。此外,当提供给lambda函数的参数不是列表时,您使用了car x。
是的,这是一种可视化LISP方法
我宁愿使用Visual LISP而不是“command”,因为它们更快、更可靠。 我也更喜欢通过VL提取数据,但它将帮助您了解哪里出了错。除了没有本地化变量和strcat中输出的一个小错误之外,该例程工作正常。
你有这个:
正如你所看到的,你试图获取列表x的第一项,x不是一个要从中提取的列表。mapcar允许您遍历列表中的每个项目。通过移除汽车排气装置,该部分将起作用。
另一个问题是,您试图rtos一个字符串。
通过以下代码替换,一切正常。
李对变量的本地化是完全正确的。你不想让变量与数据联系在一起,这可能会在以后伤害你。
虽然我没有为此修复您的代码,但我肯定会使用错误捕捉“if”或“cond”(由lee显示)来防止您的例程在没有所有必需变量的情况下继续。
希望这有帮助
以下是用上述符号固定的代码:
(defun c:pad (/ file elist exlist pl area arealst)
(setq file (getfiled "Output File" "" "csv" 9))
(setq elist (entget (car (entsel "\nSelecione a estaca: "))))
(setq exlist (assoc 1 elist))
(while
(setq pl (entsel "\nSelecione a pline: "))
(command "area" "o" pl)
(setq area (getvar "area"))
(setq arealst (cons area arealst))
) ;_ while
(setq file (open file "w"))
(mapcar
(function
(lambda (x)
(write-line
(strcat (rtos x) "," (cdr exlist))
file
) ;_ write-line
) ;_ lambda
) ;_ function
arealst
) ;_ mapcar
(close file)
(princ)
) ;_ defun
谢谢Alan提供的补充信息
我可以补充一点,当创建这样的例程时,我会尝试想出任何可能的方法,让例程失败(除了按Esc键),然后尝试解释它。
即。
使用IF语句不仅可以检查用户是否选择了某个对象,还可以检查它是否是正确的对象。
此外,在WHILE语句之后,用户可能没有选择任何PLINE,因此我在继续之前检查了arealst是否存在。
李 哦,是的,我忘了加上:
始终避免组合这种类型的编码
5
如果你错过了你的选择,它会出错,因为它没有什么可输入的。
最安全的方法是(if或cond,我更喜欢cond)选择您的对象,然后开始提取数据:
6
这将保证只有在您满足要求的情况下才能继续。 我完全同意,我是去错误陷阱,但他的日常工作后,修复他的strcat问题的工作;这就是我真正想首先强调的。
我认为你在“教学”方面比我更好——我倾向于只提出一个解决方案,没有太多解释。。。
页:
[1]
2