明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2482|回复: 7

[讨论] 如何将轻量多段线转为二维多段线

[复制链接]
发表于 2015-1-6 17:47:08 | 显示全部楼层 |阅读模式
我有一副图,目前已经有了轻量多段线即lwpolyline,现在我想把他转成二维多段线,即polyline,并且在转换后的多段线的各顶点图元中添加扩展属性,请高手们帮帮忙啊!
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2015-1-6 20:34:58 | 显示全部楼层
各位版主大人出来看看啊,首先肯定是能实现的。南方cass就已经实现了。并且他们将轻量多段线变为二维多段线'后连句柄都没改变。实在太厉害了。
发表于 2015-2-1 19:54:47 | 显示全部楼层
changyiran 发表于 2015-1-6 20:34
各位版主大人出来看看啊,首先肯定是能实现的。南方cass就已经实现了。并且他们将轻量多段线变为二维多段线 ...

给你个获取三维多段线顶点坐标的程序。然后你再删除三维多段线并且生成二维多段线(自己加上扩展属性)
  1. ;;;---------------------------------------------
  2. ;;; No.23-4-2 获取 POLYLINE 对象所有顶点坐标   
  3. ;;;---------------------------------------------
  4. (Defun ayGetPolyLineVTX (LwPolyEntName / entData1 entName1 pel ptp wpl wpll plp par ct
  5.                                                                                                                      pen rl pn clk pt al gx bj np xc gg rr cp retList)
  6.         (setq entName1 LwPolyEntName)
  7.         (setq retList nil)
  8.         (setq entData1 (entget entName1))
  9.         (if (= "POLYLINE" (Cdr (Assoc 0 entData1)))
  10.                 (progn
  11.                         (setq pel  entData1             ;取出对象表.
  12.                               ptp  (Cdr (Assoc 70 pel)) ;取出结束片段型.
  13.                               wpl  '()                  ;自建的点位数表.
  14.                                                 wpll '()
  15.                                                 entName1 (EntNext entName1)
  16.                                                 pen entName1
  17.                         );end_setq
  18.                         (While (/= "SEQEND" (Cdr (Assoc 0 (entget pen))));如果没束.
  19.                                 (setq pel (entget pen)               ;取得顶点对象数据表.
  20.                                 plp (Cdr (Assoc 10 pel))       ;取出控制点点位.
  21.                                 par (Cdr (Assoc 42 pel))       ;取出弓弦比.
  22.                                 wpl (Cons (List plp par) wpl)  ;将数据加到WPL表中.
  23.                                                         wpll (cons plp wpll)
  24.                                 );end_setq
  25.                           (setq pen (EntNext pen));搜索下一个对象.
  26.                         );end_while
  27.                         (setq wpll (Reverse wpll))

  28.                         ;以下代码暂时没有用!
  29.                         (setq ct (If (= 0 (Cadr (Car wpl))) "直线片段封闭" "弧片段封闭"))
  30.                         (setq wpl (Cons (Last wpl) wpl);加入封闭点.
  31.                                     wpl (Reverse wpl)        ;整理WPL表.
  32.                               rl (Length wpl)
  33.                               pn 0
  34.                         );end_setq
  35.                         (setq clk (If (Or (= 0 ptp) (= 128 ptp)) "开口" "封闭"))  
  36.                         (Repeat (1- rl)          ;逐点分析.
  37.                           (setq al (Nth pn wpl)  ;取出点数据表.
  38.                                 pt (Car al)      ;取出点位.
  39.                           );end_setq
  40.                           (If (And (/= 0.0 (Cadr al)) (Nth pn wpl)) ;如果是断.
  41.                                    (Progn (setq gx (Cadr al)               ;取出弓比.
  42.                                          bj (* (ATAN (ABS gx)) 4)   ;计算包角.
  43.                                          np (Car (Nth (1+ pn) wpl)) ;取出下一点位.
  44.                                          xc (* 0.5 (Distance pt np));半弦长计算.
  45.                                          gg (* gx xc)               ;弓高计算.
  46.                                          rr (/ (+ (* xc xc)(* gg gg)) (* 2 gg))
  47.                                     );end_setq  
  48.                                     (setq cp (Polar pt (setq pa (Angle pt np)) xc)  
  49.                                           cp (Polar cp (+ pa (* 0.5 PI)) (- rr gg))
  50.                                     );end_setq
  51.                             );end_progn
  52.                           );end_if
  53.                     (setq pn (1+ pn))
  54.                         );end_repeat
  55.                        
  56.                         (setq retList wpll)
  57.                 );end_progn
  58.         );end_if
  59. );end_defun
 楼主| 发表于 2015-2-1 21:29:13 | 显示全部楼层
newbuser 发表于 2015-2-1 19:54
给你个获取三维多段线顶点坐标的程序。然后你再删除三维多段线并且生成二维多段线(自己加上扩展属性)

这样生出来的二维多段线句柄就变了。有没有什么法使得句柄不变。
发表于 2015-2-1 21:36:04 | 显示全部楼层
changyiran 发表于 2015-2-1 21:29
这样生出来的二维多段线句柄就变了。有没有什么法使得句柄不变。

Lisp无法实现,用arx很容易!
发表于 2015-2-2 10:40:41 | 显示全部楼层
changyiran 发表于 2015-2-1 21:29
这样生出来的二维多段线句柄就变了。有没有什么法使得句柄不变。

如果需要arx的支持,我看我这二把刀还是不研究了。不懂。
 楼主| 发表于 2015-2-3 22:27:02 | 显示全部楼层
Gu_xl 发表于 2015-2-1 21:36
Lisp无法实现,用arx很容易!

看来lisp还是有不小局限性啊。
发表于 2015-2-3 22:43:34 | 显示全部楼层
Gu_xl 发表于 2015-2-1 21:36
Lisp无法实现,用arx很容易!

比如给已有图块追加attrib同样保持句柄不变也是需要ARX支持才行,LSP做不到?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 13:57 , Processed in 0.209078 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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