xugaoming23 发表于 2019-6-4 16:26:56

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

本帖最后由 xugaoming23 于 2019-7-12 21:39 编辑

;;----------------将xrecord的内容生成文件------------------------------------------------
(defun xrecordtofile (vlaobj filepath)
    (if      (/= (vla-get-ObjectName vlaobj) "AcDbXrecord")
      (exit)
    )
    (vla-getxrecorddata vlaobj 'xtypeOut 'xdataOut)
    (setq x (vlax-safearray->list xtypeOut))
    (setq y (vlax-safearray->list xdataOut))
    (setq z nil)
    (if      (= (vlax-safearray-type xdataOut) vlax-vbVariant)
      (progn
            (foreach i y
                (if (> (vlax-variant-type i) 8192)
                  (progn
                        (setq j (vlax-safearray->list (vlax-variant-value i)))
                        (foreach k j (setq z (cons k z)))
                  )
                )
            )
            (setq z (reverse z))
            ;;28456
            (setq k (list 77 66))
            (setq l (length z))
            (while (/= 0 l)
                (setq
                  k (cons (rem l 16) k)
                  l (/ l 16)
                )
            )
   ;6 15 2 8
            (setq k (cons 0 k))
            (setq k (cons 0 k))
            (setq k (cons 0 k))
            (setq k (cons 0 k))
            (setq k (cons 54 k))
            (setq k (cons 0 k))
            (setq k (cons 0 k))
            (setq k (cons 0 k))

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


;;--------------------------------end-------------------------------------------
(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")
提供思路,不负责解释http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTA0NTk0fDU5ZWI3ZjMwfDE1NTk2Mzc2MTZ8NDA1OTI1fDE3OTY2Nw%3D%3D&noupdate=yes左侧为提取的缩略图片

liwen888888 发表于 2019-6-5 20:39:00

看不出和直接输出BMP JPG有什么区别

bai2000 发表于 2019-6-7 13:10:59

怎么运行啊

xugaoming23 发表于 2019-6-9 22:59:27

liwen888888 发表于 2019-6-5 20:39
看不出和直接输出BMP JPG有什么区别

重点是提供了一些新的想法与思路,比如xrecord下的二进制,CAD自身储存的二进制格式如何翻译,还比如图像二进制没有头文件的添加问题,没提到的安全数组类型,如17为VBbyte

xugaoming23 发表于 2019-6-9 23:01:25

bai2000 发表于 2019-6-7 13:10
怎么运行啊

你都两个太阳了不会运行,先看看cad文件有没有缩略图,然后复制粘贴就可以运行了

xugaoming23 发表于 2019-6-9 23:11:24

本帖最后由 xugaoming23 于 2019-6-9 23:13 编辑

bai2000 发表于 2019-6-7 13:10
怎么运行啊
主代码是这个:
(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")

只提供思路,程序没有严谨的去写,只是大致部位提供下条件转折,但条件也没有一 一严禁,自己用的时候需要修改完善

USER2128 发表于 2019-6-12 11:26:54

楼主,能否提取图像为sld格式,这样就有办法在DCL中做到DWG预览

xugaoming23 发表于 2019-6-12 16:35:58

USER2128 发表于 2019-6-12 11:26
楼主,能否提取图像为sld格式,这样就有办法在DCL中做到DWG预览

这个程序本身就不完善,我也是猜测图像的格式为bmp,结果凑了出来,如果缩略图在布局里面,主程序还要调整下扩展字典的根,至于转码以及如何应用,这个靠你自己了:lol

xugaoming23 发表于 2019-6-13 12:14:54

补充: 今天偶尔测试,居然又不行了
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形式
页: [1]
查看完整版本: 从cad内部提取CAD的缩略图lisp源码分享,新鲜出炉2019.6.4