找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3044|回复: 5

[LISP函数]:请教老师在编lisp中遇到的问题:如何把pL多义线的各顶点按顺序编号?

[复制链接]
发表于 2004-3-10 08:26:54 | 显示全部楼层 |阅读模式

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

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

×
请问老师和各位高手:我在编程(lisp)时,不知如何把pL多义线的各顶点按顺序自动编号。
比如,一条PL多义线有80个顶点,我希望把一端的起点设为T1,第二点自动编为T2,......至
最后一点自动编为T80;然后在输出的顶点坐标文件时,把T1、T2、T3......T80等与顶点坐标
一一对应上。
多谢陈老师和各位高手指教。

下面是我下载老师的有关程序,请教老师如何把‘各顶点自动编号’也加到程序中?
是不是要用regapp函数扩展数据呢?

**********************************************************************************
作(译)者:  陈伯雄  
 上传时间:2002年9月3日  
(Defun C:PLL ()
       (PrinC "\n这是对 PolyLine 进行数据分析的基本程序...")
       (While (Progn (SetQ pen (Car (EntSel "\n指定一条 PolyLine: ")))
                        (/= "POLYLINE" (Cdr (Assoc 0 (EntGet pen))))
                )
                (Alert "所指对象不是 PolyLine,请重新指定...")
       )                                              ;指定PolyLine
       (SetQ pel (EntGet pen)           ;取出对象表
              ptp (Cdr (Assoc 70 pel))   ;取出结束片段型
              wpl '()                       ;自建的点位数表
           pen (EntNext pen)
       )
       (While (/= "SEQEND" (Cdr (Assoc 0 (EntGet pen)))) ;如果没结束
               (SetQ pel (EntGet pen)           ;取得顶点对象数据表
               plp (Cdr (Assoc 10 pel))    ;取出控制点点位
                      par (Cdr (Assoc 42 pel))     ;取出弓弦比
                      wpl (Cons (List plp par) wpl)    ;将数据加到WPL表中
               )
               (SetQ pen (EntNext pen))                ;搜索下一个对象
       )
       (SetQ ct (If (= 0 (Cadr (Car wpl))) "直线片段封闭" "弧片段封闭"))
       (SetQ wpl (Cons (Last wpl) wpl) ;加入封闭点
       wpl (Reverse wpl)           ;整理WPL表
       rl (Length wpl)
              pn 0
       )            
       (SetQ clk (If (Or (= 0 ptp) (= 128 ptp)) "开口" "封闭"))  
       (SetVar “pdmode” 3)
       (Repeat (1- rl)                 ;逐点分析
               (SetQ al (Nth pn wpl)  ;取出点数据表
                     pt (Car al)        ;取出点位
               )
         (Command "point" pt)
         (PrinC "\n") (PrinC al)   
              (If (And (/= 0.0 (Cadr al)) (Nth pn wpl)) ;如果是弧片断
                   (Progn (SetQ gx (Cadr al)               ;取出弓比
         bj (* (ATAN (ABS gx)) 4) ;计算包角
                                   np (Car (Nth (1+ pn) wpl));取出下一点位
                                   xc (* 0.5 (Distance pt np));半弦长计算
                                   gg (* gx xc)                  ;弓高计算
                                    rr (/ (+ (* xc xc)(* gg gg)) (* 2 gg))
                           )
                           (SetQ cp (Polar pt (SetQ pa (Angle pt np)) xc)  
                                  cp (Polar cp (+ pa (* 0.5 Pi)) (- rr gg))
                           )
                           (Command "text" "m" cp 2 0  
(StrCat "R" (RToS (Abs rr)))
                       "text" "" (AngToS bj)
                       "circle" cp 5
                           )
                    )
               )
               (SetQ pn (1+ pn)) ;搜索序号步进
       )
       (Alert (StrCat "结束段状态:\n"
                  clk
                        (If (= "封闭" clk) ct "")
              )
       )
       (PrinC)
)  
**********************************************************************************
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-3-11 09:04:56 | 显示全部楼层

Re: [LISP函数]:请教老师在编lisp中遇到的问题:如何把pL多义线的各顶点按顺序编号?

最初由 tywsc 发布
[B]请问老师和各位高手:我在编程(lisp)时,不知如何把pL多义线的各顶点按顺序自动编号...[/B]

  1. (defun c:test ()
  2.   (setq poly (car (entsel)))
  3.   (setq ptlst (acet-geom-vertex-list poly))
  4.   (setq n 0)
  5.   (while (< n (length ptlst))
  6.     (princ (strcat "\nT" (itoa n) "  "))
  7.            (princ (nth n ptlst))
  8.     (setq n (1+ n))
  9.     )
  10.   (princ)
  11. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-11 20:17:02 | 显示全部楼层
也可以这样:

  1. (setq e (entget (car (entsel))))
  2. (setq n 1)
  3. (foreach x e
  4.   (if (= (car x) 10)
  5.     (progn (princ (strcat "\nT" (itoa n) " "))
  6.            (princ (nth 1 x))
  7.            (setq n (1+ n))
  8.     )
  9.   )
  10. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-11 23:11:06 | 显示全部楼层
感谢这个论坛,感谢二位老师指路。
这里高手真多。我要加倍努力。
多谢了!多谢了!多谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-13 09:38:14 | 显示全部楼层
1楼的只适用于polyline,
2楼的polyline和lwpolyline都行,但不知道没装express时能否使用,
3楼的只适用于lwpolyline,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-13 19:38:00 | 显示全部楼层
6楼的适用polyline和lwpolyline,不用装et, 要求2000以上版本

  1. ;;列 pl,lwpl顶点.
  2. (defun c:plnpt (/ obj ptlst z i)
  3. (setq obj   (vlax-ename->vla-object (car(entsel "\n选择多义线:")))
  4.        ptlst (vlax-get obj 'Coordinates )
  5.        z     (if (= "AcDb2dPolyline"  (vla-get-objectname obj)) (vlax-get obj 'Elevation ))
  6.        i     0)
  7. (while ptlst
  8.    (mapcar 'princ (list "\nT" (itoa i) " " (car ptlst) " " (cadr ptlst) " " (if z z (caddr ptlst))))
  9.    (setq ptlst (cdddr ptlst)
  10.          i (1+ i))
  11. )(princ)
  12. )

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:28 , Processed in 0.177394 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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