AIberto 发表于 2022-7-5 22:17:58

分享!Xrecord功能

以下代码源于XDCAD。ORG,作者是自由撰稿人
 

;;Set Xrecord
;;bbs.xdcad.org
;;Author:Free-Lancer
(defun Obj:SetXrecord (obj name      values / _setxrecord xlst xrec dicts xd
                      xt)
(defun _setxrecord (obj lst)
   (vla-setxrecorddata
   obj
   (list->vbarray (mapcar 'car lst) vlax-vbinteger)
   (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)      
   )
)
(if (= (vla-get-objectname obj) "AcDbDictionary")
   (progn
   (vlax-for      d obj
       (if (and (= (vla-get-objectname d) "AcDbXrecord")
                (= (strcase (vla-get-name d)) (strcase name))
         )
         (setq xrec d)
       )
   )
   (if xrec
       (progn
         (vla-getxrecorddata xrec 'xt 'xd)
         (if xt
         (_setxrecord
             xrec
             (append
               (mapcar      '(lambda (x y)
                        (cons x y)
                        )
                     (safearray-value xt)
                     (mapcar 'variant-value (safearray-value xd))
               )
               values
             )
         )
         (_setxrecord xrec values)
         )
       )
       (progn
         (setq xrec (vla-addxrecord obj name))
         (_setxrecord xrec values)
       )
   )
   )
   (if      (= (vla-get-hasExtensionDictionary obj) :vlax-true)
   (progn
       (setq dicts (vla-GetExtensionDictionary obj))
       (vlax-for dict dicts
         (if (and (= (vla-get-objectname dict) "AcDbXrecord")
                  (= (strcase (vla-get-name dict)) (strcase name))
             )
         (setq xrec dict)
         )
       )
       (if xrec
         (progn
         (vla-getxrecorddata xrec 'xt 'xd)
         (_setxrecord
             xrec
             (append
               (mapcar      '(lambda (x y)
                        (cons x y)
                        )
                     (safearray-value xt)
                     (mapcar 'variant-value (safearray-value xd))
               )
               values
             )
         )
         )
       )
   )
   (progn
       (setq dict (vla-getextensiondictionary obj)
             xrec (vla-addxrecord dict name)
       )
       (_setxrecord xrec values)
   )
   )
)
)
 
;;获取Xrecord

;; Get Xrecord
;;bbs.xdcad.org
;;Author:Free-Lancer
(defun Obj:GetXrecord (obj name / e dicts xd xt lst _getxrecord)
(defun _getxrecord (dc / xt xd)
   (if      (= (vla-get-objectname dc) "AcDbXrecord")
   (progn (vla-getxrecorddata dc 'xt 'xd)
            (if (and xt xd)
            (setq lst
                     (cons
                     (cons (vla-get-name dc)
                           (mapcar
                               '(lambda (x y) (cons x y))
                               (safearray-value xt)
                               (mapcar 'variant-value (safearray-value xd))
                           )
                     )
                     lst
                     )
            )
            (setq lst (cons (vla-get-name dc) lst))
            )
   )
   )
)
(if (= (vla-get-objectname obj) "AcDbDictionary")
   (vlax-for dict obj (_getxrecord dict))
   (if      (= (vla-get-hasExtensionDictionary obj) :vlax-true)
   (progn (setq dicts (vla-GetExtensionDictionary obj))
            (vlax-for dict dicts (_getxrecord dict))
   )
   )
)
(if (= name "*")
   lst
   (vl-remove-if-not
   '(lambda (x) (= (strcase (car x)) (strcase name)))
   lst
   )
)
)

 
;;删除Xrecord

;;bbs.xdcad.org
;;Author:Free-Lancer
(defun obj:DeleteXrecord (obj name /)
(if (= (vla-get-objectname obj) "AcDbDictionary")
   (vlax-for d      obj
   (if (= (vla-get-objectname d) "AcDbXrecord")
       (if (= name "*")
         (vla-delete d)
       )
       (if (= (strcase (vla-get-name d)) (strcase name))
         (vla-delete d)
       )
   )
   )
   (if      (vla-get-hasextensiondictionary obj)
   (vlax-for      d (vla-getextensiondictionary obj)
       (if (= (vla-get-objectname d) "AcDbXrecord")
         (if (= name "*")
         (vla-delete d)
         )
         (if (= (strcase (vla-get-name d)) (strcase name))
         (vla-delete d)
         )
       )
   )
   )
)
)

 
;;更换Xrecord

;;bbs.xdcad.org
;;Author:Free-Lancer
(defun OBJ:ReplaceXrecord (obj name vars / oldvars lst tf)
(if (setq lst (obj:getxrecord obj name))
   (progn
   (setq oldvars (mapcar 'car vars)
         lst            (mapcar
                     '(lambda (x / ll nx)
                        (if (setq ll
                                 (vl-member-if
                                     '(lambda (a) (equal a x 1e-3))
                                     oldvars
                                 )
                            )
                        (progn
                            (setq
                              nx (cons (car x) (cadr (assoc (car ll) vars)))
                              tf t
                            )
                            (setq vars (vl-remove (car ll) vars))
                            nx
                        )
                        x
                        )
                      )
                     lst
                   )
   )
   (if tf
       (obj:setxrecord obj name lst)
   )
   t
   )
)
)

 
;;删除Xrecord

;;bbs.xdcad.org
;;Author:Free-Lancer
(defun Obj:RemoveXrecord (obj name vars / lst)
(if (setq lst (obj:getxrecord obj name))
   (progn
   (mapcar '(lambda (x / el)
                (if (setq el (vl-member-if
                               '(lambda (a) (equal (cdr a) x 1e-3))
                               lst
                           )
                  )
                  (setq lst (vl-remove (car el) lst)
                        tft
                  )
                )
            )
             vars
   )
   (if tf
       (obj:setxrecord obj name lst)
   )
   t
   )
)
)
页: [1]
查看完整版本: 分享!Xrecord功能