yfywk 发表于 2016-4-23 15:01:26

如何获取属性块内文字的长度?(已解决选取问题)

本帖最后由 yfywk 于 2016-4-27 20:17 编辑

学习lisp编程,自己制作小工具,以便画图方便使用,现在遇到一个问题:
属性图块内文字的长度如何获取?

自贡黄明儒 发表于 2016-4-23 17:28:34

同块外一样的。

yfywk 发表于 2016-4-23 18:39:07

(setq ent (car (nentsel "\n请选择文本:")))
(setq zf (cdr (assoc 1 (entget (ent))))); 提取文本得字符
(setq len (strlen zf));文本字符串的长度
使用这样的代码出现
请选择文本:; 错误: 函数错误: <图元名: 7ffff635980>
是怎么回事儿

springwillow 发表于 2016-4-23 22:39:10

yfywk 发表于 2016-4-23 18:39 static/image/common/back.gif
(setq ent (car (nentsel "\n请选择文本:")))
(setq zf (cdr (assoc 1 (entget (ent))))); 提取文本得字符 ...

再查查nentsel的用法吧,你的用法不对,你要的在nentsel返回的表里!

yfywk 发表于 2016-4-24 08:01:23

已经在论坛里查找到了相关代码,编写成了我需要的小工具,目前我需依据字符长短来调节属性块中文字下方线的长短。代码如下:;; 获取动态块的属性-Lee Mac
;; 返回动态块的一个属性值 (如果存在)
;; blk - VLA 类型动态块数据
;; prp - str 类型的动态块属性名称(不分大小写)
(defun LM:getdynpropvalue (blk prp)
(setq prp (strcase prp))
(vl-some '(lambda (x)
      (if (= prp (strcase (vla-get-propertyname x)))
    (vlax-get x 'value)
      )
      )
   (vlax-invoke blk 'getdynamicblockproperties)
)
)
;; 设置动态块的属性值-Lee Mac
;; 修改一个动态块的属性值(如果存在)
;; blk - VLA 类型的动态块数据
;; prp - str 类型的动态块属性名称(不分大小写)
;; val - 新的动态块属性(数据类型随系统,常见为string)
;; 返回: 新的动态块属性(如果成功,否则nil)
(defun LM:setdynpropvalue (blk prp val)
(setq prp (strcase prp))
(vl-some
    '(lambda (x)
       (if (= prp (strcase (vla-get-propertyname x)))
   (progn
   (vla-put-value
       x
       (vlax-make-variant
         val
         (vlax-variant-type (vla-get-value x))
       )
   )
   (cond (val)
   (t)
   )
   )
       )
   )
    (vlax-invoke blk 'getdynamicblockproperties)
)
)

(defun c:test()
(setq lenCH (car (apply 'mapcar (cons '- (reverse (textbox (entget(car(nentsel "\n请选择文字")))))))));获取块内文字长度,这段代码论坛中获取,谢谢
(setq lenw (rtos lenCH));转换文字长度串值

(prompt "\n请选择图名.");这里继续选择属性块
(setq dx_actdyn (vlax-ename->vla-object (car (entsel))))
(LM:setdynpropvalue dx_actdyn "距离1" lenw);
;设置选择的动态属性块 ”距离1“ 长度为文字长度
    (princ)
)目前需要解决的是属性图块需要选择两次,不知是否有办法选择一次就可实现二次的修改问题?

yfywk 发表于 2016-4-25 11:16:57

帖子不要沉哦,求解决

自贡黄明儒 发表于 2016-4-25 11:46:15

(entsel)返回有一个点,nentsel可以利用这个点,这样就只选择一次了(nentsel利用这个点自动选择)

vectra 发表于 2016-4-25 12:15:12

(setq zf (cdr (assoc 1 (entget ent))))

ent前后的括号取消

yfywk 发表于 2016-4-25 12:40:37

自贡黄明儒 发表于 2016-4-25 11:46 static/image/common/back.gif
(entsel)返回有一个点,nentsel可以利用这个点,这样就只选择一次了(nentsel利用这个点自动选择)

貌似设置变量好像不行哦!不知道怎么利用

自贡黄明儒 发表于 2016-4-25 13:20:24

yfywk 发表于 2016-4-25 12:40 static/image/common/back.gif
貌似设置变量好像不行哦!不知道怎么利用

(setq e (entsel))
(setq p (cadr e))
(setq dx_actdyn (vlax-ename->vla-object e))
(nentselp p)
页: [1] 2
查看完整版本: 如何获取属性块内文字的长度?(已解决选取问题)