To insert just one block definition from another drawing requires a DBX module.
If you go to this link you can see a simple version (with no error trapping)
https://forums.autodesk.com/t5/visua...p/td-p/5519160
I prefer to write functions that can be reused.
I have vast libraries that include 1000's of functions.
I prefer to build them with error trapping built in...
I broke this routine up into reusable functions that perform the steps necessary to copy a block from another drawing.
So...
Code:
;___________________________________________________________________________________________________________|
;
; Written By: Peter Jamtgaard copyright 2017 All Rights Reserved
;___________________________________________________________________________________________________________|
;___________________________________________________________________________________________________________|
;___________________________________________________________________________________________________________|
;
; General Functions
;___________________________________________________________________________________________________________|
;* (BlockFromFile strFullName strBlockName)
;* Function to duplicate a block definition from an outside drawing
;* (CopyObjects2 objOwner lstObjects objCOllection)
;* Function to create a safearray of objects and run the copyobjects method
;* (DBXDocument strFullName)
;* Function to open a DBX Document
;* (DBXBlockDefinition objDBXDocument strBlockName)
;* Function to read a DBX document and return a specified block definition
;* (ErrorTrap symFunction)
;* Function to trap an error
;* (ListToSafeArray lstObjects symObjectType)
;* Function to create a safearray
;$ Header End
; Function Headers
;___________________________________________________________________________________________________________|
;
; Function to duplicate a block definition from an outside drawing
;___________________________________________________________________________________________________________|
(defun BlockFromFile (strFullName strBlockName / lstGlobalToRelease objBlocks objDBXDocument objDBXBlockDefinition)
(if (and (setq objDBXDocument (DBXDocument strFullName))
(setq objDBXBlockDefinition (DBXBlockDefinition objDBXDocument strBlockName))
(setq objBlocks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
(not (errortrap '(vla-item objBlocks strBlockName)))
(CopyObjects2 objDBXDocument (list objDBXBlockDefinition) objBlocks)
)
(setq objBlockDefinition (errortrap '(vla-item objDBXBlockDefinition strBlockName)))
(princ (strcat "\nError copying block: " strBlockName " from drawing " strFullName "..."))
)
(mapcar '(lambda (X)(errortrap (quote (vlax-release-object X)))) lstGlobalToRelease);<- Must release objects in reverse order
objDBXBlockDefinition
)
;___________________________________________________________________________________________________________|
;
; Function to create a safearray of objects and run the copyobjects method
;___________________________________________________________________________________________________________|
(defun CopyObjects2 (objOwner lstObjects objCOllection / lstObjects2 safObjects)
(if (setq safObjects (ListToSafeArray vlax-vbobject lstObjects))
(or (errortrap '(vla-CopyObjects objOwner
safObjects
objCollection
)
)
(princ "\nError using copyobjects: ")
)
)
)
;___________________________________________________________________________________________________________|
;
; Function to open a DBX Document
;___________________________________________________________________________________________________________|
(defun DBXDocument (strFullName / objDBXDocument strACADVersion strObjectDBX)
(if (and (= (type strFullName) 'STR)
(= (strcase (vl-filename-extension strFullName)) ".DWG")
(setq strFullName (findfile strFullName))
(setq strACADVersion (getvar "acadver"))
(setq strObjectDBX (strcat "ObjectDBX.AxDbDocument." (substr strACADVersion 1 2)))
(setq objDBXDocument (vla-GetInterfaceObject (vlax-get-acad-object) strObjectDBX ))
(setq lstGlobalToRelease (list objDBXDocument))
(errortrap '(vla-open objDBXDocument strFullName))
)
objDBXDocument
(princ "\nError creating DBX File Object!: ")
)
)
;___________________________________________________________________________________________________________|
;
; Function to read a DBX document and return a specified block definition
;___________________________________________________________________________________________________________|
(defun DBXBlockDefinition (objDBXDocument strBlockName / objDBXBlockDefinition objDBXBlocks)
(if (and
(= (type strBlockName) 'STR)
(setq objDBXBlocks (vla-get-blocks objDBXDocument))
(setq lstGlobalToRelease (cons objDBXBlocks lstGlobalToRelease))
(setq objDBXBlockDefinition (errortrap '(vla-item objDBXBlocks strBlockName)))
(setq lstGlobalToRelease (cons objDBXBlockDefinition lstGlobalToRelease))
)
objDBXBlockDefinition
(progn (princ "\nError reading DBX block definition object: ") nil)
)
)
;___________________________________________________________________________________________________________|
;
; Function to trap an error
;___________________________________________________________________________________________________________|
(defun ErrorTrap (symFunction / objError result)
(if (vl-catch-all-error-p
(setq objError (vl-catch-all-apply
'(lambda (XYZ)(set XYZ (eval symFunction)))
(list 'result))))
nil
(or result
'T
)
)
)
;___________________________________________________________________________________________________________|
;
; Function to create a safearray
;___________________________________________________________________________________________________________|
;vlax-vbInteger (2) Integer
;vlax-vbLong (3) Long integer
;vlax-vbSingle (4) Single-precision floating-point number
;vlax-vbDouble (5) Double-precision floating-point number
;vlax-vbString (8) String
;vlax-vbObject (9) Object
;vlax-vbBoolean (11) Boolean
;vlax-vbVariant (12) Variant
(defun ListToSafeArray (symVariableType lstValues / safObjects)
(if (and (setq safValues (vlax-make-safearray symVariableType (cons 0 (1- (length lstValues)))))
(errortrap '(vlax-safearray-fill safValues lstValues))
)
safValues
)
)
(princ "!")
(vl-load-com)