找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1092|回复: 4

[原创]:交点断开------圆断开

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-24 12:58:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1. ;; 上班后书也看不进去,写个程序玩玩,也是不久前写的曲线断
  2. ;; 开的继续。其中有几处不足,当然所提出的不足在论坛上都有
  3. ;; 过讨论,大家可以搜索下,可能有答案也可能没有,有兴趣的
  4. ;; 参与下完善不足。积极参与者提议斑竹给与奖励

  5. ;; 为方便网友使用,附件系Vla方法"打断"圆的编译文件,

  6. ;; 两实体的交点,本函数没有过滤重合交点。在过滤重合点问题上
  7. ;; LUCAS曾经用 member 写过 ,但使用中发现达不到要求

  8. (defun ea:ints (e1 e2 / pts ipts)
  9.   (setq        ipts (vlax-variant-value
  10.                (vla-intersectwith
  11.                  e1
  12.                  e2
  13.                  acExtendNone
  14.                )
  15.              )
  16.   )
  17.   (if (> (vlax-safearray-get-u-bound ipts 1) 0);是否有交点
  18.     (progn
  19.       (setq ipts
  20.              (vlax-safearray->list ipts)
  21.       )
  22.       (while (> (length ipts) 0)
  23.         (setq pts (cons        (list (car ipts)
  24.                               (cadr ipts)
  25.                               (caddr ipts)
  26.                         )
  27.                         pts
  28.                   );此处可以在添加时判断是否有重合点
  29.         )
  30.         (setq ipts (cdddr ipts))
  31.       )
  32.     )
  33.   )
  34.   pts                                        ;也可以在这里单独去除重合点
  35. )
  36. ;;基于实体的点的排序函数,就是有一系列点是在曲线实体上或外部,基于这个曲线实体,
  37. ;;从开始点到结束点排序这些点。结果是这些点依据实体的开始点开始排升序。
  38. ;;本函数用的是不去除重合点,实际中可能某些情况下要去除重合点
  39. ;;比如下面断开圆的应用中
  40. (defun ea:SortPointOnCurve (points curve / pl1)
  41.   (setq        pl1 (mapcar '(lambda (x /)
  42.                        (vlax-curve-getparamatpoint
  43.                          curve
  44.                          (vlax-curve-getclosestpointto curve x)
  45.                        )
  46.                      )
  47.                     points
  48.             )
  49.   )
  50.   (mapcar '(lambda (n) (nth n points))
  51.             (vl-sort-i pl1 '<)          
  52.   )
  53. )
  54. ;;
  55. ;;"断开"园的程序
  56. ;;
  57. ;; 使用了 Vla 方法 和 Entmake
  58. ;|

  59. AddArc Method

  60. Creates an arc given the center, radius, start angle, and end angle of the arc.

  61. Signature

  62. RetVal = object.AddArc(Center, Radius, StartAngle, EndAngle)

  63. StartAngle, EndAngle   Double; input-only

  64.                        The start and end angles, in radians, defining the arc.
  65.                        A start angle greater than an end angle defines a
  66.                        counterclockwise arc.
  67. |;
  68. ;; Vla 方法
  69. (defun c:BrkCr (/ line ssc thisdrawing modelspace intp cenpt lcen r)
  70.   (if (and (setq line (entsel "\n选择线: "))
  71.            (progn
  72.              (princ "\n选择园.....")
  73.              T
  74.            )
  75.            (setq ssc (ssget '((0 . "circle"))))
  76.       )
  77.     (progn
  78.       (setq thisdrawing        (vla-get-activedocument (vlax-get-acad-object))
  79.             modelspace        (vla-get-modelspace thisdrawing)
  80.       )
  81.       ;; ssget 后马上处理的话可以使用 ActiveSelectionSet 省去转换实体一步
  82.       (vlax-for        circle (vla-get-activeselectionset thisdrawing)
  83.         ;;本处没有去除重合点,可能造成程序失败
  84.         (setq intp  (ea:SortPointOnCurve
  85.                       (ea:ints (vlax-ename->vla-object (car line))
  86.                                circle
  87.                       )
  88.                       circle
  89.                     )
  90.               ;;注意:当有很多交点时就要先用[点集沿曲线排序]函数对交点排序
  91.               intp  (append intp
  92.                             (list (car intp))
  93.                     )                        ;闭合圆
  94.               cenpt (vla-get-center circle) ;center point , variant
  95.               lcen  (vlax-safearray->list (vlax-variant-value cenpt))
  96.                                         ;Lisp 点
  97.               r            (vla-get-radius circle) ;半径
  98.         )
  99.         (vla-delete circle)                ;删除圆
  100.                                         ;循环一段段生成圆弧
  101.                                         ;只要两个交点时才可以
  102.         (while (and (> (length intp) 1)
  103.                     (not (equal        (angle lcen (car intp))
  104.                                 (angle lcen (cadr intp))
  105.                                 0.001
  106.                          )
  107.                     )
  108.                )                        ;交点中没有过滤,这里就要加判断
  109.             (vla-addarc
  110.               modelspace
  111.               cenpt
  112.               r
  113.               (angle lcen (car intp))
  114.               (angle lcen (cadr intp))
  115.             )
  116.                                         ;此处 startangle endangle 是不能相等的
  117.                                         ;相等了就是 Circle 了
  118.           (setq intp (cdr intp))
  119.         )
  120.       )
  121.     )
  122.   )
  123.   (princ)
  124. )
  125. ;; 混合方法 生成 Arc 用 Entmake 方法
  126. (defun c:test1 (/ line circle clst intp cenpt ssc n)
  127.   (if (and (setq line (entsel "\n选择线: "))
  128.            (progn
  129.              (princ "\n选择园.....")
  130.              T
  131.            )
  132.            (setq ssc (ssget '((0 . "circle"))))
  133.       )
  134.     (progn
  135.       (setq n        0
  136.             ssl        (sslength ssc)
  137.       )
  138.       (repeat ssl
  139.         (setq circle (ssname ssc n))
  140.         (setq intp  (ea:SortPointOnCurve
  141.                       (ea:ints (vlax-ename->vla-object (car line))
  142.                                (vlax-ename->vla-object circle)
  143.                       )
  144.                       (vlax-ename->vla-object circle)
  145.                     )
  146.               clst  (entget circle)
  147.               intp  (append intp
  148.                             (list (car intp))
  149.                     )
  150.               cenpt (cdr (assoc 10 clst))
  151.         )
  152.         (entdel circle)
  153.         (while (and (> (length intp) 1)
  154.                     (not (equal        (angle cenpt (car intp))
  155.                                 (angle cenpt (cadr intp))
  156.                                 0.001
  157.                          )
  158.                     )
  159.                )
  160.           ;;entmake 方法
  161.           (entmake (list '(0 . "ARC")
  162.                          '(100 . "AcDbEntity")
  163.                          '(100 . "AcDbCircle")
  164.                          (assoc 10 clst)
  165.                          (assoc 40 clst)
  166.                          '(100 . "AcDbArc")
  167.                          (cons 50 (angle cenpt (car intp)))
  168.                          (cons 51 (angle cenpt (cadr intp)))
  169.                    )
  170.           )
  171.           (setq intp (cdr intp))
  172.         )
  173.         (setq n (1+ n))
  174.       )
  175.     )
  176.   )
  177.   (princ)
  178. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-3-24 14:46:05 | 显示全部楼层
为了切磋交流,希望最好把命题的已知条件,最后的要求说清楚,不然编程时总会遗漏这,忘掉那?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-4 11:21:16 | 显示全部楼层
生成arc这一步,可用circle的实体表,然后替换,删除部分不要的信息,这样能更方便保持circle的其它属性,如颜色。
你这样处理,准确的表述是“断开到当前层".
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 11:34:35 | 显示全部楼层
最初由 梦断江南 发布
[B]生成arc这一步,可用circle的实体表,然后替换,删除部分不要的信息,这样能更方便保持circle的其它属性,如颜色。
你这样处理,准确的表述是“断开到当前层". [/B]

这个程序仅是写交点断开时的一个测试片断,没有考虑其他属性。发此主题的用意不在代码本身,完整的将在另外一个帖子内给出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-23 00:56:53 | 显示全部楼层
程序运行起来很慢,速度太慢了,不好啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-18 00:24 , Processed in 0.542285 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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