乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 49|回复: 15

[编程交流] 将对象复制到新dwg

[复制链接]

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:05:52 | 显示全部楼层 |阅读模式
如何将对象复制到新的dwg或更好的dwg?
 
  1. (defun c:copybypick (/ *acad* doc path tgdbxdoc pck vlobj)
  2. (setq *acad* (vlax-get-acad-object)
  3. doc    (vla-get-documents *acad*)
  4. )
  5. (setq path (getfiled "Select Source File"
  6.         (getvar "dwgprefix")
  7.         "dwg;dwt;dws"
  8.         0
  9.      )
  10. )
  11. (setq tgdbxdoc
  12. (vla-GetInterfaceObject *acad* "ObjectDBX.AxDbDocument.17")
  13. )
  14. (vla-open tgdbxdoc path)
  15. (setq pck   (entsel "Select object: ")
  16. vlobj (vlax-ename->vla-object (car pck))
  17. )
  18. ;;;(vla-copyobjects tgdbxdoc vloobj);;;
  19. (vlax-release-object tgdbxdoc)
  20. (princ)
  21. )
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 12:12:00 | 显示全部楼层
你好
 
查看开发者帮助>ActiveX和VBA参考中的CopyObjects方法
 
vla CopyObjects至少需要3个参数:
-源数据库或文档(您案例中的文档)
-包含要复制的vla对象的变体(safearray)
-目标文档(tgdbxdoc)
 
对于第二个参数,您必须构建如下安全阵列:
 
或者,使用“旧式”vlax调用(避免生成saarray)更简单:
 
  1. (vlax-invoke doc 'CopyObjects (list vlobj) tgdbxdoc)
回复

使用道具 举报

32

主题

430

帖子

423

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 12:17:07 | 显示全部楼层
嗨,吉尔,我犯了这个错误
; 错误:ActiveX服务器返回错误:未知名称:“COPYOBJECTS”
 
 
我添加(VL-LOAD-COM)
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:19:06 | 显示全部楼层
嗨,吉尔,
感谢重播。
如果我在我的行中使用你的代码,我会出错!?
我用过(vlax invoke doc’CopyObjects(list vlobj)tgdbxdoc)
而不是(vla copyobjects。。。
错误在哪里?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:22:35 | 显示全部楼层
例子:
 
  1. (defun Copy_Obj (ss blk / ObjLst)
  2. (vl-load-com)
  3. (setq ObjLst
  4.    (mapcar 'vlax-ename->vla-object
  5.      (vl-remove-if 'listp
  6.        (mapcar 'cadr (ssnamex ss)))))
  7. (cond (  (vl-every '= (mapcar 'vla-get-OwnerId ObjLst))
  8.           (vla-copyobjects            
  9.             (vla-get-ActiveDocument
  10.               (vlax-get-acad-object))
  11.             (vlax-make-variant
  12.               (vlax-safearray-fill
  13.                 (vlax-make-safearray
  14.                   vlax-vbObject
  15.                     (cons 0 (1- (length ObjLst)))) ObjLst)) blk))))

 
ss=选择集
blk=目标块(文档变量/块定义)
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 12:28:13 | 显示全部楼层
抱歉,它看起来像(vlax invoke…)语句不适用于AxDbDocument(它适用于活动文档内的块。
 
因此,请使用(vlax make variant…)方法
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:33:28 | 显示全部楼层
你好
感谢重播
李,我用(ssget)得到ss=SelectionSet,但是blk=tgdbxdoc(从我的行中)是吗?
我不确定我是否完全理解。。。
如何使用(Copy_Obj ss blk),而参数的类型是ss和blk?
@李,我看过你的其他项目,做得很好,顶。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:37:24 | 显示全部楼层
您好,Haustab,
 
谢谢你的夸奖,非常感谢。
 
是的,blk是新文档,在您的案例中是tgdbxdoc:眨眼:
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:41:04 | 显示全部楼层
Gile这能行吗?
 
  1. (defun c:test (/ Copy_obj ss path app docs doc)
  2. (vl-load-com)
  3. (defun Copy_Obj (ss blk / ObjLst)
  4.    (vl-load-com)
  5.    (setq ObjLst
  6.      (mapcar 'vlax-ename->vla-object
  7.        (vl-remove-if 'listp
  8.          (mapcar 'cadr (ssnamex ss)))))
  9.    (cond (  (vl-every '= (mapcar 'vla-get-OwnerId ObjLst))
  10.             (vla-copyobjects            
  11.               (vla-get-ActiveDocument
  12.                 (vlax-get-acad-object))
  13.               (vlax-make-variant
  14.                 (vlax-safearray-fill
  15.                   (vlax-make-safearray
  16.                     vlax-vbObject
  17.                       (cons 0 (1- (length ObjLst)))) ObjLst)) blk))))
  18. (if (and (setq ss (ssget))
  19.           (setq path (getfiled "File" "" "dwg" 16)))
  20.    (progn
  21.      (setq app (vlax-create-object
  22.                  (strcat "AutoCAD.Application."
  23.                    (itoa (fix (atof (getvar 'ACADVER)))))))
  24.      (vlax-put-property app 'Visible :vlax-true)
  25.        (vlax-put-property
  26.          (vla-get-Display
  27.            (vla-get-preferences app)) 'maxautocadwindow :vlax-true)
  28.      (setq docs (vla-get-documents app) doc (vla-open docs path :vlax-false))
  29.      (Copy_obj ss doc)
  30.      (vla-save doc)
  31.      (vla-close doc)
  32.      (vlax-invoke-method app 'quit)
  33.      (mapcar
  34.        (function
  35.          (lambda (x)
  36.            (vlax-release-object x))) (list app docs doc))))
  37. (princ))
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:43:24 | 显示全部楼层
嗨,李,
我不知道。。。
错误
复制到其他图形中似乎不那么容易。
你的最后一个代码也是一个错误。但是有很多东西需要我学习
谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 10:09 , Processed in 0.512128 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表