aws 发表于 2022-12-17 21:16:38

请问如何使用别人的代码?

比如这位大神的代码,我想使用,
但是,我发现它这段代码,没有启动命令,
甚至好像也没有选择集
然后最后输出的是一个“点”吗?

这个点怎么使用呢?
我想增加到这个lsp文件里,替换掉那个手动选择基点,那么该如何修改呢?
请教各位老师~!



[*];; 选择集中心点--ss 选择集----(一级)----------
[*](defun ssmpt (ss / i s1 box ptn a p1 p9 p5 num)
[*](setq num (sslength ss) i -1)
[*](if (< num 100)
[*]    (progn
[*]      (repeat num
[*]      (setq s1 (ssname ss (setq i (1+ i))))
[*]      (setq box (get-box s1) ptn (append box ptn))
[*]      )
[*]      (setq a (mapcar '(lambda (x) (apply 'mapcar (cons x ptn))) (list 'min 'max))
[*]      p1 (car a)
[*]      p9 (cadr a)
[*]      p5 (sl:mid p1 p9)
[*]      )
[*]    )
[*]    (progn
[*]      (command "_zoom" "_object" ss "")
[*]      (setq p5 (getvar "viewctr"))
[*]      (command "_zoom" "_p")
[*]    )
[*])
[*]p5
[*])

start4444 发表于 2022-12-17 21:53:55

(setq ss (ssget) ptc (ssmpt ss))
你当他是个加工厂,你把东西丢给它出来的就是成品了,当然给它的东西要对头才行

aws 发表于 2022-12-17 22:06:59

start4444 发表于 2022-12-17 21:53
(setq ss (ssget) ptc (ssmpt ss))
你当他是个加工厂,你把东西丢给它出来的就是成品了,当然给它的东西 ...

还是没明白,它是自动运行的吧?怎么丢给它呢?怎么建立联系?

20060510412 发表于 2022-12-17 22:57:31

看起来你还没有建立起函数、子函数、函数的参数,这些概念。
先用起来吧,用多了就知道了。

AndyWang 发表于 2022-12-18 00:09:31

你发的那位仁兄的代码是没法直接用的,在论坛搜搜其他人的代码吧

aws 发表于 2022-12-18 03:42:41

AndyWang 发表于 2022-12-18 00:09
你发的那位仁兄的代码是没法直接用的,在论坛搜搜其他人的代码吧

哦 多谢提醒

aws 发表于 2022-12-18 09:12:43


[*](defun c:fb()
[*](setvar "cmdecho" 0)
[*](defun sszxd (ss / n obj llp urp ls1 ls2)
[*]    (repeat (setq n (sslength ss))
[*]      (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
[*]      (if (and (vlax-method-applicable-p obj 'getboundingbox)
[*]            (not (vl-catch-all-error-p
[*]                   (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp)))
[*]            )
[*]          )
[*]      (setq ls1 (mapcar 'min (vlax-safearray->list llp) (cond (ls1) ((vlax-safearray->list llp))))
[*]          ls2 (mapcar 'max (vlax-safearray->list urp) (cond (ls2) ((vlax-safearray->list urp))))
[*]      )
[*]      )
[*]    );获取对象最大矩形边界框左下角和右上角的WCS坐标
[*]    (if (and ls1 ls2)
[*]      (apply 'mapcar
[*]      (cons '(lambda (a b) (/ (+ a b) 2.0))
[*]          (list ls1 ls2)
[*]      )
[*]      )
[*]    );根据边界框坐标求中心点
[*])
[*](setq ss(ssget))
[*](command "measure" ss "10" "")
[*](setq dian(ssget "p"))
[*](setq i 0)
[*](setq lss nil)
[*](repeat (sslength dian)
[*]    (setq point1(cdr(assoc 10 (entget(ssname dian i)))))
[*]    (setq lss (cons point1 lss))
[*]    (setq i (+ 1 i))
[*])
[*](command "erase" dian "")
[*](Setq kss (ssget "WP" lss))
[*](setq p2 (sszxd ss))
[*](setq p3 (sszxd kss))
[*](setq blname (rtos (* (getvar "cdate") 1e8)))
[*](command "change" ss "" "p" "c" "2" "")
[*](command "block" blname "non" p3 kss "")
[*](command "insert" blname "x" 1 "y" 1 "z" 1 "r" 0 "non" p2)
[*](setvar "cmdecho" 1)
[*](princ)
[*])






琢磨了大半夜,似乎明白了,原来子函数就是相当于“自定义的系统函数”
它不会自动运行,只有你调用它,它才会给你输出结果。
比如上述代码中,(setq p2 (sszxd ss)) 就是调用子函数的方式,
子函数建议放在开头的位置。其他位置我也没试过。
然后就是,上述代码中,我想把(setq ss(ssget))改成(setq ss(entsel))
插件就不能正常使用了,这是为什么呢?
有老师指导下吗?

a2580106803 发表于 2022-12-18 13:14:07

aws 发表于 2022-12-18 09:12
[*](defun c:fb()
[*](setvar "cmdecho" 0)
[*](defun sszxd (ss / n obj llp urp ls1 ls2)


ssget 返回的是选择集,entsel 返回的是对象

aws 发表于 2022-12-19 08:07:45

a2580106803 发表于 2022-12-18 13:14
ssget 返回的是选择集,entsel 返回的是对象

是这样吗,我还以为,两者的区别仅仅是选取方式的不同,一个是框选,一个点选
页: [1]
查看完整版本: 请问如何使用别人的代码?