乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 30|回复: 9

[编程交流] 在右侧轻轻推一下

[复制链接]

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:21:50 | 显示全部楼层 |阅读模式
你好
 
作为练习,我正在lisp中尝试另一种方法。
我用一个列表来检查/创建图层,它让我想到我可以做更多。
 
  1.   (setq layLst '(
  2.          (("CNC_DRILL-.10-PLEX"      30))
  3.          (("CNC_DRILL-.30-CTRSINK"  241))
  4.          (("CNC_DRILL-.125-PILOT"     9))
  5.          (("CNC_DRILL-.1875-THRU"     4))
  6.          (("CNC_DRILL-.250-PEG"       1))
  7.          (("CNC_DRILL-.250-THRU"      6))
  8.          (("CNC_DRILL-.3125-THRU"     3))
  9.          (("CNC_DRILL-.375-THRU"      6))
  10.          (("CNC_DRILL-.500-THRU"      2))
  11.          (("CNC_PLY-DOWEL"          211))
  12.          (("CNC_PLY-T-NUT-RECESS"     2))
  13.          (("CNC_PLY-GROMMET"         40))
  14.          (("CNC_PLY-SLOT"             1))
  15.         ) ; end comLst
  16. ) ;_ end of setq
  17. (foreach itm layLst
  18.    (if        (not (tblsearch "LAYER" (caar itm)))
  19.      (progn
  20. (setq nLay (vla-Add (vla-get-Layers
  21.                       (vla-get-ActiveDocument
  22.                         (vlax-get-acad-object)
  23.                       ) ;_ end of vla-get-ActiveDocument
  24.                     ) ;_ end of vla-get-Layers
  25.                     (caar itm)
  26.            ) ;_ end of vla-Add
  27. ) ;_ end of setq
  28. (vla-put-Color nLay (cadar itm))
  29.      ) ; end progn
  30.    ) ; end if
  31.    (command "_.layer"
  32.      "_on" (caar itm)
  33.      "_thaw" (caar itm)
  34.      "_unlock" (caar itm)
  35.      ""
  36.    )
  37. ) ;_ end of foreach

 
 
此例行程序的其余部分(使用cond)检查圆半径,并将圆放置在其相应的层上(使用命令)。如果需要的话,我可以发布整个程序。
 
我想知道是否可以将半径添加到layLst,并使用foreach语句对照它检查选择集,从而消除多个条件语句。
 
  1.   (setq        layLst '(
  2.          (("CNC_DRILL-.10-PLEX"      30) 0.10)
  3.          (("CNC_DRILL-.30-CTRSINK"  241) 0.30)
  4.          (("CNC_DRILL-.125-PILOT"     9) 0.125)
  5.          (("CNC_DRILL-.1875-THRU"     4) 0.1875)
  6.          (("CNC_DRILL-.250-PEG"       1) 0.250)
  7.          (("CNC_DRILL-.250-THRU"      6))
  8.          (("CNC_DRILL-.3125-THRU"     3) 0.3125)
  9.          (("CNC_DRILL-.375-THRU"      6) 0.375)
  10.          (("CNC_DRILL-.500-THRU"      2) 0.5)
  11.          (("CNC_PLY-DOWEL"          211))
  12.          (("CNC_PLY-T-NUT-RECESS"     2))
  13.          (("CNC_PLY-GROMMET"         40))
  14.          (("CNC_PLY-SLOT"             1))
  15.         ) ; end comLst
  16. ) ;_ end of setq

 
 
这似乎应该是可能的。
 
任何帮助都将不胜感激。
回复

