明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3107|回复: 16

请教斑竹,如何建立以指定点,指定半径的圆周内对象的选择集?

  [复制链接]
发表于 2003-10-21 13:57:00 | 显示全部楼层 |阅读模式
发表于 2003-10-21 14:26:00 | 显示全部楼层
估计要用小线段近似了
发表于 2003-10-21 16:44:00 | 显示全部楼层
;|I want to draw a circle around an item.  Copy the only things are the
circle.  I don't want lines or text that run out of the circle to be copied.
I have seen this before.  Can someone help?  Maybe someone has a program
that I can use?|;

;;Select with pline or circle - by fence, window or crossing
(defun C:SSWITHOBJECT (/ *ERROR* OBJ OBJLST PTLST TPTLST SS COUNT TYP
                       CENPT RAD STPT STANG DIV        INCRANG        2NDANG
                      )
  (defun *ERROR* (MSG)
    (cond
      ((or (not MSG)
           (member MSG
                   '("console break"
                     "Function cancelled"
                     "quit / exit abort"
                    )
           )                                ;member
       )                                ;or
      )                                        ;condition, no message to display
      ((princ (strcat "\nError: " MSG))) ;else display message
    )                                        ;cond
    (setvar "cmdecho" 1)
    (princ)
  )                                        ;end error

  (defun ISCLOSED (POLY)
    (if        (= "LWPOLYLINE" (cdr (assoc 0 (entget POLY))))
      (= 1 (logand 1 (cdr (assoc 70 (entget POLY)))))
    )                                        ;if
  )                                        ;end

  (defun MASSOC        (KEY ALIST / X NLIST)
    (foreach X ALIST
      (if (eq KEY (car X))
        (setq NLIST (cons (cdr X) NLIST))
      )
    )
    (reverse NLIST)
  )                                        ;end

  ;;remove duplicate adjacent points from point list
  ;;arguments: OLST - pointlist, FUZ - fuzz distance
  (defun REMDUPPTS (OLST FUZ / NLST P1 P2)
    (while (> (length OLST) 1)
      (setq P1 (car OLST)
            P2 (cadr OLST)
      )
      (if (> (distance P1 P2) FUZ)
        (setq NLST (cons P1 NLST))
      )                                        ;if
      (setq OLST (cdr OLST))
    )                                        ;while
    (setq NLST (cons (last OLST) NLST))
    (reverse NLST)
  )                                        ;end

                                        ;start
  (setvar "cmdecho" 0)
  (sssetfirst)

  (initget 1 "F W C  ")
  (setq        TYP
         (getkword
           "\nSelect by (F)ence, (W)indow inside or (C)rossing <C>: "
         )
  )
  (if (or (= TYP "") (= TYP "C"))
    (setq TYP "C")
  )                                        ;if

  (cond
    ((= TYP "W")
     (prompt
       "\nSelect circle or pline to define Window selection set:"
     )
    )
    ((= TYP "C")
     (prompt
       "\nSelect circle or pline to define Crossing selection set:"
     )
    )
    ((= TYP "F")
     (prompt
       "\nSelect circle or pline to define Fence selection set:"
     )
    )
  )                                        ;conditions

  (setq OBJ (car (entsel)))
  (while
    (or
      (null OBJ)
      (and
        (/= "LWPOLYLINE" (cdr (assoc 0 (entget OBJ))))
        (/= "CIRCLE" (cdr (assoc 0 (entget OBJ))))
      )                                        ;and
    )                                        ;or
     (princ
       "\nSelection was not a pline or circle - try again..."
     )
     (setq OBJ (car (entsel)))
  )                                        ;while

  (setq OBJLST (entget OBJ))

  (cond
    ((= "LWPOLYLINE" (cdr (assoc 0 OBJLST)))
     (setq PTLST (MASSOC 10 (entget OBJ)))
    )                                        ;cond pline

    ((= "CIRCLE" (cdr (assoc 0 OBJLST)))
     (setq CENPT   (cdr (assoc 10 OBJLST)) ;center pt
           RAD           (cdr (assoc 40 OBJLST)) ;radius
           STPT           (polar CENPT 0.0 RAD) ;start pt
           STANG   0.0                        ;start angle
           DIV           360                        ;number of divisions
           INCRANG (/ pi 180)                ;increment angle
           2NDANG  (+ STANG INCRANG)        ;second angle
           PTLST   (list STPT)
     )                                        ;setq

     (while (> DIV 1)
       (setq PT (polar CENPT 2NDANG RAD)) ;2nd pt
       (setq PTLST (cons PT PTLST))
       (setq 2NDANG (+ 2NDANG INCRANG))
       (setq DIV (1- DIV))
     )                                        ;while
    )                                        ;cond circle
  )                                        ;conditions

  (foreach X PTLST                        ;trans for rotated UCS
    (setq TPTLST (cons (trans X 0 1) TPTLST))
  )                                        ;WCS to UCS
  (setq TPTLST (REMDUPPTS TPTLST 0.001))

  (cond
    ((= TYP "W")
     (setq SS (ssget "WP" TPTLST))
     (if SS
       (progn
         (setq COUNT (sslength SS))
         (princ "\nSelection set contains ")
         (princ COUNT)
         (princ " objects by Window method")
       )                                ;progn
       (princ "\nNothing selected")        ;else
     )                                        ;if
    )                                        ;cond W

    ((= TYP "C")
     (setq SS (ssget "CP" TPTLST))
     (if SS
       (progn
         (ssdel OBJ SS)                        ;remove OBJ
         (setq COUNT (sslength SS))
         (princ "\nSelection set contains ")
         (princ COUNT)
         (princ " objects by Crossing method")
       )                                ;progn
       (princ "\nNothing selected")        ;else
     )                                        ;if
    )                                        ;cond C

    ((= TYP "F")
     (if (ISCLOSED OBJ)
       (setq TPTLST (cons (car TPTLST) (reverse TPTLST)))
                                        ;first point at last
     )                                        ;if
     (setq SS (ssget "F" TPTLST))
     (if SS
       (progn
         (ssdel OBJ SS)                        ;remove OBJ
         (setq COUNT (sslength SS))
         (princ "\nSelection set contains ")
         (princ COUNT)
         (princ " objects by Fence method")
       )                                ;progn
       (princ "\nNothing selected")        ;else
     )                                        ;if
    )                                        ;cond F
  )                                        ;conditions

  (if SS
    (sssetfirst NIL SS)
  )                                        ;select
  (*ERROR* NIL)                                ;reset vars
  (princ)
)                                        ;end
 楼主| 发表于 2003-10-21 17:05:00 | 显示全部楼层
