找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 703|回复: 10

[编程申请]:请教一个类似于天正的墙线剪切的问题。

[复制链接]
发表于 2004-5-11 13:32:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
最近正在编一个程序,每画一笔就会画出三根平行线,但在每组平行线相交的地方,我需要剪切掉重复的线。很类似天正的墙线。
我自己想了几个办法,效果都不是太好,请哪位高手指点一下如何能够实现??已知我的线都在同一层上。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-11 16:45:33 | 显示全部楼层
用  mline命令就可以了,何必编程序呢?其实好多cad的命令很好用,只不过大家没有
留意罢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-12 13:58:41 | 显示全部楼层
mline命令的确可以,mline样式中也有3线的


楼主既然想要这样的程序
我写了一个(练练手)
看看可以不??


[PHP]
(defun c:xj()
  (setq k 1)
  (princ "选者第一组对象<三条平行线>:")
  (setq ss1 (ssget))
  (princ "选者第二组对象<三条平行线>:")
  (setq ss2 (ssget))
  (setq ss1_1 (ssname ss1 0) ss1_2 (ssname ss1 1) ss1_3 (ssname ss1 2))
  (setq ss2_1 (ssname ss2 0) ss2_2 (ssname ss2 1) ss2_3 (ssname ss2 2))
  (repeat 3   
    (command "fillet" ss1_1 (eval(read(strcat "ss2_" (rtos k)))))
    (setq m 1)
    (repeat 3
      (if (/= m k)
        (progn          
          (command "fillet" ss1_2 (eval(read(strcat "ss2_" (rtos m)))))
          )
        )
      (setq n 1)
      (repeat 3
        (if (and (/= n m) (/= n k))
          (progn            
            (command "fillet" ss1_3 (eval(read(strcat "ss2_" (rtos n)))))
            )
          )
        (setq i 0 j 1)
        (setq ss1_1_data (entget ss1_1)
              ss1_2_data (entget ss1_2)
              ss1_3_data (entget ss1_3)
              ss2_1_data (entget ss2_1)
              ss2_2_data (entget ss2_2)
              ss2_3_data (entget ss2_3))
        (setq qd1_1 (cdr (assoc 10 ss1_1_data)) zd1_1 (cdr (assoc 11 ss1_1_data))
              qd1_2 (cdr (assoc 10 ss1_2_data)) zd1_2 (cdr (assoc 11 ss1_2_data))
              qd1_3 (cdr (assoc 10 ss1_3_data)) zd1_3 (cdr (assoc 11 ss1_3_data))
              qd2_1 (cdr (assoc 10 ss2_1_data)) zd2_1 (cdr (assoc 11 ss2_1_data))
              qd2_2 (cdr (assoc 10 ss2_2_data)) zd2_2 (cdr (assoc 11 ss2_2_data))
              qd2_3 (cdr (assoc 10 ss2_3_data)) zd2_3 (cdr (assoc 11 ss2_3_data)))
        (setq a 0)
        (repeat 3
          (setq l 1)
          (setq h 0)
          (repeat 3
            (setq pt1 (eval(read(strcat "qd1_" (rtos j)))) pt2 (eval(read(strcat "zd1_" (rtos j))))
                  pt3 (eval(read(strcat "qd2_" (rtos l)))) pt4 (eval(read(strcat "zd2_" (rtos l)))))
            (if (/= (inters pt1 pt2 pt3 pt4) nil)
              (progn
                (setq h (+ h 1))
                (setq i (+ i 1))
                )
              )
            (setq l (+ l 1))
            )
          (if (= h 0) (setq a nil))
          (setq j (+ j 1))
          )
        (if (and (= i 3) (/= a nil)) (exit))
        (setq n (+ n 1))
        )
      (setq m (+ m 1))
      )
    (setq k (+ k 1))
    )
  )
[/PHP]



命令行输入xj,然后按要求选者就可以了
(选者3条线后点右键,再选另外三条)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-5-12 20:44:31 | 显示全部楼层
是吗??可能我误会了
但是要是这样楼主可以自己修改来实现
而且我认为那样就更简单了
因为那样可以对应的导圆角了,不用套循环了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-5-12 22:28:15 | 显示全部楼层
谢谢大家回贴,我想的是画线后自动剪切,及当线相交以后就自动裁减。
ml肯定不行,二楼把问题想得太简单了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-5-12 22:39:33 | 显示全部楼层
用晓东工具箱
它其实是画的三条线,不过它的中线自动关上了。
你画完打开就行了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-13 10:27:55 | 显示全部楼层
原来是这样呀
楼主看看下面的
至于相交的我再完善
相交的你的意思是具体是什么??
是要和任意的交时都要剪切??是不是要保留中间的线??





[B]
好了相交的也搞定了,楼主看看可以不?
现在还有一个问题就是相交的时候中间不能有任何别的线
因为我是简单的认为3条线一个循环,没有过滤。
把三条线编成组,应该可以实现的
以后再完善了!!
[/B] [/SIZE] [/COLOR]


