乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 58|回复: 12

[编程交流] 导出值时出现问题

[复制链接]

13

主题

75

帖子

62

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 14:28:45 | 显示全部楼层 |阅读模式
嗨(再次),有人能帮我解决这个Lisp程序吗??
 
只需选择一个文本和多个闭合线。然后,提取到。csv,带有每条线的“面积”,文本位于。。。但有点不对劲。。。
 
  1. (defun c:pad ()
  2. (setq file (getfiled "Output File" "" "csv" 9))
  3. (setq elist (entget (car (entsel "\nSelecione a estaca: "))))  
  4.    (setq exlist (assoc 1 elist))  
  5. (while
  6. (setq pl (entsel "\nSelecione a pline: "))
  7. (command "area" "o" pl)
  8.    (setq area (getvar "area"))
  9.    (setq arealst (cons area arealst)))
  10. (setq file (open file "w"))
  11.    (mapcar
  12.      (function
  13. (lambda (x)
  14.   (write-line     
  15.     (strcat (rtos (car x)) "," (rtos (cdr exlist)))file)))arealst)
  16. (close file)
  17. (princ)
  18. )

 
 
它返回我“错误的参数类型:consp”最后一个区域值
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:34:45 | 显示全部楼层
我会这样处理:
 
  1. (defun c:pad (/ file tEnt pl arealst)
  2. (if (and (setq file (getfiled "Output File" "" "csv" 9))
  3.           (setq tEnt (car (entsel "\nSelecione a estaca: ")))
  4.           (wcmatch (cdr (assoc 0 (setq elst (entget tEnt)))) "*TEXT"))
  5.    (progn
  6.      (while (and (setq pl (car (entsel "\nSelecione a pline: ")))
  7.                  (wcmatch (cdr (assoc 0 (entget pl))) "*POLYLINE"))
  8.        (setq arealst
  9.          (cons
  10.            (vla-get-Area
  11.              (vlax-ename->vla-object pl)) arealst)))
  12.      (if arealst
  13.        (progn
  14.          (setq file (open file "w"))
  15.          (mapcar
  16.            (function
  17.              (lambda (x)
  18.                (write-line
  19.                  (strcat (rtos x) "," (cdr (assoc 1 elst))) file))) arealst)
  20.          (close file))))
  21.    (princ "\n<< Incorrect Selection >>"))
  22. (princ))
  23.             

 
[列表]
  • 我不信任“区域”命令,所以我会选择VL方法。
  • 注意我是如何构造mapcar表达式的。
  • 本地化变量!-否则,arealst变量将出错!
    如果你对我发布的代码有任何问题,尽管问
     
  • 回复

    使用道具 举报

    13

    主题

    75

    帖子

    62

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    65
    发表于 2022-7-6 14:41:19 | 显示全部楼层
    你的代码运行得很好。。。就像我希望我的代码能工作一样。我的代码怎么了?
     
    所有这些“vl-”。。是visual lisp cmd?
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 14:46:02 | 显示全部楼层
    从错误判断——我认为这与使用“area”命令检索您的区域有关——这就是我避免使用它的原因。
     
    但是,您的mapcar语句也不起作用,因为文本的DXF 1值是一个字符串,所以您不能在其上使用rtos。此外,当提供给lambda函数的参数不是列表时,您使用了car x。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 14:53:17 | 显示全部楼层
     
    是的,这是一种可视化LISP方法
     
    我宁愿使用Visual LISP而不是“command”,因为它们更快、更可靠。
    回复

    使用道具 举报

    54

    主题

    3755

    帖子

    3583

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    438
    发表于 2022-7-6 14:55:49 | 显示全部楼层
    我也更喜欢通过VL提取数据,但它将帮助您了解哪里出了错。除了没有本地化变量和strcat中输出的一个小错误之外,该例程工作正常。
     
    你有这个:
    正如你所看到的,你试图获取列表x的第一项,x不是一个要从中提取的列表。mapcar允许您遍历列表中的每个项目。通过移除汽车排气装置,该部分将起作用。
    另一个问题是,您试图rtos一个字符串。
    通过以下代码替换,一切正常。
    李对变量的本地化是完全正确的。你不想让变量与数据联系在一起,这可能会在以后伤害你。
     
    虽然我没有为此修复您的代码,但我肯定会使用错误捕捉“if”或“cond”(由lee显示)来防止您的例程在没有所有必需变量的情况下继续。
     
    希望这有帮助
     
    以下是用上述符号固定的代码:
    1. (defun c:pad [color=Red](/ file elist exlist pl area arealst)[/color]
    2. (setq file (getfiled "Output File" "" "csv" 9))
    3. (setq elist (entget (car (entsel "\nSelecione a estaca: "))))
    4. (setq exlist (assoc 1 elist))
    5. (while
    6.    (setq pl (entsel "\nSelecione a pline: "))
    7.     (command "area" "o" pl)
    8.     (setq area (getvar "area"))
    9.     (setq arealst (cons area arealst))
    10. ) ;_ while
    11. (setq file (open file "w"))
    12. (mapcar
    13.    (function
    14.      (lambda (x)
    15.        (write-line
    16.          [color=Red](strcat (rtos x) "," (cdr exlist))[/color]
    17.          file
    18.        ) ;_ write-line
    19.      ) ;_ lambda
    20.    ) ;_ function
    21.    arealst
    22. ) ;_ mapcar
    23. (close file)
    24. (princ)
    25. ) ;_ defun
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 15:03:26 | 显示全部楼层
     
    谢谢Alan提供的补充信息
     
    我可以补充一点,当创建这样的例程时,我会尝试想出任何可能的方法,让例程失败(除了按Esc键),然后尝试解释它。
     
    即。
     
    使用IF语句不仅可以检查用户是否选择了某个对象,还可以检查它是否是正确的对象。
     
    此外,在WHILE语句之后,用户可能没有选择任何PLINE,因此我在继续之前检查了arealst是否存在。
     
    回复

    使用道具 举报

    54

    主题

    3755

    帖子

    3583

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    438
    发表于 2022-7-6 15:05:04 | 显示全部楼层
    哦,是的,我忘了加上:
     
    始终避免组合这种类型的编码
    1. 5

     
    如果你错过了你的选择,它会出错,因为它没有什么可输入的。
    最安全的方法是(if或cond,我更喜欢cond)选择您的对象,然后开始提取数据:
    1. 6

     
    这将保证只有在您满足要求的情况下才能继续。
    回复

    使用道具 举报

    54

    主题

    3755

    帖子

    3583

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    438
    发表于 2022-7-6 15:09:25 | 显示全部楼层
    我完全同意,我是去错误陷阱,但他的日常工作后,修复他的strcat问题的工作;这就是我真正想首先强调的。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 15:14:26 | 显示全部楼层
     
    我认为你在“教学”方面比我更好——我倾向于只提出一个解决方案,没有太多解释。。。
    回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

    QQ|关于我们|小黑屋|乐筑天下 繁体中文

    GMT+8, 2025-3-5 00:11 , Processed in 0.714218 second(s), 72 queries .

    © 2020-2025 乐筑天下

    联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表