明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: xiaxiang

剪切穿过圆的图元,如何判断剪切圆内还是圆外(已解决)

  [复制链接]
发表于 2011-10-31 16:38 | 显示全部楼层
...为何此处非要执行两次...
是的,多年以来未见改善,就两次呗
 楼主| 发表于 2011-10-31 16:46 | 显示全部楼层
highflybir 发表于 2011-10-31 15:40
(polar cen  ang  (+ rad eps))
之类的可以让你直接取得圆内或者圆外的一点.

感谢高飞鸟!现上传非偏移方法的圆内外剪切程序,直接求点集的,这样速度比偏移快吗?可以批量处理的来测试一下。

  1. (defun c:ctrim ( / circ_pts lst ang inc tmp seg pt ent el pt rad
  2.                    ctrim_err x zmode adist f_pts svd_os svd_cmd svd_err)

  3. (defun ctrim_err (s)
  4.   (if(/= s "Function cancelled")
  5.   (princ(strcat "\n\n" s))     )
  6.   (setvar "cmdecho" svd_cmd)
  7.   (setvar "osmode" svd_os)
  8.   (setq *error* svd_err)
  9. )

  10. (defun circ_pts (cen rad segs / lst cnt)
  11.   (setq cnt 0)
  12.   (repeat segs
  13.     (setq lst (cons (polar cen (+ 0 (* cnt (/ (* pi 2) segs))) rad)
  14.     lst
  15.       )
  16.   cnt (1+ cnt)
  17.     )
  18.   )
  19.   ;(setq lst (append lst (list (nth 0 lst))))
  20.   (princ)
  21. lst
  22. )
  23. (setq ent     (car(entsel "\nSelect circle: "))
  24.        svd_err *error*
  25.        *error* ctrim_err
  26.        svd_os  (getvar "osmode")
  27.        svd_cmd (getvar "cmdecho")
  28. )
  29. (setvar "cmdecho" 0)
  30. (setvar "osmode" 0)
  31.    (initget  128 "Z X")
  32.   (setq zmode(getkword "\n输入选项 (Z内剪切/X外剪切)(默认Z内剪切): "))
  33.   (if (null zmode) (setq zmode "Z"))
  34.     (cond
  35.      ((= zmode "Z") (setq adist -0.1))
  36.      ((= zmode "X") (setq adist 0.1))
  37.     )
  38. (if(and ent
  39.      (=(cdr(assoc 0(entget ent)))"CIRCLE")
  40.     )
  41.   (progn
  42.    (setq el (entget ent))
  43.    (setq pt (cdr (assoc 10 el)))
  44.    (setq rad (cdr (assoc 40 el)))
  45.    (setq f_pts(circ_pts pt (+ rad adist) 25))  
  46.    (repeat 2   
  47.    (command "trim" ent "" "f")   
  48.    (foreach x f_pts(command x))  
  49.    (command "" "")
  50.    )
  51.    (redraw)
  52.   )
  53. )
  54. (setvar "cmdecho" svd_cmd)
  55. (setvar "osmode" svd_os)
  56. (setq *error* svd_err)
  57. (princ)
  58. )


本帖子中包含更多资源

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

x

点评

能框选就更好了  发表于 2012-9-13 17:16
autocad2010也未能外剪切  发表于 2012-5-12 13:05
2006测试未能外剪切  发表于 2012-1-8 11:15
程序很实用,希望能扩展到所有封闭曲线。。。最好按shift后还能延伸  发表于 2011-11-6 15:25

评分

参与人数 1明经币 +1 收起 理由
yjr111 + 1

查看全部评分

发表于 2011-11-1 16:17 | 显示全部楼层
本帖最后由 zzl9105 于 2011-11-1 16:33 编辑

为何不直接求出圆与直线的交点,直接进行裁剪呢?
楼主有没有考虑下,闭合多段线对与之相交的内部线的裁剪呀?


发表于 2011-11-6 15:23 | 显示全部楼层
xiaxiang这程序很不错,能不能不局限为圆,而是扩展到所有封闭曲线?
 楼主| 发表于 2011-11-6 17:56 | 显示全部楼层
