乐筑天下

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

[编程交流] 以相同比例插入新块

[复制链接]

28

主题

124

帖子

96

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 18:26:58 | 显示全部楼层 |阅读模式
大家好
我正在尝试编写一些代码:
 
1.查找名为EMRG DetailTag的现有块的比例
2.以与现有块相同的比例值插入一个名为_EMRG\u DETL\u NOTE的新块
 
但它不起作用。我的代码是:
 
  1. (Command "_.select" ss1 "")
  2. (defun c:SNB ()
  3. (setq ss1 (ssadd))
  4. (setq block (getstring T "EMRG-DetailTag"))
  5. (setq ss1 (ssget "x" (list (cons '2 block))))
  6. (setq mx (cdr (assoc 41 e))
  7. );setq
  8. (command "-insert" "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg" "0,0,0" "x" mx PAUSE 0)
  9. (princ)
  10. );defun

 
有人能指出我的错误吗?
 
谢谢
保罗
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:34:28 | 显示全部楼层
几个问题:
 
[列表]
  • getstring应该用于提示用户输入字符串,但是,您已经有了块名。
    [/列表]
    [列表]
  • 代码中的变量“e”未定义-您需要使用ssname函数从选择集中检索实体名称,然后在从DXF组41检索比例之前,使用entget函数获取与实体相关的DXF数据。
    [/列表]
    我建议采取以下行动:
    1. (defun c:snb ( / b s )
    2.    (cond
    3.        (   (not (setq s (ssget "_X" '((0 . "INSERT") (2 . "EMRG-DetailTag")))))
    4.            (princ "\n"EMRG-DetailTag" block not found.")
    5.        )
    6.        (   (not (setq b (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
    7.            (princ "\n"_EMRG_DETL_NOTE.dwg" not found.")
    8.        )
    9.        (   (command "_.-insert" b "_s" (cdr (assoc 41 (entget (ssname s 0)))) "_r" 0.0 "\"))
    10.    )
    11.    (princ)
    12. )
  • 回复

    使用道具 举报

    28

    主题

    124

    帖子

    96

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    140
    发表于 2022-7-5 18:43:27 | 显示全部楼层
    嗨,李
     
    谢谢你的回复。是的,代码是不同解决方案的混合体。
     
    我运行了代码并得到了这个。。。
     
    未找到“EMRG DetailTag”块。
     
    该块在图形中,是一个动态块-这会影响代码吗?
     
    当做
    保罗
    回复

    使用道具 举报

    106

    主题

    1万

    帖子

    101

    银币

    顶梁支柱

    Rank: 50Rank: 50

    铜币
    1299
    发表于 2022-7-5 18:47:31 | 显示全部楼层
    作为一个微小的更改,您是否希望根据其比例选择现有块,而不必担心名称,也不需要在动态块上测试。
     
    1. (setq c:test ( / blobj xsc ysc zsc)
    2. (setq blobj (vlax-ename->vla-object (car (entsel "pickblock"))))
    3. (setq xsc (vla-get-Xscalefactor blobj))
    4. (setq ysc (vla-get-Yscalefactor blobj))
    5. (setq zsc (vla-get-Zscalefactor blobj))
    6. )
    回复

    使用道具 举报

    28

    主题

    124

    帖子

    96

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    140
    发表于 2022-7-5 18:56:43 | 显示全部楼层
     
    嗨,比格尔,谢谢你的回复。我想在几百个文件中运行它,所以希望它按名称而不是手动选择块
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 19:00:58 | 显示全部楼层
     
    是的,非常喜欢。
     
    当动态块的参数与块定义中定义的参数发生更改时,将自动生成一个匿名块定义,其中包含反映新参数设置的几何图形——参数已更改的动态块参照将通过指向原始动态块定义的链接引用此新匿名块定义。
     
    因此,代码还必须包括原始选择中的所有匿名块引用,然后在该选择上迭代以检索链接到所述动态块定义的引用:
    1. (defun c:snb ( / blk ent idx obj scl sel )
    2.    (cond
    3.        (   (not
    4.                (and (setq sel (ssget "_X" '((0 . "INSERT") (2 . "`*U*,EMRG-DetailTag"))))
    5.                    (progn
    6.                        (setq idx -1)
    7.                        (while (and (null scl) (setq ent (ssname sel (setq idx (1+ idx)))))
    8.                            (setq obj (vlax-ename->vla-object ent))
    9.                            (if (or (and (vlax-property-available-p obj 'effectivename)
    10.                                         (= "emrg-detailtag" (strcase (vla-get-effectivename obj) t))
    11.                                    )
    12.                                    (= "emrg-detailtag" (strcase (vla-get-name obj) t))
    13.                                )
    14.                                (if (vlax-property-available-p obj 'xeffectivescalefactor)
    15.                                    (setq scl (vla-get-xeffectivescalefactor obj))
    16.                                    (setq scl (vla-get-xscalefactor obj))
    17.                                )
    18.                            )
    19.                        )
    20.                        scl
    21.                    )
    22.                )
    23.            )
    24.            (princ "\n"EMRG-DetailTag" block not found.")
    25.        )
    26.        (   (not (setq blk (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
    27.            (princ "\n"_EMRG_DETL_NOTE.dwg" not found.")
    28.        )
    29.        (   (command "_.-insert" blk "_s" scl "_r" 0.0 "\"))
    30.    )
    31.    (princ)
    32. )
    33. (vl-load-com) (princ)

     
    我在“获取匿名引用”函数的编写中讨论了这一点和其他选项。
     
    回复

    使用道具 举报

    28

    主题

    124

    帖子

    96

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    140
    发表于 2022-7-5 19:07:18 | 显示全部楼层
     
    谢谢李。我理解你说的基本内容,但会阅读你的“获取匿名参考”信息,帮助我了解所有内容。
     
    你的代码运行得很好。我希望在0,0,0处插入块,而不是拾取点。我在下面做了修改,但不太正确-看起来例行程序正在尝试再次运行
     
    1. (   (command "_.-insert" blk "_s" scl [color="red"]"0,0,0"[/color] [color="red"]""[/color] "_r" "0.0" "\"))
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 19:12:38 | 显示全部楼层
     
    好东西-如果你有任何问题,或者有什么不清楚的地方,请告诉我。
     
     
    没问题-请尝试以下操作:
    1. (defun c:snb ( / blk ent idx obj scl sel )
    2.    (cond
    3.        (   (not
    4.                (and (setq sel (ssget "_X" '((0 . "INSERT") (2 . "`*U*,EMRG-DetailTag"))))
    5.                    (progn
    6.                        (setq idx -1)
    7.                        (while (and (null scl) (setq ent (ssname sel (setq idx (1+ idx)))))
    8.                            (setq obj (vlax-ename->vla-object ent))
    9.                            (if (or (and (vlax-property-available-p obj 'effectivename)
    10.                                         (= "emrg-detailtag" (strcase (vla-get-effectivename obj) t))
    11.                                    )
    12.                                    (= "emrg-detailtag" (strcase (vla-get-name obj) t))
    13.                                )
    14.                                (if (vlax-property-available-p obj 'xeffectivescalefactor)
    15.                                    (setq scl (vla-get-xeffectivescalefactor obj))
    16.                                    (setq scl (vla-get-xscalefactor obj))
    17.                                )
    18.                            )
    19.                        )
    20.                        scl
    21.                    )
    22.                )
    23.            )
    24.            (princ "\n"EMRG-DetailTag" block not found.")
    25.        )
    26.        (   (not (setq blk (findfile "V:\\E-Library\\Autocad\\04 ACAD Detail library\\_EMRG_DETL_NOTE.dwg")))
    27.            (princ "\n"_EMRG_DETL_NOTE.dwg" not found.")
    28.        )
    29.        (   (command "_.-insert" blk "_s" scl "_r" 0.0 "_non" '(0 0 0)))
    30.    )
    31.    (princ)
    32. )
    33. (vl-load-com) (princ)
    回复

    使用道具 举报

    106

    主题

    1万

    帖子

    101

    银币

    顶梁支柱

    Rank: 50Rank: 50

    铜币
    1299
    发表于 2022-7-5 19:15:05 | 显示全部楼层
    删除李回答的帖子
    回复

    使用道具 举报

    28

    主题

    124

    帖子

    96

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    140
    发表于 2022-7-5 19:23:45 | 显示全部楼层
     
    非常感谢李,这真是太棒了。谢谢你的帮助!
    当做
    保罗
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-8-19 01:37 , Processed in 3.381837 second(s), 72 queries .

    © 2020-2025 乐筑天下

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