张大锤 发表于 2018-7-9 15:36:53

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

本帖最后由 张大锤 于 2018-7-9 15:42 编辑

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

我目前掌握的:
(defun c:xxx()
(vl-load-com)
(setq aa (entsel "\n選擇 "))
(setq bb (caraa))      
(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编写的
如果有小伙伴也在 读取块属性这里比较发愁
可以复制我发的这个源码这段码 不是我写的 是网上找到的 希望对新人有一些帮助



masterlong 发表于 2018-7-9 16:01:43

建议
一定要建立自己的常用函数库
常用的动作一定要写成方便使用的子函数

比如提取某个图元的某个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?mod=viewthread&tid=96543&highlight=%B3%A3%D3%C3%BA%AF%CA%FD

张大锤 发表于 2018-7-10 15:49:50

本帖最后由 张大锤 于 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))))
)


感谢 以后这样子就可以不用重复的写了

masterlong 发表于 2018-7-10 18:23:24

不得不说你这个子函数编写的很失败你的选择集就只有一个图元吗就只有一类图元吗 dxf这样写它的适用性就大大受到限制

张大锤 发表于 2018-7-11 08:18:53

本帖最后由 张大锤 于 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: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)))))))

masterlong 发表于 2018-7-11 14:30:39

关于参数的调用
几句话说不清
你需要自己去找些资料看看
论坛里应该能搜到

板凳楼的程序两个错误
你仔细对比一下
(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:48

太好了,正想看看
页: [1]
查看完整版本: 读取块的属性都有那几种方法?(已知1种并分享需要的可以看一下)