feargt 发表于 2022-7-6 14:56:50

访问自定义ShSet属性t

你好
 
我前一段时间发布了一条帖子,但没有收到任何回应,所以我将使用我迄今为止取得的进展重试。
 
我希望能够访问自定义属性以获取值,然后说如果值=x,则执行Y等。
 
它应该做的是更改标题栏的可见性。自定义属性将为“当前版本”。我找到了允许我更改DB标题栏可见性的代码,但现在需要访问图纸集属性来控制可见性状态。
 
如果你能在任何方面帮助我,我将非常感激。谢谢。
 
下面是我从另一个论坛获得的saple代码,不确定是哪一个,也许这里有人能识别并给予应有的认可。该代码用于更改图形戳记的可见性。我可以修改这个来更改我的标题栏,但也需要上面的修改。
 
正如我所说的,如果您能提供任何帮助,我们将不胜感激
 
;----------------------------------------------------------- DynamicProps -----
; Function retrieve or set properties from a dynamic block
; (DynamicProps (car (entsel)) "Visibility" nil) get the visibility states from a dynamic block
; (DynamicProps (car (entsel)) "Visibility" "Construction") set the visibility from a dynamic block
; (DynamicProps (car (entsel)) "" nil) get the properties from a dynamic block
; (DynamicProps (car (entsel)) "Pipe length" 2000.0) set the properties from a dynamic block
(defun DynamicProps (ename propname value / obj prpL cla cll prp)
(setq obj (if (= (type ename) 'VLA-OBJECT) ename (vlax-ename->vla-object ename)))
(setq prpL (vlax-invoke obj 'getdynamicblockproperties))
(setq return
   (if (setq prp (vl-remove-if-not (function (lambda(x)(= (vlax-get-property x 'PropertyName) propname))) prpL))
   (mapcar (function (lambda(v)
       (if (and (/= value nil)(vlax-property-available-p v 'Value)(/= (type value)'LIST))
         (progn (vlax-put-property v 'Value value)(vla-update obj))
       )
       (if (and (vlax-property-available-p v 'AllowedValues) (vlax-get v 'AllowedValues))
         (list (vlax-get v 'Value)(vlax-get v 'AllowedValues))
(vlax-get v 'Value)
       )
   )) prp)
   (mapcar (function (lambda(v)(list (vla-get-propertyName v)(vlax-get v 'Value) v))) prpL)
   )
)
return
)
;------------------------------------------------ MWE:GetDBlockNames ------------------
; Function for filtering dynamic blocks
; Arguments: 1
;    arglst = list met names
; Syntax: (MWE:GetDBlockNames '("Issue Stamp")) --> (("ISSUE STAMP" "*U833" "*U841")
;function by James Allen.
;;; Returns all names used for a dynamic block, including
;;; the actual block name and all anonymous instances.
;;;
;;; (setq names (MWE:GetDBlockNames (list bname)))
;;;
;;; bname = Str - Dynamic block name
;;; names = List - List of all inserted blocks whose
;;; EffectiveName = bname
;;;
;;; (setq names (MWE:GetDBlockNames '("TestDBlock")))
;;; ("TestDBlock" "*U4" "*U5" "*U6")
;;;
;;; James Allen - 26Apr07
;;; Malicoat-Winslow Engineers, P.C.
;;;
;;; Thanks to Joe Burke for pointing out code 331
;;; and to Tony Tanzillo for prodding in that direction.
;;;
(defun MWE:GetDBlockNames (arglst / blk edt enm ins name names)
(mapcar 'set '(name) arglst)
(setq names (list name) name (strcase name))
(vl-load-com)
(vlax-for blk (vla-get-Blocks (vlax-get (vlax-get-Acad-Object) 'ActiveDocument))
   (if (and (setq enm (tblobjname "block" (vla-get-Name blk)))
   (setq edt (entget enm))
   (= (logand (cdr (assoc 70 edt)) 1) 1))
   (if (and (setq edt (entget (vlax-vla-object->ename blk)))
       (setq enm (cdr (assoc 331 edt)))
       (setq ins (vlax-ename->vla-object enm))
       (eq (vla-get-ObjectName ins) "AcDbBlockReference")
       (wcmatch (strcase (vla-get-EffectiveName ins)) name))
       (setq names (cons (vla-get-Name blk) names))
   )
   )
)
(reverse names)
) ;end
;------------------------------------------------ BlockNamesFilter ------------------
;; Argument example: ("TestDBlock" "*U4" "*U5" "*U6")
;; Returns: "TestDBlock,`*U4,`*U5,`*U6,"
(defun BlockNamesFilter (strlst)
(apply 'strcat (mapcar '(lambda (x)
   (if (wcmatch x "`**,`?*")(strcat "`" x ",")(strcat x ","))) strlst)
)
)
;----------------------------------------------------------- ChangeVisibility -----
;; Argument example: (ChangeVisibility "Issue Stamp" "Review")
;; Returns: number of changed states
(defun ChangeVisibility (BlkName state / names ss ssl tempEnt)
(setq names (MWE:GetDBlockNames (list BlkName)))
(prompt (strcat "\nSelect insert Name " BlkName ": "))
(if (and (setq ss (ssget (list '(0 . "INSERT")(cons 2 (BlockNamesFilter names)))))
   (> (setq ssl (sslength ss)) 0))
   (progn
   (while (setq tempEnt (ssname ss 0))
(DynamicProps (vlax-ename->vla-object tempEnt) "Visibility" state)
       (ssdel tempEnt ss)
   )
   (princ (strcat "\nChanged "(itoa ssl) " inserts to the visibility <" state ">."))
   ssl
   )
   (princ (strcat "\nInsert " BlkName " not found."))
)
)
;----------------------------------------------------------- c:ChvConstruction -----
(defun c:ChvConstruction ()
(ChangeVisibility "Issue Stamp" "Construction")
(princ)
)
;----------------------------------------------------------- c:ChvReview -----
(defun c:ChvReview ()
(ChangeVisibility "Issue Stamp" "Review")
(princ)
)
;----------------------------------------------------------- c:ChvBid -----
(defun c:ChvBid ()
(ChangeVisibility "Issue Stamp" "Bid")
(princ)
)
;----------------------------------------------------------- c:ChvReference -----
(defun c:ChvReference ()
(ChangeVisibility "Issue Stamp" "Reference")
(princ)
)

ASMI 发表于 2022-7-6 15:34:51

另一个示例是如何访问动态块的可见性参数:
============================================================        ;;;;                                                            ;;;;维科。LSP-此lisp程序从;;;;复制可见性状态;;;;一个动态块传递给其他块。                       ;;;;                                                                  ;;;; ============================================================        ;;;;                                                                    ;;;;呼叫命令:VICO;;;;        ;;;;选择示例动态块以获取可见性状态;;;;然后选择要复制状态的块集。        ;;;;                                                                    ;;;; ============================================================        ;;;;                                                                     ;;;;本程序及其部分内容可通过任何方法复制;;;;出于任何原因在任何媒体上。您可以使用或修改此;;;;程序或其部分完全免费。        ;;;;                                                            ;;;;该程序提供所有故障的“原样”;;;;并明确否认对;;;的任何默示保证;;;;适销性或适合特定用途;;;;        ;;;; ============================================================        ;;;;                                                            ;;;;V1.0,2008年4月10日,拉脱维亚里加;;;;©Aleksandr Smirnov(ASMI);;;;对于AutoCAD 2000-2008(未在后续版本中测试);;;;http://www.asmitools.com           ;;;;                                                                    ;;;; ============================================================ ;;(defun c:vico(/sBlk eBlk dyPrp cProp curBl prLst cSt efNm fLst bSet nSet errCnt)(vl load com)(if(setq sBlk(entsel“\n选择要复制可见性状态的样本块>”)(if(and(=“INSERT”(cdr(assoc 0(entget(setq eBlk(car sBlk))))(setq sBlk(vlax ename->vla object(car sBlk)))(=:vlax true(vla get IsDynamicBlock sBlk)));结束和(progn(if(setq dyPrp(vla GetDynamicBlockProperties sBlk))(progn(setq dyPrp(vlax safearray->list(vlax variant value dyPrp)))(foreach itm dyPrp(if(vlax-property-available-p itm’AllowedValues)(setq cSt(vla get value itm));如果结束);end foreach(如果cSt(progn(setq efNm(vla get EFIVENAME sBlk))errCnt 0);结束setq(princ“\n>”)(if(setq bSet(ssget'((0。“INSERT”))))(progn(setq bSet(vl remove if'listp(mapcar'cadr(ssnamex bSet)))nSet(ssadd))(foreach i bSet(setq curBl(vlax ename->vla object i))(if(and(vlax-method-applicable-p curBl'GetDynamicBlockProperties)(=efNm(vla get EffectiveName curBl)));结束和(ssadd i nSet));如果结束);结束foreach(setq nSet(mapcar'vlax ename->vla object(vl remove if'listp(mapcar'cadr(ssnamex nSet)а))(foreach bl nSet(setq prLst(vlax safearray->list(vlax variant value(vla GetDynamicBlockProperties bl))))(foreach pr prLst(if(vlax-property-available-p pr'AllowedValues)(if(vl-catch-all-error-p(vl catch all apply‘vla put Value(list pr cSt)))(setq errCnt(1+errCnt));如果结束);如果结束);结束foreach);end foreach(if(/=0 errCnt)(princ(strcat“\n>>>”(itoa errCnt)“位于锁定层上!未选择任何内容!>“可见性”参数未找到!>它不是动态块!>未选择任何内容!

feargt 发表于 2022-7-6 16:20:31

Asmi,
 
我对延迟回复表示歉意,但感谢您的回复。我已经决定暂时搁置这个小想法,直到晚些时候。
 
再次感谢。
页: [1]
查看完整版本: 访问自定义ShSet属性t