以相同比例插入新块
大家好我正在尝试编写一些代码:
1.查找名为EMRG DetailTag的现有块的比例
2.以与现有块相同的比例值插入一个名为_EMRG\u DETL\u NOTE的新块
但它不起作用。我的代码是:
(Command "_.select" ss1 "")
(defun c:SNB ()
(setq ss1 (ssadd))
(setq block (getstring T "EMRG-DetailTag"))
(setq ss1 (ssget "x" (list (cons '2 block))))
(setq mx (cdr (assoc 41 e))
);setq
(command "-insert" "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg" "0,0,0" "x" mx PAUSE 0)
(princ)
);defun
有人能指出我的错误吗?
谢谢
保罗 几个问题:
[列表]
[*]getstring应该用于提示用户输入字符串,但是,您已经有了块名。
[/列表]
[列表]
[*]代码中的变量“e”未定义-您需要使用ssname函数从选择集中检索实体名称,然后在从DXF组41检索比例之前,使用entget函数获取与实体相关的DXF数据。
[/列表]
我建议采取以下行动:
(defun c:snb ( / b s )
(cond
( (not (setq s (ssget "_X" '((0 . "INSERT") (2 . "EMRG-DetailTag")))))
(princ "\n\"EMRG-DetailTag\" block not found.")
)
( (not (setq b (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
(princ "\n\"_EMRG_DETL_NOTE.dwg\" not found.")
)
( (command "_.-insert" b "_s" (cdr (assoc 41 (entget (ssname s 0)))) "_r" 0.0 "\\"))
)
(princ)
) 嗨,李
谢谢你的回复。是的,代码是不同解决方案的混合体。
我运行了代码并得到了这个。。。
未找到“EMRG DetailTag”块。
该块在图形中,是一个动态块-这会影响代码吗?
当做
保罗 作为一个微小的更改,您是否希望根据其比例选择现有块,而不必担心名称,也不需要在动态块上测试。
(setq c:test ( / blobj xsc ysc zsc)
(setq blobj (vlax-ename->vla-object (car (entsel "pickblock"))))
(setq xsc (vla-get-Xscalefactor blobj))
(setq ysc (vla-get-Yscalefactor blobj))
(setq zsc (vla-get-Zscalefactor blobj))
)
嗨,比格尔,谢谢你的回复。我想在几百个文件中运行它,所以希望它按名称而不是手动选择块
是的,非常喜欢。
当动态块的参数与块定义中定义的参数发生更改时,将自动生成一个匿名块定义,其中包含反映新参数设置的几何图形——参数已更改的动态块参照将通过指向原始动态块定义的链接引用此新匿名块定义。
因此,代码还必须包括原始选择中的所有匿名块引用,然后在该选择上迭代以检索链接到所述动态块定义的引用:
(defun c:snb ( / blk ent idx obj scl sel )
(cond
( (not
(and (setq sel (ssget "_X" '((0 . "INSERT") (2 . "`*U*,EMRG-DetailTag"))))
(progn
(setq idx -1)
(while (and (null scl) (setq ent (ssname sel (setq idx (1+ idx)))))
(setq obj (vlax-ename->vla-object ent))
(if (or (and (vlax-property-available-p obj 'effectivename)
(= "emrg-detailtag" (strcase (vla-get-effectivename obj) t))
)
(= "emrg-detailtag" (strcase (vla-get-name obj) t))
)
(if (vlax-property-available-p obj 'xeffectivescalefactor)
(setq scl (vla-get-xeffectivescalefactor obj))
(setq scl (vla-get-xscalefactor obj))
)
)
)
scl
)
)
)
(princ "\n\"EMRG-DetailTag\" block not found.")
)
( (not (setq blk (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
(princ "\n\"_EMRG_DETL_NOTE.dwg\" not found.")
)
( (command "_.-insert" blk "_s" scl "_r" 0.0 "\\"))
)
(princ)
)
(vl-load-com) (princ)
我在“获取匿名引用”函数的编写中讨论了这一点和其他选项。
李
谢谢李。我理解你说的基本内容,但会阅读你的“获取匿名参考”信息,帮助我了解所有内容。
你的代码运行得很好。我希望在0,0,0处插入块,而不是拾取点。我在下面做了修改,但不太正确-看起来例行程序正在尝试再次运行
( (command "_.-insert" blk "_s" scl "0,0,0" "" "_r" "0.0" "\\"))
好东西-如果你有任何问题,或者有什么不清楚的地方,请告诉我。
没问题-请尝试以下操作:
(defun c:snb ( / blk ent idx obj scl sel )
(cond
( (not
(and (setq sel (ssget "_X" '((0 . "INSERT") (2 . "`*U*,EMRG-DetailTag"))))
(progn
(setq idx -1)
(while (and (null scl) (setq ent (ssname sel (setq idx (1+ idx)))))
(setq obj (vlax-ename->vla-object ent))
(if (or (and (vlax-property-available-p obj 'effectivename)
(= "emrg-detailtag" (strcase (vla-get-effectivename obj) t))
)
(= "emrg-detailtag" (strcase (vla-get-name obj) t))
)
(if (vlax-property-available-p obj 'xeffectivescalefactor)
(setq scl (vla-get-xeffectivescalefactor obj))
(setq scl (vla-get-xscalefactor obj))
)
)
)
scl
)
)
)
(princ "\n\"EMRG-DetailTag\" block not found.")
)
( (not (setq blk (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
(princ "\n\"_EMRG_DETL_NOTE.dwg\" not found.")
)
( (command "_.-insert" blk "_s" scl "_r" 0.0 "_non" '(0 0 0)))
)
(princ)
)
(vl-load-com) (princ) 删除李回答的帖子
非常感谢李,这真是太棒了。谢谢你的帮助!
当做
保罗
页:
[1]
2