找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: xtdwynij

[已解决] 多选直线按指定打断距离打断直线

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-12 21:26:49 | 显示全部楼层
newer 发表于 2013-4-12 20:50
XYP是你的院长?

不是.大家都这么叫的!我也这样叫了.呵呵!还是搞不出来!修剪圆的时候只能修剪第一个圆,有没有高手出手一下呀把这功能实现了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-12 22:16:19 | 显示全部楼层
xtdwynij 发表于 2013-4-12 21:26
不是.大家都这么叫的!我也这样叫了.呵呵!还是搞不出来!修剪圆的时候只能修剪第一个圆,有没有高手出手一下 ...

你为什么要修剪园呢?前后算出两点BREAK就是了。不过需要注意的是,你打断实体后,就会新生成个实体了,一个是原来的线,另外一个是entlast。

所以,你没必要在循环处理实体了,按照等分数循环,然后始终对entlast 根据p10 算出第二点,然后在break.

需要注意的是,P10不一定就肯定是按着顺序来的(第一点),为了使程序更稳重,程序还需要把点按照起始的角度排序后找到第一点在处理,或者在你break后,entlast实体的P10和P11哪个距离断点近。距离近的在作为entlast的起点继续算下一点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-13 13:59:35 | 显示全部楼层
XDSoft 发表于 2013-4-12 22:16
你为什么要修剪园呢?前后算出两点BREAK就是了。不过需要注意的是,你打断实体后,就会新生成个实体了,一 ...

有指定打断距离的系统变量么?如果是这样的话!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-13 14:02:22 | 显示全部楼层
xtdwynij 发表于 2013-4-13 13:59
有指定打断距离的系统变量么?如果是这样的话!

晓东大神。能出手让我学习学习呀~想了二天了。思路是有。可就是无法实现!我昨夜又想了。得到要打断的直线的长度和角度。然后再生成新的线 !可就是无法做出来!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-13 14:58:29 | 显示全部楼层
xtdwynij 发表于 2013-4-13 14:02
晓东大神。能出手让我学习学习呀~想了二天了。思路是有。可就是无法实现!我昨夜又想了。得到要打断的直线 ...

大神担当不起啊。

思路:

1、始终对entlast找第一个打断位置pt。程序最开始时候是你选的线e.
2、间隙gap你不是自己设定嘛,打断第一点p1=(polar pt (- an) (/ gap 2.0)),打断第二点 p2=(polar pt an (/ gap 2.0))

3. 打断后,对entlast在继续找第一个打断点,重复2,直到entlast线的长度小于你设定的长度,结束循环。

临时想的,可能不完善。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-13 15:01:54 | 显示全部楼层
xtdwynij 发表于 2013-4-13 14:02
晓东大神。能出手让我学习学习呀~想了二天了。思路是有。可就是无法实现!我昨夜又想了。得到要打断的直线 ...

在你打断直线前,线是一个实体,打断后 变成2个实体了,图形数据库肯定要添加一个实体的,这个实体就是entlast.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-13 15:13:14 | 显示全部楼层
XDSoft 发表于 2013-4-13 14:58
大神担当不起啊。

思路:

谢谢!问了这么久了。可能是我知识还不够吧!慢慢来吧!打断的我也想过。只是打断于点的吧?还有我指定的距离呢?比如说我指定打断的距离为4MM。那么不就还有4个MM的直线没有被删除?entlast这一个函数是生成图元名!现在是修改图元。这个函数也能用么?我还真不知道呢。具体如何用呢?能给个例子不?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-13 16:08:40 | 显示全部楼层
xtdwynij 发表于 2013-4-13 15:13
谢谢!问了这么久了。可能是我知识还不够吧!慢慢来吧!打断的我也想过。只是打断于点的吧?还有我指定的 ...

entlast函数不是生成图元名,是得到当前图形数据库最后一个实体,也就是你打断线后,新生成的实体。

之所以没给你直接贴代码,是因为初学编程都有这个过程,当初我也是为了写一个程序半夜有灵感想起来,开开电脑继续写,这样最后你成功后那种喜悦是什么都不可替代的,希望你也多有这样感觉。

我们写写程序是“玩”,玩就要得到仅仅把他当成工作所不能带给自己的快乐。

加油,你完成后记得把你的心得和代码贴上来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-13 20:56:20 | 显示全部楼层
XDSoft 发表于 2013-4-13 16:08
entlast函数不是生成图元名,是得到当前图形数据库最后一个实体,也就是你打断线后,新生成的实体。

之 ...

我最初开始时也是想打断!但打断的话只能打断于点吧?那还有一小段的线没有删除呢!我完成后会把代码和思路都贴上来的!刚刚才回来.呵呵!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-4-13 21:07:01 来自手机 | 显示全部楼层
entmake新线,删除旧线条
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-4-13 23:07:37 | 显示全部楼层
eachy 发表于 2013-4-13 21:07
entmake新线,删除旧线条