飞哥您好:

     我做程序目的如下:
     框选一视图,把视图内所有圆选中,如果有同心圆选中直径最大的圆,划出中心线,按圆的直径排序,标A,B, C,D,直径相同的圆标同一标号,见程序及附图。

    但有一问题不知如何解决,视图中可能有大量的阵列圆(加工孔做通风孔用),该阵列圆只需一个标号即可(图示只标一个D即可),其他的不知如何滤除,望指教!
   另外,同心圆图示只标一个C即可,为何有的标AC?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2003-10-21 17:14:00 | 显示全部楼层
大致看了一下图,你的两个同心圆并不同心,注意,同心圆是只圆心坐标相同,而不是看起来同心。如果你允许有一些误差,判断时用equal,
我记得说过这个问题了,不过不记得是不是你了,可能是别人,其它的我再看看
发表于 2003-10-21 17:23:00 | 显示全部楼层
看了看程序,发现你注意到这个问题了,可能是程序判断有些问题了,给你个思路,
先取出表中的第一个圆,标A,将这个存于一表中,然后取第二个,与刚才新的那个表中的元素比较,如果圆心相同或半径相同,则取第三个圆,否则标注B,将这个圆也存入新的表中,以后取出的圆则分别与这个表中的圆比较,如果须标注,则须将它加入此新表。直到结束
 楼主| 发表于 2003-10-22 09:55:00 | 显示全部楼层
飞哥您好:

     您的帖子我认真拜读了一下,说实话没看明白什么意思,能否把程序给完善一下,谢谢!
发表于 2003-10-22 10:30:00 | 显示全部楼层
突然发现你的话有矛盾,
********************************************************************
如果有同心圆选中直径最大的圆,划出中心线,按圆的直径排序,标A,B, C,D,直径相同的圆
标同一标号,见程序及附图。

   另外,同心圆图示只标一个C即可,为何有的标AC?
***********************************************************
同心圆到底怎么标,是标一个C,还是按直径,标A B C D?
 楼主| 发表于 2003-10-22 11:45:00 | 显示全部楼层
飞哥您好:
      我的目的是先按照圆的直径从小到大排序,标A、B、C、D、E、F......直径最小的圆标A,同直径的用同一标号,如果是同心圆,则按照最大圆标注,如图示应标C,不应标AC(即把同心圆中直径小的圆标号及中心线忽略)
发表于 2003-10-22 15:39:00 | 显示全部楼层
程序写完了,就拿你的图试了试,注意,判断是否是阵列的依据是至少6个以上间距相等,规则排列,写字的位置及一些细节的东西你自己写了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 02:23 , Processed in 0.173053 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表