明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2311|回复: 13

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

[复制链接]
发表于 2016-4-23 15:01:26 | 显示全部楼层 |阅读模式
本帖最后由 yfywk 于 2016-4-27 20:17 编辑

学习lisp编程,自己制作小工具,以便画图方便使用,现在遇到一个问题:
属性图块内文字的长度如何获取?
发表于 2016-4-23 17:28:34 来自手机 | 显示全部楼层
同块外一样的。
 楼主| 发表于 2016-4-23 18:39:07 | 显示全部楼层
(setq ent (car (nentsel "\n请选择文本:")))
(setq zf (cdr (assoc 1 (entget (ent))))); 提取文本得字符
(setq len (strlen zf));文本字符串的长度
使用这样的代码出现
请选择文本:; 错误: 函数错误: <图元名: 7ffff635980>
是怎么回事儿
发表于 2016-4-23 22:39:10 | 显示全部楼层
yfywk 发表于 2016-4-23 18:39
(setq ent (car (nentsel "\n请选择文本:")))
(setq zf (cdr (assoc 1 (entget (ent))))); 提取文本得字符 ...

再查查nentsel的用法吧,你的用法不对,你要的在nentsel返回的表里!
 楼主| 发表于 2016-4-24 08:01:23 | 显示全部楼层
已经在论坛里查找到了相关代码,编写成了我需要的小工具,目前我需依据字符长短来调节属性块中文字下方线的长短。代码如下:
  1. ;; 获取动态块的属性  -  Lee Mac
  2. ;; 返回动态块的一个属性值 (如果存在)
  3. ;; blk - [vla] VLA 类型动态块数据
  4. ;; prp - [str] str 类型的动态块属性名称(不分大小写)
  5. (defun LM:getdynpropvalue (blk prp)
  6.   (setq prp (strcase prp))
  7.   (vl-some '(lambda (x)
  8.         (if (= prp (strcase (vla-get-propertyname x)))
  9.     (vlax-get x 'value)
  10.         )
  11.       )
  12.      (vlax-invoke blk 'getdynamicblockproperties)
  13.   )
  14. )
  15. ;; 设置动态块的属性值  -  Lee Mac
  16. ;; 修改一个动态块的属性值(如果存在)
  17. ;; blk - [vla] VLA 类型的动态块数据
  18. ;; prp - [str] str 类型的动态块属性名称(不分大小写)
  19. ;; val - [any] 新的动态块属性(数据类型随系统,常见为string)
  20. ;; 返回: [any] 新的动态块属性(如果成功,否则nil)
  21. (defun LM:setdynpropvalue (blk prp val)
  22.   (setq prp (strcase prp))
  23.   (vl-some
  24.     '(lambda (x)
  25.        (if (= prp (strcase (vla-get-propertyname x)))
  26.    (progn
  27.      (vla-put-value
  28.        x
  29.        (vlax-make-variant
  30.          val
  31.          (vlax-variant-type (vla-get-value x))
  32.        )
  33.      )
  34.      (cond (val)
  35.      (t)
  36.      )
  37.    )
  38.        )
  39.      )
  40.     (vlax-invoke blk 'getdynamicblockproperties)
  41.   )
  42. )

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

  46. (prompt "\n请选择图名.");这里继续选择属性块
  47.   (setq dx_actdyn (vlax-ename->vla-object (car (entsel))))
  48.   (LM:setdynpropvalue dx_actdyn "距离1" lenw);
  49. ;设置选择的动态属性块 ”距离1“ 长度为文字长度
  50.     (princ)
  51.   )
目前需要解决的是属性图块需要选择两次,不知是否有办法选择一次就可实现二次的修改问题?
 楼主| 发表于 2016-4-25 11:16:57 | 显示全部楼层
帖子不要沉哦,求解决
发表于 2016-4-25 11:46:15 | 显示全部楼层
(entsel)返回有一个点,nentsel可以利用这个点,这样就只选择一次了(nentsel利用这个点自动选择)
发表于 2016-4-25 12:15:12 | 显示全部楼层
(setq zf (cdr (assoc 1 (entget ent))))

ent前后的括号取消
 楼主| 发表于 2016-4-25 12:40:37 | 显示全部楼层
自贡黄明儒 发表于 2016-4-25 11:46
(entsel)返回有一个点,nentsel可以利用这个点,这样就只选择一次了(nentsel利用这个点自动选择)

貌似设置变量好像不行哦!不知道怎么利用
发表于 2016-4-25 13:20:24 | 显示全部楼层
yfywk 发表于 2016-4-25 12:40
貌似设置变量好像不行哦!不知道怎么利用

  1. (setq e (entsel))
  2. (setq p (cadr e))
  3. (setq dx_actdyn (vlax-ename->vla-object e))
  4. (nentselp p)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-20 14:00 , Processed in 0.190247 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表