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”。请问是怎么回事呢?