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" "")
)
我最终会添加其他孔径来搜索和更改,但我需要克服这个初始问题才能继续。
请告知,谢谢。 问题是,您为if函数提供了三个以上的参数。
if函数需要两个或三个参数:测试表达式、“then”表达式和可选的“else”表达式。
因此,为了允许在“then”参数中计算多个表达式,此类表达式需要是另一个函数的参数,才能生成单个表达式。实现这一点的最简单方法是使用progn函数:
PS:请编辑您的帖子,并用代码标签附上您的代码:
[突出显示][不突出]
Your code here 这三个操作也可以成为:
(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。 您还可以将这三种操作合并到一个选择集中:
(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)))
)
)
) 谢谢你的快速回复,我需要一些时间来消化你的答案!这是我例程中的完整代码,我这样写是因为我发现随着代码的不断发展,很容易复制和粘贴额外的代码块。在改变孔径的情况下,我将复制并粘贴新的文本块,只需改变半径值。希望我能想出如何结合你的答案,让我的日常工作顺利进行。非常感谢。
; 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" "")
)
非常感谢,我成功了!额外的红色代码行。
; 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" "")
)
Re 8.00015硬编码半径值并复制其他半径值是没有意义的,只是暗示一个半径和一个公差因子将其作为和添加到ssget中
第二个建议是只做ssget X圆并使用cond检查半径,您将需要重复以循环通过选择sset。
8 嗨,谢谢你的意见。
我试图实现的是自动图层管理,为最终的数控编程在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]