明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2105|回复: 8

从cad内部提取CAD的缩略图lisp源码分享,新鲜出炉2019.6.4

[复制链接]
发表于 2019-6-4 16:26 | 显示全部楼层 |阅读模式
本帖最后由 xugaoming23 于 2019-7-12 21:39 编辑

  1. ;;----------------将xrecord的内容生成文件------------------------------------------------
  2. (defun xrecordtofile (vlaobj filepath)
  3.     (if        (/= (vla-get-ObjectName vlaobj) "AcDbXrecord")
  4.         (exit)
  5.     )
  6.     (vla-getxrecorddata vlaobj 'xtypeOut 'xdataOut)
  7.     (setq x (vlax-safearray->list xtypeOut))
  8.     (setq y (vlax-safearray->list xdataOut))
  9.     (setq z nil)
  10.     (if        (= (vlax-safearray-type xdataOut) vlax-vbVariant)
  11.         (progn
  12.             (foreach i y
  13.                 (if (> (vlax-variant-type i) 8192)
  14.                     (progn
  15.                         (setq j (vlax-safearray->list (vlax-variant-value i)))
  16.                         (foreach k j (setq z (cons k z)))
  17.                     )
  18.                 )
  19.             )
  20.             (setq z (reverse z))
  21.             ;;28456
  22.             (setq k (list 77 66))
  23.             (setq l (length z))
  24.             (while (/= 0 l)
  25.                 (setq
  26.                     k (cons (rem l 16) k)
  27.                     l (/ l 16)
  28.                 )
  29.             )
  30.      ;6 15 2 8
  31.             (setq k (cons 0 k))
  32.             (setq k (cons 0 k))
  33.             (setq k (cons 0 k))
  34.             (setq k (cons 0 k))
  35.             (setq k (cons 54 k))
  36.             (setq k (cons 0 k))
  37.             (setq k (cons 0 k))
  38.             (setq k (cons 0 k))

  39.      ;(setq k (list 66 77 8 2 15 6 0 0 0 0 54 0 0 0))
  40.      ;(setq k (reverse k))
  41.             (foreach i k (setq z (cons i z)))
  42.             (setq m (vlax-make-safearray 17 (cons 0 (1- (length z))))) ;17为vbbyte
  43.             (setq n (vlax-safearray-fill m z))
  44.         )
  45.     )
  46.     (setq ObjStream (vlax-get-or-create-object "Adodb.Stream"))
  47.     (vlax-put-property ObjStream 'Type 1) ;1为二进制模式读取 ,2为文本模式读取
  48.     (vlax-put-property ObjStream 'Mode 3) ;1为读,2为写,3为读写
  49.     (vlax-invoke ObjStream 'Open)
  50.     (vlax-invoke-method ObjStream 'Write n) ;还有一个方法是writetext
  51.     (vlax-put-property ObjStream 'Position 0) ;写文本时有效
  52.      ;(vlax-put-property ObjStream 'Type 2);写文本时有效,编码调整
  53.      ;(vlax-put-property ObjStream 'Charset 'unicode);写文本时有效 'unicode,utf-8,ascii,gb2312,big5,gbk
  54.      ;(setq str (vlax-invoke-method ObjStream 'ReadText));生成字符串时有效
  55.     (vlax-invoke-method ObjStream 'SaveToFile filepath 2) ;adSaveCreateNotExist =1 , adSaveCreateOverWrite =2
  56.     (vlax-invoke-method ObjStream 'Close)
  57.     (vlax-release-object ObjStream)
  58. )


  59. ;;--------------------------------end-------------------------------------------
  60. (setq i (cdr (assoc -1(dictsearch (namedobjdict) "ACAD_LAYOUT"))))
  61. (setq i (vla-Item (vla-GetExtensionDictionary (vla-Item (vlax-Ename->Vla-Object i) 0 ))0))
  62. (xrecordtofile i "E:\\cad.bmp")
提供思路,不负责解释
左侧为提取的缩略图片

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

发表于 2019-6-5 20:39 | 显示全部楼层
看不出和直接输出BMP JPG有什么区别
发表于 2019-6-7 13:10 | 显示全部楼层
怎么运行啊
 楼主| 发表于 2019-6-9 22:59 | 显示全部楼层
liwen888888 发表于 2019-6-5 20:39
看不出和直接输出BMP JPG有什么区别

重点是提供了一些新的想法与思路,比如xrecord下的二进制,CAD自身储存的二进制格式如何翻译,还比如图像二进制没有头文件的添加问题,没提到的安全数组类型,如17为VBbyte
 楼主| 发表于 2019-6-9 23:01 | 显示全部楼层

你都两个太阳了不会运行,先看看cad文件有没有缩略图,然后复制粘贴就可以运行了
 楼主| 发表于 2019-6-9 23:11 | 显示全部楼层
本帖最后由 xugaoming23 于 2019-6-9 23:13 编辑

主代码是这个:
(setq i (cdr (assoc -1(dictsearch (namedobjdict) "ACAD_LAYOUT"))))
(setq i (vla-Item (vla-GetExtensionDictionary (vla-Item (vlax-Ename->Vla-Object i) 0 ))0))
(xrecordtofile i "E:\\cad.bmp")

只提供思路,程序没有严谨的去写,只是大致部位提供下条件转折,但条件也没有一 一严禁,自己用的时候需要修改完善
发表于 2019-6-12 11:26 | 显示全部楼层
楼主,能否提取图像为sld格式,这样就有办法在DCL中做到DWG预览
 楼主| 发表于 2019-6-12 16:35 | 显示全部楼层
USER2128 发表于 2019-6-12 11:26
楼主,能否提取图像为sld格式,这样就有办法在DCL中做到DWG预览

这个程序本身就不完善,我也是猜测图像的格式为bmp,结果凑了出来,如果缩略图在布局里面,主程序还要调整下扩展字典的根,至于转码以及如何应用,这个靠你自己了
 楼主| 发表于 2019-6-13 12:14 | 显示全部楼层
补充: 今天偶尔测试,居然又不行了
1.原因为byte数不稳定 ,由于系统自身运行可能导致符号位的加入,需要调整
(foreach k j (setq z (cons k z)))  调整为(foreach k j (setq z (cons (logand k 255) z)))
2.是否能提取缩略图取决于根ACAD_LAYOUT是否有Xrecord ,如果缩略图不是在这个根下,需要自己去找,cad版本的因素,可能缩略图不是Xrecord形式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 19:55 , Processed in 0.257675 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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