明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 98172|回复: 384

[【Gu_xl】] 【Gu_xl】[讨论]根据选择的直线·、圆弧等实体,自动生成有实体围成的所有边界

    [复制链接]
发表于 2010-2-4 22:51:00 | 显示全部楼层 |阅读模式
本帖最后由 Gu_xl 于 2013-5-14 09:59 编辑

  1. ;;;La为图层名
  2. (defun Layer_zdsb (La / sel make_point_list n mn en entype pt1 pt2 pL sel k p1 p2 enlast ensel)
  3. ;;;===============================
  4. ;;;表操作函数
  5. ;;;判断点 p1 是否在点集PL中,是返回T ,不是返回nil,a为精度
  6. ;;;例 (IsInPointList '(1.0001 1.001 0) '((1 1 0) (2 1 0)) 0.001),返回T
  7. (defun IsInPointList (p1 PL a)
  8. ;(setq n (length PL))
  9. (if (member t (mapcar '(lambda (b) (equal p1 b a)) PL))
  10. t
  11. nil
  12. )
  13. )
  14. ;;;取出图元索引i对应的值
  15. (defun dxf (ent i)
  16. (cdr (assoc i (entget ent)))
  17. )
  18. ;;;取圆弧的起点、终点。中点
  19. (defun arc_3point (a / cenp radius STP ENPmp arcmidpoint)
  20. (setq cenp (cdr (assoc 10 (entget a))))
  21. (setq radius (cdr (assoc 40 (entget a))))
  22. (setq STP (vlax-curve-getPointAtParam A (vlax-curve-getstartparam A)))
  23. (setq ENP (vlax-curve-getPointAtParam A (vlax-curve-getEndParam A)))
  24. (setq arcmidpoint (polar (polar stp (angle stp enp) (/ (distance STP ENP) 2.0))
  25. (angle cenp (polar stp (angle stp enp) (/ (distance STP ENP) 2.0)))
  26. (- radius (distance (polar stp (angle stp enp) (/ (distance STP ENP) 2.0)) cenp))))
  27. (list stp enp arcmidpoint)
  28. )


  29. ;;;根据选择集中的line、arc、circle,生成点集
  30. (defun make_point_list (s / PL)
  31. (setq n 0 PL '() mn (sslength s))
  32. (repeat mn
  33. (setq en (ssname s n)
  34. enType (dxf en 0))
  35. (cond
  36. ((= enType "LINE")
  37. (setq pt1 (dxf en 10)
  38. pt2 (dxf en 11))
  39. (if (not (IsInPointList pt1 pl 0.00001))
  40. (setq pl (cons pt1 pl))
  41. );if
  42. (if (not (IsInPointList pt2 pl 0.00001))
  43. (setq pl (cons pt2 pl))
  44. );if
  45. )
  46. ((= enType "ARC")
  47. (setq pt1 (car (arc_3point en))
  48. pt2 (cadr (arc_3point en))
  49. )
  50. (if (not (IsInPointList pt1 pl 0.00001))
  51. (setq pl (cons pt1 pl))
  52. );if
  53. (if (not (IsInPointList pt2 pl 0.00001))
  54. (setq pl (cons pt2 pl))
  55. );if

  56. )

  57. );cond
  58. (setq n (1+ n))
  59. );repeat
  60. (setq pl pl)
  61. );make_point_list
  62. ;;;此处SEL选择集可自行修改为命令行选择代码
  63. (setq sel (ssget "x" (list '(0 . "line,arc,circle") (cons 8 La))))
  64. (if sel
  65. (progn
  66. (setq Plist (make_point_list sel))
  67. (setq enlast (entlast) ensel (ssadd))
  68. (setvar "CLAYER" la)
  69. (command "_.boundary" "a" "b" "n" sel "" "" )
  70. (setq n -1
  71. mn 0
  72. k (length Plist))
  73. (repeat k
  74. (setq p0 (nth (setq n (1+ n)) Plist) mn n)
  75. (repeat (- k n 1)
  76. (setq p1 (nth (setq mn (1+ mn)) Plist))
  77. (setq p2 (midpoint p0 p1))
  78. (command p2)
  79. );repeat
  80. );repeat
  81. (command "")
  82. (while (setq en (entnext enlast))
  83. (setq enlast en)
  84. (ssadd en ensel)
  85. );while
  86. (command "erase" sel "")
  87. (setq ensel ensel)
  88. );progn
  89. nil
  90. );if
  91. )   
程序缺点是选择的实体多了,计算速度太慢,请高手讨论,提供共好的算法!
程序加以改进后,完整代码如下:
游客,本帖隐藏的内容需要发帖数高于 10 才可浏览,你当前发帖数只有 0

评分

参与人数 4明经币 +3 金钱 +60 收起 理由
飞鱼StrawHaat + 1 前来学习!!!
树櫴希德 + 1 + 35 gU版 太强大了 至于多段线 EXPLODE就是LINE.
flytoday + 1 很给力!
自贡黄明儒 + 25 很实用的。

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2012-3-19 12:25:57 | 显示全部楼层
谢谢作者
回复 支持 0 反对 1

使用道具 举报

发表于 2024-11-5 16:20:40 | 显示全部楼层
Gu_xl 发表于 2010-2-6 18:52
不好意思,该处代码有误,已修改((= enType "ARC")(setq pt1 (car (arc_3point en))pt2 (cadr (arc_3point  ...

学习下,谢谢
发表于 2019-1-20 16:39:49 | 显示全部楼层
xuexi                     
发表于 2010-2-5 09:17:00 | 显示全部楼层

用手工选择限制选择实体的范围

(setq sel (ssget "x" (list '(0 . "line,arc,circle") (cons 8 La))))

改为:(setq sel (ssget (list '(0 . "line,arc,circle") (cons 8 La))))

发表于 2010-2-6 09:31:00 | 显示全部楼层

Gu_xl 你好:

程序对圆弧是不是有问题啊!

如果仅选择线是O.K.

如果选择含有圆弧时,有错误讯息!

ERROR:损坏的引数类型: lentityp nilosnap
目前的物件锁点模式: 端点,中点,中心点,交点
输入物件锁点模式的清单: endp,mid,int,cen

 楼主| 发表于 2010-2-6 18:52:00 | 显示全部楼层

Gu_xl 你好:

程序对圆弧是不是有问题啊!

如果仅选择线是O.K.

如果选择含有圆弧时,有错误讯息!

ERROR:损坏的引数类型: lentityp nilosnap
目前的物件锁点模式: 端点,中点,中心点,交点
输入物件锁点模式的清单: endp,mid,int,cen

 

不好意思,该处代码有误,已修改

((= enType "ARC")
(setq pt1 (car (arc_3point en))
pt2 (cadr (arc_3point en))
)

发表于 2010-2-6 19:38:00 | 显示全部楼层

Gu_xl你好:

依照你的方式修正程序,

程序运行O.K.

感谢你的帮忙!

发表于 2010-12-22 17:58:56 | 显示全部楼层
收藏了,下来学习
谢谢楼主的分享
发表于 2010-12-22 20:01:05 | 显示全部楼层
感谢分享,gu_xl
发表于 2011-2-16 13:26:31 | 显示全部楼层
这个东西厉害。感谢版主分享。
发表于 2011-2-17 05:08:09 | 显示全部楼层
下来备用,谢谢分享!
发表于 2011-2-17 07:43:31 | 显示全部楼层
好程序,下载收藏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 01:12 , Processed in 0.238994 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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