srv2 发表于 2012-7-11 07:53:48

程序越写越难维护, 这个观念对新手很有帮助.

xiaxiang 发表于 2012-7-11 08:29:27

说得非常好!之前没有关注到这个帖子

xyp1964 发表于 2012-7-11 08:42:48

;; 改成函数方式
;; 使用方式: (aaa '("circle" "*line" "*text"))
(defun aaa (filterlst / i lst ft ss)
(defun ssgetp        (ss filter)
    (vl-cmdf "select" ss "")
    (ssget "p" (list (cons 0 filter)))
)
(setq        i   1
        lst '()
)
(foreach a filterlst
    (setq lst (cons (strcat "ss" (itoa i)) lst)
          i   (1+ i)
    )
)
(setq        lst (reverse lst)
        ft(mapcar '(lambda (x) (strcat x ",")) filterlst)
        ft(apply 'strcat ft)
        ss(ssget (list (cons 0 ft)))
)
(mapcar '(lambda (x y) (set x (ssgetp ss y)))
          (mapcar 'read lst)
          filterlst
)
)

preone 发表于 2012-7-19 20:04:21

本帖最后由 preone 于 2012-7-19 20:07 编辑

看了半天还是没看出来 (sssetfirst nil ss)与(vl-cmdf "select" ss "")的区别
主要是不明白 sssetfirst函数的用法~~帮助文件里讲的感觉也很晦涩~~
还请楼主明示~~

e2002 发表于 2012-7-20 12:48:38

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

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

有些命令在通过 vl-cmdf 调用时表现正常,而在通过 command 调用时则会失败。vl-cmdf 函数主要突破了在 command 中不能使用 getxxx 的限制。

langjs 发表于 2012-7-20 13:49:18

写的很好,技术贴必须支持

风中寻觅 发表于 2012-7-24 08:19:33

很好的学习代码~!

xuexicad1960 发表于 2012-8-2 11:32:34

刚看到这个帖子,   希望这样的帖子多点 ,供新手学习提高。

fcut2004 发表于 2012-10-4 11:20:22

很不错,学习了。

fcut2004 发表于 2012-10-4 13:20:31

;桩轴力求和
(defun c:dd (/ ss ss1 ss2 n i sum1 sum2)

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

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

;下面对ss1操作
(setq n (sslength ss1))
(setq i 0 sum1 0)
(repeat n
(setq string (cdr (assoc 1 (entget (ssname ss1 i)))))
(setq a1 (vl-string-search"," string))
(setq string (substr string 3 (-a1 2)))
(setq sum1 (+ sum1 (atof string)))
(setq i (+ i 1))
)

;下面对ss2操作
(setq i 0 sum2 0 )
(setq n (sslength ss2))
(repeat n
(setq string (cdr (assoc 1 (entget (ssname ss2 i)))))
(setq sum2 (+ sum2 (atof string)))
(setq i (+ i 1))
)

(setq sum1 (+ sum1 sum2))

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

参考上面的讨论,我写了个轴力求和的代码。轴力的数值分别在81 82 图层,下面的代码两个图层一起选择的时候,就没有问题,但是如果只选其中一个图层时,就出错了 “*error* 函数中出错no function definition: &TSTY”。请问是怎么回事呢?
页: 1 [2] 3 4
查看完整版本: 写给新手,也谈已知选择集中根据实体类型筛选实体及代码优化