明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: firstinti

写给新手,也谈已知选择集中根据实体类型筛选实体及代码优化

    [复制链接]
发表于 2012-7-11 07:53:48 | 显示全部楼层
程序越写越难维护, 这个观念对新手很有帮助.
发表于 2012-7-11 08:29:27 | 显示全部楼层
说得非常好!之前没有关注到这个帖子
回复 支持 0 反对 1

使用道具 举报

发表于 2012-7-11 08:42:48 | 显示全部楼层
;; 改成函数方式

  1. ;; 使用方式: (aaa '("circle" "*line" "*text"))
  2. (defun aaa (filterlst / i lst ft ss)
  3.   (defun ssgetp        (ss filter)
  4.     (vl-cmdf "select" ss "")
  5.     (ssget "p" (list (cons 0 filter)))
  6.   )
  7.   (setq        i   1
  8.         lst '()
  9.   )
  10.   (foreach a filterlst
  11.     (setq lst (cons (strcat "ss" (itoa i)) lst)
  12.           i   (1+ i)
  13.     )
  14.   )
  15.   (setq        lst (reverse lst)
  16.         ft  (mapcar '(lambda (x) (strcat x ",")) filterlst)
  17.         ft  (apply 'strcat ft)
  18.         ss  (ssget (list (cons 0 ft)))
  19.   )
  20.   (mapcar '(lambda (x y) (set x (ssgetp ss y)))
  21.           (mapcar 'read lst)
  22.           filterlst
  23.   )
  24. )

评分

参与人数 1明经币 +2 收起 理由
xiaxiang + 2 院长的方法挺好!

查看全部评分

发表于 2012-7-19 20:04:21 | 显示全部楼层
本帖最后由 preone 于 2012-7-19 20:07 编辑

看了半天  还是没看出来 (sssetfirst nil ss)与(vl-cmdf "select" ss "")的区别
主要是不明白 sssetfirst函数的用法~~帮助文件里讲的感觉也很晦涩~~
还请楼主明示~~
发表于 2012-7-20 12:48:38 | 显示全部楼层
vl-cmdf 也是 command那样的.

  1. vl-cmdf 函数和 command 函数类似,但在求值传递的参数方面有所不同。vl-cmdf 函数在执行 AutoCAD 命令之前检查所有的描述参数,如果在这一过程中检测到错误,将不再执行 AutoCAD 命令。然而,command 函数将每个参数顺序传递给 AutoCAD,所以在发现错误之时命令可能已经开始执行了。

  2. 如果对命令的调用中包含对其他函数的调用,则 vl-cmdf 在执行命令之前先进行函数调用。而 command 则在开始执行命令后执行定函数调用。

  3. 有些命令在通过 vl-cmdf 调用时表现正常,而在通过 command 调用时则会失败。vl-cmdf 函数主要突破了在 command 中不能使用 getxxx 的限制。
复制代码
发表于 2012-7-20 13:49:18 | 显示全部楼层
写的很好,技术贴必须支持
发表于 2012-7-24 08:19:33 | 显示全部楼层
很好的学习代码~!
发表于 2012-8-2 11:32:34 | 显示全部楼层
刚看到这个帖子,   希望这样的帖子多点 ,供新手学习提高。
发表于 2012-10-4 11:20:22 | 显示全部楼层
很不错,学习了。
发表于 2012-10-4 13:20:31 | 显示全部楼层
  1. ;桩轴力求和
  2. (defun c:dd (/ ss ss1 ss2 n i sum1 sum2)

  3. (defun wmg-ssgetp (ss filter)
  4. (sssetfirst nil ss)
  5.   (ssget "p" (list (cons 8 filter)))
  6. ) ;wmg-ssgetp 子函数

  7. (setq ss1 nil)
  8. (setq ss2 nil )
  9. (setq ss (ssget '((0 . "TEXT")(8 . "81,82"))));选择对象
  10. (setq ss1(wmg-ssgetp  ss "82") );调用子函数,创建ss1选择集
  11. (setq ss2(wmg-ssgetp  ss "81") );调用子函数,ss2选择集

  12. ;下面对ss1操作
  13. (setq n (sslength ss1))
  14. (setq i 0 sum1 0)
  15. (repeat n
  16. (setq string (cdr (assoc 1 (entget (ssname ss1 i)))))
  17. (setq a1 (vl-string-search  "," string))
  18. (setq string (substr string 3 (-  a1 2)))
  19. (setq sum1 (+ sum1 (atof string)))
  20. (setq i (+ i 1))
  21. )

  22. ;下面对ss2操作
  23. (setq i 0 sum2 0 )
  24. (setq n (sslength ss2))
  25. (repeat n
  26. (setq string (cdr (assoc 1 (entget (ssname ss2 i)))))
  27. (setq sum2 (+ sum2 (atof string)))
  28. (setq i (+ i 1))
  29. )

  30. (setq sum1 (+ sum1 sum2))

  31. (setq p1 (getpoint "\n计算结果基点: "))
  32. (command "text" "ml" p1 "150"  "0" (strcat "\n 轴力和:"(rtos sum1 2 0) "") ""); 轴力结果
  33. )

参考上面的讨论,我写了个轴力求和的代码。轴力的数值分别在81 82 图层,下面的代码两个图层一起选择的时候,就没有问题,但是如果只选其中一个图层时,就出错了 “*error* 函数中出错no function definition: &TSTY”。请问是怎么回事呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-24 02:00 , Processed in 0.180619 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表