jason_a 发表于 2022-7-5 17:42:20

if s的Lisp例程问题

你好
 
我有一个lisp例程,用于查找实体和更改属性。在例行程序的一个部分中,它寻找8.00015孔径,并将直径更改为8。问题是,如果这个洞不存在,例程就会停止并且不会完成。这是例行程序。
 
; Looking for 3mm holes... 1.5mm radius
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
(COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
)



; Find 8.00015 change to 8mm
(setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
(setq LE (sslength ss1))
(setq CNT 0)
(while (< CNT LE)
(progn
(setq OBJ (entget (ssname ss1 CNT)))
(setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
(setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
(entmod OBJ)
(setq CNT (+ CNT 1))
) ;end progn
) ;end do while
(PRINC)


; it's looking for the following entities/blocks/linetypes and deleting them
(if
(ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
(COMMAND "ERASE" "P" "")
)

 
 
所以我合并了一个if语句,但这也不起作用。这样地。。
 


; Looking for 3mm holes... 1.5mm radius
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
(COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
)



; Find 8.00015 change to 8mm
(if
(setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
(setq LE (sslength ss1))
(setq CNT 0)
(while (< CNT LE)
(progn
(setq OBJ (entget (ssname ss1 CNT)))
(setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
(setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
(entmod OBJ)
(setq CNT (+ CNT 1))
) ;end progn
) ;end do while
(PRINC)
)


; it's looking for the following entities/blocks/linetypes and deleting them
(if
(ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
(COMMAND "ERASE" "P" "")
)


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

Lee Mac 发表于 2022-7-5 17:53:59

问题是,您为if函数提供了三个以上的参数。
 
if函数需要两个或三个参数:测试表达式、“then”表达式和可选的“else”表达式。
 
因此,为了允许在“then”参数中计算多个表达式,此类表达式需要是另一个函数的参数,才能生成单个表达式。实现这一点的最简单方法是使用progn函数:
PS:请编辑您的帖子,并用代码标签附上您的代码:
 
[突出显示][不突出]
Your code here

Lee Mac 发表于 2022-7-5 18:02:50

这三个操作也可以成为:
(if (setq s (ssget "_X" '((0 . "CIRCLE") (40 . 1.5))))
   (repeat (setq i (sslength s))
       (setq e (entget (ssname s (setq i (1- i)))))
       (entmod (subst '(8 . "vertical15p00") (assoc 8 e) e))
   )
)
(if (setq s (ssget "_X" '((0 . "CIRCLE") (40 . 4.000075))))
   (repeat (setq i (sslength s))
       (setq e (entget (ssname s (setq i (1- i)))))
       (entmod (subst '(40 . 4.0) (assoc 40 e) e))
   )
)
(if (setq s (ssget "_X" '((0 . "INSERT") (2 . "POCKET"))))
   (repeat (setq i (sslength s))
       (entdel (ssname s (setq i (1- i))))
   )
)
这是使用我的选择集处理教程中的方法2a。

Lee Mac 发表于 2022-7-5 18:10:40

您还可以将这三种操作合并到一个选择集中:
(if
   (setq s
       (ssget "_X"
          '(
               (-4 . "<OR")
                   (-4 . "<AND")
                     (0 . "CIRCLE")
                     (-4 . "<OR")
                           (40 . 1.5)
                           (40 . 4.000075)
                     (-4 . "OR>")
                   (-4 . "AND>")
                   (-4 . "<AND")
                     (0 . "INSERT")
                     (2 . "POCKET")
                   (-4 . "AND>")
               (-4 . "OR>")
         )
       )
   )
   (repeat (setq i (sslength s))
       (setq e (ssname s (setq i (1- i)))
             x (entget e)
       )
       (cond
         (   (= "INSERT" (cdr (assoc 0 x)))
               (entdel e)
         )
         (   (= 1.5 (cdr (assoc 40 x)))
               (entmod (subst '(8 . "vertical15p00") (assoc 8 x) x))
         )
         (   (entmod (subst '(40 . 4.0) (assoc 40 x) x)))
       )
   )
)

jason_a 发表于 2022-7-5 18:19:57

谢谢你的快速回复,我需要一些时间来消化你的答案!这是我例程中的完整代码,我这样写是因为我发现随着代码的不断发展,很容易复制和粘贴额外的代码块。在改变孔径的情况下,我将复制并粘贴新的文本块,只需改变半径值。希望我能想出如何结合你的答案,让我的日常工作顺利进行。非常感谢。
 


; Looking for 3mm holes... 1.5mm radius
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
(COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
)
; Looking for 76.2mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 38.1)))
(COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 77.2mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 38.6)))
(COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 38mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 19.0)))
(COMMAND "CHPROP" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 5mm dia Z15mm holes
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 2.50075)))
(COMMAND "CHPROP" "P" "" "P" "LA" "VERTICAL15P00" "")
)


; Find 8.00015 change to 8mm
(setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
(setq LE (sslength ss1))
(setq CNT 0)
(while (< CNT LE)
(progn
(setq OBJ (entget (ssname ss1 CNT)))
(setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
(setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
(entmod OBJ)
(setq CNT (+ CNT 1))
) ;end progn
) ;end do while
(PRINC)

; it's looking for the following entities/blocks/linetypes and deleting them
(if
(ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "LKCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "PTCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "NLCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "GRAIN")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "x" (list (cons 0 "DIM*")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "X" '((6 . "DASHED*")))
(COMMAND "ERASE" "P" "")
)

jason_a 发表于 2022-7-5 18:31:06

非常感谢,我成功了!额外的红色代码行。
 


; Looking for 3mm holes... 1.5mm radius
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 1.5)))
(COMMAND "CHANGE" "P" "" "P" "LA" "VERTICAL15P00" "")
)
; Looking for 76.2mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 38.1)))
(COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 77.2mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 38.6)))
(COMMAND "CHANGE" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 38mm dia grommets
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 19.0)))
(COMMAND "CHPROP" "P" "" "P" "LA" "ROTOR" "")
)
; Looking for 5mm dia Z15mm holes
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 2.50075)))
(COMMAND "CHPROP" "P" "" "P" "LA" "VERTICAL15P00" "")
)

