明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2003|回复: 13

[提问] 同心圆处理

[复制链接]
发表于 2017-12-2 22:15:34 | 显示全部楼层 |阅读模式
坛子里找了段同心圆的代码,楞是不会用,逻辑关系太复杂,想求大家帮忙改改。主要是同心坐标去重复,另外求出大圆半径。框选一堆圆,含单圆和同心圆,依次在他们圆心上用文字标出它的直径。如遇同心圆就只标大圆直径。谢谢大家。

(defun c:tt (/ CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
     ss (ssget '((0 . "CIRCLE")))
      )
    (repeat (sslength ss)
      (setq en (ssname ss (setq ii (1+ ii)))
     hdl (cdr (assoc 5 (entget en)))
     cnt (cdr (assoc 10 (entget en)))
     rrr (cdr (assoc 40 (entget en)))
     idx (strcat (rtos (car cnt) 2 3) "#" (rtos (cadr cnt) 2 3))
      )
      (if (null (setq hhh (cdr (assoc idx data))))
(setq data (cons (cons idx hdl) data))
(if (> (cdr (assoc 40 (entget (handent hhh))))
        rrr
     )
   (setq hhh  (entdel (handent hhh))
  data (subst (cons idx hdl) (assoc idx data) data)
   )
   ;(entdel en)
          (command "text" "m" "non" cnt  (* rrr 0.8) 0 (* rrr 2))
)
      )
    )
  )
)


 楼主| 发表于 2017-12-4 22:05:17 | 显示全部楼层

你好,谢谢你的代码,那种输出形式不太会用。

我从别人的代码中另摘录了一段,可否再次麻烦你帮忙改改
(defun c:tt ()
  (setq ss (ssget '((0 . "ARC,CIRCLE"))))
  (setq sscir (ssadd))
  ((> (sslength sscir) 0)  ;圆、圆弧,处理同心圆
    (setq lst nil)
    (foreach en (ss-enlst sscir) ;((图元 圆心)……)
      (setq cen_po (vlax-get (vlax-ename->vla-object en) 'center))
      (setq lst (cons (list en cen_po) lst))
    )
    (while (> (length lst) 0)  ;直到抽空表为止
      (setq lst2 (vl-remove-if-not
     '(lambda (x) (equal (cadar lst) (cadr x) 1e-8))
     lst
   )
      )     ;查找所有与第一个同心
      (princ "aaaaaaaaaaaa") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这里开始没值
      (foreach en lst2 (setq lst (vl-remove en lst))) ;从总表移除
      (setq lst2 (mapcar '(lambda (x) (car x)) lst2)) ;得到同心圆表
      (if (> (length lst2) 1)  ;2个以上进行半径从大至小排序
(setq lst2
        (vl-sort lst2
   (function
     (lambda (a b)
       (> (vla-get-radius (vlax-ename->vla-object a))
          (vla-get-radius (vlax-ename->vla-object b))
       )
     )
   )
        )
)
      )
      (setq en (car lst2))
      (setq cen_po (vlax-get (vlax-ename->vla-object en) 'center)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;希望输出形式像这样
      (setq rr (vla-get-radius (vlax-ename->vla-object en)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;希望输出形式像这样
      (command "text" "m" "non" cnt  (* rr 0.8) 0 (* rr 2))
    )
  )
)
(defun ss-enlst (ss / enlst)   ;选择集与对象名表互转
  (cond
    ((= (type ss) 'PICKSET)
     (vl-remove-if-not
       '(lambda (x) (= (type x) 'ENAME))
       (mapcar 'cadr (ssnamex SS))
     )
    )
    ((= (type ss) 'LIST)
     (setq enlst (ssadd))
     (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
    )
  )
)

发表于 2017-12-3 14:19:44 | 显示全部楼层
  1. (defun c:Tt (/ DD LEN N1 NS P1 PT SS SSC)
  2.   (setq ssC (ssget '((0 . "CIRCLE"))))
  3.   (setq Len (sslength ssC) ns '())
  4.   (repeat Len
  5.     (setq n1 (ssname ssC (setq Len (1- Len)))
  6.           pt (cdr (assoc 10 (entget n1)))
  7.           dd (list (cdr (assoc 40 (entget n1)))))
  8.     (if (setq ss (assoc pt ns))
  9.       (setq ns (subst (list pt (append dd (cadr ss))) ss ns))
  10.       (setq ns (cons (list pt dd) ns))            
  11.       )
  12.   )
  13.   (foreach K ns
  14.     (setq p1 (length (cadr k)))
  15.     (if (> p1 1)
  16.       (entmake (list '(0 . "TEXT") (cons 10 (car k)) (cons 1 (rtos (* (apply 'max (cadr k))2) 2 2)) (cons 40 5)))
  17.       (entmake (list '(0 . "TEXT") (cons 10 (car k)) (cons 1 (rtos (* (caadr k)2) 2 2)) (cons 40 5)))
  18.       )
  19.     )
  20.   (princ)
  21. )
发表于 2017-12-3 12:04:20 | 显示全部楼层
本帖最后由 llsheng_73 于 2017-12-8 18:55 编辑

  1. (defun c:tt(/ s i a l x e)
  2.   (if(setq s(ssget'((0 . "circle"))))
  3.     (foreach x(repeat(setq i(sslength s))
  4.                 (setq i(1- i)
  5.     e(ssname s i)
  6.     x(entget e)
  7.     x(list(cdr(assoc 10 x))(cdr(assoc 40 x)))
  8.     a(assoc(car x)l))
  9.   (if(member(cadr x)a)(setq e(entdel e)l l)
  10.     (setq l(if a(subst(append a(cdr x))a l)(cons x l)))))
  11.       (entmakex(mapcar'cons'(0 10 40 1)(list"text"(car x)200(rtos(*(apply'max(cdr x))2)))))))
  12.   )


本帖子中包含更多资源

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

x
发表于 2017-12-3 00:14:52 | 显示全部楼层
题目不错:圆消重+同心圆最大半径标注
 楼主| 发表于 2017-12-3 12:53:52 | 显示全部楼层

你好,谢谢你的代码,现在把圆和半径合并到x里面去,更难搞了,可以简单点么
发表于 2017-12-4 00:23:42 | 显示全部楼层

没达到需要的效果。
可以试试下面这个图。

本帖子中包含更多资源

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

x
发表于 2017-12-4 00:51:52 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2017-12-4 22:07:10 | 显示全部楼层
楼上代码是从“小笨智能中心线v1.3”抄的,在此谢过原作者。
发表于 2017-12-4 23:00:10 | 显示全部楼层

同心圆去重,同心最大圆标R。

本帖子中包含更多资源

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

x

点评

代码完善了!  发表于 2017-12-5 08:08
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 19:41 , Processed in 0.186085 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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