[求助]把外部参照变成插入块
<p>在网上有段代码,可以把全部的外部参照全部插入或者绑定</p><p>由于绑定回弄出好多图层,所以我改了一下,只能全部插入</p><p>但是我只想要插入我选中的那个外部参照,竟然不会改,</p><p>实在对这个"Object" 无办法,试了N次都出错,只好上来求教了</p><p>请帮我改一改,使之能够只插入选中的外部参照,谢谢</p><p></p><p>(defun C:ii ( / inskey lst) <br/> (setq inskey "T")<br/> (setq inskey (if inskey :vlax-true :vlax-false)) <br/> (setq *doc (vla-get-activedocument(vlax-get-acad-object))) <br/> (vlax-for x (vla-get-blocks *doc) <br/> (if (= :vlax-true (vla-get-isxref x)) <br/> (setq lst(cons x lst)) <br/> ) <br/> ) <br/> (mapcar (FUNCTION (LAMBDA(x)(vla-bind x inskey)))lst)<br/>)</p> <p>(DEFUN C:II (/ INSKEY LST *DOC NAMELST X I J STRING)<br/> (SETQ *DOC (VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT)))<br/> (SETQ J 0 )<br/> (WHILE J<br/> (SETQ I 0<br/> STRING ""<br/> LST NIL<br/> NAMELST NIL<br/> ) ;_ 结束SETQ<br/> (VLAX-FOR X (VLA-GET-BLOCKS *DOC)<br/> (IF (= :VLAX-TRUE (VLA-GET-ISXREF X))<br/> (SETQ LST (CONS X LST)<br/> NAMELST (CONS (VLA-GET-NAME X) NAMELST)<br/> ) ;_ 结束SETQ<br/> ) ;_ 结束if<br/> ) ;_ 结束vlax-for<br/> (IF LST<br/> (PROGN<br/> (TEXTSCR)<br/> (PRINC "\n序号 参照块名称")<br/> (FOREACH STR NAMELST<br/> (SETQ STRING (STRCAT " " (ITOA I) " " STRING STR "\n")<br/> I (1+ I)<br/> ) ;_ 结束SETQ<br/> ) ;_ 结束FOREACH<br/> (PRINC (STRCAT "\n" STRING))<br/> (IF (< (SETQ J (GETINT "\n选择要绑定的参照块名称的序号:")) (LENGTH LST))<br/> (VLA-BIND (NTH J LST) :VLAX-TRUE)<br/> (PROGN<br/> (SETQ J NIL)<br/> (VL-EXIT-WITH-ERROR "\n 你输入的编号超出范围。" )<br/> ) ;_ 结束PROGN<br/> ) ;_ 结束IF<br/> ) ;_ 结束PROGN<br/> (SETQ J NIL)<br/> ) ;_ 结束IF<br/> ) ;_ 结束WHILE<br/> (PRINC)<br/>) ;_ 结束defun</p><p></p><p></p> 本帖最后由 作者 于 2007-12-24 18:50:44 编辑 <br /><br /> <p>;;这个是屏幕鼠标选择的</p><p>(DEFUN C:XREFBIND (/ ACADDOCUMENT CATCH OBJNAME SSOBJ TMP REFBLOCK) (SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT)))<br/> (SETQ SSOBJ (VLA-GET-ACTIVESELECTIONSET ACADDOCUMENT))<br/> (VLA-CLEAR SSOBJ)<br/> (PRINC "\n选择要绑定的参照块:")<br/> (VLA-SELECTONSCREEN SSOBJ<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER))<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT))<br/> ) ;_ 结束VLA-SELECTONSCREEN(SETQ I(VLA-ITEM SSOBJ 0) TMP NIL)<br/> (WHILE (< 0 (SETQ CATCH (VLA-GET-COUNT SSOBJ)))<br/> (SETQ TMP NIL)<br/> (VLAX-FOR I SSOBJ<br/> (SETQ OBJNAME (VLA-GET-EFFECTIVENAME I))<br/> (IF (= :VLAX-TRUE (VLA-GET-ISXREF (SETQ REFBLOCK (VLA-ITEM (VLA-GET-BLOCKS ACADDOCUMENT) OBJNAME))))<br/> (IF (NOT (MEMBER OBJNAME TMP))<br/> (PROGN<br/> (SETQ TMP (CONS OBJNAME TMP))<br/> (VLA-BIND REFBLOCK :VLAX-TRUE)<br/> (PRINC (STRCAT "\n 参照块:" OBJNAME " 已经绑定。"))<br/> ) ;_ 结束PROGN<br/> ) ;_ 结束IF<br/> ) ;_ 结束IF<br/> ) ;_ 结束VLAX-FOR<br/> (VLA-CLEAR SSOBJ)<br/> (PRINC "\n选择要绑定的参照块:")<br/> (VLA-SELECTONSCREEN SSOBJ<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER))<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT))<br/> ) ;_ 结束VLA-SELECTONSCREEN<br/> ) ;_ 结束WHILE<br/>) ;_ 结束defun</p><p>(DEFUN XET-LIST->SAFEARRAY (LISTA VBDATASTYLE / LL)<br/> ;;将列表转换为VLA数组对象 需指定对象类型<br/> ;;(SETQ LISTA (LIST 0 0 0 "AA" 0.001))<br/> (SETQ LL (- (LENGTH LISTA) 1)<br/> LL (CONS 0 LL)<br/> ) ;_ 结束SETQ<br/> (SETQ LL (VLAX-MAKE-SAFEARRAY VBDATASTYLE LL))<br/> (VLAX-SAFEARRAY-FILL LL LISTA)<br/>)</p> <p>多谢jinwen兄,不过不知为什么运行时返回下面的信息的,是不是我cad有什么问题呢</p><p><strong><font face="Verdana" color="#61b713">错误: no function definition: VLAX-GET-ACAD-OBJECT</font></strong></p><p><strong><font face="Verdana" color="#61b713"></font></strong></p> <p>真的是呢,我运行其他的也会出现这段信息,真郁闷,有人知道这是怎么回事吗</p><p></p> 加一句(vl-load-com)试试。 <p>神奇之极加了(vl-load-com)后,程序可以运行了 </p><p>不过又出现了下面的错误信息</p><p>还要加载什么吗 ?</p><p>error: ActiveX Server returned the error: unknown name: EffectiveName</p> 本帖最后由 作者 于 2007-12-26 0:05:58 编辑 <br /><br /> <p class="Heading-2">语法 </p><p class="syntax">object.EffectiveName </p><p class="element">object</p><p class="element-desc"><a href="http://www.vba.cn/object/acad2004/idh_blockref_object.htm">BlockRef</a>, <a href="http://www.vba.cn/object/acad2004/idh_minsertblock_object.htm">MInsertBlock</a><br/>使用该属性的对象。 </p><p class="element">EffectiveName</p><p class="element-desc">String[字符串]; 只读 </p><p class="Heading-2">说明 </p><p class="body">原始名称是用户在用户界面中看到的块的名称。动态块可将其用匿名块来绘制,而其名称将与用户在用户界面中看到的块的名称不同。Name 属性返回的是用于绘制参照的块的名称,而 EffectiveName 是用户查看参照的名称。 </p><p class="body"><b>注意</b> 要访问该属性,可使用 IAcadBlockReference2 或 IAcadMInsertBlock2 接口。 </p><p>错误原因是:</p><p> 未加载IAcadBlockReference2 接口或者 对象不支持 EFFECTIVENAME 属性,可能选了不包含EFFECTIVENAME 属性的块对象。按道理是不存在这种情况的。</p><p><font color="#000000" size="4"><u><strong>由于这里的代码都有调用VL函数,所以你的函数库文件的第一行应该有</strong></u></font></p><p><font color="#000000" size="4"><u><strong>(VL-LOAD-COM)</strong></u></font></p><p><font color="#000000" size="4"><u><strong>我默认你的文件有此项内容,这里的代码,粘贴进去,重新加载后即可执行。</strong></u></font></p><p><font color="#3000ee"><strong>你加载下面的命令,在命令行输入DUMP 选择你之前使程序出错的外部参照块,会出现外部参照块的所有支持的方法和属性,把返回结果贴上来</strong></font></p><p><em><font face="Arial Black">(DEFUN C:DUMP (/ ENT)<br/> (IF (= (TYPE (SETQ ENT (ENTSEL))) 'LIST)<br/> (PROGN<br/> (VLAX-DUMP-OBJECT (VLAX-ENAME->VLA-OBJECT (CAR ENT)) T)<br/> (TEXTSCR)<br/> ) ;_ 结束PROGN<br/> ) ;_ 结束IF<br/>) ;_ 结束DEFUN</font></em></p><p>我们一起来研究下。</p> <p>好的</p><p>不过还是要加上(vl-load-com)才能运行</p><p>是不是说cad启动的时候,少加载了什么,我用的是06,中英文版也是这样的情况</p><p>Command: dump<br/>Select object: ; error: no function definition: VLAX-ENAME->VLA-OBJECT</p><p>运行后返回信息如下</p><p>Customization file loaded successfully. Customization Group: ACAD<br/>Customization file loaded successfully. Customization Group: CUSTOM<br/>Regenerating model.<br/>AutoCAD menu utilities loaded.*Cancel*<br/>Command: COMMANDLINE<br/>Command: xa<br/>XATTACH<br/>Attach Xref "E02": D:\JOB\BD\BD\1217\E02.dwg<br/>"E02" loaded.<br/>Specify insertion point or :<br/>Command: z<br/>ZOOM<br/>Specify corner of window, enter a scale factor (nX or nXP), or<br/> <real time>: e<br/>Regenerating model.<br/>Command: ap<br/>APPLOAD 新建 文本文档.lsp successfully loaded.<br/>Command:<br/>Command:<br/>Command: dump<br/>Select object: ; error: no function definition: VLAX-ENAME->VLA-OBJECT<br/>Command:<br/>Command: ap<br/>APPLOAD 新建 文本文档.lsp successfully loaded.<br/>Command:<br/>Command:<br/>Command: ap<br/>APPLOAD 新建 文本文档.lsp successfully loaded.<br/>Command:<br/>Command:<br/>Command: dump<br/>Select object: ; IAcadExternalReference2: IAcadExternalReference Interface<br/>; Property values:<br/>; Application (RO) = #<VLA-OBJECT IAcadApplication 00c2db8c><br/>; Document (RO) = #<VLA-OBJECT IAcadDocument 013d7344><br/>; Handle (RO) = "116"<br/>; HasAttributes (RO) = 0<br/>; HasExtensionDictionary (RO) = 0<br/>; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0a99d1a4><br/>; InsertionPoint = (936.412 386.14 0.0)<br/>; InsUnits (RO) = "Unitless"<br/>; InsUnitsFactor (RO) = 1.0<br/>; Layer = "0"<br/>; Linetype = "ByLayer"<br/>; LinetypeScale = 1.0<br/>; Lineweight = -1<br/>; Name = "E02"<br/>; Normal = (0.0 0.0 1.0)<br/>; ObjectID (RO) = 2130174256<br/>; ObjectName (RO) = "AcDbBlockReference"<br/>; OwnerID (RO) = 2130042104<br/>; Path = "D:\\JOB\\BD\\BD\\1217\\E02.dwg"<br/>; PlotStyleName = "ByLayer"<br/>; Rotation = 0.0<br/>; TrueColor = #<VLA-OBJECT IAcadAcCmColor 0a9acf40><br/>; Visible = -1<br/>; XEffectiveScaleFactor = 1.0<br/>; XScaleFactor = 1.0<br/>; YEffectiveScaleFactor = 1.0<br/>; YScaleFactor = 1.0<br/>; ZEffectiveScaleFactor = 1.0<br/>; ZScaleFactor = 1.0<br/>; Methods supported:<br/>; ArrayPolar (3)<br/>; ArrayRectangular (6)<br/>; Copy ()<br/>; Delete ()<br/>; Explode ()<br/>; GetAttributes ()<br/>; GetBoundingBox (2)<br/>; GetConstantAttributes ()<br/>; GetExtensionDictionary ()<br/>; GetXData (3)<br/>; Highlight (1)<br/>; IntersectWith (2)<br/>; Mirror (2)<br/>; Mirror3D (3)<br/>; Move (2)<br/>; Rotate (2)<br/>; Rotate3D (3)<br/>; ScaleEntity (2)<br/>; SetXData (2)<br/>; TransformBy (1)<br/>; Update ()<br/>nil<br/>Command:<br/>Command:<br/>Automatic save to C:\Documents and Settings\BOAT\Local <br/>Settings\Temp\Drawing1_1_1_8961.sv$ ...<br/></p> 本帖最后由 作者 于 2007-12-26 0:39:54 编辑 <br /><br /> <p>我看了上面的关于英文版的BLOCK 对象方法、属性列表</p><p>这个问题属于应该版本的问题</p><p>中文版的04都有 EFFECTIVENAME 属性啊。偏偏你传上来的没有。</p><p>命令: DUMP<br/>选择对象: ; IAcadExternalReference: IAcadExternalReference 接口<br/>;特性值:<br/>; Application (RO) = #<VLA-OBJECT IAcadApplication 00d73d3c><br/>; Document (RO) = #<VLA-OBJECT IAcadDocument 01baf398><br/><font face="Arial Black">; EffectiveName (RO) = "TEST"</font><br/>; Handle (RO) = "B74"<br/>; HasAttributes (RO) = 0<br/>; HasExtensionDictionary (RO) = 0<br/>; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 092e025c><br/>; InsertionPoint = (49.3608 1482.46 0.0)<br/>; InsUnits (RO) = "毫米"<br/>; InsUnitsFactor (RO) = 1.0<br/>; IsDynamicBlock (RO) = 0<br/>; Layer = "0"<br/>; Linetype = "ByLayer"<br/>; LinetypeScale = 1.0<br/>; Lineweight = -1<br/>; Material = "ByLayer"<br/>; Name = "TEST"<br/>; Normal = (0.0 0.0 1.0)<br/>; ObjectID (RO) = 2128230112<br/>; ObjectName (RO) = "AcDbBlockReference"<br/>; OwnerID (RO) = 2130271480<br/>; Path = "D:\\TEST.DWG"<br/>; PlotStyleName = "ByLayer"<br/>; Rotation = 0.0<br/>; TrueColor = #<VLA-OBJECT IAcadAcCmColor 08b35e10><br/>; Visible = -1<br/>; XEffectiveScaleFactor = 1.0<br/>; XScaleFactor = 1.0<br/>; YEffectiveScaleFactor = 1.0<br/>; YScaleFactor = 1.0<br/>; ZEffectiveScaleFactor = 1.0<br/>; ZScaleFactor = 1.0<br/>;支持的方法:<br/>; ArrayPolar (3)<br/>; ArrayRectangular (6)<br/>; ConvertToAnonymousBlock ()<br/>; ConvertToStaticBlock (1)<br/>; Copy ()<br/>; Delete ()<br/>; Explode ()<br/>; GetAttributes ()<br/>; GetBoundingBox (2)<br/>; GetConstantAttributes ()<br/>; GetDynamicBlockProperties ()<br/>; GetExtensionDictionary ()<br/>; GetXData (3)<br/>; Highlight (1)<br/>; IntersectWith (2)<br/>; Mirror (2)<br/>; Mirror3D (3)<br/>; Move (2)<br/>; ResetBlock ()<br/>; Rotate (2)<br/>; Rotate3D (3)<br/>; ScaleEntity (2)<br/>; SetXData (2)<br/>; TransformBy (1)<br/>; Update ()<br/>nil</p><p>我把源代码该了下,应该能通吃:</p><p>(VL-LOAD-COM)</p><p>(DEFUN C:XREFBIND (/ COUNT CATCH OBJNAME SSOBJ TMP REFBLOCK)<br/> (SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT)))<br/> (SETQ SSOBJ (VLA-GET-ACTIVESELECTIONSET ACADDOCUMENT))<br/> (VLA-CLEAR SSOBJ)<br/> (PRINC "\n选择要绑定的参照块:")<br/> (VLA-SELECTONSCREEN SSOBJ<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER))<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT))<br/> ) ;_ 结束VLA-SELECTONSCREEN(SETQ I(VLA-ITEM SSOBJ 0) TMP NIL)<br/> (WHILE (< 0 (SETQ COUNT (VLA-GET-COUNT SSOBJ)))<br/> (SETQ TMP NIL)<br/> (VLAX-FOR I SSOBJ<br/> (IF(VL-CATCH-ALL-ERROR-P(SETQ CATCH (vl-catch-all-apply 'VLA-GET-EFFECTIVENAME (list I))))<br/> (SETQ CATCH (VLA-GET-NAME I))</p><p>;如果对象不支持 VLA-GET-EFFECTIVENAME 则直接读取 NAME属性<br/> )<br/> (IF (= :VLAX-TRUE (VLA-GET-ISXREF (SETQ REFBLOCK (VLA-ITEM (VLA-GET-BLOCKS ACADDOCUMENT) CATCH))))<br/> (IF (NOT (MEMBER CATCH TMP))<br/> (PROGN<br/> (SETQ TMP (CONS CATCH TMP))<br/> (VLA-BIND REFBLOCK :VLAX-TRUE)<br/> (PRINC (STRCAT "\n 参照块:" CATCH " 已经绑定。"))<br/> ) ;_ 结束PROGN<br/> ) ;_ 结束IF<br/> ) ;_ 结束IF<br/> ) ;_ 结束VLAX-FOR<br/> (VLA-CLEAR SSOBJ)<br/> (PRINC "\n选择要绑定的参照块:")<br/> (VLA-SELECTONSCREEN SSOBJ<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER))<br/> (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT))<br/> ) ;_ 结束VLA-SELECTONSCREEN<br/> ) ;_ 结束WHILE<br/>) ;_ 结束defun</p><p>(DEFUN XET-LIST->SAFEARRAY (LISTA VBDATASTYLE / LL)<br/> ;;将列表转换为VLA数组对象 需指定对象类型<br/> ;;(SETQ LISTA (LIST 0 0 0 "AA" 0.001))<br/> (SETQ LL (- (LENGTH LISTA) 1)<br/> LL (CONS 0 LL)<br/> ) ;_ 结束SETQ<br/> (SETQ LL (VLAX-MAKE-SAFEARRAY VBDATASTYLE LL))<br/> (VLAX-SAFEARRAY-FILL LL LISTA)<br/>)</p>
页:
[1]
2