; Find 8.00015 change to 8mm
(if
(ssget "_X" '((0 . "CIRCLE")(40 . 4.000075)))
(progn
(setq ss1 (ssget "_X" '((0 . "CIRCLE")(40 . 4.000075))))
(setq LE (sslength ss1))
(setq CNT 0)
(while (< CNT LE)
(progn
(setq OBJ (entget (ssname ss1 CNT)))
(setq NewScale (* (cdr (assoc 40 OBJ)) 0.99998125035))
(setq OBJ (subst (cons 40 NewScale) (assoc 40 OBJ) OBJ ))
(entmod OBJ)
(setq CNT (+ CNT 1))
) ;end progn
) ;end do while
(PRINC)
)
)


; it's looking for the following entities/blocks/linetypes and deleting them
(if
(ssget "_X" '((0 . "INSERT") (2 . "POCKET")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "LKCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "PTCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "NLCLIP")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "_X" '((0 . "INSERT") (2 . "GRAIN")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "x" (list (cons 0 "DIM*")))
(COMMAND "ERASE" "P" "")
)
(if
(ssget "X" '((6 . "DASHED*")))
(COMMAND "ERASE" "P" "")
)


BIGAL 发表于 2022-7-5 18:36:12

Re 8.00015硬编码半径值并复制其他半径值是没有意义的,只是暗示一个半径和一个公差因子将其作为和添加到ssget中
 
第二个建议是只做ssget X圆并使用cond检查半径,您将需要重复以循环通过选择sset。
8

jason_a 发表于 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,但希望我能解决这个问题。既然你知道我的日常工作是用来做什么的,如果你有任何其他建议来更好地完成我需要的,请告诉我,我很乐意听到他们。再次感谢你的帮助,我真的很感激。
页: [1]
查看完整版本: if s的Lisp例程问题