明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2419|回复: 8

【已完成】获取所有图块包括嵌套块(多重块)内圆的圆心坐标(当前坐标系下的值)

[复制链接]
发表于 2009-1-12 16:27 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-2-4 23:59:19 编辑
  1. 请大家修改一下程序,在取得块中圆心的时候,对于嵌套块,圆心就偏差了,如何修改才能实现采集嵌套块中的圆心坐标不产生偏离?谢谢!!
  2. [CODE][font=courier new]
  3. (defun AllEntityInBlkdef (blk / bn blkdef e typ el )
  4.   (setq bn     (cdr (assoc 2 (entget blk)))
  5. blkdef (tblobjname "block" bn)
  6.   )
  7.   (while (setq e (entnext blkdef))
  8.     (setq typ (cdr (assoc 0 (entget e))))
  9.     (if (= typ "INSERT")
  10.       (setq el (append (AllEntityInBlkdef e) el))
  11.       (setq el (cons e el))
  12.     )
  13.     (setq blkdef e)
  14.   )
  15.   el
  16. )
  17. (defun c:AentinBl (/ i en ss entlst ABentlst) ;bn) if while repeat 三函数 foreach
  18.   (setq ss  (ssget '((0 . "INSERT")))
  19. ABentlst '()
  20.   )
  21.   (if ss
  22.     (repeat (setq i (sslength ss))
  23.       (setq en (ssname ss (setq i (1- i)))
  24.      entlst   (AllEntityInBlkdef en)
  25.      ABentlst (append (list (list (cons en (length entlst)) entlst)) ABentlst)
  26.       )
  27.       ;;(princ (strcat "该块内共有" (itoa (length entlst)) "个实体\n"))
  28.     )
  29.     (princ "*** 你没有选择任何图块 ***")
  30.   )
  31.   (princ ABentlst)
  32.   ;;返回的结果(((第i个图块图元名 . 块内实体图元数) (<图元名: 7ef771b0>...)) ...)
  33. ;;;  (princ)
  34. )
  35. ;; 获取图块(包括嵌套块)内所圆的有圆心坐标,返回圆心坐标组成的表:(pt0 pt1 pt2 ... ptn)
  36. (defun c:GetBlockCircen (/        Par_list      Par_Item
  37.     Par_ent       Par_ent_insPtptcenlst
  38.     Sub_list      Out_LoopN     In_LoopN
  39.     ent        entdata      CenPt
  40.    )
  41.   (setq Par_list (c:AentinBl)
  42. ptcenlst '()
  43.   )
  44.   ;;循环
  45.   (repeat (setq Out_LoopN (length Par_list))
  46.     (setq Par_Item (nth (setq Out_LoopN (1- Out_LoopN)) Par_list)
  47.    Par_ent (car (car Par_Item))
  48.    Par_ent_insPt (cdr (assoc 10 (entget Par_ent)))
  49.    Sub_list (car (cdr Par_Item))
  50.     )
  51.     (foreach ent Sub_list
  52.       (setq entdata (entget ent))
  53.       (if (= (cdr (assoc 0 entdata)) "CIRCLE")
  54. (setq CenPt    (trans (trans (cdr (assoc 10 entdata)) Par_ent 1) 1 0);OCS坐标系(distance Par_ent_insPt '(0 0))
  55.        ptcenlst (append
  56.     ptcenlst
  57.     (list (list (+ (car Par_ent_insPt) (car CenPt))
  58.          (+ (cadr Par_ent_insPt) (cadr CenPt))
  59.          (+ (caddr Par_ent_insPt) (caddr CenPt))
  60.           );仅对单层图块或插入点重合在一点嵌套块适用
  61.     )
  62.          )
  63. )
  64. ;;取得的是世界坐标值(不一定,要看块的插入点?还是建立块的时候的坐标系情况?),使用的时候需要再转换为用户坐标值
  65. ;;经过测试,取得坐标值,与图块的插入点相关,所以上面加上块的插入点偏移值
  66.       )
  67.     )
  68.   )
  69.   (command "pline"
  70.     (foreach i (trans_pt_0->1 ptcenlst) (command i))
  71. ;;;    ""
  72.   )     ;该语句实现,由点表画线
  73.   (princ ptcenlst)
  74.   (princ)
  75. )
  76. ;;; ****************************************************
  77. ;;; 坐标点由世界坐标系转换到用户坐系  2007.6.10
  78. ;;; ****************************************************
  79. (defun trans_pt_0->1 ( ptlst / )
  80.   (mapcar '(lambda (x) (trans x 0 1)) ptlst)
  81. )
  82. (defun trans_pt_1->0 ( ptlst / )
  83.   (mapcar '(lambda (x) (trans x 1 0)) ptlst)
  84. )
  85. ;;先取得块里有多少个子块,然后逐一用VAL-GET-LAYER就好了。(VLA-GET-LAYER(VLA-ITEM BLKOBJ I))
  86. [/FONT][CODE]
  1. 程序已经完成,采用了多种方法,有两种方法对任意情况的图块均得出正确的值。
复制代码
发表于 2012-11-26 17:25 | 显示全部楼层
强大无比啊   
发表于 2012-11-26 17:25 | 显示全部楼层
再顶  太有用了
发表于 2012-11-26 17:26 | 显示全部楼层
改好了????????
发表于 2012-11-26 17:27 | 显示全部楼层
程序有点看不懂啊       55 水平菜啊我
发表于 2012-11-26 17:27 | 显示全部楼层
为什么神贴都没人来顶?  我再顶2
发表于 2012-11-26 17:28 | 显示全部楼层
其实我要刷帖数啊   
发表于 2012-11-26 17:28 | 显示全部楼层
呵呵   这个帖子不错   楼主  强大
发表于 2012-11-26 17:29 | 显示全部楼层
心怀敬仰啊!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 20:26 , Processed in 0.528455 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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