BlackAlnet 发表于 2022-7-6 14:28:45

导出值时出现问题

嗨(再次),有人能帮我解决这个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”最后一个区域值

Lee Mac 发表于 2022-7-6 14:34:45

我会这样处理:
 

(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变量将出错!
如果你对我发布的代码有任何问题,尽管问
 

BlackAlnet 发表于 2022-7-6 14:41:19

你的代码运行得很好。。。就像我希望我的代码能工作一样。我的代码怎么了?
 
所有这些“vl-”。。是visual lisp cmd?

Lee Mac 发表于 2022-7-6 14:46:02

从错误判断——我认为这与使用“area”命令检索您的区域有关——这就是我避免使用它的原因。
 
但是,您的mapcar语句也不起作用,因为文本的DXF 1值是一个字符串,所以您不能在其上使用rtos。此外,当提供给lambda函数的参数不是列表时,您使用了car x。

Lee Mac 发表于 2022-7-6 14:53:17

 
是的,这是一种可视化LISP方法
 
我宁愿使用Visual LISP而不是“command”,因为它们更快、更可靠。

alanjt 发表于 2022-7-6 14:55:49

我也更喜欢通过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

Lee Mac 发表于 2022-7-6 15:03:26

 
谢谢Alan提供的补充信息
 
我可以补充一点,当创建这样的例程时,我会尝试想出任何可能的方法,让例程失败(除了按Esc键),然后尝试解释它。
 
即。
 
使用IF语句不仅可以检查用户是否选择了某个对象,还可以检查它是否是正确的对象。
 
此外,在WHILE语句之后,用户可能没有选择任何PLINE,因此我在继续之前检查了arealst是否存在。
 

alanjt 发表于 2022-7-6 15:05:04

哦,是的,我忘了加上:
 
始终避免组合这种类型的编码
5
 
如果你错过了你的选择,它会出错,因为它没有什么可输入的。
最安全的方法是(if或cond,我更喜欢cond)选择您的对象,然后开始提取数据:
6
 
这将保证只有在您满足要求的情况下才能继续。

alanjt 发表于 2022-7-6 15:09:25

我完全同意,我是去错误陷阱,但他的日常工作后,修复他的strcat问题的工作;这就是我真正想首先强调的。

Lee Mac 发表于 2022-7-6 15:14:26

 
我认为你在“教学”方面比我更好——我倾向于只提出一个解决方案,没有太多解释。。。
页: [1] 2
查看完整版本: 导出值时出现问题