明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2861|回复: 20

请教怎么用VBA实现在cad图纸中嵌入图片(不是附着,源文件删除也能正常显示的那种)

[复制链接]
发表于 2018-7-31 23:15 | 显示全部楼层 |阅读模式
本帖最后由 mr0810 于 2018-7-31 23:40 编辑

在cad图纸中插入图片,用AddRaster方法只能插入链接(代码见附件),当源文件删除或位置发生变化时,图片就不显示了,只显示链接文字;
我想将图片嵌入到cad图纸中,即使源文件删除或位置发生了变化,cad图纸中的图片扔能正常显示,不知这个VBA代码应该怎么写;
请高手们指教,帮忙写一下这个VBA代码,不胜感激!

本帖子中包含更多资源

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

x
发表于 2018-9-30 18:48 | 显示全部楼层
直接设置剪贴板的数据为图形,就不会提示了
代码如下:
Dim objPic As Picture
Dim File As String

'设置图片文件路径
File = "D:\test.jpg"

'加载图片
Set objPic = LoadPicture(File)

'清空剪贴板
Clipboard.Clear

'设置剪贴板数据
Clipboard.SetData objPic, 2

'在CAD文档中粘贴
'...............

'代码结束


VB参考手册中关于Clipboard.SetData的解释
作用:用以使用指定的图形格式将图片放到 Clipboard 对象上。
语法:object.SetData data, format
data 必需的。被放置到 Clipboard 对象中的图形。
format  可选的。一个常数或数值,按照下列“设置值”中的描述,指定 Visual Basic 识别的 Clipboard 对象格式。如果省略 format,则 SetData 自动决定图形格式。
用于 format 的设置值有:
常数:vbCFBitmap, 值=2 含义:位图(.bmp 文件)

Clipboard.SetData objPic, 2,2的含义就是format的设置值
也就是说在CAD中保存的图象是BMP格式,不是压缩的,即使你的源图是很小体积JPG格式,也会使文件体积猛增。


插入图片,还可以使用相对路径,也就是图片文件与DWG文件在同一目录,这样就可以避免分发、复制文件的时候丢失图片带来的影响,而且文件体积也不会增大。
插入图片可以使用AddRaster方法,详细解释与例子请参阅明经的CAD编程参考手册。有了这个手册与CAD自带的VBA开发手册,基本不用看别的书了。如果有不知道的,书上也没有,比如这个问题。
 楼主| 发表于 2018-8-1 10:14 | 显示全部楼层
dong20030432 发表于 2018-8-1 08:57
用OLE对象不可以吗?

感谢您的关注,想问用OLE对象怎么用VBA实现?能麻烦您给写个代码吗?

我现在是先用代码把图片放到Excel中,然后复制到粘贴板,再用下面的代码可以粘贴到CAD中:
InsertPnt(0) = 4699.1082
InsertPnt(1) = 9911.5235
lspPnt = InsertPnt(0) & "," & InsertPnt(1)
ThisDrawing.SendCommand ("_pasteclip" & vbCr & lspPnt & vbCr)
这样就会跳出“OLE文字大小”的对话框,用下面的代码模拟ESC键:
Call keybd_event(27, 1, 0, 0)
Call keybd_event(27, 0, KEYEVENTF_KEYUP, 0)
也没有反应,这样就造成了程序的中断,我不知道怎么处理了,我不想让程序中断,这个能有什么办法处理吗?
 楼主| 发表于 2018-8-3 17:00 | 显示全部楼层
dong20030432 发表于 2018-8-3 14:32
你查看一下用不同方法插入到CAD的图片到底是光栅图像还是OLE对象,确认下是否跟这个有关。我试了很多种方 ...

用截图工具或PrtSC、Alt+PrtSC方法得到的图片,粘贴到cad后,源图片路径变了仍然可以显示;也不跳出对话框;
用windows 自带的画图软件中打开复制或从Excel或word等工具中复制的图片,粘贴到cad后,源图片路径变了仍然可以显示,但会跳出对话框;
直接拷贝文件(选中文件,按Ctrl+c)的方法虽然不显示对话框,但修改原图片路径,cad中就只显示路径文字了;这个应该是栅格文件,跟AddRaster方法插入的图片一样。

你用哪些方法插入,不显示对话框?
发表于 2018-8-1 08:57 | 显示全部楼层
用OLE对象不可以吗?
发表于 2018-8-1 10:21 | 显示全部楼层
mr0810 发表于 2018-8-1 10:14
感谢您的关注,想问用OLE对象怎么用VBA实现?能麻烦您给写个代码吗?

我现在是先用代码把图片放到Exce ...

这一玦的代码我也没写过,不是很了解,不能给出代码。
发表于 2018-8-1 10:22 | 显示全部楼层
mr0810 发表于 2018-8-1 10:14
感谢您的关注,想问用OLE对象怎么用VBA实现?能麻烦您给写个代码吗?

我现在是先用代码把图片放到Exce ...

等版主给你解决吧,我也顺便学习下,呵呵!
发表于 2018-8-1 10:25 | 显示全部楼层
mr0810 发表于 2018-8-1 10:14
感谢您的关注,想问用OLE对象怎么用VBA实现?能麻烦您给写个代码吗?

我现在是先用代码把图片放到Exce ...

你的代码我也不知道对不对,只是感觉尽量不要使用SENDCOMMAND,这不是正常VBA方法,是一种变相的LISP程序,时常会出现一些不必要的对话框,也可能造成无法确定程序是否完毕的困扰。
 楼主| 发表于 2018-8-1 11:18 | 显示全部楼层
dong20030432 发表于 2018-8-1 10:25
你的代码我也不知道对不对,只是感觉尽量不要使用SENDCOMMAND,这不是正常VBA方法,是一种变相的LISP程序 ...

是的,用SendCommand的确不好控制,无法得知命令的运行进度,要是加入循环插入多张图片的话,有时候贴不好,不稳定;而且这种方法只能控制插入点,无法精确控制插入的图片的大小;
我一直想找一个类似AddRaster那样的方法,能精确控制插入点和比例,而且也不会出现对话框。
还期盼各位大神们能出手,多多指教,感激不尽!
发表于 2018-8-1 23:21 | 显示全部楼层
用qq截图,然后粘贴。。
 楼主| 发表于 2018-8-2 08:41 | 显示全部楼层
@edata,非常感谢您的解答; 我试着用QQ截图的方法操作了一下,粘贴到CAD中,的确可以直接粘贴进去,不显示对话框了;
请问用QQ截图怎么用VBA代码实现?
还有,怎么用VBA代码模拟鼠标选择截屏区域?
粘贴到cad中有没有办法控制图片的大小比例?
谢谢!
发表于 2018-8-3 09:54 | 显示全部楼层
QQ截图理论上也是放在剪切板上了吧?怎么跟你用程序实现会不一样呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-17 05:24 , Processed in 0.177964 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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