[PHP]
;主程序
(defun c:qx()  
  (setq w (getreal "线间距: "))
  (setq pt1 (getpoint "起点:"))
  (setq pt2 (getpoint pt1 "选点:"))  
  (setq xz (three_parallel pt1 pt2 w))  
  (setq pt3 pt2)
  (setq xz_1 xz)
  (while pt3
    (setq ptt pt3)   
    (setq pt3 (getpoint pt3 "选点:"))
    (if (/= pt3 nil)
      (progn
        (setq xz_2 (three_parallel ptt pt3 w))
        (three_line_cut xz_1 xz_2)
        (setq xz_2 (cross_cut xz_2 ptt pt3))
        )
      )
    (setq xz_1 xz_2)
    )
  (setq hh (getstring "/n是否闭合<N>: "))
  (if (or (= hh "y") (= hh "Y")) (three_line_cut xz_2 xz))  
  )

;-------------------子程序------------------
;两点间的三条平行线
(defun three_parallel(qd zd w)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq a (angle qd zd))
  (setq qd1 (polar qd (+ a (/ pi 2)) w) qd2 (polar qd (- a (/ pi 2)) w)
        zd1 (polar zd (+ a (/ pi 2)) w) zd2 (polar zd (- a (/ pi 2)) w))  
  (command "line" qd zd "")
  (setq zx (entlast))
  (command "line" qd1 zd1 "")
  (setq x1 (entlast))  
  (command "line" qd2 zd2 "")
  (setq x2 (entlast))  
  (setvar "osmode" os)
  (list zx x1 x2)
  )

;两组平行线剪切
(defun three_line_cut(ss1 ss2)  
  (setq ss1_1 (car ss1) ss1_2 (cadr ss1) ss1_3 (caddr ss1))
  (setq ss2_1 (car ss2) ss2_2 (cadr ss2) ss2_3 (caddr ss2))
  (command "fillet" ss1_1 ss2_1)
  (command "fillet" ss1_2 ss2_2)
  (command "fillet" ss1_3 ss2_3)
  )

;交叉剪切
(defun cross_cut(ss1 pt1 pt2)
  (setq aa1 (angle pt1 pt2))
  (setq pt22 (polar pt1 aa1 w))
  (setq ss (ssadd))  
  (setq ss1_1 (car ss1) ss1_2 (cadr ss1) ss1_3 (caddr ss1))
  (setq pt_list (list pt22 pt2))
  (setq ss (ssget "F" pt_list))
  (if (/= ss nil)
    (progn
      (setq num (sslength ss))
      (setq z_num (fix (/ num 3))
            yn (rem num 3))
      (setq i 1)
      (repeat z_num
        (setq k (* (- i 1) 3))
        (setq ss2_1 (ssname ss (+ k 0))
              ss2_2 (ssname ss (+ k 1))
              ss2_3 (ssname ss (+ k 2)))
        (setq ss1_1_1 (cdr (assoc 10 (entget ss1_1))) ss1_1_2 (cdr (assoc 11 (entget ss1_1)))
              ss1_2_1 (cdr (assoc 10 (entget ss1_2))) ss1_2_2 (cdr (assoc 11 (entget ss1_2)))
              ss1_3_1 (cdr (assoc 10 (entget ss1_3))) ss1_3_2 (cdr (assoc 11 (entget ss1_3)))
              ss2_1_1 (cdr (assoc 10 (entget ss2_1))) ss2_1_2 (cdr (assoc 11 (entget ss2_1)))
              ss2_2_1 (cdr (assoc 10 (entget ss2_2))) ss2_2_2 (cdr (assoc 11 (entget ss2_2)))
              ss2_3_1 (cdr (assoc 10 (entget ss2_3))) ss2_3_2 (cdr (assoc 11 (entget ss2_3))))
        (setq ptt1 (inters ss1_2_1 ss1_2_2 ss2_1_1 ss2_1_2 nil)
              ptt2 (inters ss1_2_1 ss1_2_2 ss2_3_1 ss2_3_2 nil)
              ptt3 (inters ss1_3_1 ss1_3_2 ss2_1_1 ss2_1_2 nil)
              ptt4 (inters ss1_3_1 ss1_3_2 ss2_3_1 ss2_3_2 nil))       
        (command "break" ss1_2 ptt1 ptt2)
        (setq ss1_2 (entlast))
        (command "break" ss1_3 ptt3 ptt4)
        (setq ss1_3 (entlast))
        (command "break" ss2_1 ptt1 ptt3)
        (command "break" ss2_3 ptt2 ptt4)
        (setq i (+ i 1))
        )
      )
    )
  (list ss1_1 ss1_2 ss1_3)
  )
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-5-13 23:38:10 | 显示全部楼层
谢谢8楼,!
你的程序给我不少启示,不过我还得完善。
我想的结果是不管线是否是连续画的,只要想交,就能自动裁减、断开。就是说,当然还比较复杂,希望大家一起研究一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-14 07:53:22 | 显示全部楼层
这个已经是不管是否连续画都会断开的
只是,中间不能有任何别的线,要不也会进入断开,这样三个一组就会乱了
我准备利用组来实现,不过这个现在比较麻烦暂时还没有头绪。
有没有人给点启发!!


[B]
我忘了第一组线没有把剪切加进去
把语句(setq xz_1 xz)给为
(setq xz_1 (cross_cut xz pt1 pt2))
[/B] [/COLOR] [/SIZE]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 11:52 , Processed in 0.206006 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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