明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1079|回复: 4

[已解答] 请教处理外边框问题

[复制链接]
发表于 2014-12-10 10:15:51 | 显示全部楼层 |阅读模式
请教一个问题,如左边图,想要求出右边红色外框。请各位帮忙指点,思路或代码。谢谢!

本帖子中包含更多资源

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

x

点评

凸包扫锚在这里http://bbs.mjtd.com/thread-81308-1-1.html  发表于 2014-12-10 15:00
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-12-10 11:47:12 | 显示全部楼层
1 先求出所以虚交点
2 用高飞的程序扫描,求出所有最外的点
3 找出最外交点的对象

点评

感谢黄大师出手指点!  发表于 2014-12-10 12:18
 楼主| 发表于 2014-12-10 17:41:26 | 显示全部楼层
感谢大师再次光临!
发表于 2014-12-10 23:43:20 | 显示全部楼层
本帖最后由 wzg356 于 2014-12-11 00:56 编辑

应该成了,经针对直线情况
  1. ;;;直线的外边框
  2. ;;;by wzg356 20141210
  3. (defun c:wk ( / enlst en ptlst tblst enlst1 i inters1 interslst en1 en2 pt11 pt12 pt21 pt22 pt)
  4. (setq enlst (ss-ents(ssget '((0 . "LINE")))));直线的图元名表
  5. (setq ptlst nil);安全起见,设空
  6. (foreach en enlst
  7.     (setq ptlst (cons (cdr(assoc 10 (entget en))) ptlst))
  8.     (setq ptlst (cons (cdr(assoc 11 (entget en))) ptlst))
  9. );所有线图元顶点表ptlst
  10. (setq tblst(ZL-TB ptlst));凸包点表ptlst
  11. (setq enlst1 nil)
  12. (repeat (setq i (length enlst))
  13.   (setq en (nth (- i 1) enlst))
  14.     (if (and
  15.       (member (cdr(assoc 10 (entget en))) tblst)
  16.       (member (cdr(assoc 11 (entget en))) tblst)
  17.       )
  18.       (setq enlst1 (cons en enlst1))      
  19.     )
  20.     (setq i (- i 1))
  21. );得到在凸包线上的图元名表enlst1
  22. (setq interslst nil)
  23. (setq i 1)
  24. (while (and (setq en1 (car enlst1))(setq en2 (cadr enlst1)))
  25.   (setq pt11 (cdr(assoc 10 (entget en1))))
  26.   (setq pt12 (cdr(assoc 11 (entget en1))))
  27.   (setq pt21 (cdr(assoc 10 (entget en2))))
  28.   (setq pt22 (cdr(assoc 11 (entget en2))))
  29.   (if (= i 1);第一次循环计算第一边与最后一边交点
  30.     (progn
  31.       (setq pt31 (cdr(assoc 10 (entget (last enlst1)))))
  32.       (setq pt32 (cdr(assoc 11 (entget (last enlst1)))))
  33.       (if (setq inters1(inters pt11 pt12 pt31 pt32 nil));虚拟交点
  34.         (setq interslst(cons inters1 interslst))
  35.       )
  36.     )
  37.   )
  38.   (if (setq inters1(inters pt11 pt12 pt21 pt22 nil));与下一边的虚拟交点
  39.     (setq interslst (cons inters1 interslst));虚拟交点表
  40.   )
  41.   (setq enlst1(cdr enlst1))
  42.   (setq i (+ i 1))
  43. )
  44. (cond
  45.   ((> (length interslst )2);;画外框
  46.     (command "pline" (foreach pt interslst (command "non" pt)))
  47.     (command "PEDIT" (entlast) "c" "")
  48.     (command "chprop" (entlast) "" "c" "1" "")
  49.     (princ "外框绘制成功!")   
  50.   )
  51.   ((> (length tblst )2)  ;只画凸包
  52.     (command "pline" (foreach pt tblst (command "non" pt)));凸包
  53.     (command "PEDIT" (entlast) "c" "")
  54.     (command "chprop" (entlast) "" "c" "1" "")
  55.     (princ "凸包绘制成功!")   
  56.   )
  57.   (T(princ "你选的对象无法画外包框!"))
  58. )
  59. )

  60. ;;;======================
  61. ;;;以下为两个通用函数

  62. ;选择集到图元列表 by 明经论坛
  63. (defun ss-ents(ss / i en ents)
  64.    (setq i 0)
  65.    (repeat (sslength ss)
  66.       (setq en (ssname ss i)
  67.                   ents (cons en ents)
  68.                   i (1+ i)
  69.       )
  70.     )
  71.    ents
  72. )

  73. ;;;      凸包分析
  74. ;;;from zml184的搜狐博客
  75. ;;;功能:得到包围点表的凸多边形顶点列表
  76. ;;;参数:lst_pt ----二维点表
  77. ;;;返回:包围这些点的凸多边形顶点列表(逆时针)
  78. (defun ZL-TB (LST_PT / ZL-TB-001 PT0 ANG LST_JG PT)
  79.     ;;=======================
  80.     ;;功能:找出pt0的下一点
  81.     ;;全局变量 lst_pt ----点表,
  82.     ;;         ang    ----当前的方位角
  83.     (defun ZL-TB-01 (LST PT / LST_TMP N ANGI DIST E1 E2)
  84.   (setq LST (vl-remove PT LST_PT))
  85.   ;;从当前点出发找余下点表中方位角
  86.   (setq LST_TMP '())
  87.   ;;计算方位角
  88.   (foreach N LST
  89.       (setq ANGI (angle PT N)
  90.       DIST (distance PT N)
  91.       )
  92.       (if  (< ANGI ANG)
  93.     ()
  94.     (setq LST_TMP (cons (list N ANGI DIST) LST_TMP))
  95.       )
  96.   )
  97.   ;;根据方位角排序(若方位角相等,则区距离远的)
  98.   (setq LST_TMP (vl-sort LST_TMP
  99.              '(lambda  (E1 E2)
  100.             (or  (< (cadr E1) (cadr E2)) ;_先比较方位角
  101.           (and (= (cadr E1) (cadr E2))
  102.                (> (caddr E1) (caddr E2))
  103.           )
  104.             )
  105.         )
  106.           )
  107.   )
  108.   ;;返回
  109.   (caar LST_TMP)
  110.     )
  111.     ;;=======================
  112.     ;;先找Y坐标最小的点
  113.     (setq LST_PT (vl-sort LST_PT
  114.         '(lambda (E1 E2)
  115.              (< (cadr E1) (cadr E2))
  116.          )
  117.      )
  118.     )

  119.     (setq PT0   (car LST_PT) ;_起点
  120.     LST_JG (list PT0)
  121.     ANG   0.0
  122.     )
  123.     ;;直到回到起点
  124.     (while
  125.   (progn
  126.       (setq PT (ZL-TB-01 LST_PT (car LST_JG))) ;_计算下一点
  127.       (if  (equal PT PT0) ;_判断是否回到起点
  128.     NIL
  129.     (setq ANG    (angle (car LST_JG) PT)
  130.           LST_JG (cons PT LST_JG)
  131.     )
  132.       )
  133.   )
  134.     )
  135.     ;;返回
  136.     (reverse LST_JG)
  137. )
  138. (princ)

复制代码
 楼主| 发表于 2014-12-11 09:11:33 | 显示全部楼层
wzg356 发表于 2014-12-10 23:43
应该成了,经针对直线情况

感谢这位朋友,都这么晚了,还百忙中抽空写代码。乃冬日里的阳光。!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 17:38 , Processed in 0.177028 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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