乐筑天下

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

[编程交流] if s的Lisp例程问题

[复制链接]

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 17:42:20 | 显示全部楼层 |阅读模式
你好
 
我有一个lisp例程,用于查找实体和更改属性。在例行程序的一个部分中,它寻找8.00015孔径,并将直径更改为8。问题是,如果这个洞不存在,例程就会停止并且不会完成。这是例行程序。
 
  1. [color="royalblue"]; Looking for 3mm holes... 1.5mm radius
  2. (if
  3. (ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
  4. (COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
  5. )
  6. ; Find 8.00015 change to 8mm
  7. (setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
  8. (setq LE (sslength ss1))
  9. (setq CNT 0)
  10. (while (< CNT LE)
  11. (progn
  12. (setq OBJ (entget (ssname ss1 CNT)))
  13. (setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
  14. (setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
  15. (entmod OBJ)
  16. (setq CNT (+ CNT 1))
  17. ) ;end progn
  18. ) ;end do while
  19. (PRINC)
  20. ; it's looking for the following entities/blocks/linetypes and deleting them
  21. (if
  22. (ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
  23. (COMMAND "ERASE" "P" "")
  24. )[/color]

 
 
所以我合并了一个if语句,但这也不起作用。这样地。。
 
  1. [color="royalblue"]; Looking for 3mm holes... 1.5mm radius
  2. (if
  3. (ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
  4. (COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
  5. )
  6. ; Find 8.00015 change to 8mm
  7. [color="red"](if[/color]
  8. (setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
  9. (setq LE (sslength ss1))
  10. (setq CNT 0)
  11. (while (< CNT LE)
  12. (progn
  13. (setq OBJ (entget (ssname ss1 CNT)))
  14. (setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
  15. (setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
  16. (entmod OBJ)
  17. (setq CNT (+ CNT 1))
  18. ) ;end progn
  19. ) ;end do while
  20. (PRINC)
  21. [color="red"])[/color]
  22. ; it's looking for the following entities/blocks/linetypes and deleting them
  23. (if
  24. (ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
  25. (COMMAND "ERASE" "P" "")
  26. )
  27. [/color]

我最终会添加其他孔径来搜索和更改,但我需要克服这个初始问题才能继续。
 
请告知,谢谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:53:59 | 显示全部楼层
问题是,您为if函数提供了三个以上的参数。
 
if函数需要两个或三个参数:测试表达式、“then”表达式和可选的“else”表达式。
 
因此,为了允许在“then”参数中计算多个表达式,此类表达式需要是另一个函数的参数,才能生成单个表达式。实现这一点的最简单方法是使用progn函数:
PS:请编辑您的帖子,并用代码标签附上您的代码:
 
[突出显示][不突出]
  1. [/noparse][/highlight]Your code here[highlight][noparse]
[/noparse][/highlight]
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:02:50 | 显示全部楼层
这三个操作也可以成为:
  1. (if (setq s (ssget "_X" '((0 . "CIRCLE") (40 . 1.5))))
  2.    (repeat (setq i (sslength s))
  3.        (setq e (entget (ssname s (setq i (1- i)))))
  4.        (entmod (subst '(8 . "vertical15p00") (assoc 8 e) e))
  5.    )
  6. )
  7. (if (setq s (ssget "_X" '((0 . "CIRCLE") (40 . 4.000075))))
  8.    (repeat (setq i (sslength s))
  9.        (setq e (entget (ssname s (setq i (1- i)))))
  10.        (entmod (subst '(40 . 4.0) (assoc 40 e) e))
  11.    )
  12. )
  13. (if (setq s (ssget "_X" '((0 . "INSERT") (2 . "POCKET"))))
  14.    (repeat (setq i (sslength s))
  15.        (entdel (ssname s (setq i (1- i))))
  16.    )
  17. )

这是使用我的选择集处理教程中的方法2a。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:10:40 | 显示全部楼层
您还可以将这三种操作合并到一个选择集中:
  1. (if
  2.    (setq s
  3.        (ssget "_X"
  4.           '(
  5.                (-4 . "<OR")
  6.                    (-4 . "<AND")
  7.                        (0 . "CIRCLE")
  8.                        (-4 . "<OR")
  9.                            (40 . 1.5)
  10.                            (40 . 4.000075)
  11.                        (-4 . "OR>")
  12.                    (-4 . "AND>")
  13.                    (-4 . "<AND")
  14.                        (0 . "INSERT")
  15.                        (2 . "POCKET")
  16.                    (-4 . "AND>")
  17.                (-4 . "OR>")
  18.            )
  19.        )
  20.    )
  21.    (repeat (setq i (sslength s))
  22.        (setq e (ssname s (setq i (1- i)))
  23.              x (entget e)
  24.        )
  25.        (cond
  26.            (   (= "INSERT" (cdr (assoc 0 x)))
  27.                (entdel e)
  28.            )
  29.            (   (= 1.5 (cdr (assoc 40 x)))
  30.                (entmod (subst '(8 . "vertical15p00") (assoc 8 x) x))
  31.            )
  32.            (   (entmod (subst '(40 . 4.0) (assoc 40 x) x)))
  33.        )
  34.    )
  35. )
回复

使用道具 举报

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 18:19:57 | 显示全部楼层
谢谢你的快速回复,我需要一些时间来消化你的答案!这是我例程中的完整代码,我这样写是因为我发现随着代码的不断发展,很容易复制和粘贴额外的代码块。在改变孔径的情况下,我将复制并粘贴新的文本块,只需改变半径值。希望我能想出如何结合你的答案,让我的日常工作顺利进行。非常感谢。
 
  1. ; Looking for 3mm holes... 1.5mm radius
  2. (if
  3. (ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
  4. (COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
  5. )
  6. ; Looking for 76.2mm dia grommets
  7. (if
  8. (ssget "_X" '((0 . "CIRCLE")(40 . 38.1)))
  9. (COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
  10. )
  11. ; Looking for 77.2mm dia grommets
  12. (if
  13. (ssget "_X" '((0 . "CIRCLE")(40 . 38.6)))
  14. (COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
  15. )
  16. ; Looking for 38mm dia grommets
  17. (if
  18. (ssget "_X" '((0 . "CIRCLE")(40 . 19.0)))
  19. (COMMAND "CHPROP" "P" "" "P" "LA" "ROTOR" "")
  20. )
  21. ; Looking for 5mm dia Z15mm holes
  22. (if
  23. (ssget "_X" '((0 . "CIRCLE")(40 . 2.50075)))
  24. (COMMAND "CHPROP" "P" "" "P" "LA" "VERTICAL15P00" "")
  25. )
  26. ; Find 8.00015 change to 8mm
  27. (setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
  28. (setq LE (sslength ss1))
  29. (setq CNT 0)
  30. (while (< CNT LE)
  31. (progn
  32. (setq OBJ (entget (ssname ss1 CNT)))
  33. (setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
  34. (setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
  35. (entmod OBJ)
  36. (setq CNT (+ CNT 1))
  37. ) ;end progn
  38. ) ;end do while
  39. (PRINC)
  40. ; it's looking for the following entities/blocks/linetypes and deleting them
  41. (if
  42. (ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
  43. (COMMAND "ERASE" "P" "")
  44. )
  45. (if
  46. (ssget "_X" '((0 . "INSERT") (2 . "LKCLIP")))
  47. (COMMAND "ERASE" "P" "")
  48. )
  49. (if
  50. (ssget "_X" '((0 . "INSERT") (2 . "PTCLIP")))
  51. (COMMAND "ERASE" "P" "")
  52. )
  53. (if
  54. (ssget "_X" '((0 . "INSERT") (2 . "NLCLIP")))
  55. (COMMAND "ERASE" "P" "")
  56. )
  57. (if
  58. (ssget "_X" '((0 . "INSERT") (2 . "GRAIN")))
  59. (COMMAND "ERASE" "P" "")
  60. )
  61. (if
  62. (ssget "x" (list (cons 0 "DIM*")))
  63. (COMMAND "ERASE" "P" "")
  64. )
  65. (if
  66. (ssget "X" '((6 . "DASHED*")))
  67. (COMMAND "ERASE" "P" "")
  68. )
回复

使用道具 举报

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 18:31:06 | 显示全部楼层
非常感谢,我成功了!额外的红色代码行。
 
  1. ; Looking for 3mm holes... 1.5mm radius
  2. (if
  3. (ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
  4. (COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
  5. )
  6. ; Looking for 76.2mm dia grommets
  7. (if
  8. (ssget "_X" '((0 . "CIRCLE")(40 . 38.1)))
  9. (COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
  10. )
  11. ; Looking for 77.2mm dia grommets
  12. (if
  13. (ssget "_X" '((0 . "CIRCLE")(40 . 38.6)))
  14. (COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
  15. )
  16. ; Looking for 38mm dia grommets
  17. (if
  18. (ssget "_X" '((0 . "CIRCLE")(40 . 19.0)))
  19. (COMMAND "CHPROP" "P" "" "P" "LA" "ROTOR" "")
  20. )
  21. ; Looking for 5mm dia Z15mm holes
  22. (if
  23. (ssget "_X" '((0 . "CIRCLE")(40 . 2.50075)))
  24. (COMMAND "CHPROP" "P" "" "P" "LA" "VERTICAL15P00" "")
  25. )
  26. ; Find 8.00015 change to 8mm
  27. [color="red"](if
  28. (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075)))
  29. (progn[/color]
  30. (setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
  31. (setq LE (sslength ss1))
  32. (setq CNT 0)
  33. (while (< CNT LE)
  34. (progn
  35. (setq OBJ (entget (ssname ss1 CNT)))
  36. (setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
  37. (setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
  38. (entmod OBJ)
  39. (setq CNT (+ CNT 1))
  40. ) ;end progn
  41. ) ;end do while
  42. (PRINC)
  43. [color="red"])
  44. )[/color]
  45. ; it's looking for the following entities/blocks/linetypes and deleting them
  46. (if
  47. (ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
  48. (COMMAND "ERASE" "P" "")
  49. )
  50. (if
  51. (ssget "_X" '((0 . "INSERT") (2 . "LKCLIP")))
  52. (COMMAND "ERASE" "P" "")
  53. )
  54. (if
  55. (ssget "_X" '((0 . "INSERT") (2 . "PTCLIP")))
  56. (COMMAND "ERASE" "P" "")
  57. )
  58. (if
  59. (ssget "_X" '((0 . "INSERT") (2 . "NLCLIP")))
  60. (COMMAND "ERASE" "P" "")
  61. )
  62. (if
  63. (ssget "_X" '((0 . "INSERT") (2 . "GRAIN")))
  64. (COMMAND "ERASE" "P" "")
  65. )
  66. (if
  67. (ssget "x" (list (cons 0 "DIM*")))
  68. (COMMAND "ERASE" "P" "")
  69. )
  70. (if
  71. (ssget "X" '((6 . "DASHED*")))
  72. (COMMAND "ERASE" "P" "")
  73. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:36:12 | 显示全部楼层
Re 8.00015硬编码半径值并复制其他半径值是没有意义的,只是暗示一个半径和一个公差因子将其作为和添加到ssget中
 
第二个建议是只做ssget X圆并使用cond检查半径,您将需要重复以循环通过选择sset。
  1. 8
回复

使用道具 举报

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 18:44:25 | 显示全部楼层
嗨,谢谢你的意见。
 
我试图实现的是自动图层管理,为最终的数控编程在autocad中准备dxf文件。这些文件源于solidworks,导入autocad,然后编译dxf,并转换到cnc软件。为了在cnc软件中正确处理,正确的层管理和准确的孔径至关重要。
 
cnc软件可以从二维图形中的圆实体中获取孔径信息,但它仍然不知道孔的深度。这就是autocad图层管理发挥作用的地方。如果将孔放置在包含孔深度信息的正确标记层上,则cnc软件在后处理时使用该信息处理孔深度。将孔放置在适当图层上的一种方法是手动拾取dwg中的每个孔并移动到适当的图层。充其量也很乏味。
 

 
例如,在solidworks中,假设要钻一个直径为8mm的孔,深度为15mm,我们在直径为8.0015的位置绘制该孔。(0.0015就像一个指示钻孔深度的标记)然后,当2d文件导入Autocad并使用我的脚本和lisp例程时,它会找到任何直径为8.0015的孔,将其更改为15mm深的标记层,并将直径缩放到8mm的真实大小。dxf文件现在已完全准备好用于cnc后处理,并且是全自动的!因此,在这种情况下,公差是不可接受的,因为孔径为8.0016的孔表示直径为8mm、钻深为16mm的孔。这听起来有点复杂,但当处理许多不同深度和直径的不同大小的孔时,这是一个非常好的自动化系统。
 
明天上班时,我会看看我是否能想出如何将你的第二个建议纳入我的Lisp程序程序。我不太精通autolisp,但希望我能解决这个问题。既然你知道我的日常工作是用来做什么的,如果你有任何其他建议来更好地完成我需要的,请告诉我,我很乐意听到他们。再次感谢你的帮助,我真的很感激。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:04 , Processed in 0.363701 second(s), 68 queries .

© 2020-2025 乐筑天下

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