AutoCAD中的Deep Clone
所谓Deep clone是指将实体从一个dwg文件拷贝至另一个dwg文件,类似于Ctr+C,CtrV,而普通的实体的Copy()方法,是在单个dwg文件中输入命令'copy',
在Pycomcad中,实现deep colone是通过Document的CopyObjects方法实现的,语法如下:
Retval=obj.CopyObjects(objects[,Owner][,IDPairs])
Retval
:新创建的复制的对象组,在pycomcad中,返回的是包含复制后的对象的元组。
obj
:Document,Database
objects
:需要被deep clone的对象组(变体),该对象组必须在同一个owner1中,这个owner1就是调用CopyObjects的obj(Document或者Database),在pyccomcad中,可通过VtObject()函数转换。
Owner
:可选参数,单个对象(变体),其他文件的ModeSpace。
IDPairs
:可选参数。Input:an empty variant,在pycomcad中,为idp=win32com.client.VARIANT(pythoncom.VT_VARIANT, ()) .
Output:IDPair objects组.
需要说明的有2点:(1)当不输入owner,IDParis时,仅在当前文件内复制(2)该方法在读-写模式下进行,所以在迭代完成后,再调用该方法,否则迭代进行中,文件是仅读模型,该操作将失败。
import sys
sys.path.append(r'G:PycharmProjectPycomCADPycomCAD')
from pycomcad import *
acad=Autocad()
acad.CurrentFilename
'Drawing1.dwg'
obj=acad.AddCircle(Apoint(0,0,0),10)
acad.CreateNewFile()
acad.ActivateFile('Drawing1.dwg')
acad.OpenedFilenames
['Drawing1.dwg', 'Drawing2.dwg']
acad.CurrentFilename
'Drawing1.dwg'
objs=VtObject(obj)
owner=acad.GetOpenedFile('Drawing2.dwg').ModelSpace #新文档的ModelSpace
type(owner)
win32com.gen_py.4E3F492A-FB57-4439-9BF0-1567ED84A3A9x0x1x0.IAcadModelSpace
import win32com,pythoncom
acad.IsEarlyBind
True
idp=win32com.client.VARIANT(pythoncom.VT_VARIANT, ()) # IDPairs:Empty Variant
test2=acad.acad.ActiveDocument.CopyObjects(objs,owner,idp)
test2[0][0].Move(Apoint(0,0,0),Apoint(10,10,0))
Try Deep clone mutiple objects using GetSelectionSets
slt=acad.GetSelectionSets('slt')
slt.SelectOnScreen()
objss=VtObject(slt.Item(0),slt.Item(1),slt.Item(2))
test3=acad.acad.ActiveDocument.CopyObjects(objss,owner,idp)
len(test3[0])
1
len(test3[1])
35
test3[0][0].Move(Apoint(0,0,0),Apoint(10,10,0)) # Move the cloned circle in the new file.
len(test3[0])
3