李义东 发表于 2003-12-19 10:35:00

一个儿复杂条件选择题目

为了达成以下目的我思考试验多次都未有一明确的编程思路请高手赐教!!!!!!

1、有两个同心圆,大圆与小圆的直径差为有规律性的几个值(大圆为直径3、4、5、6、8mm小圆为对应的2.5
、3.4、4.2、5.8mm)
2、在一张图中有很多这种圆环(如在同一个中心点大圆为8小圆为5.8mm,,,以另一个点为圆心有大圆为6
小圆为4.2)
3、现要做一个程式能够过滤选取到直径为3、4、5、6、8mm圆并将其改为3/4圆弧

meflying 发表于 2003-12-19 10:58:00


(defun c:test( / ss i ent ents pt r pts pte os)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" '((0 . "CIRCLE") (-4 . "<or") (40 . 1.5) (40 . 2) (40 . 2.5) (40 . 3) (40 . 4) (-4 . "or>"))))
(setq i 0)
(while (< i (sslength ss))
    (setq ent (ssname ss i))
    (setq ents (entget ent))
    (setq pt (cdr (assoc 10 ents)))
    (setq r (cdr (assoc 40 ents)))
    (setq pts (polar pt (+ pi (/ pi 12)) r))
    (setq pte (polar pt (+ (/ (* pi 3) 2) (/ pi 12)) r))
    (command "_.break" (list ent pts) pte)
    (setq i (1+ i))
)
(setvar "osmode" os)
(princ)
)

李义东 发表于 2003-12-19 12:35:00

看到您的笑脸心中真高兴!!!!!!!!!!!!!!
请教版主
(-4 . "<or")
怎么理解?

meflying 发表于 2003-12-19 12:43:00

这是SSGET的一个过滤的逻辑判断测试式,
详细的可以参考帮助文件中的SSGET,

李义东 发表于 2003-12-19 17:16:00

你的程式只满足了一条件请再赐教

选择的圆有另一个条件,比如选8mm的圆那么在它的同心上要有一个5.8mm的圆才能选到8mm的圆将它变为圆弧.????
这个够难的吧!!!!???

meflying 发表于 2003-12-19 18:13:00

你可以通过修改参数lst来达到不同的要求,这个列表应该能明白是怎么回事吧。。。
注意不要写错,点两边都有空格,详细查看帮助文件中的点表。。。

(defun c:test (/ ss i ent ents pt d pts pte os lst lst2 rL)
(setq lst '((3 . 2.5) (4 . 3.4) (5 . 4.2) (8 . 5.8)))
(setq i 0)
(repeat (length lst)
    (setq lst2 (append lst2 (list (cons 40 (/ (car (nth i lst)) 2.0)))))
    (setq i (1+ i))
)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq        ss (ssget "x"
                  (append (list '(0 . "CIRCLE"))
                        (list '(-4 . "<or"))
                        lst2
                        (list '(-4 . "or>"))
                  )
           )
)
(setq i 0)
(while (< i (sslength ss))
    (setq ent (ssname ss i))
    (setq ents (entget ent))
    (setq d (* 2.0 (cdr (assoc 40 ents))))
    (setq pt (cdr (assoc 10 (entget ent))))
    (setq rL (assoc d lst))
    (if        rl
      (if (ssget "x"
               (list '(0 . "CIRCLE")
                     '(-4 . "<and")
                     (cons 40 (/ (cdr rL) 2.0))
                     (cons 10 pt)
                     '(-4 . "and>")
               )
          )
        (progn
          (setq pts (polar pt (+ pi (/ pi 12)) (/ d 2.0)))
          (setq pte (polar pt (+ (/ (* pi 3) 2) (/ pi 12)) (/ d 2.0)))
          (command "_.break" (list ent pts) pte)
        )
      )
    )
    (setq i (1+ i))
)
(setvar "osmode" os)
(princ)
)

李义东 发表于 2003-12-20 00:14:00

感谢版主赐教,,待我试过后回复版主结果!!!!
先谢谢啦!!!!!
越看您的笑容越亲切可爱!!!!!
人因梦想而伟大!!!!!
人因可爱而美丽!!!!!

李义东 发表于 2003-12-20 00:47:00

测试可以但如何能出现一个选取取,,没有选取让人感觉怪怪的。

李义东 发表于 2003-12-20 08:23:00

请版主对程式做一下说明好吗?昨天晚上搞到1:30也未弄明白
以下程式如何理解.
(setq lst '((3 . 2.5) (4 . 3.4) (5 . 4.2) (8 . 5.8)))

(setq rL (assoc d lst))


这两句关系是什么?如何理解?

meflying 发表于 2003-12-20 10:19:00

一个个选取是怎么个选取法,说说操作过程。。。

这个程序的思路是,先根据直径选取你需要变为3/4圆,然后判断每一个是否具有与其同心并且半径对应的圆,如果有,则操作,否则不操作。。。

这个列表是一系列需要操作的圆的直径列表,点前面表示需要操作圆的直径,点后面表示对应的同心圆的直径,你可以增加或减少这个列表的数量(就是如(3 . 25)同类型的数量),但格式要保证不变。。。
(setq rL (assoc d lst))取出与直径D对应的小圆直径(后面会使用CDR),
页: [1]
查看完整版本: 一个儿复杂条件选择题目