yjr111 发表于 2011-11-6 15:23
xiaxiang这程序很不错,能不能不局限为圆,而是扩展到所有封闭曲线?

考虑到这一类程序太多,就不发上来献丑了。
关键问题是,像椭圆这一类图元还可以勉强求点集,
如果不规则多线,多义线,则除了偏移,似乎没有更好的办法。
飞诗那个方向剪切做得不错,也是点集栏选方式。也可以山寨一个。
至于延伸,无非就是在grread上做做文章,也没有什么技术含量
发表于 2011-11-6 19:18 | 显示全部楼层
xiaxiang 发表于 2011-11-6 17:56
考虑到这一类程序太多,就不发上来献丑了。
关键问题是,像椭圆这一类图元还可以勉强求点集,
如果不规 ...

从收集的源码里找到的,剪切矩形框内的线,和你这放一起。。。不知道谁写的。。。
  1. (defun c:tt
  2. (/ rect e0 e1 pt x ptx pty l1 i p1 p2 p1x p1y point count)
  3. (setvar "osmode" 0)
  4. (setq l1 nil)
  5. (setq i 0)
  6. (setq rect (car (entsel "\n请选择需剪切的矩形:")))
  7. (setq e0 (entget rect))
  8. (while (setq x (nth i e0))
  9. (if (= (car x) 10)
  10. (progn
  11. (setq ptx (nth 1 x))
  12. (setq pty (nth 2 x))
  13. (setq x (list ptx pty))
  14. (setq l1 (cons x l1))
  15. )
  16. )
  17. (setq i (1+ i))
  18. )
  19. (reverse l1)
  20. (setq p1 (car l1))
  21. (setq p1x (nth 0 p1))
  22. (setq p1y (nth 1 p1))
  23. (setq count 0)
  24. (repeat 3
  25. (setq count (+ count 1))
  26. (setq pt (nth count l1))
  27. (setq ptx (nth 0 pt))
  28. (setq pty (nth 1 pt))
  29. (setq point (mapcar '+ p1 pt))
  30. (setq point (mapcar '/ point '(2.0 2.0 2.0)))
  31. (if
  32. (and (/= (nth 0 point) p1x)
  33. (/= (nth 0 point) ptx)
  34. (/= (nth 1 point) p1y)
  35. (/= (nth 1 point) pty)
  36. )
  37. (setq p point)
  38. )
  39. )
  40. (setq l1 nil)
  41. (command "offset" 5 rect p "")
  42. (setq e0 (entlast))
  43. (setq e1 (entget e0))
  44. (princ e1)
  45. (setq i 0)
  46. (while (setq x (nth i e1))
  47. (if (= (car x) 10)
  48. (progn
  49. (setq ptx (nth 1 x))
  50. (setq pty (nth 2 x))
  51. (setq x (list ptx pty))
  52. (setq l1 (cons x l1))
  53. )
  54. )
  55. (setq i (1+ i))
  56. )
  57. (reverse l1)
  58. (setq p1 (car l1))
  59. (setq p2 p1)
  60. (command "erase" e0 "")
  61. (setq count 0)
  62. (repeat 3
  63. (setq count (+ count 1))
  64. (setq pt (nth count l1))
  65. (command "trim" rect "" "f" p1 pt "" "")
  66. (setq p1 pt)
  67. )
  68. (command "trim" rect "" "f" p1 p2 "" "")
  69. (setvar "osmode" 687)
  70. )
发表于 2011-11-7 10:11 | 显示全部楼层
yjr111 发表于 2011-11-6 19:18
从收集的源码里找到的,剪切矩形框内的线,和你这放一起。。。不知道谁写的。。。

对正方形,经测试,可以
这个似乎不能剪多段线的,比如下图

本帖子中包含更多资源

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

x

点评

xiaxiang不肯写啊,怕我们学会了砸他的饭碗:)  发表于 2011-11-7 10:52
发表于 2024-5-6 19:06 | 显示全部楼层
yjr111 发表于 2011-11-6 19:18
从收集的源码里找到的,剪切矩形框内的线,和你这放一起。。。不知道谁写的。。。

感谢分享,很好用的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-24 03:34 , Processed in 0.134190 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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