也想过!但是做不出来!想得到有好多办法。但最终一个也搞不定!给个代码学习一下啦!我明天就按晓东大神的做一下看看我能做出来不?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-14 01:09:04 | 显示全部楼层
纯Lisp参考
[pcode=lisp,true](defun c:tt (/ mkline getpts ss i sl e el sp ep pl)
  ;;Make Line
  (defun mkline        (el p1 p2)
    (setq el (subst (cons 10 p1)
                    (assoc 10 el)
                    el
             )
          el (subst (cons 11 p2)
                    (assoc 11 el)
                    el
             )
    )
    (entmake el)
  )
  ;;divide n
  (defun getpts        (sp ep n dw / d an d1 pl pp x)
    (setq d  (distance sp ep)
          an (angle sp ep)
          d1 (/ d n)
          tf t
    )
    (repeat n
      (setq p1 (polar sp
                      an
                      (- d1
                         (if tf
                           dw
                           (* 2 dw)
                         )
                      )
               )
      )
      (setq pl (cons (list sp p1) pl))
      (setq sp (polar p1 an (* dw 2))
            tf nil
      )
    )
    (setq lp (car pl))
    (reverse (append (list (list (car lp) ep))
                     (cdr pl)
             )
    )
  )
  ;;Main
  (while (setq ss (ssget '((0 . "line"))))
    (setq sl (sslength ss)
          i  -1
    )
    (repeat sl
      (setq e  (ssname ss (setq i (1+ i)))
            el (entget e)
            sp (vlax-curve-getstartpoint e)
            ep (vlax-curve-getendpoint e)
            d  (vlax-curve-getEndParam e)
      )
      (cond
        ((< 0 d 20.)
         (setq pl (getpts sp ep 2 0.75))
        )
        ((<= 20 d 100)
         (setq pl (getpts sp ep 2 2.))
        )
        ((< 100 d)
         (setq pl (getpts sp ep (1+ (fix (/ d 100.))) 2.))
        )
      )
      (mapcar '(lambda (x)
                 (mkline el (car x) (cadr x))
               )
              pl
      )
      (vl-cmdf ".erase" ss "")
    )
  )
  (princ)
)[/pcode]

点评

这个不是纯LISP。纯LISP没有VL开头的函数。  发表于 2013-4-14 08:13

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9812个

财富等级: 富甲天下

发表于 2013-4-14 08:10:21 | 显示全部楼层
[pcode=lisp,true](defun c:tt ()
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setq ss (ssget '((0 . "LINE"))))
  (setq i 0)
  (repeat (sslength ss)
    (setq name (ssname ss i))
    (setq ent (entget name))
    (setq pt10 (cdr (assoc 10 ent)))
    (setq pt11 (cdr (assoc 11 ent)))
    (setq dist (distance pt10 pt11))
    (setq ang (angle pt10 pt11))
    (cond
      ((> dist 100.0)
        (setq gs (1+ (fix (/ dist 100))))
      )
      (T
        (setq gs 1)
      )
    )                                       ; 桥位的个数
    (setq b (if (>= dist 20)
              2
              0.75
            )
    )
    (setq abc 1)
    (setq dist1 (/ dist (1+ gs)))
    (repeat gs
      (setq pt1 (polar pt10 ang dist1))        ; 距离
      (setq pt2 (polar pt1 ang b)
            pt3 (polar pt1 ang (- b))
      )
      (command "_.break" "nea" pt2 "nea" pt1)
      (setq dist1 (+ dist1 dist1))
      (setq abc (1+ abc))
    )
    (setq i (1+ i))
  )
  (setvar "osmode" 3)
  (setvar "osmode" 1)
)
[/pcode]

评分

参与人数 1D豆 +2 收起 理由
XDSoft + 2 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-14 09:19:13 | 显示全部楼层
用Break方法,Vlax-curve 类函数根据需要选择
[pcode=lisp,true];;定数等分点,不包括起始点
(defun xdlsp_pts_div (sp ep n / d d1 an p1 pl)
  (setq        d  (distance sp ep)
        d1 (/ d n)
        an (angle sp ep)
  )
  (repeat (1- n)
    (setq p1 (polar sp an d1)
          pl (cons p1 pl)
          sp p1
    )
  )
  (reverse pl)
)
(defun c:tt (/ mkline getpts ss i sl e el sp ep pl)
  ;;divide n
  (defun getpts        (sp ep n dw / pts an)
    (setq pts (xdlsp_pts_div sp ep n)
          an  (angle sp ep) ;_此处用通用函数的话计算了两次,Lisp要高效就要注意这些细节
    )
    (reverse (apply 'append
                    (mapcar '(lambda (x)
                               (list (polar x (+ pi an) dw)
                                     (polar x an dw)
                               )
                             )
                            pts
                    )
             )
    );_生成逆序点,用来Break
  )
  ;;Main
  (while (setq ss (ssget '((0 . "line"))))
    (setq sl (sslength ss)
          i  -1
    )
    (repeat sl
      (setq e  (ssname ss (setq i (1+ i)))
            el (entget e)
            sp (vlax-curve-getstartpoint e);_比assoc + cdr 简单高效
            ep (vlax-curve-getendpoint e)
            d  (vlax-curve-getEndParam e);_对Line而言省了distance,如果是spline,arc,pline 要改改
      )
      (cond
        ((< 0 d 20.)
         (setq pl (getpts sp ep 2 0.75))
        )
        ((<= 20 d 100)
         (setq pl (getpts sp ep 2 2.))
        )
        ((< 100 d)
         (setq pl (getpts sp ep (1+ (fix (/ d 100.))) 2.))
        )
      )
      (while pl
        (vl-cmdf ".break" (list e sp) "_f" "_none" (car pl) "_none" (cadr pl));_始终选择的是原实体
        (setq pl (cddr pl))
      )     
    )
  )
  (princ)
)[/pcode]

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:17 , Processed in 0.191044 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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