明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2179|回复: 7

[讨论] 读取块的属性都有那几种方法?(已知1种并分享需要的可以看一下)

[复制链接]
发表于 2018-7-9 15:36 | 显示全部楼层 |阅读模式
本帖最后由 张大锤 于 2018-7-9 15:42 编辑

欢迎大家前来讨论 讨论的题目是 读取块的属性 都有什么办法!使用(entget (car (entsel))) 读取出来的组码 里面是不包含块属性
有属性的块 读取的组码有66 1
没有属性的块 读取不到组码 66
请问66 代表的是什么?

我目前掌握的:
(defun c:xxx()
(vl-load-com)
(setq aa (entsel "\n選擇 "))
(setq bb (car  aa))      
(setq cc (vlax-ename->vla-object bb))   
(setq dd  (vlax-safearray->list  (vlax-variant-value (vla-getattributes cc))))
(setq mm 0)
(repeat (length dd)                                                                  
(setq ee  (nth mm dd))
(setq ff  (vla-get-TextString ee))
(princ ff)
(setq mm (1+ mm))
)
(princ)
)


当块有属性的时候 会(princ ff) 但是这么写 我感觉好麻烦 而且我个人比较偏爱lisp 不太习惯使用vlisp
请问各位还有什么好办法 得到一样的效果但是比较简练的 或使用Lisp编写的
如果有小伙伴也在 读取块属性这里比较发愁
可以复制我发的这个源码  这段码 不是我写的 是网上找到的 希望对新人有一些帮助



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-7-9 16:01 | 显示全部楼层
建议
一定要建立自己的常用函数库
常用的动作一定要写成方便使用的子函数

比如提取某个图元的某个dxf组码值
lsp方法
(cdr (assoc 0 (entget ent)))
如果写成子函数
(defun dxf(n ent) (cdr (assoc n (entget ent))))
以后每次调用时只需要写成
(dxf 0 ent)

当你的函数库比较完善的时候
你会发现你的编程能力已经有了很大的提升
再要编个什么小程序的时候
也会非常轻松
没必要纠结lisp还是vlisp
尽可能的选择快速高效的方式

推荐你学习这个帖子
http://bbs.mjtd.com/forum.php?mo ... 3%D3%C3%BA%AF%CA%FD

 楼主| 发表于 2018-7-10 15:49 | 显示全部楼层
本帖最后由 张大锤 于 2018-7-10 16:01 编辑
masterlong 发表于 2018-7-9 16:01
建议
一定要建立自己的常用函数库
常用的动作一定要写成方便使用的子函数

十分感谢 明白了 重复使用的命令 就可以 用子函数调出来 直接使用 就不需要重复的写


(defun c:xxx ()
(setq ss (SSGET))
(setq aa (dxf 0 ent))
)
(defun dxf (n ent)
(cdr (assoc n (entget (ssname ss 0))))
)


感谢 以后这样子就可以不用重复的写了
发表于 2018-7-10 18:23 来自手机 | 显示全部楼层
不得不说  你这个子函数编写的很失败  你的选择集就只有一个图元吗  就只有一类图元吗 dxf这样写  它的适用性就大大受到限制
 楼主| 发表于 2018-7-11 08:18 | 显示全部楼层
本帖最后由 张大锤 于 2018-7-11 08:19 编辑
masterlong 发表于 2018-7-10 18:23
不得不说  你这个子函数编写的很失败  你的选择集就只有一个图元吗  就只有一类图元吗 dxf这样写  它的适用 ...

实在是新手 这个想法也是 您提点 我才知道 还可以这样子
(defun dxf (n ent)  刚看的时候 我连n net 都没明白怎么回事
后来翻书 有一本书 最开始的时候提到了 (里面是干嘛) 但也是一句概括
(dxf 0 ent)  dxf 是调用子函数的命令 0=n
但ent 还是没有明白是什么
如果您有时间的话 可以再详细的指点一下嘛

按照上边我理解的写法 我尝试的试了一下
(defun c:qqq ()
(setq ss (SSGET))
(setq aa (sssx ss ent))
)

(defun sssx (n ent )
(vl-load-com)
(setq bb (car n))      
(setq cc (vlax-ename->vla-object bb))   
(setq dd  (vlax-safearray->list  (vlax-variant-value (vla-getattributes cc))))
(setq mm 0)
(repeat (length dd)                                                                  
(setq ee  (nth mm dd))
(setq ff  (vla-get-TextString ee))
(princ ff)
(setq mm (1+ mm))
)
(princ)
)

是不能被调用的 因为还没理解怎么回事。。。
发表于 2018-7-11 08:34 | 显示全部楼层
张大锤 发表于 2018-7-11 08:18
实在是新手 这个想法也是 您提点 我才知道 还可以这样子
(defun dxf (n ent)  刚看的时候 我连n ...

(mapcar 'vla-get-TextString  (vlax-safearray->list  (vlax-variant-value(vla-getattributes(vlax-ename->vla-object(car(entsel)))))))
发表于 2018-7-11 14:30 | 显示全部楼层
关于参数的调用
几句话说不清
你需要自己去找些资料看看
论坛里应该能搜到

板凳楼的程序两个错误
你仔细对比一下
(defun c:xxx ()
(setq ss (SSGET))
(setq ent (ssname ss 0))
(setq aa (dxf 0 ent))
)
(defun dxf (n ent)
(cdr (assoc n (entget ent))))
)
两个函数里都出现了ent
但是含义是不同的
为什么不同
带着问题寻求答案吧
一定要靠自己搞明白
这是学习lsp必经的一道坎
发表于 2019-10-17 06:51 | 显示全部楼层
太好了,正想看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 13:10 , Processed in 0.222257 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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