如何使用AutoLISP插入具有自定义特性的块?

如何使用AutoLISP插入具有自定义特性的块?,lisp,autocad,autolisp,Lisp,Autocad,Autolisp,我正在尝试插入具有自定义属性的块。如何设置这些变量 在Decreative块中有一个称为“可见性”的自定义特性,具有各种不同的样式“可见性1”、“可见性2”、“可见性3…” 例如,如何插入可见性为3的落叶块 (DEFUN C:TREE ( / DECIDUOUS CONIFER SHRUBMEDIUM SHRUBSMALL) (INITGET 1 "DECIDUOUS CONIFER SHRUBMEDIUM SHRUBSMALL") (OR (SETQ RETKWORD (GET

我正在尝试插入具有自定义属性的块。如何设置这些变量

在Decreative块中有一个称为“可见性”的自定义特性,具有各种不同的样式“可见性1”、“可见性2”、“可见性3…”

例如,如何插入可见性为3的落叶块

(DEFUN C:TREE ( / DECIDUOUS CONIFER SHRUBMEDIUM SHRUBSMALL)
  (INITGET 1 "DECIDUOUS CONIFER SHRUBMEDIUM SHRUBSMALL")
  (OR
    (SETQ RETKWORD (GETKWORD "\nSpecify tree type: [DECIDUOUS/CONIFER/SHRUBMEDIUM/SHRUBSMALL]:"))
    (SETQ RETKWORD "DECIDUOUS")
    )
  (IF (= RETKWORD "DECIDUOUS")
    (PROGN
      (SETQ OLDLAYER (GETVAR "CLAYER"))
      (SETQ FLAG (TBLSEARCH "LAYER" "L-PLNT-DECD"))
      (IF FLAG
    (SETVAR "CLAYER" "L-PLNT-DECD")
    )
      (INITGET 1 "Visibility1 Visibility2 Visibility3")
      (OR
    (SETQ CMDKWORD (GETKWORD "\nPick a command: [Visibility1/Visibility2/Visibility3]:"))
    )
      (IF (= CMDKWORD "Visibility3")
    (PROGN
      (COMMAND "INSERT"
           "TT-L-TREE-DECIDUOUS"
           )
      )
    )
      (PRINC)
      )
    )
  )

具有自定义特性的块称为动态块。 您可以找到详细信息和样品

p、 美国。
谢谢@LeeMac

具有自定义属性的块称为动态块。 您可以找到详细信息和样品

p、 美国。
谢谢@LeeMac

此问题的答案最终取决于是否需要AutoCAD INSERT命令提供的插入块参照的视觉预览

由于标准AutoCAD INSERT命令在插入块期间不会提示输入动态块参数值,因此您需要插入块,然后使用插入的动态块参照的ActiveX特性和方法(特别是使用该方法)操纵可见性状态

如果不需要插入块的视觉预览。。。 …然后可以完全放弃INSERT命令,使用目标容器对象模型空间/图纸空间/块定义的方法,该方法将返回块引用vla对象

下面是一个演示如何使用该方法的基本示例:

defun c:测试/图纸插入 如果 和 setq dwg getfiled选择块dwg 16 setq ins getpoint\n指定插入点: vla插入块 vlax get属性 vla获取活动文档vlax获取acad对象 if=1 getvar'cvport “纸质空间 “模型空间 vlax-3D-point trans ins 1 0 图纸 1.0 1.0 1.0 0.0 王子 vl加载组件原理 此方法将返回块引用vla对象,然后可以使用该方法返回的动态块特性数组来操纵其动态块特性

由于您特别希望修改可见性状态,您可能希望考虑以下一组函数,这些函数是我开发的一部分,用于修改提供的块引用对象的可见性状态:

;; 设置动态块可见性状态-Lee Mac ;; 将动态块(如果存在)的可见性参数设置为特定值(如果允许) ;; blk-[vla]vla动态块参照对象 ;; val-[str]可见性状态参数值 ;; 返回:[str]可见性参数的新值,否则为nil 定义LM:SetVisibilityState blk val/vis 如果 和 setq vis LM:getvisibilityparametername blk 成员strcase val mapcar的strcase LM:getdynpropallowedvalues blk vis LM:setdynpropvalue blk vis val ;; 获取可见性参数名称-Lee Mac ;; 返回动态块的可见性参数的名称(如果存在) ;; blk-[vla]vla动态块参照对象 ;; 返回可见性参数的:[str]名称,否则为nil 定义LM:getvisibilityparametername blk/vis 如果 和 vlax-property-available-p blk'effectivename setq blk vla项目 vla获取块vla获取文档块 vla获得有效名称blk =:vlax真实vla获取isdynamicblock blk =:vlax true vla get具有ExtensionDictionary blk setq vis 一些 “lambda对 如果 和 =360辆车对 =块可见性参数cdr关联0入口获取cdr对 cdr对 口述搜索 vlax vla对象->珐琅vla getextensiondictionary blk ACAD_增强块 cdr助理301 entget vis ;; 获取动态块属性允许的值-Lee Mac ;; 返回特定动态块特性的允许值。 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; 返回[lst]属性允许值的列表,如果没有限制,则返回nil 定义LM:getdynpropallowedvalues blk prp setq prp STRUCASE prp vl一些'lambda x if=prp strcase vla get propertyname x vlax get x'允许值 vlax调用blk'getdynamicblockproperties ;; 设置动态块特性值-Lee Mac ;; 修改动态块特性(如果存在)的值 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称大小写为 敏感的 ;; val-[任何]属性的新值 ;; 如果成功,则返回:[any]新值,否则返回nil 解除LM:SETDYNPROPPVALUE blk prp val setq prp STRUCASE prp 一些 “λx if=prp strcase vla get propertyname x 程序 vla放置值x vlax使变量值vlax变量类型vla获取值x cond val t vlax调用blk'getdynamicblockproperties 您可以通过以下方式调用我前面提供的示例中的上述函数,更改可见性状态的名称以适合您的块:

defun c:测试/图纸插入 如果 和 setq dwg getfiled选择块dwg 16 setq ins getpoint\n指定插入点: LM:SetVisibilityState vla插入块 vlax get属性 vla获取活动文档vlax获取acad对象 if=1 getvar'cvport “纸质空间 “模型空间 vlax-3D-point trans ins 1 0 图纸 1.0 1.0 1.0 0.0 你的可视状态 王子 vl加载组件原理 如果需要插入块的视觉预览。。。 …除了使用grread循环滚动您自己版本的标准INSERT命令外,还需要模拟所有绘图辅助工具,例如,和,您需要使用INSERT命令

但是,由于块的可见性状态只能在插入块参照后更改,因此显示给用户的视觉预览将不准确

为了充分利用这两个方面,我之前提出了以下可能的解决方案,并发布了一个附带的函数:

;; 演示插入已设置可见性状态的动态块的方法的示例。 ;; 李Mac-2013-12-24 DeFunc:Test/*Real*ATBLK DEF文档新Obj-PAR SPC TMP Vis defun*错误*msg if='整型att setvar'属性att foreach obj列出新定义 if and='vla对象类型obj非vlax-erased-p obj vl综合应用“vla删除列表obj” 如果不匹配strcase msg t*break、*取消*、*退出* princ strcat\n错误:msg 王子 康德 =4个Log和4个cdr assoc 70 tblsearch layer getvar'clayer princ\n当前层已锁定。 null setq blk GETFIED选择具有可见性状态的动态块dwg 16 原则\n*取消* 程序 setq doc vla get activedocument vlax get acad对象 spc vlax get property doc if=1 getvar'cvport'paperspace'modelspace obj vlax调用spc“insertblock”0.0 0.0 blk 1.0 1.0 1.0 0 0.0 vla放置可见对象:vlax false =:vlax假vla获取ISDYNAMIC块obj princ\n所选块不是动态的。 vla删除obj NETSqqPARLM:GETVISIILITION参数名称OBJ princ\n所选块没有可见性参数。 vla删除obj 空StqVis CALLM:ListBox选择可见性状态AcdIdStLoLtLM:GETYNPROSPORDED值OBJ PAR 0 原则\n*取消* vla删除obj T LM: StayDyPosialObjor setq tmp 0 而TBL搜索块setq blk strcat tmp itoa setq tmp 1+tmp 可见vla 汽车 vlax调用文件 '复制对象 列表对象 setq def vlax调用vla获取块文档“添加”0.0 0.0 0 blk :vlax true vla删除obj 内质网 att getvar'attreq setvar'属性0 如果 和 vl cmdf.-插入blk_S 1.0_R 0.0\\ 非均衡设置 =AcDbBlockReference vla get objectname setq new vlax ename->vla object ent 程序 vla爆炸新 vla删除新的 vl捕获全部应用“vla删除列表定义” 王子 ;; 获取可见性参数名称-Lee Mac ;; 返回动态块的可见性参数的名称(如果存在) ;; blk-[vla]vla动态块参照对象 ;; 返回可见性参数的:[str]名称,否则为nil 定义LM:getvisibilityparametername blk/vis 如果 和 vlax-property-available-p blk'有效名称 setq blk vla项目 vla获取块vla获取文档块 vla获得有效名称blk =:vlax真实vla获取isdynamicblock blk =:vlax true vla get具有ExtensionDictionary blk setq vis 一些 “lambda对 如果 和 =360辆车对 =块可见性参数cdr关联0入口获取cdr对 cdr对 口述搜索 vlax vla对象->珐琅vla getextensiondictionary blk acad_增强块 cdr助理301 entget vis ;; 获取动态块属性允许的值-Lee Mac ;; 返回特定动态块特性的允许值。 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; 返回[lst]属性允许值的列表,如果没有限制,则返回nil 定义LM:getdynpropallowedvalues blk prp setq prp STRUCASE prp vl一些'lambda x if=prp strcase vla get propertyname x vlax get x'允许值 vlax调用blk'getdynamicblockproperties ;; 设置动态块特性值-Lee Mac ;; 修改动态块特性(如果存在)的值 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; val-[任何]属性的新值 ;; 如果成功,则返回:[any]新值,否则返回nil 解除LM:SETDYNPROPPVALUE blk prp val setq prp STRUCASE prp 一些 “λx if=prp strcase vla get propertyname x 程序 vla放置值x vlax使变量值vlax变量类型vla获取值x cond val t vlax调用blk'getdynamicblockproperties ;; 列表框-Lee Mac ;; 显示DCL列表框,允许用户从提供的数据中进行选择。 ;; msg-[str]对话框标签 ;; lst-[lst]要显示的字符串列表 ;; 位-[int]1=允许多个;2=返回索引 ;; 返回:[lst]所选项目/索引列表,否则为零 定义LM:listbox msg lst位/dch des tmp rtn 康德 不 和 setq tmp vl filename mktemp nil nil.dcl setq des open tmp w 写行 strcat列表框:对话框{label=\msg\;间隔符;:列表框{key=\list\;多个选择= if=1 logand 1 bit true false;width=50;height=15;}间隔符;ok_cancel;} des 不近人情 <0 setq dch加载对话框tmp 新建\u对话框列表框dch 提示\n加载列表框时出错。 T 开始列表 对于每个itm lst添加列表itm 结束列表 setq rtn set_磁贴列表0 操作\u磁贴列表setq rtn$值 setq rtn 如果=1,则启动\u对话框 if=2和2位 读取strcat rtn mapcar'lambda x第n x第1个读取标准rtn 如果<0 dch 卸载对话框dch if和tmp setq tmp findfile tmp vl文件删除tmp rtn vl加载组件原理
我的解决方案主要涉及临时插入块参照、适当配置可见性状态、创建包含已配置动态块的临时块定义,然后利用标准INSERT命令提供的视觉预览插入临时块参照,然后将其分解并从图形中清除。

此问题的答案最终取决于是否需要AutoCAD INSERT命令提供的插入块参照的视觉预览

由于标准AutoCAD INSERT命令在插入块期间不会提示输入动态块参数值,因此您需要插入块,然后使用插入的动态块参照的ActiveX特性和方法(特别是使用该方法)操纵可见性状态

如果不需要插入块的视觉预览。。。 …然后可以完全放弃INSERT命令,使用目标容器对象模型空间/图纸空间/块定义的方法,该方法将返回块引用vla对象

下面是一个演示如何使用该方法的基本示例:

德芬c:te st/dwg ins 如果 和 setq dwg getfiled选择块dwg 16 setq ins getpoint\n指定插入点: vla插入块 vlax get属性 vla获取活动文档vlax获取acad对象 if=1 getvar'cvport “纸质空间 “模型空间 vlax-3D-point trans ins 1 0 图纸 1.0 1.0 1.0 0.0 王子 vl加载组件原理 此方法将返回块引用vla对象,然后可以使用该方法返回的动态块特性数组来操纵其动态块特性

由于您特别希望修改可见性状态,您可能希望考虑以下一组函数,这些函数是我开发的一部分,用于修改提供的块引用对象的可见性状态:

;; 设置动态块可见性状态-Lee Mac ;; 将动态块(如果存在)的可见性参数设置为特定值(如果允许) ;; blk-[vla]vla动态块参照对象 ;; val-[str]可见性状态参数值 ;; 返回:[str]可见性参数的新值,否则为nil 定义LM:SetVisibilityState blk val/vis 如果 和 setq vis LM:getvisibilityparametername blk 成员strcase val mapcar的strcase LM:getdynpropallowedvalues blk vis LM:setdynpropvalue blk vis val ;; 获取可见性参数名称-Lee Mac ;; 返回动态块的可见性参数的名称(如果存在) ;; blk-[vla]vla动态块参照对象 ;; 返回可见性参数的:[str]名称,否则为nil 定义LM:getvisibilityparametername blk/vis 如果 和 vlax-property-available-p blk'effectivename setq blk vla项目 vla获取块vla获取文档块 vla获得有效名称blk =:vlax真实vla获取isdynamicblock blk =:vlax true vla get具有ExtensionDictionary blk setq vis 一些 “lambda对 如果 和 =360辆车对 =块可见性参数cdr关联0入口获取cdr对 cdr对 口述搜索 vlax vla对象->珐琅vla getextensiondictionary blk ACAD_增强块 cdr助理301 entget vis ;; 获取动态块属性允许的值-Lee Mac ;; 返回特定动态块特性的允许值。 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; 返回[lst]属性允许值的列表,如果没有限制,则返回nil 定义LM:getdynpropallowedvalues blk prp setq prp STRUCASE prp vl一些'lambda x if=prp strcase vla get propertyname x vlax get x'允许值 vlax调用blk'getdynamicblockproperties ;; 设置动态块特性值-Lee Mac ;; 修改动态块特性(如果存在)的值 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; val-[任何]属性的新值 ;; 如果成功,则返回:[any]新值,否则返回nil 解除LM:SETDYNPROPPVALUE blk prp val setq prp STRUCASE prp 一些 “λx if=prp strcase vla get propertyname x 程序 vla放置值x vlax使变量值vlax变量类型vla获取值x cond val t vlax调用blk'getdynamicblockproperties 您可以通过以下方式调用我前面提供的示例中的上述函数,更改可见性状态的名称以适合您的块:

defun c:测试/图纸插入 如果 和 setq dwg getfiled选择块dwg 16 setq ins getpoint\n指定插入点: LM:SetVisibilityState vla插入块 vlax get属性 vla获取活动文档vlax获取acad对象 if=1 getvar'cvport “纸质空间 “模型空间 vlax-3D-point trans ins 1 0 图纸 1.0 1.0 1.0 0.0 你的可视状态 王子 vl加载组件原理 如果需要插入块的视觉预览。。。 …然后除了使用grread循环滚动您自己版本的标准INSERT命令之外 hich还需要模拟所有绘图辅助工具,例如,和,您需要使用INSERT命令

但是,由于块的可见性状态只能在插入块参照后更改,因此显示给用户的视觉预览将不准确

为了充分利用这两个方面,我之前提出了以下可能的解决方案,并发布了一个附带的函数:

;; 演示插入已设置可见性状态的动态块的方法的示例。 ;; 李Mac-2013-12-24 DeFunc:Test/*Real*ATBLK DEF文档新Obj-PAR SPC TMP Vis defun*错误*msg if='整型att setvar'属性att foreach obj列出新定义 if and='vla对象类型obj非vlax-erased-p obj vl综合应用“vla删除列表obj” 如果不匹配strcase msg t*break、*取消*、*退出* princ strcat\n错误:msg 王子 康德 =4个Log和4个cdr assoc 70 tblsearch layer getvar'clayer princ\n当前层已锁定。 null setq blk GETFIED选择具有可见性状态的动态块dwg 16 原则\n*取消* 程序 setq doc vla get activedocument vlax get acad对象 spc vlax get property doc if=1 getvar'cvport'paperspace'modelspace obj vlax调用spc“insertblock”0.0 0.0 blk 1.0 1.0 1.0 0 0.0 vla放置可见对象:vlax false =:vlax假vla获取ISDYNAMIC块obj princ\n所选块不是动态的。 vla删除obj NETSqqPARLM:GETVISIILITION参数名称OBJ princ\n所选块没有可见性参数。 vla删除obj 空StqVis CALLM:ListBox选择可见性状态AcdIdStLoLtLM:GETYNPROSPORDED值OBJ PAR 0 原则\n*取消* vla删除obj T LM: StayDyPosialObjor setq tmp 0 而TBL搜索块setq blk strcat tmp itoa setq tmp 1+tmp 可见vla 汽车 vlax调用文件 '复制对象 列表对象 setq def vlax调用vla获取块文档“添加”0.0 0.0 0 blk :vlax true vla删除obj 内质网 att getvar'attreq setvar'属性0 如果 和 vl cmdf.-插入blk_S 1.0_R 0.0\\ 非均衡设置 =AcDbBlockReference vla get objectname setq new vlax ename->vla object ent 程序 vla爆炸新 vla删除新的 vl捕获全部应用“vla删除列表定义” 王子 ;; 获取可见性参数名称-Lee Mac ;; 返回动态块的可见性参数的名称(如果存在) ;; blk-[vla]vla动态块参照对象 ;; 返回可见性参数的:[str]名称,否则为nil 定义LM:getvisibilityparametername blk/vis 如果 和 vlax-property-available-p blk'effectivename setq blk vla项目 vla获取块vla获取文档块 vla获得有效名称blk =:vlax真实vla获取isdynamicblock blk =:vlax true vla get具有ExtensionDictionary blk setq vis 一些 “lambda对 如果 和 =360辆车对 =块可见性参数cdr关联0入口获取cdr对 cdr对 口述搜索 vlax vla对象->珐琅vla getextensiondictionary blk acad_增强块 cdr助理301 entget vis ;; 获取动态块属性允许的值-Lee Mac ;; 返回特定动态块特性的允许值。 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; 返回[lst]属性允许值的列表,如果没有限制,则返回nil 定义LM:getdynpropallowedvalues blk prp setq prp STRUCASE prp vl一些'lambda x if=prp strcase vla get propertyname x vlax get x'允许值 vlax调用blk'GetDynamicBlockProperty s ;; 设置动态块特性值-Lee Mac ;; 修改动态块特性(如果存在)的值 ;; blk-[vla]vla动态块参照对象 ;; prp-[str]动态块属性名称不区分大小写 ;; val-[任何]属性的新值 ;; 如果成功,则返回:[any]新值,否则返回nil 解除LM:SETDYNPROPPVALUE blk prp val setq prp STRUCASE prp 一些 “λx if=prp strcase vla get propertyname x 程序 vla放置值x vlax使变量值vlax变量类型vla获取值x cond val t vlax调用blk'getdynamicblockproperties ;; 列表框-Lee Mac ;; 显示DCL列表框,允许用户从提供的数据中进行选择。 ;; msg-[str]对话框标签 ;; lst-[lst]要显示的字符串列表 ;; 位-[int]1=允许多个;2=返回索引 ;; 返回:[lst]所选项目/索引列表,否则为零 定义LM:listbox msg lst位/dch des tmp rtn 康德 不 和 setq tmp vl filename mktemp nil nil.dcl setq des open tmp w 写行 strcat列表框:对话框{label=\msg\;间隔符;:列表框{key=\list\;多个选择= if=1 logand 1 bit true false;width=50;height=15;}间隔符;ok_cancel;} des 不近人情 <0 setq dch加载对话框tmp 新建\u对话框列表框dch 提示\n加载列表框时出错。 T 开始列表 对于每个itm lst添加列表itm 结束列表 setq rtn set_磁贴列表0 操作\u磁贴列表setq rtn$值 setq rtn 如果=1,则启动\u对话框 if=2和2位 读取strcat rtn mapcar'lambda x第n x第1个读取标准rtn 如果<0 dch 卸载对话框dch if和tmp setq tmp findfile tmp vl文件删除tmp rtn vl加载组件原理
我的解决方案主要涉及临时插入块参照、适当配置可见性状态、创建包含已配置动态块的临时块定义,然后利用标准INSERT命令提供的视觉预览插入临时块参照,然后将其从图纸中分解和清除。

谢谢!在过去的几个小时里,我一直在尝试解决这个问题,但在设置可见性参数时仍然遇到很多问题。你能帮我指导下一步该做什么吗?谢谢!在过去的几个小时里,我一直在尝试解决这个问题,但在设置可见性参数时仍然遇到很多问题。你能帮我指导下一步该怎么做吗?