明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3376|回复: 11

请大神帮忙分析这一点处怎么可能是裂缝(检查多段线之间的缝隙)

[复制链接]
发表于 2012-8-21 08:42:34 | 显示全部楼层 |阅读模式
本帖最后由 changyiran 于 2012-8-21 16:49 编辑
  1. (defun fjdb(en / x);返回轻量多段线的点表
  2.   (vl-remove-if'not
  3.         (mapcar'(lambda(x)(if(=(car x)10)(cdr x)))(entget en));mapcar返回的是一个表,lambda构造一个匿名函数
  4.   )        
  5. )

这是我写的查询缝隙的程序,根据本程序一共查出了19处缝隙,白色的圆圈标出的确实是裂缝,但是蓝色的圆圈怎么可能是裂缝,两个多段线在这一点处明明是重合的啊,我的程序难道有什么问题吗?请大神们帮忙分析下这个十分困扰我的问题。
  1. (defun c:jcfx(/ BJXDB BJYBJ CXJL EN FXGS J M PDZ QSXZBB QYTYB SS YBJZB TYCCB ZXCXJL);检查缝隙(裂缝、相交缝)
  2.   (command"undo"m)
  3.   (setq cxjl(getreal"\n请输入最大查询距离(0.3):"))
  4.   (setq zxcxjl(getreal"\n请输入最小查询距离(0.0001):"))
  5.   (if (not cxjl)(setq cxjl 0.3))
  6.   (if (not zxcxjl)(setq zxcxjl 0.0001))
  7.   (setq bjybj(getreal"\n请输入标记圆半径(2):")fxgs 0 ybjzb'())
  8.   (if (not bjybj)(setq bjybj 2))
  9.   (setq en(car(entsel"\n请选择外围边界线(如果没有外围线直接回车):")))
  10.   (if (not en);没有外围线
  11.       (progn
  12.   (princ"\n请选择权属线:")
  13.         (setq ss(ssget'((0 . "lwpolyline")(8 . "jzd"))))
  14.   (setq tyccb'()j -1)
  15.       )
  16.       (progn
  17.         (setq bjxdb(fjdb en)fxgs 0);获取边界线点表
  18.         (setq ss(ssget"cp"bjxdb'((0 . "lwpolyline")(8 . "jzd"))));建立边界线内部权属线选择集
  19.   (setq tyccb(list en)j -1);建立图元储存表
  20.       )
  21.   )
  22.   (repeat(sslength ss)
  23.          (setq tyccb(cons (ssname ss (setq j(1+ j)))tyccb))
  24.   )
  25.   (foreach en tyccb
  26.     (setq qytyb(vl-remove en tyccb));建立其余图元储存表
  27.     (setq qsxzbb(fjdb en));获取权属线坐标表
  28.     (foreach pt qsxzbb
  29.        (if(not(vl-position pt ybjzb));该点位没有参加过比较
  30.     (progn
  31.          (setq ybjzb(cons pt ybjzb))
  32.          (setq pdz(vl-some'(lambda(x)
  33.                  (setq jlz(distance pt(vlax-curve-getClosestPointTo x pt)))
  34.            (and(> jlz zxcxjl)(< jlz cxjl)))
  35.          qytyb
  36.             )
  37.          )
  38.     )
  39.        )
  40.       (if pdz
  41.    (progn
  42.      (entmake(list'(0 . "circle")(list 10(car pt)(cadr pt))'(8 . "缝隙标记")(cons 40 bjybj)'(62 . 2)))
  43.      (setq fxgs(1+ fxgs))
  44.    )
  45.       )
  46.     )
  47.   )
  48.   (if(= 0 fxgs)
  49.      (alert"没有发现缝隙处")
  50.      (alert(strcat"共发现"(itoa fxgs)"处缝隙"))
  51.   )
  52.   (princ)
  53. )

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-8-21 10:57:25 来自手机 | 显示全部楼层
我自己调试了下,正式怀疑cad有bug,我分段调试程序时有一部分圆的圆心在黄线上,当程序运行完毕时那些本来圆心在黄线上的圆居然也跑到了红线上,还有黄线上蓝色圈处所在点离红线的距离是0,而红线上蓝色圈处所在点离黄线的距离居然是0.000169285,更崩溃的时程序运行时是0.000169285,而运行结束后再算这个距离居然又变成了0,cad和lisp伤不起啊!
 楼主| 发表于 2012-8-21 10:59:31 来自手机 | 显示全部楼层
如此一来检查多段线缝隙的程序该怎么写呢,哎,真是困扰人啊
 楼主| 发表于 2012-8-21 15:32:26 来自手机 | 显示全部楼层
高手们为什么都不出现呢?
发表于 2012-8-21 16:31:27 | 显示全部楼层
no function definition: FJDB
不知是怎麽回事?
 楼主| 发表于 2012-8-21 16:38:29 来自手机 | 显示全部楼层
我把我自己的研究结果继续写出来,希望有高手能给予合理的解答。设黄色多段线位于蓝色圈圆心处的点为pt1,而红色红色多段线相应位置的点为pt2,黄色线上离pt2最近的点为zj1,红色线上离pt1最近的点为zj2,用equal实验pt1和pt2返回T,zj1和zj2同样返回T,而pt1和zj2以及pt2和zj1居然返回nil,这么奇怪的事情,且不说其他的,根据equal就算等价代换这四个值也应该分别相等啊,真是搞不懂。
 楼主| 发表于 2012-8-21 16:41:45 来自手机 | 显示全部楼层
srv2 发表于 2012-8-21 16:31  no function definition: FJDB  不知是怎麽回事?

哦,这是我自己写的一个返回多段线顶点坐标的一个函数,忘了传了。现在传上去
 楼主| 发表于 2012-8-21 17:37:02 来自手机 | 显示全部楼层
万能的明经啊,帮帮俺吧!
 楼主| 发表于 2012-8-21 18:03:24 来自手机 | 显示全部楼层
调试到现在终于找到原因了,原来是pdz放的位置不对!可以放松了!
 楼主| 发表于 2012-8-21 18:07:53 来自手机 | 显示全部楼层
不过还是有一点不太明白,本该标注在黄色多段线上的圆为什么都跑到了红色多段线上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-20 15:56 , Processed in 0.250450 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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