明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: xstlf

[求助]求教求交点函数怎么写。

  [复制链接]
发表于 2004-12-20 08:28:00 | 显示全部楼层
xstlf发表于2004-12-19 22:14:00现在我是一碰到要求直线交点的函数就死蟹一只了。

已经有3次叫你看置顶的帖子了,看来你是情愿做一只死蟹也不愿意看置顶的求交点的帖子了!!!
 楼主| 发表于 2004-12-20 09:06:00 | 显示全部楼层
我早看了呀,看得眼都花了,这么长的函数就为了求二曲线的交线。若我要求的是所有选择集的交点又想把他们都在交点打断,那不是函数也太肥了吗?变成了大胖子了,有没有更简单一点的呀。meflying老师,不要再说我呀,我怕怕呀,呵呵。算我多嘴。我只是想找出所有的交点,把曲线在交点处打断就行了呀。
发表于 2004-12-20 09:26:00 | 显示全部楼层
我曾看到过求两实体交点的程序,你在论埮中找找,


那个程序不但可以求两直线交点,多义线的多个交点都可以求
发表于 2004-12-20 12:38:00 | 显示全部楼层
仅限于LINE
  1. (vl-load-com)
  2. (defun c:breakall( / ss n i j ents ent1 ent2 pts)
  3.    (setq ss (ssget '((0 . "line"))))
  4.    (setq n (sslength ss))
  5.    (setq i 0)
  6.    (while (< i n)
  7.        (setq ents (append ents (list (list (ssname ss i)))))
  8.        (setq i (1+ i))
  9.    )
  10.    (setq i 0)
  11.    (while (< i n)
  12.        (setq j (1+ i))
  13.        (setq ent1 (ssname ss i))
  14.        (while (< j n)
  15.            (setq ent2 (ssname ss j))
  16.            (setq pts (getinterpoint ent1 ent2))
  17.            (if pts
  18.   (progn
  19.      (setq ents (subst (append (assoc ent1 ents) pts) (assoc ent1 ents) ents))
  20.      (setq ents (subst (append (assoc ent2 ents) pts) (assoc ent2 ents) ents))
  21.   )
  22.            )
  23.            (setq j (1+ j))
  24.        )
  25.        (setq i (1+ i))
  26.    )
  27.    (mapcar 'breaks ents)
  28.    (princ ents)
  29. )
  30. (defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
  31.    (setq ax_ent_1 (vlax-ename->vla-object ent1)
  32.                ax_ent_2 (vlax-ename->vla-object ent2)
  33.    )
  34.    (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  35.    (setq intpoints (vlax-variant-value intpoints))
  36.    (setq i 0)
  37.    (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  38.        (repeat (/ (+ 1
  39.                            (- (vlax-safearray-get-u-bound intpoints 1)
  40.                                  (vlax-safearray-get-l-bound intpoints 1)
  41.                            )
  42.                      )
  43.                      3
  44.                )
  45.            (setq points (append points (list (list
  46.                (vlax-safearray-get-element intpoints i)
  47.                (vlax-safearray-get-element intpoints (+ i 1))
  48.                (vlax-safearray-get-element intpoints (+ i 2))
  49.            )))
  50.            )
  51.            (setq i (+ 3 i))
  52.        )
  53.    )
  54.    points
  55. )
  56. (defun breaks(lst / n i sname sinf ptstart ptend pts)
  57.    (setq sname (car lst))
  58.    (setq sinf (entget sname))
  59.    (setq ptstart (cdr (assoc 10 sinf)))
  60.    (setq ptend (cdr (assoc 11 sinf)))
  61.    (setq pts (cdr lst))
  62.    (setq pts (vl-sort (append (list ptstart ptend) pts) '(lambda(e1 e2) (> (car e1) (car e2)))))
  63.    (setq n (length lst))
  64.    (setq i 0)
  65.    (mapcar 'command (append (list "_.line") pts (list "")))
  66.    (entdel sname)
  67. )
 楼主| 发表于 2004-12-20 14:42:00 | 显示全部楼层
本帖最后由 作者 于 2004-12-20 21:04:41 编辑

谢谢 meflying 老师,这下又可以让我这LISP新手研究上一天半天了。一朵鲜花,略表敬意。上面的那个我试过了,可能还是有点小问题。有些线打不断的,但总体来说很好。就是发现上面的二条直线相交只打断了一条,其中一条没被打断。
 楼主| 发表于 2004-12-21 19:36:00 | 显示全部楼层
(setq ptstart (cdr (assoc 10 sinf)))
(setq ptend (cdr (assoc 11 sinf))) 上面的breaks子程序里面的上面二句。其中。10和11分别指什么呀。哎。我找来找去找不到相关的资料。望这儿所有的老师们能不厌其烦帮我解答一下。我想我现在LISP可以已经快幼儿园毕业了,就让我早点升小学吧。呵呵。
发表于 2004-12-22 08:18:00 | 显示全部楼层
参看帮助文件的DXF部分
发表于 2004-12-22 08:27:00 | 显示全部楼层
再试试
  1. (vl-load-com)
  2. (defun c:breakall( / ss n i j ents ent1 ent2 pts)
  3.    (setq ss (ssget '((0 . "line"))))
  4.    (setq n (sslength ss))
  5.    (setq i 0)
  6.    (while (< i n)
  7.        (setq ents (append ents (list (list (ssname ss i)))))
  8.        (setq i (1+ i))
  9.    )
  10.    (setq i 0)
  11.    (while (< i n)
  12.        (setq j (1+ i))
  13.        (setq ent1 (ssname ss i))
  14.        (while (< j n)
  15.            (setq ent2 (ssname ss j))
  16.            (setq pts (getinterpoint ent1 ent2))
  17.            (if pts
  18.   (progn
  19.      (setq ents (subst (append (assoc ent1 ents) pts) (assoc ent1 ents) ents))
  20.      (setq ents (subst (append (assoc ent2 ents) pts) (assoc ent2 ents) ents))
  21.   )
  22.            )
  23.            (setq j (1+ j))
  24.        )
  25.        (setq i (1+ i))
  26.    )
  27.    (mapcar 'breaks ents)
  28.    (princ)
  29. )
  30. (defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
  31.    (setq ax_ent_1 (vlax-ename->vla-object ent1)
  32.                ax_ent_2 (vlax-ename->vla-object ent2)
  33.    )
  34.    (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  35.    (setq intpoints (vlax-variant-value intpoints))
  36.    (setq i 0)
  37.    (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  38.        (repeat (/ (+ 1
  39.                            (- (vlax-safearray-get-u-bound intpoints 1)
  40.                                  (vlax-safearray-get-l-bound intpoints 1)
  41.                            )
  42.                      )
  43.                      3
  44.                )
  45.            (setq points (append points (list (list
  46.                (vlax-safearray-get-element intpoints i)
  47.                (vlax-safearray-get-element intpoints (+ i 1))
  48.                (vlax-safearray-get-element intpoints (+ i 2))
  49.            )))
  50.            )
  51.            (setq i (+ 3 i))
  52.        )
  53.    )
  54.    points
  55. )
  56. (defun breaks(lst / n i sname sinf ptstart ptend pts)
  57.    (setq sname (car lst))
  58.    (setq sinf (entget sname))
  59.    (setq ptstart (cdr (assoc 10 sinf)))
  60.    (setq ptend (cdr (assoc 11 sinf)))
  61.    (setq pts (cdr lst))
  62.    (setq pts (vl-sort (append (list ptstart ptend) pts) '(lambda(e1 e2) (> (car e1) (car e2)))))
  63.    (setq pts (vl-sort pts '(lambda(e1 e2) (> (cadr e1) (cadr e2)))))
  64.    (setq n (length lst))
  65.    (setq i 0)
  66.    (mapcar 'command (append (list "_.line") pts (list "")))
  67.    (entdel sname)
  68. )
 楼主| 发表于 2004-12-22 11:08:00 | 显示全部楼层
原来所有的组码都在DXF帮助文件里有的呀,谢谢meflying 老师。还有上面的那个改新后的,breakall可能把所有交点打断了,呵呵。再次谢谢。
发表于 2004-12-29 19:45:00 | 显示全部楼层
用用这个(SETQ HZ                (VLA-INTERSECTWITH         HJ1 ZJ1         ACEXTENDNONE))即可!


需先将HJ1,ZJ1线条图元变成VLA对象!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 23:35 , Processed in 0.176966 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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