乐筑天下

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

[编程交流] 特定块/属性lisp

[复制链接]

6

主题

31

帖子

25

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:30:12 | 显示全部楼层 |阅读模式
下午好
 
 
我正在寻找一个遵循这些特定参数的lisp(我只是在学习lisp,我被困在这一个):
 
 
 
[列表]
  • 窗口选择要更改的项目/块(具有不同名称的不同块的组合)。
  • 选择要编辑其值的属性标记(例如LOC)(用户输入)。注意:属性可能是隐藏的,可能包含也可能不包含现有值。
  • 确定属性的新值应该是什么(用户输入)。
    [/列表]
    选择中包含所需属性标记的块将按指定更改属性值。
     
     
    有什么想法吗?有什么东西可以做这项工作吗?欢迎您的任何意见。
     
     
    当做
    洛辛斯基
  • 回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 18:36:42 | 显示全部楼层
    下面是一个快速示例,使用属性函数集中的LM:setattributevalue函数:
    1. ([color=BLUE]defun[/color] c:setattval ( [color=BLUE]/[/color] idx sel tag val )
    2.    ([color=BLUE]if[/color] ([color=BLUE]and[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] [color=MAROON]"_:L"[/color] '((0 . [color=MAROON]"INSERT"[/color]) (66 . 1))))
    3.             ([color=BLUE]/=[/color] [color=MAROON]""[/color] ([color=BLUE]setq[/color] tag ([color=BLUE]getstring[/color] [color=MAROON]"\nSpecify tag: "[/color])))
    4.             ([color=BLUE]setq[/color] val ([color=BLUE]getstring[/color] [color=BLUE]t[/color] [color=MAROON]"\nSpecify new value: "[/color]))
    5.        )
    6.        ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel))
    7.            (LM:setattributevalue ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx))) tag val)
    8.        )
    9.    )
    10.    ([color=BLUE]princ[/color])
    11. )
    12. [color=GREEN];; Set Attribute Value  -  Lee Mac[/color]
    13. [color=GREEN];; Sets the value of the first attribute with the given tag found within the block, if present.[/color]
    14. [color=GREEN];; blk - [ent] Block (Insert) Entity Name[/color]
    15. [color=GREEN];; tag - [str] Attribute TagString[/color]
    16. [color=GREEN];; val - [str] Attribute Value[/color]
    17. [color=GREEN];; Returns: [str] Attribute value if successful, else nil.[/color]
    18. ([color=BLUE]defun[/color] LM:setattributevalue ( blk tag val [color=BLUE]/[/color] enx )
    19.    ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=MAROON]"ATTRIB"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 ([color=BLUE]setq[/color] enx ([color=BLUE]entget[/color] ([color=BLUE]setq[/color] blk ([color=BLUE]entnext[/color] blk)))))))
    20.        ([color=BLUE]if[/color] ([color=BLUE]=[/color] ([color=BLUE]strcase[/color] tag) ([color=BLUE]strcase[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 enx))))
    21.            ([color=BLUE]if[/color] ([color=BLUE]entmod[/color] ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 1 val) ([color=BLUE]assoc[/color] 1 enx) enx))
    22.                ([color=BLUE]progn[/color]
    23.                    ([color=BLUE]entupd[/color] blk)
    24.                    val
    25.                )
    26.            )
    27.            (LM:setattributevalue blk tag val)
    28.        )
    29.    )
    30. )
    31. ([color=BLUE]princ[/color])
    回复

    使用道具 举报

    rlx

    21

    主题

    1505

    帖子

    1551

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    81
    发表于 2022-7-5 18:42:58 | 显示全部楼层
    李刚刚赢了我,阿威尔还在这里
     
    1. (defun c:caval ( / i p1 p2 ss blk attlst attname newval)
    2.   (princ "\nSelect blocks :")
    3.   (if (and (setq p1 (getpoint "\nFirst corner : ")) (setq p2 (getcorner p1 "\nSecond corner : "))
    4.            (setq ss (ssget "c" p1 p2 (list (cons 0 "insert"))))(setq i -1))
    5.     (while (setq blk (ssname ss (setq i (1+ i))))
    6.       (setq attlst (append attlst (mapcar 'vla-get-tagstring (vlax-invoke (vlax-ename->vla-object blk) 'getattributes)))))
    7.   )
    8.   (if (and (setq attname (cfl (rdup attlst))) (setq i -1)
    9.            (setq newval (getstring (strcat "\nNew value for attribute " attname " : "))))
    10.     (while (setq blk (ssname ss (setq i (1+ i))))
    11.       (vl-some '(lambda (x)(if (= attname (vla-get-tagstring x))(vla-put-textstring x newval)))
    12.                    (vlax-invoke (vlax-ename->vla-object blk) 'getattributes)))
    13.   )
    14. )
    15. ; chose from list
    16. (defun cfl (l / f p d r)
    17.   (and (setq p (open (setq f (vl-filename-mktemp ".dcl")) "w"))
    18.        (princ "cfl:dialog{label="Choose";:list_box{key="lb";}ok_cancel;}" p)
    19.        (not (setq p (close p)))(< 0 (setq d (load_dialog f)))(new_dialog "cfl" d)
    20.        (progn
    21.          (start_list "lb")(mapcar 'add_list l)(end_list)
    22.          (action_tile "lb" "(setq r (nth (atoi $value) l))(done_dialog 1)")
    23.          (action_tile "accept" "(setq r (get_tile "lb"))(done_dialog 1)")
    24.          (action_tile "cancel" "(setq r nil)(done_dialog 0)")
    25.          (start_dialog)(unload_dialog d)(vl-file-delete f)
    26.        )
    27.   )
    28.   (cond ((= r "") nil)(r r)(t nil))
    29. )
    30. ;remove duplicates
    31. (defun rdup ( i / o ) (vl-remove-if '(lambda (x) (cond ((vl-position x o) t) ((setq o (cons x o)) nil))) i))
    32. ; auto run when loaded
    33. (c:caval)
    回复

    使用道具 举报

    6

    主题

    31

    帖子

    25

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 18:43:21 | 显示全部楼层
    这正是我想要的。
     
     
    非常感谢,
    洛辛斯基
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 18:47:35 | 显示全部楼层
    @rlx、FWIW注意:
     
    相当于:
    1. (setq attlst (append attlst (mapcar 'vla-get-tagstring (vlax-invoke (vlax-ename->vla-object blk) 'getattributes))))

     
    我不认为有理由故意忽略这一点?
    回复

    使用道具 举报

    6

    主题

    31

    帖子

    25

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 18:55:58 | 显示全部楼层
    李,
     
     
    有没有办法添加在任何选定块中未找到指定标记的指示,然后提示重新输入?这将有利于输入标签时的拼写错误。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 18:56:04 | 显示全部楼层
     
    请尝试以下操作:
    1. (defun c:setattval ( / att ent enx idx lst sel tag val )
    2.    (if (setq sel (ssget "_:L" '((0 . "INSERT") (66 . 1))))
    3.        (progn
    4.            (repeat (setq idx (sslength sel))
    5.                (setq ent (entnext (ssname sel (setq idx (1- idx))))
    6.                      enx (entget ent)
    7.                )
    8.                (while (= "ATTRIB" (cdr (assoc 0 enx)))
    9.                    (setq lst (cons (cons (strcase (cdr (assoc 2 enx))) enx) lst)
    10.                          ent (entnext ent)
    11.                          enx (entget  ent)
    12.                    )
    13.                )
    14.            )
    15.            (while
    16.                (and (/= "" (setq tag (strcase (getstring "\nSpecify tag: "))))
    17.                     (not (assoc tag lst))
    18.                )
    19.                (princ (strcat "\nAttribute tag "" tag "" not found in selection."))
    20.            )
    21.            (if (/= "" tag)
    22.                (progn
    23.                    (setq val (cons 1 (getstring t "\nSpecify new value: ")))
    24.                    (while (setq att (assoc tag lst))
    25.                        (if (entmod (subst val (assoc 1 (cdr att)) (cdr att)))
    26.                            (entupd (cdr (assoc -1 (cdr att))))
    27.                        )
    28.                        (setq lst (cdr (member att lst)))
    29.                    )
    30.                )
    31.            )
    32.        )
    33.    )
    34.    (princ)
    35. )
    回复

    使用道具 举报

    6

    主题

    31

    帖子

    25

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 19:03:29 | 显示全部楼层
    李,
     
     
    效果很好。再次感谢。
     
     
    洛辛斯基
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 19:04:56 | 显示全部楼层
    不客气!
    回复

    使用道具 举报

    6

    主题

    31

    帖子

    25

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 19:09:02 | 显示全部楼层
    介意换一个李吗?
     
     
    希望使lisp不需要完整的属性名。例如:
     
     
    如果属性是TAGSTRIP,您可以只键入TAG。然而,如果有两个属性(例如TAG1和TAG2),它会要求您更具体。
     
     
    此外,您能计算出在lisp完成时有多少块受到更改的影响吗?
     
     
    我经常使用lisp,它节省了我很多时间。再次感谢。
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-12 19:55 , Processed in 0.473553 second(s), 72 queries .

    © 2020-2025 乐筑天下

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