本帖最后由 作者 于 2007-12-26 0:39:54 编辑
我看了上面的关于英文版的BLOCK 对象方法、属性列表 这个问题属于应该版本的问题 中文版的04都有 EFFECTIVENAME 属性啊。偏偏你传上来的没有。 命令: DUMP 选择对象: ; IAcadExternalReference: IAcadExternalReference 接口 ;特性值: ; Application (RO) = #<VLA-OBJECT IAcadApplication 00d73d3c> ; Document (RO) = #<VLA-OBJECT IAcadDocument 01baf398> ; EffectiveName (RO) = "TEST" ; Handle (RO) = "B74" ; HasAttributes (RO) = 0 ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 092e025c> ; InsertionPoint = (49.3608 1482.46 0.0) ; InsUnits (RO) = "毫米" ; InsUnitsFactor (RO) = 1.0 ; IsDynamicBlock (RO) = 0 ; Layer = "0" ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; Name = "TEST" ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 2128230112 ; ObjectName (RO) = "AcDbBlockReference" ; OwnerID (RO) = 2130271480 ; Path = "D:\\TEST.DWG" ; PlotStyleName = "ByLayer" ; Rotation = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 08b35e10> ; Visible = -1 ; XEffectiveScaleFactor = 1.0 ; XScaleFactor = 1.0 ; YEffectiveScaleFactor = 1.0 ; YScaleFactor = 1.0 ; ZEffectiveScaleFactor = 1.0 ; ZScaleFactor = 1.0 ;支持的方法: ; ArrayPolar (3) ; ArrayRectangular (6) ; ConvertToAnonymousBlock () ; ConvertToStaticBlock (1) ; Copy () ; Delete () ; Explode () ; GetAttributes () ; GetBoundingBox (2) ; GetConstantAttributes () ; GetDynamicBlockProperties () ; GetExtensionDictionary () ; GetXData (3) ; Highlight (1) ; IntersectWith (2) ; Mirror (2) ; Mirror3D (3) ; Move (2) ; ResetBlock () ; Rotate (2) ; Rotate3D (3) ; ScaleEntity (2) ; SetXData (2) ; TransformBy (1) ; Update () nil 我把源代码该了下,应该能通吃: (VL-LOAD-COM) (DEFUN C:XREFBIND (/ COUNT CATCH OBJNAME SSOBJ TMP REFBLOCK) (SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT))) (SETQ SSOBJ (VLA-GET-ACTIVESELECTIONSET ACADDOCUMENT)) (VLA-CLEAR SSOBJ) (PRINC "\n选择要绑定的参照块:") (VLA-SELECTONSCREEN SSOBJ (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER)) (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT)) ) ;_ 结束VLA-SELECTONSCREEN(SETQ I(VLA-ITEM SSOBJ 0) TMP NIL) (WHILE (< 0 (SETQ COUNT (VLA-GET-COUNT SSOBJ))) (SETQ TMP NIL) (VLAX-FOR I SSOBJ (IF(VL-CATCH-ALL-ERROR-P(SETQ CATCH (vl-catch-all-apply 'VLA-GET-EFFECTIVENAME (list I)))) (SETQ CATCH (VLA-GET-NAME I)) ;如果对象不支持 VLA-GET-EFFECTIVENAME 则直接读取 NAME属性 ) (IF (= :VLAX-TRUE (VLA-GET-ISXREF (SETQ REFBLOCK (VLA-ITEM (VLA-GET-BLOCKS ACADDOCUMENT) CATCH)))) (IF (NOT (MEMBER CATCH TMP)) (PROGN (SETQ TMP (CONS CATCH TMP)) (VLA-BIND REFBLOCK :VLAX-TRUE) (PRINC (STRCAT "\n 参照块:" CATCH " 已经绑定。")) ) ;_ 结束PROGN ) ;_ 结束IF ) ;_ 结束IF ) ;_ 结束VLAX-FOR (VLA-CLEAR SSOBJ) (PRINC "\n选择要绑定的参照块:") (VLA-SELECTONSCREEN SSOBJ (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST 100) VLAX-VBINTEGER)) (VLAX-MAKE-VARIANT (XET-LIST->SAFEARRAY (LIST "AcDbBlockReference") VLAX-VBVARIANT)) ) ;_ 结束VLA-SELECTONSCREEN ) ;_ 结束WHILE ) ;_ 结束defun (DEFUN XET-LIST->SAFEARRAY (LISTA VBDATASTYLE / LL) ;;将列表转换为VLA数组对象 需指定对象类型 ;;(SETQ LISTA (LIST 0 0 0 "AA" 0.001)) (SETQ LL (- (LENGTH LISTA) 1) LL (CONS 0 LL) ) ;_ 结束SETQ (SETQ LL (VLAX-MAKE-SAFEARRAY VBDATASTYLE LL)) (VLAX-SAFEARRAY-FILL LL LISTA) ) |