dasin 发表于 2015-1-26 20:10:51

快速选择相同半径的圆

本帖最后由 dasin 于 2015-1-26 20:12 编辑

因PROE导过来的2D图,经常在CAD中进行编辑。有时使用“快速先择”命令,也无法筛选出相同大小的圆,可能是导过的尺寸有很小的偏差。本人糊整了一个快速选择相同圆的LISP,但因能力有限无法完成它。请哪位大虾帮忙改进下!!!

ZZXXQQ 发表于 2015-1-26 21:25:04

(DEFUN C:qc (/ COUNTOR SELECTION DIMSE DIMDE ENTGRP COUNT ENTNAME ENT)
(COMMAND "_.UNDO" "M")
(SETQ COUNTOR 0)
(PRINC "\n批量选取圆!")
(SETQ ENT (ENTSEL "\n选择参照圆:"))
(SETQ ENT (ENTGET (CAR ENT)))
(SETQ DIMSE (CDR (ASSOC 40 ENT)))

;(INITGET "RADIU,R DIAMETER,D ")
;(SETQ SELECTION (GETKWORD "\n孔径匹配模式(半径或直径)(R/D)RADIU?:"))
(PROMPT "\n请选择区域:")
(SETQ ENTGRP (SSGET '((0 . "CIRCLE"))))
(SETQ COUNT 0)
(REPEAT (SSLENGTH ENTGRP)
    (SETQ ENTNAME (SSNAME ENTGRP COUNT))
    (SETQ ENT (ENTGET ENTNAME))
    (IF (EQUAL (CDR (ASSOC 40 ENT)) DIMSE 0.00005);孔径匹配,精度0.00001
    (PROGN
      (ENTMOD (SUBST (CONS 40 DIMSE) (ASSOC 40 ENT) ENT));更改找到的圆
      (SSSETFIRST NIL ENTNAME)   ;选中找到的圆
      (SETQ COUNTOR (1+ COUNTOR));计数器
    ))
    (SETQ COUNT (1+ COUNT))
)
(PRINC "\n共计圆数量")(PRINC COUNTOR) (PRINC "!!!")
(PRINC "   -------OK-------")
(PRINC)
)

琴剑江山_10184 发表于 2015-1-26 21:41:39

(defun c:tt (/ sel as-40 get len add nn as)
(and (setq sel (entsel "\n点取参照圆:"))
(progn
(setq as-40 (cdr (assoc 40 (entget (car sel)))))
(princ (strcat "\n参照圆直径=" (rtos (* as-40 2) 2 2)))
(setq get (ssget '((0 . "CIRCLE"))))
(setq len (sslength get))
(setq add (ssadd))       
(repeat len
    (setq nn (ssname get (setq len (1- len))))
    (setq as (cdr (assoc 40 (entget nn))))
    (if (equal as-40 as 0.01) (ssadd nn add))
    );repeat
(if add (sssetfirst nil add))
)
       )
(princ)
)

tianyi1230 发表于 2015-1-26 22:03:12

我一般用小菜选择易

ysq101 发表于 2015-1-28 16:52:17

琴剑江山_10184 发表于 2015-1-26 21:41 static/image/common/back.gif


不能直接输入直径??

琴剑江山_10184 发表于 2015-1-28 17:13:39

ysq101 发表于 2015-1-28 16:52 static/image/common/back.gif
不能直接输入直径??

自己改改就行了

琴剑江山_10184 发表于 2015-1-28 17:19:07

ysq101 发表于 2015-1-28 16:52 static/image/common/back.gif
不能直接输入直径??

(defun c:tt (/ sel as-40 get len add nn as)
(setq sel (/ (getdist "\n输入直径:") 2))   
(princ (strcat "\n过滤直径=" (rtos(* sel 2) 2 2)))
(setq get (ssget '((0 . "CIRCLE"))))
(setq len (sslength get))
(setq add (ssadd))         
(repeat len
    (setq nn (ssname get (setq len (1- len))))
    (setq as (cdr (assoc 40 (entget nn))))
    (if (equal sel as 0.01) (ssadd nn add))
    );repeat
(if add (sssetfirst nil add))      
(princ)
)

llsheng_73 发表于 2015-2-3 16:37:53

(defun c:tt(/ sel funz ss)
(setq sel (/ (getdist "\n输入直径:") 2))
(setq funz (getreal "容差范围:"))
(if(setq ss(ssget(list'(0 . "CIRCLE")'(-4 . "<and")'(-4 . ">=")(cons 40 (- sel funz))'(-4 . "<=")(cons 40 (+ sel funz))'(-4 . "and>"))))
    (sssetfirst nil ss))
ss)
页: [1]
查看完整版本: 快速选择相同半径的圆