明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5340|回复: 11

[求助]如何:join几条线段(多线段),然后闭合这条连接后的多线段?

[复制链接]
发表于 2007-4-2 11:20:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-4-2 11:23:54 编辑

废话一句:本人刚入门,这是我的第二个程序。既然刚入门,提问题也许很菜,但还是要提。诚请知道的人答复!深表感谢!

本人的意思:AutoLisp调用Command的“pedit”命令,使它能够完成连接几条线段,多线段,在选择几条多线段之后,使这条合成后的多线段闭合。

本人做出过不少尝试,但都失败。用到了while循环,但因为join命令本身有一个循环,所以弄了两天一直没有搞懂应该怎么办。

(defun c:pj ()
    (setvar "cmdecho" 1)
    (command "peditaccept" 1)
 
     (command "pedit" "j" )  ;;;调用Pedit命令,join命令
     (setq pl(entsel))        ;;;取值,
     (while pl                    ;;;如果pl存在,即如果选取了线段,则执行循环,但join本身就有一个循环
          (setq pl(entsel))       

       )
     (command  "c" "")    ;;;调用闭合命令,使多线段闭合

发表于 2019-1-25 22:44:08 | 显示全部楼层
linshiyin2 发表于 2010-6-2 15:45
(defun fsxm-silenceexit (/ *error*) ;无声退出 ;by fsxm  (t (setq *error* strcat)))
(defun c:n  ...

8楼的程序,太好了!这个是我想要的!谢谢!
发表于 2024-8-31 14:30:25 | 显示全部楼层
感谢大家的分享,学习了
发表于 2019-7-10 13:44:23 | 显示全部楼层
感谢楼上分享!赞!
发表于 2007-4-2 13:03:00 | 显示全部楼层

1. EDIT 命令后不应该为 "j", 而应该为图元名!

2. 在这种情况下不适合用 while ,如果循环结束,它传递给command的参数就是 nil

3. 最好先获取参数然后再command

4. (while pl (setq pl(entsel)))为什么不直接用 ssget

5. 当你第一次  (setq pl(entsel))  时,是否要将结果进行判断,是多段线还是直线,因为类型不同

   命令行参数也不一样

6. 与其这样还不如干脆这样

(defun c:pj ()
     (command "pedit" pause "j" pause "" "c" "")
)

发表于 2007-4-2 14:39:00 | 显示全部楼层

(ENTSEL)返回点表,要运用(CAR (ENTSEL))才能返回图元名

要将第一次选择结果进行判断,是多段线还是直线、弧……

(defun c:pj ()
    (setvar "cmdecho" 0)
    (command "peditaccept" 1)
 
     (command "pedit")  ;;;调用Pedit命令,join命令
     (setq pl (car (entsel)))        ;;;取值,
     (IF pl                    ;;;如果pl存在,即如果选取了线段,则执行循环,但join本身就有一环
          (PROGN
          (command pl)
          (if (WCMATCH (CDR (ASSOC 0 (ENTGET PL))) "*POLYLINE") (command "J") (command "Y" "J"))
          (setq pl (SSGET))
   (command pl "" "C" "");;;调用闭合命令,使多线段闭合
          )
       )
  (setvar "cmdecho" 1)
(PRINC)
)

 楼主| 发表于 2007-4-2 14:54:00 | 显示全部楼层

哈哈哈哈 ~!

太好了,太谢谢了 !

根据caoyin大侠的提示,终于解决了问题。非常感谢!

依找caoyin的意见,修改如下:

(defun c:pj ()
  (setvar "cmdecho" 1)
  (command "peditaccept" 1)    ;;;如果是直线,则直接变为多线段从而跳过询问
  (setq pl_sel (ssget))        ;;;取得选择集,也就是仁兄所说,先获取参数。
  (command "pedit" "m" pl_sel "" "j" "0.01" "c" "")   ;;;万事俱备,只要调用command命令即可,

                                                      ;;;其中“j”前必须加上一个空格命令,
 )

学习是一件很快乐的事情啊!

哈哈 ,

 楼主| 发表于 2007-4-2 15:06:00 | 显示全部楼层

刚看了三楼的提示,程序是能解决问题,可是我不太明白一些问题:

1.(command pl) 这句不知道什么作用。是相当于CAD命令行中先放入之前的选择集的意思?

2.在之前已经有了“ (command "peditaccept" 1)”这句,后面是不是(我认为是)就不用判断是直线还是多线段了?

谢谢你的答复,希望与您交流。

发表于 2007-4-2 15:21:00 | 显示全部楼层

(command pl)是执行PEDIT后的先择对象,

(command "peditaccept" 1)后面是不用判断是直线还是多线段了,但在ACAD2002以下版中没有这个系统变量

 楼主| 发表于 2007-4-5 18:55:00 | 显示全部楼层
终于知道一点点了,知道返回的对象是怎么回事了。总算有一点进步了
发表于 2010-6-2 15:45:00 | 显示全部楼层

(defun fsxm-silenceexit (/ *error*) ;无声退出 ;by fsxm
  (t (setq *error* strcat))
)

(defun c:n (/ ss *error*)         ;连接多义线
(defun *error* (msg) (princ))
(princ "\n连接多义线")
(setq ss (ssget '((-4 . "<or")
(-4 . "<AND") (0 . "LWPOLYLINE") (70 . 0) (-4 . "AND>")
(0 . "LINE")
(0 . "ARC")
(-4 . "or>")))
)
(or ss (fsxm-silenceexit))
(setvar "cmdecho" 0)
(setvar "PEDITACCEPT" 1)
(if (= (sslength ss) 1)
  (vl-cmdf "PEDIT" (ssname ss 0) "j" "all" "" "")
  (command "PEDIT" "m" "P" "" "j" "" "")
)
(setvar "PEDITACCEPT" 0)
(princ)
)

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

本版积分规则

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

GMT+8, 2024-9-23 20:17 , Processed in 0.208526 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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