明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14630|回复: 27

[源码] 【悬赏!!!】画多段线打断于交点处

[复制链接]
发表于 2013-8-21 21:04:38 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 yeahyeah 于 2013-8-21 21:23 编辑

昨晚看到一个很好的帖子《求画直线相交断己》,也看到了G版老师的程序。昨晚内心欣喜之情真是说不出来的好。

我是做建筑工程电气电信设计的,画施工图时,常常会遇到管线“交叉”(其实是交点处交叉分层布置)的情况,所以画多段线打断于交点处这样的程序真是饥渴啊。

由于G版的原程序是不包括处理多段线的,我就在他的程序的基础上,试着改了下(我改的程序见二楼)结果遇到些很棘手的问题。

我才学LISP没到一个月,能力实在有限,现特悬赏征集画多段线打断于交点处解决方案。

下面我把问题交代清楚:
两条交叉的线都是多段线,一条已经存在,另一条是新画的,要达到的效果是新画的多段线自动断口经过,程序中需要能设置打短距离。
我把G版的程序改完之后遇到的问题如下图:

在要打断的多段线上总是还会生成一段多段线。而且导致打断距离和预想的不相等,总是相差一个经过的那条多段线线宽的距离。


当遇到下图这种线型时,能碰到的,会出现下图中左边那条红线的情况;没碰到的时候,就会完全穿越而过,导致彻底失败,连个断点也没有了。



我希望遇到这种线型时能够像下图这样。而且,如果旁边有两条多段线与穿越而过的这条多段线距离很近时,穿越的多段线不会断掉。



另,附加的期望要求(如果实在达不到也就算了,但是我希望大家接着研究,让它达到):
1、G版的程序只能在一个图层中操作,可是我们画施工图时,往往有个建筑底图(一般我把图层放在251图层,颜色251),我希望画多段线与底图有相交时不会对多段线有任何影响。
2、经过文字时,能够很好地断掉,不要在比如“0”的文字中间还有多段线的断线。


附件: 您需要 登录 才可以下载或查看,没有账号?注册
 楼主| 发表于 2013-8-21 21:10:08 | 显示全部楼层
本帖最后由 yeahyeah 于 2013-8-21 21:12 编辑

;;画多段线打断于交点处

(defun c:kk (/ LA P0 PT S PL A d)
  (if (null *d*)
    (setq *d* 0)
  )
  (setq d (getdist (strcat "\n打断距离<" (rtos *d* 2 2) ">:")))
  (if (null d)
    (setq d *d*)
    (setq *d* d)
  )
  (setq d (* 0.5 d))
  (setq xww (getvar 'Plinewid))                ;线宽
  (setq la (getvar 'clayer))
  (setq p0 (getpoint "\n第一点:"))
  (while (setq pt (getpoint p0 "\n下一点:"))
    (setq s
           (ssget "f"
                  (list p0 pt)
                  (list        (cons 0 "*line,LWPOLYLINE,arc,circle,ellipse")
                        (cons 8 la);只能在一个图层里
                  )
           )
    )
    (if        s
      (progn
        (setq pl                      ;我感觉问题就出在这个setq语句里
               (vl-sort
                 (apply        'append                ;apply function
                        (mapcar
                          '(lambda (x) (mapcar 'cadr (cdddr x)))
                                        ;mapcar function
                          (ssnamex s)        ;mapcar list1
                        )                ;apply list
                 )                        ;end apply ;vl-sort list
                 '(lambda (a b)
                    (< (distance a p0) (distance b p0))
                  )                        ;lambda:参数是两个点           ;vl-sort comparison-function
               )                        ;end vl-sort
        )
        (setq a p0)
        (foreach b pl
          (if (not (equal p0 b (* 0.1 d)))
            (progn
              (entmake
                (list
                  '(0 . "LWPOLYLINE")
                  '(100 . "AcDbEntity")
                  '(100 . "AcDbPolyline")
                  '(90 . 2)
                  (cons 43 xww)
                  (cons 10 a)
                  (cons 10 (polar b (angle pt p0) d))
                )
              )
              (setq a (polar b (angle p0 pt) d))
            )
          )                                ;整个if是foreach的求值表达式
        )
        (entmake
          (list
            '(0 . "LWPOLYLINE")
            '(100 . "AcDbEntity")
            '(100 . "AcDbPolyline")
            '(90 . 2)
            (cons 43 xww)
            (cons 10 a)
            (cons 10 pt)
          )
        )
      )
      (entmake
        (list
          '(0 . "LWPOLYLINE")
          '(100 . "AcDbEntity")
          '(100 . "AcDbPolyline")
          '(90 . 2)
          (cons 43 xww)
          (cons 10 p0)
          (cons 10 pt)
        )
      )
    )
    (setq p0 pt)
  )
  (princ)
)
回复

使用道具 举报

 楼主| 发表于 2013-8-21 23:32:27 | 显示全部楼层
悬赏呢!晚安美好的各位!
回复

使用道具 举报

 楼主| 发表于 2013-8-22 07:26:52 来自手机 | 显示全部楼层
我觉得需要对经过的对象做二次判断,看看是不是同一个图元,如果是,取先后两次经过的点的中点。来自: Android客户端
回复

使用道具 举报

 楼主| 发表于 2013-8-22 18:13:06 来自手机 | 显示全部楼层
各位下班了吗?来看看帖子呀,可好看了,要快!!快快快!yeah!来自: Android客户端
回复

使用道具 举报

 楼主| 发表于 2013-8-23 19:46:58 | 显示全部楼层
您今天还有没接受、没完成的任务哟~~~
回复

使用道具 举报

发表于 2013-8-23 22:08:03 | 显示全部楼层
看附件。。。

本帖子中包含更多资源

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

x

点评

谢谢老师!您的这个程序我看过了,很不错的程序,有可借鉴的地方。但是,像我改G版的这个吧,也是可以打断的,但是打断距离出现了错误。。。就差这么一点点了。。。唉……  发表于 2013-8-23 22:33
回复

使用道具 举报

 楼主| 发表于 2013-8-25 15:21:50 | 显示全部楼层
最近怎么这么多人号外号外,悬赏悬赏呢?
都把伦家欺负到底层弃了。。。
回复

使用道具 举报

发表于 2013-8-27 21:29:45 | 显示全部楼层
帮楼主顶起。

点评

谢谢!这个帖子都要让我绝望了。  发表于 2013-8-27 21:41
回复

使用道具 举报

发表于 2013-8-27 21:49:19 | 显示全部楼层
楼主要有耐心,高手一般都很忙。

点评

感谢支持!  发表于 2013-8-28 21:20
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 17:14 , Processed in 0.180688 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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