明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 561|回复: 6

[提问] 下面代码哪个地方有问题

[复制链接]
发表于 2020-9-28 09:31:52 | 显示全部楼层 |阅读模式
如下图  一些软件生成的独立基础  每个内框和外框 均为多线段  4条对角线为斜直线  所有线图层颜色均相同 现在想把所有外框切换一个图层S-BASE  我东拼西凑了下面代码  运行起来还是有问题  少量框选不起作用   全部框选 有的内外框都变图层了 请大佬看看哪里有问题
  1. ;独基外轮廓
  2. (defun c:222  ( )

  3. (setq ss (ssget ' ((0 . "LWPOLYLINE")(90 . 4))))



  4. (setq i 0 n (sslength ss)   )

  5.   (while (< i n)  (setq  spl  (ssname ss i))
  6.    (setq pts ( get-pline-point spl ))
  7. (setq ssObjects (ssget "_WP" (rm-lst pts) '((0 . "LWPOLYLINE") (90 . 4))))

  8.     (if ( = ssObjects nil )
  9.     ( ssdel spl ss )
  10.   
  11.     )
  12.     (setq i (1+ i))
  13.   )

  14. (command "change" ss "" "p" "la"  "S-BASE""")




  15. (princ)
  16. )



  17. ; ssget   0   线   90  顶点个数  —>ss
  18. ; ss ->转换为顶点加该图元地址
  19. ; 用范围选择,判断内有无矩形
  20. ; 无ssdel
  21. ; 输出最终的ss




  22. (defun get-pline-point (ent / ptlist ptlist1 re)
  23. (setq ptlist '() ptlist1 '() n 0)
  24. (setq ptlist (vlax-safearray->list
  25.                 (vlax-variant-value
  26.                   (vlax-get-property
  27.                     (vlax-ename->vla-object ent)
  28.                     'Coordinates
  29.                     )
  30.                   )
  31.                 )
  32.        )
  33.   (cond
  34.     (
  35.      (= "LWPOLYLINE" (cdr (assoc 0 (entget ent)
  36.                                  )
  37.                           )
  38.         )
  39.     (progn
  40.       (repeat (/ (length ptlist) 2)
  41.         (setq ptlist1 (cons (list (nth n ptlist)
  42.                                   (nth (setq n (1+ n)) ptlist)
  43.                                   )
  44.                             ptlist1)                           
  45.               )
  46.         (setq n (1+ n))
  47.         )
  48.       )
  49.      )
  50.     (
  51.      (= "POLYLINE" (cdr (assoc 0 (entget ent)
  52.                               )
  53.                        )
  54.      )
  55.     (progn
  56.       (repeat (/ (length ptlist) 3)
  57.         (setq ptlist1 (cons (list (nth n ptlist)
  58.                                   (nth (setq n (1+ n)) ptlist)
  59.                                   (nth (setq n (1+ n)) ptlist)
  60.                                   )
  61.                             ptlist1)
  62.               )
  63.         (setq n (1+ n))
  64.         )
  65.       )
  66.      )
  67.     )
  68.    
  69. (setq re (reverse ptlist1))
  70.   re
  71. )


  72. ;;;删除表中重复的子表
  73. (defun rm-lst (ptlst)
  74.    (setq ptlst-new '())
  75.    (while (setq pt1 (car ptlst))
  76.        (setq ptlst-new (cons pt1 ptlst-new)
  77.      ptlst         (vl-remove pt1 ptlst)
  78.        )
  79.    )
  80.    (setq ptlst-new (reverse ptlst-new))
  81.    ptlst-new
  82. )



 楼主| 发表于 2020-9-28 09:32:22 | 显示全部楼层
本帖最后由 江南十笑 于 2020-9-28 12:12 编辑

本帖子中包含更多资源

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

x
发表于 2020-9-28 14:25:09 | 显示全部楼层
本帖最后由 gaics 于 2020-9-28 14:46 编辑
  1. (defun c:222 (/ ss i n spl pts ssObjects)
  2.   (setq ss (ssget '((0 . "LWPOLYLINE") (90 . 4))))
  3.   (setq        i 0
  4.         n (sslength ss)
  5.   )
  6.   (repeat n                                                             ;;;while改为repeat
  7.     (setq spl (ssname ss i))
  8.     (setq pts (get-pline-point spl))
  9.     (setq ssObjects (ssget "_WP"
  10.                            (rm-lst pts)
  11.                            '((0 . "LWPOLYLINE") (90 . 4))
  12.                     )
  13.     )
  14.     (if        (= ssObjects nil)
  15.       (ssdel spl ss)
  16.       (setq i (1+ i))                                                  ;;;ssObjects不为nil时 i+1
  17.     )
  18.   )
  19.   (if (> (sslength ss) 0)
  20.     (command "change" ss "" "p" "la" "S-BASE" "")
  21.   )
  22.   (princ)
  23. )


当ssObjects为nil,从ss中删除spl,此时“i”值不能变;当
ssObjects不为nil时,i+1。while改为repeat,因为“i”值可能不会大于等于“n”,就是死循环。
 楼主| 发表于 2020-9-28 18:33:37 | 显示全部楼层
gaics 发表于 2020-9-28 14:25

当ssObjects为nil,从ss中删除spl,此时“i”值不能变;当ssObjects不为nil时 ...

谢谢大佬   已测试成功  我在仔细研究一下逻辑  
 楼主| 发表于 2020-9-28 18:35:56 | 显示全部楼层
就是从选择集中删除一个图元 后面图元的i值会自动往前递减一个是不是这个意思
发表于 2020-9-28 18:41:05 来自手机 | 显示全部楼层
江南十笑 发表于 2020-9-28 18:35
就是从选择集中删除一个图元 后面图元的i值会自动往前递减一个是不是这个意思

是这样的。
 楼主| 发表于 2020-9-28 18:56:04 | 显示全部楼层
好的  谢谢      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 16:54 , Processed in 0.174855 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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