明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1976|回复: 11

[已解答] 求助lisp 取消重复设定区域问题

[复制链接]
发表于 2014-1-7 09:45 | 显示全部楼层 |阅读模式
本帖最后由 jly0406 于 2014-1-7 10:52 编辑

本人lisp菜鸟,出于工作需要拼凑了些代码想实现些功能,在指定区域内查找出某窗号的数量,如此循环即可
下边的代码初步实现了,点好基点,选择要查找的窗号,再选择一下要查的区域,就可以在基点处列出窗号和数量,并且画了
圆圈标示,然后再点好基点,选择要查找的窗号,再选择一下要查的区域

但是这样会有点麻烦,每次都要选区域,能否请大侠们帮改改,实现如下功能,先选好区域后,区域就暂时不变了,之后选择要查找的窗号,列出窗号数量,再选窗号,列出数量,区域就不用每次再选了,求大侠帮忙,感激不尽!

(defun c:tt ()
(setvar "cmdecho" 0)  
(setq sspt (getpoint "\n请输入基点:"))

(WHILE 1
          (setq stxt "")  
          (setq s1 (entsel "\n选择窗号 :"))
          (setq ent (entget(car s1)))
          (= (cdr(assoc 0 ent)) "TEXT")
          (setq stxt (cdr(assoc 1 (entget(car s1)))))


  (if (setq ss (ssget (list '(0 . "TEXT") (cons 1 (strcat "*" stxt "*"))))) (progn
     (setq i 0)
     (repeat (sslength ss)
     (setq en (ssname ss i))
     (vla-getboundingbox(vlax-ename->vla-object en) 'minp 'maxp)
     (setq minp (vlax-safearray->list minp)
         maxp (vlax-safearray->list maxp))
     (setq pt (polar minp (angle minp maxp) (/ (distance minp maxp) 2)))
     (command ".CIRCLE" pt 800)
     (setq i (1+ i))
   )

   (setq spt1 (polar sspt 0 8000))
   (command "text" sspt 1000 0  stxt "")   
   (command "text" spt1 1000 0  (sslength ss) "")
   (setq sspt (polar sspt (- (/ pi 2)) 1500))
  ))
)

(princ "\n")
(setvar "CMDECHO" 1)
(princ)
)



本帖子中包含更多资源

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

x

点评

图中无窗图块!  发表于 2014-1-7 13:39
 楼主| 发表于 2014-1-7 14:15 | 显示全部楼层
恩,图中无窗图块,就窗号字符串就行,求大侠解决感激不尽啊
 楼主| 发表于 2014-1-7 14:19 | 显示全部楼层
大侠快出现啊
发表于 2014-1-7 15:06 | 显示全部楼层
对楼主的帖子标题表达感觉无语。。。
楼主估计要的是批量统计文本,并标示数量。
估计结果如下图:

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-1-7 16:19 | 显示全部楼层
edata 发表于 2014-1-7 15:06
对楼主的帖子标题表达感觉无语。。。
楼主估计要的是批量统计文本,并标示数量。
估计结果如下图:

对的,大侠终于出现了,就是大侠你说的这个意思,如何实现批量统计文本,并标示数量
发表于 2014-1-7 17:44 | 显示全部楼层
  1. ;; 查找出现次数最多表项】
  2. ;; 返回表中出现次数和元素
  3. ;; by chlh_jd 发表于 2012-7-18 20:01:02
  4. ;;;http://bbs.mjtd.com/forum.php?mod=redirect&goto=findpost&ptid=95639&pid=539700&fromuid=338795
  5. (defun vl-maxtimes (lst / a len ti new)
  6.   (while lst
  7.         (setq a(car lst)len(length lst)
  8.               ti (- len (length (setq lst (vl-remove a lst))))
  9.               new (cons (cons ti a) new)))
  10.   ;(if new(car(vl-sort new (function (lambda (e1 e2) (> (car e1) (car e2)))))))
  11. )
  12. ;;;
  13. ;;;组码值提取(sk_dxf 图元名 组码)
  14. (defun sk_dxf(en code)
  15.     (if(and(=(type en) 'ENAME)(= (type code) 'INT))
  16.       (cdr(assoc code (entget en))))
  17.   )
  18. ;;;单行文本重复统计
  19. ;;; editor by edata
  20. ;;; 2014-1-7 17:43:51
  21. (defun c:tt(/ EN K NEW_LST PT SS STR_LST)
  22.   (or font_heigth (setq font_heigth 300))
  23.   (if(setq ss(ssget'((0 . "text"))))
  24.     (progn
  25.       (setq str_lst '())
  26.     (while (setq en(ssname ss 0))
  27.       (setq str_lst(cons (sk_dxf en 1)str_lst))
  28.       (setq ss(ssdel en ss))
  29.       )
  30.       (setq str_lst(reverse str_lst))
  31.       (setq new_lst(vl-maxtimes str_lst))
  32.       (if (and (not (null new_lst)) (setq  k -1 pt(getpoint "\n指定放置位置点:")))
  33.       (foreach n new_lst (entmakex (list
  34.                                     (cons 0 "text")
  35.                                     (cons 10 (polar pt (* pi 1.5) (* (setq k(1+ k)) (* font_heigth 1.5))))
  36.                                     (cons 1 (strcat (cdr n)"      " (rtos (car n) 2 0)))
  37.                                     (cons 40 font_heigth)
  38.                                     )
  39.                                   ))
  40.         )      
  41.     )
  42.     (princ"\n Nothing Select Object!!!")
  43.     )
  44.   (princ)
  45.   )
 楼主| 发表于 2014-1-7 19:31 | 显示全部楼层
edata 发表于 2014-1-7 17:44

在网上找了个更便捷的代码,更有效些,但是缺点是需要单行文字,另外生成的文字重叠,大侠看看能解决重叠问题不

(defun c:wba (/      LST1   N      E     S    WB   SS  lst2
         lst_new       shuz   lst     lst11  lst12   height  p1
         WBJULI
        )
  (setq  ss (ssget '((0 . "TEXT")))
  N  0
  )
  (REPEAT (SSLENGTH SS)
    (SETQ E   (SSNAME SS N)
    S   (ENTGET E)
    WB   (CDR (ASSOC 1 S))
    height (CDR (ASSOC 40 s))
    LST1   (CONS WB LST1)
    )
    (SETQ N (1+ N))
  )
  (while (> (LENGTH LST1) 0)
    (IF  (NOT (MEMBER (NTH 0 LST1) LST2))
      (progn
  (SETQ LST2    (append LST2 (list (strcat (NTH 0 LST1) "=")))
        lst_new (vl-remove (NTH 0 LST1) LST1)
        shuz    (itoa (- (LENGTH LST1) (length lst_new)))
        lst2    (append lst2 (list shuz))
        lst1    lst_new
  )
      )
    )
    (setq lst  (cons lst2 lst)
    lst2 nil
    )
  )
  (mapcar '(lambda (x)
       (setq lst11 (cons (strcat (car x) (cadr x)) lst11))
     )
    lst
  )
  (setq lst11 (acad_strlsort lst11))
  (setq WBJULI (* height 1.4))
  (setq p1 (getpoint "\n请指定插入点:"))
  (setq n 0)
  (foreach x lst11
    (command "text" p1 height "" x)
    (command)
    (setq p1 (list (car p1) (- (cadr p1) WBJULI) (caddr p1)))
    (setq p1 (polar p1 (- (/ pi 2)) 500))
    (setq n (1+ n))
  )
  (princ)
)
 楼主| 发表于 2014-1-7 19:42 | 显示全部楼层

1

本帖最后由 jly0406 于 2014-1-7 19:48 编辑

怎么能解决重叠问题呢
发表于 2014-1-7 21:13 | 显示全部楼层
jly0406 发表于 2014-1-7 19:42
怎么能解决重叠问题呢

----------------------------- 表示无语----------------------------------------
  1. (defun c:wba (/      LST1   N      E     S    WB   SS  lst2
  2.          lst_new       shuz   lst     lst11  lst12   height  p1
  3.          WBJULI
  4.         )
  5.   (setq  ss (ssget '((0 . "TEXT")))
  6.   N  0
  7.   )
  8.   (REPEAT (SSLENGTH SS)
  9.     (SETQ E   (SSNAME SS N)
  10.     S   (ENTGET E)
  11.     WB   (CDR (ASSOC 1 S))
  12.     height (CDR (ASSOC 40 s))
  13.     LST1   (CONS WB LST1)
  14.     )
  15.     (SETQ N (1+ N))
  16.   )
  17.   (while (> (LENGTH LST1) 0)
  18.     (IF  (NOT (MEMBER (NTH 0 LST1) LST2))
  19.       (progn
  20.   (SETQ LST2    (append LST2 (list (strcat (NTH 0 LST1) "=")))
  21.         lst_new (vl-remove (NTH 0 LST1) LST1)
  22.         shuz    (itoa (- (LENGTH LST1) (length lst_new)))
  23.         lst2    (append lst2 (list shuz))
  24.         lst1    lst_new
  25.   )
  26.       )
  27.     )
  28.     (setq lst  (cons lst2 lst)
  29.     lst2 nil
  30.     )
  31.   )
  32.   (mapcar '(lambda (x)
  33.        (setq lst11 (cons (strcat (car x) (cadr x)) lst11))
  34.      )
  35.     lst
  36.   )
  37.   (setq lst11 (acad_strlsort lst11))
  38.   (setq WBJULI (* height 1.4))
  39.   (setq p1 (getpoint "\n请指定插入点:"))
  40.   (setq n 0)
  41.   (foreach x lst11
  42.     (command "text" "NON" p1 height "" x)
  43.     (command)
  44.     (setq p1 (list (car p1) (- (cadr p1) WBJULI) (caddr p1)))
  45.     (setq p1 (polar p1 (* pi 1.5) 1))
  46.     (setq n (1+ n))
  47.   )
  48.   (princ)
  49. )
发表于 2014-1-7 22:06 | 显示全部楼层
要多行就很简单的。。
  1. ;; 查找出现次数最多表项】
  2. ;; 返回表中出现次数和元素
  3. ;; by chlh_jd 发表于 2012-7-18 20:01:02
  4. ;;;http://bbs.mjtd.com/forum.php?mod=redirect&goto=findpost&ptid=95639&pid=539700&fromuid=338795
  5. (defun vl-maxtimes (lst / a len ti new)
  6.   (while lst
  7.         (setq a(car lst)len(length lst)
  8.               ti (- len (length (setq lst (vl-remove a lst))))
  9.               new (cons (cons ti a) new)))
  10.   ;(if new(car(vl-sort new (function (lambda (e1 e2) (> (car e1) (car e2)))))))
  11. )
  12. ;;;
  13. ;;;组码值提取(sk_dxf 图元名 组码)
  14. (defun sk_dxf(en code)
  15.     (if(and(=(type en) 'ENAME)(= (type code) 'INT))
  16.       (cdr(assoc code (entget en))))
  17.   )
  18. ;;;单行文本重复统计
  19. ;;; editor by edata
  20. ;;; 2014-1-7 17:43:51
  21. (defun c:tt(/ EN K NEW_LST PT SS STR_LST)
  22.   (vl-load-com)
  23.   ;(or font_heigth (setq font_heigth 300))
  24.   (if(setq ss(ssget'((0 . "*text"))))
  25.     (progn
  26.       (setq str_lst '())
  27.       (setq font_heigth(sk_dxf (ssname ss 0) 40));按第选择集的第一个文字字高
  28.     (while (setq en(ssname ss 0))
  29.       (setq str_lst(cons (sk_dxf en 1)str_lst))
  30.       (setq ss(ssdel en ss))
  31.       )
  32.       (setq str_lst(reverse str_lst))
  33.       (setq new_lst(vl-sort (vl-maxtimes str_lst) '(lambda(x1 x2)(< (cdr x1)(cdr x2)) )));按文本内容排序
  34.       (if (and (not (null new_lst)) (setq  k -1 pt(getpoint "\n指定放置位置点:")))
  35.       (foreach n new_lst (entmakex (list
  36.                                     (cons 0 "text")
  37.                                     (cons 10 (polar pt (* pi 1.5) (* (setq k(1+ k)) (* font_heigth 1.5))))
  38.                                     (cons 1 (strcat (rtos (car n) 2 0)"      " (cdr n)))
  39.                                     (cons 40 font_heigth)
  40.                                     )
  41.                                   ))
  42.         )      
  43.     )
  44.     (princ"\n Nothing Select Object!!!")
  45.     )
  46.   (princ)
  47.   )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 01:14 , Processed in 0.359723 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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