明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2557|回复: 23

[已解答] 有没有什么办法,能够获取选定图形所有图元的定义数据?

[复制链接]
发表于 2013-11-25 12:49 | 显示全部楼层 |阅读模式
比如一张图,我想或得这张图中所有图形的定义数据,然后存到txt中。
 楼主| 发表于 2013-11-25 12:52 | 显示全部楼层
(defun c:sss ()
  (setq ss (ssget))
  (setq n (sslength ss))
  (setq i 0)
  (repeat n
    (setq s1 (ssname ss i))
    (setq s0 (entget s1))
    (print "s0=")
    (princ s0)
    (setq i (1+ i))
  )
)


我用这个获取图元定义数据,有时候有效果,有时候没有,不知道为什么
发表于 2013-11-25 14:20 | 显示全部楼层
倔强的蚂蚁 发表于 2013-11-25 12:52
(defun c:sss ()
  (setq ss (ssget))
  (setq n (sslength ss))

“所有图元的定义数据”这是很含糊的概念,图元的种类有很多,数据的类型也很多,有可见的,有不可见的,还有隐含的,无法一概而论,应该针对你的需要来分析,总有办法来解决的。
当然,如果你有兴趣,不妨把图形保存为dxf文件,那里面几乎什么都有了。
 楼主| 发表于 2013-11-25 15:04 | 显示全部楼层
ll_j 发表于 2013-11-25 14:20
“所有图元的定义数据”这是很含糊的概念,图元的种类有很多,数据的类型也很多,有可见的,有不可见的, ...

我试一试dxf,谢谢了!
发表于 2013-11-25 15:33 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-11-25 15:58 编辑

当然,存为DXF它是什么都有了,但是要在里边找到你所需要的却比较头痛了,它里边数据太多太多了。。。

如果你仅仅是想把你选择得到的图元定义数据写出去的话,可以在你在代码里边加一两句

(defun c:sss ()
  (while(null(setq f1(getfiled "指定文件保存图元数据" "D:\\" "txt" 32))))
   (setq f1(open f1"a"))
   (setq ss (ssget))
   (setq n (sslength ss))
   (setq i 0)
   (repeat n
     (setq s1 (ssname ss i))
     (setq s0 (entget s1))
;;其实s0里边还有很多是你不需要关心的比如-1组以及很多很多,这些你都可以先去掉它们
;;比如(setq s0(vl-remove(assoc 5 s0)(cdr s0))
                 s0(vl-remove(assoc 330 s0) s0));;一个图元的图元名对于帮助我们理解DXF的数据定义是没有用的(-1组更没用,因为每次打开图它都会不一样)
     (write-line (vl-princ-to-string s0)f1 );;
  ;   (print "s0=")
   ;  (princ s0)
     (setq i (1+ i))
   )
   (close f1)
)

;;;应该说这样写出去的数据你可以读它们进来后经过简单处理就可以一个个重新绘它们出来

 楼主| 发表于 2013-11-25 15:55 | 显示全部楼层
llsheng_73 发表于 2013-11-25 15:33
当然,存为DXF它是什么都有了,但是要在里边找到你所需要的却比较头痛了,它里边数据太多太多了。。。

如 ...

非常感谢!大概是因为单位电脑加密的原因,图纸转dxg转不了,看来只能用代码了。
发表于 2013-11-25 16:01 | 显示全部楼层
倔强的蚂蚁 发表于 2013-11-25 15:55
非常感谢!大概是因为单位电脑加密的原因,图纸转dxg转不了,看来只能用代码了。

不过向上边那样得到的数据CAD是不认识它的
只有你自己认识
 楼主| 发表于 2013-11-25 16:31 | 显示全部楼层
llsheng_73 发表于 2013-11-25 16:01
不过向上边那样得到的数据CAD是不认识它的
只有你自己认识

我试过,画一个简单的圆,然后得到定义数据,然后用entmake在新文件中重新画,还是可以还原的。就是需要对数据进行删删减减,很麻烦啊。

点评

有的数据可以先前就不写出去,比如410组,330组,5组,-1组......具体还有哪些得看DXF帮助去找了,如果有扩展数据, 先就得通过(entget ename '("*"))得到它们,处理的时候如果有-3组还得注册应用不然它不会出来   发表于 2013-11-25 19:13
发表于 2013-11-25 19:05 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-11-25 19:10 编辑
倔强的蚂蚁 发表于 2013-11-25 16:31
我试过,画一个简单的圆,然后得到定义数据,然后用entmake在新文件中重新画,还是可以还原的。就是需要对 ...


(while(not(null(setq en(read-line f1))))
    (foreach a en
      (if(member(car a)'(0 1 2 3 4 6 7 8 9 410 330))
              (setq en(subst(cons(car a)(vl-princ-to-string (cdr a))) a en)))
    )
   (entmake en)
)
(close f1)

;;;应该对很多图元有效,但如果有扩展数据就要麻烦得多,不过道理是一样,反正它本来应该是字串的得把它改成字串就可以
 楼主| 发表于 2013-11-26 12:03 | 显示全部楼层
llsheng_73 发表于 2013-11-25 19:05
(while(not(null(setq en(read-line f1))))
    (foreach a en
      (if(member(car a)'(0 1 2 3 4  ...

非常感谢!代码我留下了,回去研究研究。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 18:50 , Processed in 0.195240 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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