使用道具 举报

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:28:50 | 显示全部楼层
这是整个程序,以防我不清楚我想做什么。
 
 
  1. (defun C:C2L  (/ *error*
  2.        clay
  3.        oce
  4.        doc
  5.        ss-circle
  6.        ent
  7.        enlist
  8.        cr
  9.        i
  10.        layList
  11.        nLay)
  12. (defun *error* (msg)
  13.    (if        (and msg
  14.      (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  15. )
  16.      (princ (strcat "\nError: " msg))
  17.      )
  18.    (if        clay
  19.      (setvar 'clayer clay)
  20.      )
  21.    (if        oce
  22.      (setvar 'cmdecho oce)
  23.      )
  24.    (if doc
  25.      (vla-endundomark doc)
  26.      )
  27.    (princ)
  28. ) ;_ end of defun
  29. (setq clay (getvar 'clayer)
  30.        oce  (getvar 'cmdecho)
  31.        )
  32. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  33. (vla-startundomark doc)
  34. (setvar 'cmdecho 0)
  35. ;; -----------------------------------------------------------------------------
  36. ;; |                               CREATE LAYERS                               |
  37. ;; |                                                                           |
  38. ;; -----------------------------------------------------------------------------
  39. (setq        layLst '(
  40.          (("CNC_DRILL-.10-PLEX"      30) 0.10)
  41.          (("CNC_DRILL-.30-CTRSINK"  241) 0.30)
  42.          (("CNC_DRILL-.125-PILOT"     9) 0.125)
  43.          (("CNC_DRILL-.1875-THRU"     4) 0.1875)
  44.          (("CNC_DRILL-.250-PEG"       1) 0.250)
  45.          (("CNC_DRILL-.250-THRU"      6))
  46.          (("CNC_DRILL-.3125-THRU"     3) 0.3125)
  47.          (("CNC_DRILL-.375-THRU"      6) 0.375)
  48.          (("CNC_DRILL-.500-THRU"      2) 0.5)
  49.          (("CNC_PLY-DOWEL"          211))
  50.          (("CNC_PLY-T-NUT-RECESS"     2))
  51.          (("CNC_PLY-GROMMET"         40))
  52.          (("CNC_PLY-SLOT"             1))
  53.         ) ; end comLst
  54. ) ;_ end of setq
  55. (foreach itm layLst
  56.    (if        (not (tblsearch "LAYER" (caar itm)))
  57.      (progn
  58. (setq nLay (vla-Add (vla-get-Layers
  59.                       (vla-get-ActiveDocument
  60.                         (vlax-get-acad-object)
  61.                       ) ;_ end of vla-get-ActiveDocument
  62.                     ) ;_ end of vla-get-Layers
  63.                     (caar itm)
  64.            ) ;_ end of vla-Add
  65. ) ;_ end of setq
  66. (vla-put-Color nLay (cadar itm))
  67.      ) ; end progn
  68.    ) ; end if
  69.    (command "_.layer"
  70.      "_on" (caar itm)
  71.      "_thaw" (caar itm)
  72.      "_unlock" (caar itm)
  73.      ""
  74.    )
  75. ) ;_ end of foreach
  76. ;; -----------------------------------------------------------------------------
  77. ;; |                               MAIN PROGRAM                                |
  78. ;; |                                                                           |
  79. ;; -----------------------------------------------------------------------------
  80. (prompt "\nSelect Entities to be Changed : ")
  81. (if (setq ss-circle
  82.             (ssget
  83.               '(
  84.                 (-4 . "<OR")
  85.                 (0 . "CIRCLE")
  86.                 (-4 . "<AND")
  87.                 (0 . "LWPOLYLINE")
  88.                 (42 . 1.0)
  89.                 (-4 . "AND>")
  90.                 (-4 . "OR>")
  91.                 )
  92.               )
  93.            )
  94.    (progn
  95.      (setq i -1)
  96.      (while (setq ent (ssname ss-circle (setq i (1+ i))))
  97.        (setq enlist (entget ent))
  98. (setq cr (cdr (assoc 40 enlist)))
  99.        (if (eq (cdr (assoc 0 enlist)) "LWPOLYLINE")
  100.   (if (equal 2.17691944 (vlax-curve-getarea ent) 1e-6)
  101.     (command "change" ent "" "property" "layer" "CNC_PLY-SLOT" "")
  102.   )
  103.   (cond
  104.     ((equal cr 0.0625 0.00001)     ;1/8" PILOT  DRILL
  105.             (command "change" ent "" "property" "layer"
  106.                      "CNC_DRILL-.125-PILOT" "")
  107.             )
  108.            ((equal cr 0.09375 0.00001) ;3/16" DRILL
  109.             (command "change" ent "" "property" "layer"
  110.                      "CNC_DRILL-.1875-THRU" "")
  111.             )
  112.            ((equal cr 0.125 0.00001)   ;1/4" DRILL BLIND
  113.             (command "change" ent "" "property" "layer"
  114.                      "CNC_DRILL-.250-PEG" "")
  115.             )
  116.            ((equal cr 0.15625 0.00001) ;5/16" DRILL
  117.             (command "change" ent "" "property" "layer"
  118.                      "CNC_DRILL-.3125-THRU" "")
  119.             )
  120.            ((equal cr 0.1875 0.00001)  ;3/8" DRILL
  121.             (command "change" ent "" "property" "layer"
  122.                      "CNC_DRILL-.375-THRU" "")
  123.             )
  124.            ((equal cr 0.25 0.00001)    ;1/2" DRILL
  125.             (command "change" ent "" "property" "layer"
  126.                      "CNC_DRILL-.500-THRU" "")
  127.             )
  128.     ((and (>= cr 0.375) (<= cr 0.49)) ;DOWELS
  129.             (command "change" ent "" "property" "layer"
  130.                      "CNC_PLY-DOWEL" "")
  131.             )
  132.            ;|((equal cr 0.3750 0.00001)  ;3/4" DOWEL PINS
  133.             (command "change" ent "" "property" "layer"
  134.               "CNC_PLY-DOWEL" "")
  135.             )|;
  136.            ((equal cr 0.453125 0.000001) ;29/32" HOLE LOCK IN DOOR
  137.             (command "change" ent "" "property" "layer"
  138.               "CNC_PLY-DOWEL" "")
  139.             )
  140.            ;|((equal cr 0.4375 0.00001)  ;7/8" RECESS FOR T-NUT
  141.             (command "change" ent "" "property" "layer"
  142.                      "CNC_PLY-T-NUT-RECESS" "")
  143.             )|;
  144.            ((and (>= cr 0.375) (<= cr 0.625))   ;RECESS FOR T-NUT
  145.             (command "change" ent "" "property" "layer"
  146.                      "CNC_PLY-T-NUT-RECESS" "")
  147.             )
  148.            ((equal cr 0.52343750 0.00001)  ; 1 3/64" HOLE PUSH LOCK IN DOOR
  149.             (command "change" ent "" "property" "layer"
  150.               "CNC_PLY-DOWEL" "")
  151.             )
  152.            ((and (>= cr 0.563) (<= cr 2.5)) ;GROMMETS
  153.             (command "change" ent "" "property" "layer"
  154.                      "CNC_PLY-GROMMET" "")
  155.             )
  156.            ) ;_cond
  157.          ) ;_if
  158.        (princ)
  159.        )
  160.      )
  161.    )
  162. (vla-endundomark doc)
  163. (setvar 'cmdecho oce)
  164. (setvar 'clayer  clay)
  165. (princ)
  166. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:37:12 | 显示全部楼层
嗨,塔尔瓦特。
 
嗯,因为我不知道我在做什么?
 
你是对的,我遵循了我使用的reactor lisp的语法,但我现在明白了这是没有必要的。
 
我的下一个问题是,如何将选择集传递给列表?
我确信我被一些简单的事情困住了。
 
除了减少键入之外,这种方法还有什么好处吗?
 
谢谢Tharwat!
回复

使用道具 举报

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:43:52 | 显示全部楼层
嗨,菲利普,
 
对不起,将选择集传递给列表是什么意思?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:55:08 | 显示全部楼层
  1. (setq layLst '(
  2.               ("CNC_DRILL-.10-PLEX" 30 0.10)
  3.               ("CNC_DRILL-.30-CTRSINK" 241 0.30)
  4.              )
  5. )

 
如何将foreach语句包含在ssget中?
 
我可能没有任何意义。。。
回复

使用道具 举报

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:59:58 | 显示全部楼层
 
我认为这是一种不好的编程方式,但用圆创建一个选择集,然后用cond函数检查每个圆的半径,就像你在post#2中的代码中使用的那样,要好得多。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:03:04 | 显示全部楼层
我在想这可能不是一个好处。。。
 
多谢塔瓦。
回复

使用道具 举报

16

主题

99

帖子

83

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 18:08:55 | 显示全部楼层
非常欢迎菲利普,如果你需要帮助,请告诉我。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:20:47 | 显示全部楼层
如果可以使用第n个x直接在laylst中查看半径,如果匹配,则更改层,那么唯一可能有助于减少conds的事情需要仔细考虑。A repeat=sslength实体。
 
  1. (foreach itm layLst
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:26:17 | 显示全部楼层
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 04:06 , Processed in 0.404749 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表