找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 682|回复: 5

[编程申请]:如何在图形中选择多条不同宽度的多义线按宽度统计长度?

[复制链接]
发表于 2005-6-8 09:24:34 | 显示全部楼层 |阅读模式

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

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

×
我先试做了一个小程序(还没把宽度类型放进去),请各位看看问题出在哪里。
(defun c:pl_sum()
   (setvar "cmdecho" 0)
   (prompt "\n<<选择多义线>>")
   (setq n 0)
   (setq ss_LL 0)
   (setq llist (list))
   (repeat (sslength ss))
      (setq en (ssname ss n))
      (command "lengthen" en "")
      (setq ss_L (getvar "perimeter"))
      (setq llist (cons (list ss_L en llist)))
      (setq ss_LL (+ ss_L ss_LL))
      (setq n (1+ n))
   )
   (princ "\n总长度为: ")
)
(prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 11288个

财富等级: 富甲天下

发表于 2005-6-8 12:29:55 | 显示全部楼层
(defun c:pl_sum()
(setvar "cmdecho" 0)
(prompt "\n<<选择多义线>>")
(SETQ SS (SSGET '((0 . "LWPOLYLINE,POLYLINE"))))
(setq n 0)
(setq ss_LL 0)
(setq llist (list))
(repeat (sslength ss))
(setq en (ssname ss n))
(command "lengthen" en "")
(setq ss_L (getvar "perimeter"))
(setq llist (cons llist ss_L))
(setq ss_LL (+ ss_L ss_LL))
(setq n (1+ n))
)
(princ "\n总长度为: ")
(princ ss_LL) (princ "\n")
(princ)
)
(prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-8 13:51:58 | 显示全部楼层

求多义线的宽度是该这样吗?

谢谢指导!
但如果要计算不同宽度的多义线的总长度,又该怎么处理?其实我脑袋里有个大概的模糊的东西,但就是不知道该怎么把它理出来。
再次请教高手,在此万分感谢!

求多义线的宽度是该这样吗?
(defun c:pl_sum-1()
   (setvar "cmdecho" 0)
   (prompt "\n <<选择线槽>>")
   (SETQ ss (SSGET '((0 . "LWPOLYLINE"))))
   (setq n 0)
   (repeat (sslength ss)
      (setq en (ssname ss n))
      (setq en_data (getget (car en)))
      (setq en_w (assoc 43 en_data))
      (princ "\n您所选到的线槽宽度是: ")
      (princ en_w) (princ "\n")
      (princ)
   )
)
(prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 11288个

财富等级: 富甲天下

发表于 2005-6-9 13:14:14 | 显示全部楼层
试一下下面程序,程序未调试

  1. (defun c:pl_sum()
  2. (setvar "cmdecho" 0)
  3. (prompt "\n<<选择多义线>>")
  4. (SETQ SS (SSGET '((0 . "LWPOLYLINE"))))
  5. (setq n 0)
  6. (setq ss_LL 0)
  7. (setq llist (list))
  8. (repeat (sslength ss))
  9. (setq en (ssname ss n))
  10. (command "lengthen" en "")
  11. (setq ss_L (getvar "perimeter"))
  12. (setq en_data (entget en))
  13. (setq en_w (cdr (assoc 43 en_data)))
  14. (if (setq en_oldwl (assoc w llist))
  15. (setq en_wl (list w (+ (cdr en_oldwl) ss_L))
  16.           llist (cons en_wl en_oldwl llist))
  17. (setq llist (append llist (list (list w ss_L))))
  18. )
  19. (setq n (1+ n))
  20. )
  21. (setq n 0)
  22. (setq ls (length llist))
  23. (repeat ls
  24. (setq en_wl (nth n llist))
  25. (princ "\n线宽:") (princ (car en_wl))
  26. (princ "  长度:") (princ (cdr en_wl))
  27. (setq ss_LL (+ ss_LL (cdr en_wl)))
  28. (setq n (1+ n))
  29. )
  30. (princ "\n总长度为: ")
  31. (princ ss_LL) (princ "\n")
  32. (princ)
  33. )
  34. (prin1)

调试过的程序

  1. (defun c:pl_sum()
  2. (setvar "cmdecho" 0)
  3. (prompt "\n<<选择多义线>>")
  4. (SETQ SS (SSGET '((0 . "LWPOLYLINE"))))
  5. (setq n 0)
  6. (setq ss_LL 0)
  7. (setq llist (list))
  8. (repeat (sslength ss)
  9. (setq en (ssname ss n))
  10. (command "lengthen" en "")
  11. (setq ss_L (getvar "perimeter"))
  12. (setq en_data (entget en))
  13. (setq en_w (cdr (assoc 43 en_data)))
  14. (if (setq en_oldwl (assoc en_w llist))
  15. (setq en_wl (list en_w (+ (cadr en_oldwl) ss_L))
  16.        llist (subst en_wl en_oldwl llist))
  17. (setq llist (append llist (list (list en_w ss_L))))
  18. )
  19. (setq n (1+ n))
  20. )
  21. (setq n 0)
  22. (setq ls (length llist))
  23. (princ "\n")
  24. (repeat ls
  25. (setq en_wl (nth n llist))
  26. (princ "\n线宽:") (princ (car en_wl))
  27. (princ "  长度:") (princ (cdr en_wl))
  28. (setq ss_LL (+ ss_LL (cadr en_wl)))
  29. (setq n (1+ n))
  30. )
  31. (princ "\n总长度为: ")
  32. (princ ss_LL) (princ "\n")
  33. (princ)
  34. )
  35. (prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-9 15:18:39 | 显示全部楼层
程序我试过了,谢谢!
但这样的话,最下面的总长度不是没有意义了吗?需不需要取消它啊?

下面这个是我做的一个程序,它的缺点就是不能把多义线所有宽度的长度都计算出来,可能把两者合起来会好一些,对吗?
(defun c:pl_sum_t()
   (setvar "cmdecho" 0)
   (prompt "\n选择要统计长度的线槽")
   (setq ss (ssget '((0 . "LWPOLYLINE"))))
   (setq ss_ll_300 0)
   (setq ss_ll_250 0)
   (setq ss_ll_200 0)
   (setq ss_ll_150 0)
   (setq ss_ll_100 0)
   (setq ss_ll_50 0)
   (setq n 0)
   (repeat (sslength ss)
      (setq en (ssname ss n))
      (command "lengthen" en "")
      (setq ss_l (getvar "perimeter"))
      (setq en_data (entget en))
      (setq ss_w_list (assoc 43 en_data))
      (setq ss_w (cdr ss_w_list))
      (if (= ss_w 300) (setq ss_ll_300 (+ ss_ll_300 ss_l)))
      (if (= ss_w 250) (setq ss_ll_250 (+ ss_ll_250 ss_l)))
      (if (= ss_w 200) (setq ss_ll_200 (+ ss_ll_200 ss_l)))
      (if (= ss_w 150) (setq ss_ll_150 (+ ss_ll_150 ss_l)))
      (if (= ss_w 100) (setq ss_ll_100 (+ ss_ll_100 ss_l)))
      (if (= ss_w 50)  (setq ss_ll_50 (+ ss_ll_50 ss_l)))
      (setq n (+ 1 n))
   )
   (setq str1 (strcat "你所选择的线槽 宽度为 300, " "总长度为:" (rtos ss_ll_300 2)))
   (setq str2 (strcat "你所选择的线槽 宽度为 250, " "总长度为:" (rtos ss_ll_250 2)))
   (setq str3 (strcat "你所选择的线槽 宽度为 200, " "总长度为:" (rtos ss_ll_200 2)))
   (setq str4 (strcat "你所选择的线槽 宽度为 150, " "总长度为:" (rtos ss_ll_150 2)))
   (setq str5 (strcat "你所选择的线槽 宽度为 100, " "总长度为:" (rtos ss_ll_100 2)))
   (setq str6 (strcat "你所选择的线槽 宽度为 50, " "总长度为:" (rtos ss_ll_50 2)))
   (alert (strcat str1 "\n" str2 "\n" str3 "\n" str4 "\n" str5 "\n" str6))
)
(prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 11288个

财富等级: 富甲天下

发表于 2005-6-10 12:52:00 | 显示全部楼层
最初由 cicing 发布
[B]程序我试过了,谢谢!
但这样的话,最下面的总长度不是没有意义了吗?需不需要取消它啊?

下面这个是我做的一个程序,它的缺点就是不能把多义线所有宽度的长度都计算出来,可能把两者合起来会好一些,对吗?
(d... [/B]


不用那么复杂的程序。将程序改一下就能满足您的要求。

  1. (defun c:pl_sum()
  2. (setvar "cmdecho" 0)
  3. (prompt "\n<<选择多义线>>")
  4. (SETQ SS (SSGET '((0 . "LWPOLYLINE"))))
  5. (setq n 0)
  6. (setq llist (list))
  7. (repeat (sslength ss)
  8. (setq en (ssname ss n))
  9. (command "lengthen" en "")
  10. (setq ss_L (getvar "perimeter"))
  11. (setq en_data (entget en))
  12. (setq en_w (cdr (assoc 43 en_data)))
  13. (if (setq en_oldwl (assoc en_w llist))
  14. (setq en_wl (list en_w (+ (cadr en_oldwl) ss_L))
  15.        llist (subst en_wl en_oldwl llist))
  16. (setq llist (append llist (list (list en_w ss_L))))
  17. )
  18. (setq n (1+ n))
  19. )
  20. (setq n 0)
  21. (setq ls (length llist))
  22. (princ "\n")
  23. (setq str "")
  24. (repeat ls
  25. (setq en_wl (nth n llist))
  26. (setq str (strcat str "线宽:" (RTOS (car en_wl) 2) "  长度:" (RTOS (cadr en_wl) 2) "\n"))
  27. (setq n (1+ n))
  28. )
  29. (alert str)
  30. (princ)
  31. )
  32. (prin1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-22 17:51 , Processed in 0.178351 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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