明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4197|回复: 20

如何让不交的线的端点自动相交

  [复制链接]
发表于 2004-2-2 14:04:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-2-2 16:51:11 编辑

我又遇到一个难题,就是如何检查一个网格之中没有相交的点。当你输入一个最大值时,让所有小于这个值的不交的线的端点和出头的端点自动相交。网格都是line。 谢谢。



本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-2-2 18:53:00 | 显示全部楼层
  1.   (defun ModPt(ents ptDes ptSou / ents2)
  2.    (setq ents2 ents)
  3.    (setq pt1 (cdr (assoc 10 ents)))
  4.    (setq pt2 (cdr (assoc 11 ents)))
  5.    (if (equal pt1 ptSou 0.000000001)
  6.        (setq ents2 (subst (cons 10 ptDes) (assoc 10 ents2) ents2))
  7.        (setq ents2 (subst (cons 11 ptDes) (assoc 11 ents2) ents2))
  8.    )
  9.    (entmod ents2)
  10. )(defun main( / ss n ent ents ents2 pt11 pt12 pt21 pt22 ptInter dist2)
  11.    (setq m 0)
  12.    (setq l 0)
  13.    (setq ss (ssget '((0 . "LINE"))))
  14.    (setq n (sslength ss))
  15.    (setq i 0)
  16.    (if (not dist)
  17.        (setq dist (getint "\n输入距离:"))
  18.        (progn (setq dist2 (getint (strcat "\n输入距离<" (itoa dist) ">:")))
  19.            (if dist2
  20.   (setq dist dist2)
  21.            )
  22.        )
  23.    )
  24.    (repeat n
  25.        (setq ent (ssname ss i))
  26.        (setq ents (entget ent))
  27.        (setq pt11 (cdr (assoc 10 ents)))
  28.        (setq pt12 (cdr (assoc 11 ents)))
  29.        (setq j 0)
  30.        (repeat n
  31.            (if (/= i j)
  32.   (progn
  33.      (setq ent (ssname ss j))
  34.      (setq ents2 (entget ent))
  35.      (setq pt21 (cdr (assoc 10 ents2)))
  36.      (setq pt22 (cdr (assoc 11 ents2)))
  37.      (setq ptInter (inters pt11 pt12 pt21 pt22 nil))
  38.      (cond
  39.          ((and ptInter (< (distance pt11 ptInter) dist) (> (distance pt11 ptInter) 0.0000001))
  40.            (setq ents (modpt ents ptInter pt11)))
  41.          ((and ptInter (< (distance pt12 ptInter) dist) (> (distance pt12 ptInter) 0.0000001))
  42.            (setq ents (modpt ents ptInter pt12)))
  43.      )
  44.   )
  45.            )
  46.            (setq j (1+ j))
  47.        )
  48.        (setq i (1+ i))
  49.    )
  50. )
 楼主| 发表于 2004-2-3 09:19:00 | 显示全部楼层
飞版主真不愧为Lisp高手,这么难的程序也能编好。


程序的思路实在太巧妙了,谢谢飞版主。
发表于 2004-2-3 10:25:00 | 显示全部楼层
思路似乎还比较过得去,不过方法我自己还是不太满意,主要是循环次数太多了,总共要循环n×n次(n为直线条数),这样如果要处理的直线太多就会很慢
 楼主| 发表于 2004-2-3 11:00:00 | 显示全部楼层
飞版主我发现了一个怪问题,在局部用这个程序每问题,但如果图形很大zoom-extend后,用这个程序会有很多线丢失,我仔细看了程序,也找出原因。速度还挺快。

本帖子中包含更多资源

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

x
发表于 2004-2-3 14:22:00 | 显示全部楼层
修正
  1. (defun ModPt(ents ptDes ptSou / ents2 pt1 pt2)
  2.    (setq ents2 ents)
  3.    (setq pt1 (cdr (assoc 10 ents)))
  4.    (setq pt2 (cdr (assoc 11 ents)))
  5.    (if (equal pt1 ptSou 0.000000001)
  6.        (progn
  7.            (setq ents2 (subst (cons 10 ptDes) (assoc 10 ents2) ents2))
  8.            (setq pt11 ptDes)
  9.        )
  10.        (progn
  11.            (setq ents2 (subst (cons 11 ptDes) (assoc 11 ents2) ents2))
  12.            (setq pt12 ptDes)
  13.        )
  14.    )
  15.    (entmod ents2)
  16. )(defun main( / ss n ent ents ents2 pt11 pt12 pt21 pt22 ptInter dist2)
  17.    (setq m 0)
  18.    (setq l 0)
  19.    (setq ss (ssget '((0 . "LINE"))))
  20.    (setq n (sslength ss))
  21.    (setq i 0)
  22.    (if (not dist)
  23.        (setq dist (getint "\n输入距离:"))
  24.        (progn (setq dist2 (getint (strcat "\n输入距离<" (itoa dist) ">:")))
  25.            (if dist2
  26.   (setq dist dist2)
  27.            )
  28.        )
  29.    )
  30.    (repeat n
  31.        (setq ent (ssname ss i))
  32.        (setq ents (entget ent))
  33.        (setq pt11 (cdr (assoc 10 ents)))
  34.        (setq pt12 (cdr (assoc 11 ents)))
  35.        (setq j 0)
  36.        (repeat n
  37.            (if (/= i j)
  38.   (progn
  39.      (setq ent (ssname ss j))
  40.      (setq ents2 (entget ent))
  41.      (setq pt21 (cdr (assoc 10 ents2)))
  42.      (setq pt22 (cdr (assoc 11 ents2)))
  43.      (setq ptInter (inters pt11 pt12 pt21 pt22 nil))
  44.      (cond
  45.          ((and ptInter (< (distance pt11 ptInter) dist) (> (distance pt11 ptInter) 0.0000001))
  46.            (setq ents (modpt ents ptInter pt11)))
  47.          ((and ptInter (< (distance pt12 ptInter) dist) (> (distance pt12 ptInter) 0.0000001))
  48.            (setq ents (modpt ents ptInter pt12)))
  49.      )
  50.   )
  51.            )
  52.            (setq j (1+ j))
  53.        )
  54.        (setq i (1+ i))
  55.    )
  56. )
 楼主| 发表于 2004-2-3 15:23:00 | 显示全部楼层
飞版主,好像还有一点问题,当距离输入80运行后,原来不出头的线,现在出头了。不知如何修改为好?


       

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-2-6 09:00:00 | 显示全部楼层
我这两天都在试这个程序,我发现在一块封闭的网格运行没什么问题,但多复制几个网格到不同的地方就会出现问题,真烦人啊。不知哪位大侠可以帮忙解决一下。


在下不胜感激。谢谢。


       

发表于 2004-2-6 09:05:00 | 显示全部楼层
问题我找出来了,不过这个如还按原来的方法,判断条件就变得很复杂,也没有想出好办法,等我再想想。
发表于 2004-2-6 12:28:00 | 显示全部楼层

;;BY 龍龍仔(LUCAS)

;;這是別一種方法,但效果也不好,必需放大並小圍範執行,距離也要提供很精確

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-27 15:53 , Processed in 0.210986 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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