CADMASTER1128 发表于 2022-7-5 16:18:27

可能的LISP请求-中断

可能的LISP请求-将圆分成等分-
 
有没有一个Lisp程序的单词可以让我画一个圆,然后把它分成等分?
 
如果没有,有人能做一个吗?如果你正在做一个,你能做吗?所以我要做的就是输入节数。
 
提前感谢!!
 
-上海

Lee Mac 发表于 2022-7-5 16:23:07

很快,我做得很开心
 

(defun c:CBrk (/ ss tmp i j ent elst inc)
(vl-load-com)

(or Cbrk:num (setq Cbrk:num 2))

(cond ((setq ss (ssget '((0 . "CIRCLE"))))
      
      (initget 6)
      (and (setq tmp (getint (strcat "\nSpecify Number of Sections <" (itoa Cbrk:num) "> : ")))
             (setq Cbrk:num tmp))

      (setq i -1)
      (while (setq ent (ssname ss (setq i (1+ i))))
          (setq elst (entget ent) inc (/ (* 2 pi) cBrk:num) j -1)

          (repeat cbrk:num
            (entmake (list (cons   0 "ARC")
                           (assoc8elst)
                           (assoc 10elst)
                           (assoc 40elst)
                           (cons50 (* (setq j (1+ j)) inc))
                           (cons51 (* (1+ j) inc)))))
      (entdel ent))))

(princ))
      
         
         
   

CADMASTER1128 发表于 2022-7-5 16:26:55

哇,李,太快了,Lisp程序。是否可以从每个弧的中心到边缘绘制线?有道理?

Lee Mac 发表于 2022-7-5 16:30:41

当然:
 

(defun c:CBrk (/ ss tmp i j ent elst inc)
(vl-load-com)

(or Cbrk:num (setq Cbrk:num 2))

(cond ((setq ss (ssget '((0 . "CIRCLE"))))
      
      (initget 6)
      (and (setq tmp (getint (strcat "\nSpecify Number of Sections <" (itoa Cbrk:num) "> : ")))
             (setq Cbrk:num tmp))

      (setq i -1)
      (while (setq ent (ssname ss (setq i (1+ i))))
          (setq elst (entget ent) inc (/ (* 2 pi) cBrk:num) j -1)

          (repeat cbrk:num
            (entmake (list (cons   0 "ARC")
                           (assoc8elst)
                           (assoc 10elst)
                           (assoc 40elst)
                           (cons50 (* (setq j (1+ j)) inc))
                           (cons51 (* (1+ j) inc))))
            
            (entmake (list (cons   0 "LINE")
                           (assoc8   elst)
                           (assoc 10   elst)
                           (cons11 (polar (cdr (assoc 10 elst))
                                          (* j inc)
                                          (cdr (assoc 40 elst)))))))
      (entdel ent))))

(princ))
      
         
         
   

CADMASTER1128 发表于 2022-7-5 16:32:35

为什么要去我的朋友!!!你是最棒的!还有快速的服务!
 
我对你感激不尽!我喜欢Lisp程序,再次感谢!

Lee Mac 发表于 2022-7-5 16:34:47

没问题Steve

SteveK 发表于 2022-7-5 16:39:11

李,我可以问一下,你有理由为不同的情况选择一个while或foreach循环,还是你只是喜欢把它混合在一起?

Lee Mac 发表于 2022-7-5 16:43:03

 
嗨,史蒂夫,
 
这取决于任务-使用选择集处理,如果我对每个实体执行多个操作,我将使用while循环重复,因为它更快。
 

(defun _while (ss / i lst)
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
   (setq lst (cons ent lst)))

lst)

(defun _repeat (ss / i lst)
(setq i -1)
(repeat (sslength ss)
   (setq lst (cons (ssname ss (setq i (1+ i))) lst)))

lst)

(defun _mapcar (ss)
(vl-remove-if 'listp
   (mapcar 'cadr (ssnamex ss))))

有趣的是,虽然mapcar代码是最优雅的,但ssnamex意味着它是迄今为止最慢的。
 
对于选择集处理以外的事情,这取决于我使用什么来控制迭代-在这种情况下(使用Steve的圆打断),它是一个集合数,因此需要重复。如果我遍历一个列表并依次处理每个元素,我可以使用while,并使用cdr在每次迭代中缩短列表。否则,如果我需要列表保持得体,我会使用foreach。
 
希望这有帮助,
 

SteveK 发表于 2022-7-5 16:44:16

这很有趣。当我开始理解mapcar和ssnamex时,我就坚持这样做了,但真的,听起来有些时候回到基础是最好的!
谢谢,我以后会考虑的。

alanjt 发表于 2022-7-5 16:49:10

打败我吧。当我不得不把孩子放在床上过夜时,我大约已经度过了三分之四的路程。决定和妻子一起看《德克斯特》,所以我要回到电脑前。实际上,我走的是同一条路线,所以我不会费心发布不完整的代码。很高兴,主人很高兴。干得好。
页: [1] 2
查看完整版本: 可能的LISP请求-中断