Designer 发表于 2022-7-5 15:43:04

Lisp显示可见性st

大家好,
 
已经有一段时间了。
 
是否有人使用lisp在引线上显示动态块的可见性状态?
 
干杯

rlx 发表于 2022-7-5 16:05:46

只需快速剪切粘贴在一起的副本:
 
 



; modified / supplemented lsp found on : http://www.cadtutor.net/forum/showthread.php?39301-Block-into-multileader-text/page2&highlight=leader
(defun c:VisLabel (/ blk entl obj)
(vl-load-com)
(cond ((not (setq blk (car (entsel "\nSelect block: ")))))
       ((not (eq (cdr (assoc 0 (entget blk))) "INSERT")) (princ "\nInvalid object!"))
       ((setq pt (getpoint "\nSpecify first point: "))
      (setq entl (entlast))
      (vl-cmdf "_.mleader" "_non" pt "\\")
      (while (eq (logand 1 (getvar 'CMDACTIVE)) 1) (vl-cmdf ""))
      (if (and (not (equal entl (setq entl (entlast)))) (setq entl (vlax-ename->vla-object entl)))
         (if (not (setq visname (GetBVis (vlax-ename->vla-object blk))))
             (vla-put-textstringentl "No visibility")   (vla-put-textstringentl visname)
          )
      )
       )
)
(princ)
)
; just some ccp (cut copy paste) from my RlxBlk.lsp
; (GetBVis (vlax-ename->vla-object (car (entsel))))
; get current visibility name block object
(defun GetBVis ( %blk / blk dic bvp bvn)
(if (and (vl-every
   '(lambda (p)(vlax-property-available-p %blk p)) '(isdynamicblock hasextensiondictionary effectivename))
   (setq blk (vla-item (vla-get-blocks (vla-get-document %blk)) (vla-get-effectivename %blk)))
   (setq dic (dictsearch (vlax-vla-object->ename (vla-getextensiondictionary blk)) "ACAD_ENHANCEDBLOCK"))
   (setq bvp (findaso "BLOCKVISIBILITYPARAMETER" (massoc 360 dic)))
   (setq bvn (cdr (assoc 301 bvp))))
   (vl-some '(lambda (p) (if (= (vla-get-PropertyName p) bvn) (vlax-get p 'Value)))
   (vlax-invoke %blk 'getDynamicBlockProperties))))
(defun massoc ($i $l / a l)(while (setq a (assoc $i $l))(setq l (cons (cdr a) l) $l (cdr (member a $l))) l))
(defun FindAso ($v %l) (vl-some (function (lambda(x) (if (= $v (cdr (assoc 0 (setq e (entget x))))) e nil))) %l))


gr.Rlx

Designer 发表于 2022-7-5 16:15:39

谢谢,成功了。
 
我试着改变你写的行(vla put textstring entl“No visibility”)来显示当没有可见性模式来显示块名时,我试过(vla put textstring entl effectivename),但没有成功。
你能再帮我一次吗?
 

rlx 发表于 2022-7-5 16:37:46

当然:
 
 



; modified lsp found on : http://www.cadtutor.net/forum/showthread.php?39301-Block-into-multileader-text/page2&highlight=leader
(defun c:VisLabel (/ blk entl pt visname)
(cond ((not (setq blk (car (entsel "\nSelect block: ")))))
       ((not (eq (cdr (assoc 0 (entget blk))) "INSERT")) (princ "\nInvalid object!"))
       ((setq pt (getpoint "\nSpecify first point: "))
      (setq entl (entlast) blk (vlax-ename->vla-object blk))
      (vl-cmdf "_.mleader" "_non" pt "\\")
      (while (eq (logand 1 (getvar 'CMDACTIVE)) 1) (vl-cmdf ""))
      (if (and (not (equal entl (setq entl (entlast)))) (setq entl (vlax-ename->vla-object entl)))
   (if (setq visname (GetBVis blk))
   (vla-put-textstringentl visname)
   (vla-put-textstringentl
       (vlax-get-propertyblk
(if (vlax-property-available-p blk 'EffectiveName) 'EffectiveName 'Name))))))
)
(princ)
)

; just some ccp (cut copy paste) from my RlxBlk.lsp
; (GetBVis (vlax-ename->vla-object (car (entsel))))
; get current visibility name block object
(defun GetBVis ( %blk / blk dic bvp bvn)
(if (and (vl-every '(lambda (p)(vlax-property-available-p %blk p)) '(isdynamicblock hasextensiondictionary effectivename))
   (setq blk (vla-item (vla-get-blocks (vla-get-document %blk)) (vla-get-effectivename %blk)))
   (setq dic (dictsearch (vlax-vla-object->ename (vla-getextensiondictionary blk)) "ACAD_ENHANCEDBLOCK"))
   (setq bvp (findaso "BLOCKVISIBILITYPARAMETER" (massoc 360 dic)))
   (setq bvn (cdr (assoc 301 bvp))))
   (vl-some '(lambda (p) (if (= (vla-get-PropertyName p) bvn) (vlax-get p 'Value)))
   (vlax-invoke %blk 'getDynamicBlockProperties))))
(defun massoc ($i $l / a l)(while (setq a (assoc $i $l))(setq l (cons (cdr a) l) $l (cdr (member a $l))) l))
(defun FindAso ($v %l) (vl-some (function (lambda(x) (if (= $v (cdr (assoc 0 (setq e (entget x))))) e nil))) %l))



 
 
gr.Rlx

Designer 发表于 2022-7-5 16:50:36

谢谢你的好意
页: [1]
查看完整版本: Lisp显示可见性st