如何用lisp程序提取选择的属性块中的length属性,并加合,最后给出结果
上次你给我的答案不能加合,而且只能选择一个块,我不是想学习lisp,我只是想要一个结果我需要的是我在图中选出我需要的块,然后把它们的length属性合计,给出结果...
上次你给我的答案不能加合,而且只能选择一个块,我不是想学习lisp,我只是想要一个结果
我需要的是我在图中选出我需要的块,然后把它们的length属性合计,给出结果 展开
我需要的是我在图中选出我需要的块,然后把它们的length属性合计,给出结果 展开
2个回答
展开全部
一般有两个方案
第一个方案:用AutoLisp方案,首先用 取得图块这个图元,然后用 entnext 逐一找到属性块来找到其中length的属性,然后将它的值给找出来,然后进行运算,注意 entnext 的运用。这个很简单,你自己应该写吧。
第二个方案:用VisualLisp方案,注意vla-getattributes,vlax-variant-value,vlax-safeArray->list这几个函数的运用,以下为 VisualLisp的例子
(Defun C:Test ()
(setq en0 (car (entsel)))
;;此处请选有属性定义的图块
(setq vn0 (vlax-ename->vla-object en0))
(setq lstVar (vla-getattributes vn0))
(setq lstAttrs (vlax-safeArray->list (vlax-variant-value lstVar)))
(setq TextString nil)
(foreach attr lstAttrs
(setq TagString (vla-get-TagString attr))
(if (equal TagString "length") ;此处为你想要的元素
(setq TextString (vla-get-TextString attr))
)
)
(if TextString
(princ (strcat "The content of length = " TextString))
(princ "没有找到length ")
)
(prin1)
)
以上回答你满意么?
第一个方案:用AutoLisp方案,首先用 取得图块这个图元,然后用 entnext 逐一找到属性块来找到其中length的属性,然后将它的值给找出来,然后进行运算,注意 entnext 的运用。这个很简单,你自己应该写吧。
第二个方案:用VisualLisp方案,注意vla-getattributes,vlax-variant-value,vlax-safeArray->list这几个函数的运用,以下为 VisualLisp的例子
(Defun C:Test ()
(setq en0 (car (entsel)))
;;此处请选有属性定义的图块
(setq vn0 (vlax-ename->vla-object en0))
(setq lstVar (vla-getattributes vn0))
(setq lstAttrs (vlax-safeArray->list (vlax-variant-value lstVar)))
(setq TextString nil)
(foreach attr lstAttrs
(setq TagString (vla-get-TagString attr))
(if (equal TagString "length") ;此处为你想要的元素
(setq TextString (vla-get-TextString attr))
)
)
(if TextString
(princ (strcat "The content of length = " TextString))
(princ "没有找到length ")
)
(prin1)
)
以上回答你满意么?
追问
这个不行,只能选择一个块,我要的是合计。你给出第一个方案也行,我不太懂lisp,我只是要一个结果,能用就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(Defun C:T911 (/ lstText i sum textA tmp)
;; 子函数:返回列表("52" "36" "48")
(Defun GetAttsFromBlk (/ lstSS ss i lstText en vn lstAttrs TagString)
(setq lstSS '((0 . "INSERT") (2 . "wdx_new_00")))
(setq ss (vl-catch-all-apply 'ssget (list lstSS)))
(cond ((or (null ss) (vl-catch-all-error-p ss)) (vl-exit-with-value 0)))
(setq i 0)
(setq lstText '())
(repeat (sslength ss)
(setq en (ssname ss i)
i (1+ i)
vn (vlax-ename->vla-object en)
lstAttrs (vlax-safeArray->list (vlax-variant-value (vla-getattributes vn)))
)
(foreach attr lstAttrs
(setq TagString (vla-get-TagString attr))
(if (equal (strcase TagString) (strcase "length"))
(progn
(setq TextString (vla-get-TextString attr))
(setq lstText (cons (vl-string-trim TextString) lstText))
)
)
)
)
lstText
)
;;; ;;
;;; ;;
(setq lstText (T0911_GetAttsFromBlk))
(setq i 0)
(setq sum 0)
(repeat (length lstText)
(setq textA (nth i lstText)
i (1+ i)
)
(setq tmp (vl-catch-all-apply 'atof (list textA)))
(if (not (vl-catch-all-error-p tmp))
(setq sum (+ sum tmp))
)
)
(princ (strcat "结果=" (rtos sum 2 4)))
(prin1)
)
;; 子函数:返回列表("52" "36" "48")
(Defun GetAttsFromBlk (/ lstSS ss i lstText en vn lstAttrs TagString)
(setq lstSS '((0 . "INSERT") (2 . "wdx_new_00")))
(setq ss (vl-catch-all-apply 'ssget (list lstSS)))
(cond ((or (null ss) (vl-catch-all-error-p ss)) (vl-exit-with-value 0)))
(setq i 0)
(setq lstText '())
(repeat (sslength ss)
(setq en (ssname ss i)
i (1+ i)
vn (vlax-ename->vla-object en)
lstAttrs (vlax-safeArray->list (vlax-variant-value (vla-getattributes vn)))
)
(foreach attr lstAttrs
(setq TagString (vla-get-TagString attr))
(if (equal (strcase TagString) (strcase "length"))
(progn
(setq TextString (vla-get-TextString attr))
(setq lstText (cons (vl-string-trim TextString) lstText))
)
)
)
)
lstText
)
;;; ;;
;;; ;;
(setq lstText (T0911_GetAttsFromBlk))
(setq i 0)
(setq sum 0)
(repeat (length lstText)
(setq textA (nth i lstText)
i (1+ i)
)
(setq tmp (vl-catch-all-apply 'atof (list textA)))
(if (not (vl-catch-all-error-p tmp))
(setq sum (+ sum tmp))
)
)
(princ (strcat "结果=" (rtos sum 2 4)))
(prin1)
)
更多追问追答
追问
怎么用啊,是不是加载了之后,输入T911。但出现错误
错误: no function definition: T0911_GETATTSFROMBLK
追答
已经给你发了邮件,你查收一下
来自:求助得到的回答
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询