lamensterms 发表于 2022-7-5 23:08:27

带对象的边缘复制例程

嘿伙计们,
 
我们在办公室使用ProSteel和ACAD。在切换到ProSteel(来自另一家商店的详细包装)之前,我们非常喜欢的一个老套路是“边缘复制”套路。
 
这是一个非常简单的例程,代码如下:
 
(defun c:ee ()
(setq OROSMODE (getvar "OSMODE"))
(setvar "osmode" 512)
(setq P1 (getpoint "\n Select edge to be copied:"))
(command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")
(setvar "osmode" OROSMODE)
)
 
它在ACAD实体(拾取时)的边缘创建直线/圆弧/圆/样条曲线。
 
我想做的是,它具有与ProSteel元素相同的功能。
 
我的想法是让例程检测选定边缘的元素的名称,如果元素是ACAD实体,则按常规进行。但是,如果该元素是ProSteel元素,则必须首先将其转换为ACAD实体。
 
我有以下代码,它在ProSteel元素上执行任务:
 
(defun c:ep ()
(SETVAR "CMDECHO" 0)
(setq OROSMODE (getvar "OSMODE"))
(setq ORPICKSTYLE (getvar "pickstyle"))
(setvar "pickstyle" 0)
(setvar "osmode" 512)
(setq P1 (getpoint "\n Select edge to be copied:"))
(setq epPSss (ssget P1))
(command "copybase" "0,0,0" epPSss "" "pasteclip" "0,0,0")
(command "draworder" "L" "" "front")
(command "PS_CREATE_ACIS" "L" "" "N" "N" "Y" "Y")
(command "chprop" "l" "" "c" "11" "")
(setq epACss (ssget "L"))
(command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")
(command "chprop" "l" "" "c" "7" "")
(command "erase" epacss "")
(setvar "osmode" OROSMODE)
(setvar "pickstyle" ORPICKSTYLE)
(princ)
)
 
但是我想让例程确定元素类型,然后继续执行适合元素类型的例程。
 
例如:
 
(defun c:eeTEST ()
(SETVAR "CMDECHO" 0)
(setq OROSMODE (getvar "OSMODE"))
(setq ORPICKSTYLE (getvar "pickstyle"))
(setvar "pickstyle" 0)
(setvar "osmode" 512)
(setq P1 (getpoint "\n Select edge to be copied:"))
(setq epPSss (ssget P1))

(cond
(= epPSss <PROSTEEL ELEMENT>)
(command "copybase" "0,0,0" epPSss "" "pasteclip" "0,0,0")
(command "draworder" "L" "" "front")
(command "PS_CREATE_ACIS" "L" "" "N" "N" "Y" "Y")
(command "chprop" "l" "" "c" "11" "")
(setq epACss (ssget "L"))
(command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")
(command "chprop" "l" "" "c" "7" "")
(command "erase" epacss "")

(= epPSss <ACAD SOLID>)
(command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")

)
(setvar "osmode" OROSMODE)
(setvar "pickstyle" ORPICKSTYLE)
(princ)
)
 
所有(我认为)ProSteel元素的名称都以“KS_”(例如KS_形状、KS_板等)开头。那么,例程是否有可能根据元素的名称识别元素类型,但仅使用前3个字符来识别ProSteel形状?否则我可以做如下事情:
 
'((-4 . "<OR")(0 . "KS_SHAPE,KS_PLATE,KS_BOLT,KS_BENDSHAPE,KS_ARCSHAPE,KS_ARCPLATE,KSBENDPLATE,KS_VOLBODY"))
有关更多详细信息,请查看帮助中的WCMATCH函数-因为过滤器可能使用相同的规则。

MSasu 发表于 2022-7-5 23:24:04

嗨Mircea,
 
非常感谢您的回复。恐怕我不太明白如何实施你的解决方案。我希望根据选择集中存在的元素类型执行不同的操作,而不是过滤选择集。
 
再次感谢。

lamensterms 发表于 2022-7-5 23:33:19

我相信我误解了你的疑问。您是否希望选择一个实体,然后根据其类型采取行动?
(ssget "_X" '((0 . "KS_*)))

MSasu 发表于 2022-7-5 23:44:32

嗨Mircea,
 
是的,那正是我想要的。非常感谢你帮我解决这个问题(或者我应该说,帮我解决这个问题)。
 
代码:
(if (and (setq ssetToEdit (ssget "_:S:E" '((0 . "KS_*,3DSOLID"))))
      (setq entToEdit(ssname ssetToEdit 0)))
(if (= (cdr (assoc 0 (entget entToEdit))) "3DSOLID")
(progn
;;; Procesing 1
)
(progn
;;; Procesing 2
)
)
)

lamensterms 发表于 2022-7-5 23:58:06

您可以简化该代码:
(defun c:eeTest ()
(SETVAR "CMDECHO" 0)
(setq OROSMODE (getvar "OSMODE"))
(setq ORPICKSTYLE (getvar "pickstyle"))
(setvar "pickstyle" 0)
(setvar "osmode" 512)
(setq P1 (getpoint "\n Select edge to be copied:"))
(setq epPSss (ssget P1))

(if (and (setq ssetToEdit (ssget "P" '((0 . "KS_*,3DSOLID"))))
   (setq entToEdit(ssname epPSss 0)))

(if
(= (cdr (assoc 0 (entget entToEdit))) "3DSOLID")
(progn
   (command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")
   (command "chprop" "l" "" "c" "7" "")
)

(progn
(command "copybase" "0,0,0" epPSss "" "pasteclip" "0,0,0")
(command "draworder" "L" "" "front")
(command "PS_CREATE_ACIS" "L" "" "N" "N" "Y" "Y")
(command "chprop" "l" "" "c" "11" "")
(setq epACss (ssget "L"))
(command "solidedit" "edge" "copy" P1 "" P1 P1 "" "")
(command "chprop" "l" "" "c" "7" "")
(command "erase" epacss "")
)
)
)

(setvar "osmode" OROSMODE)
(setvar "pickstyle" ORPICKSTYLE)
(princ)
)

MSasu 发表于 2022-7-6 00:04:42

啊,很酷,非常感谢你的Mircea。

lamensterms 发表于 2022-7-6 00:08:54

页: [1]
查看完整版本: 带对象的边缘复制例程