CAD二开—WblockCloneObjects函数用法

public void WblockCloneObjects(
    ObjectIdCollection identifiers, 
    ObjectId id, 
    IdMapping mapping, 
    Autodesk.AutoCAD.DatabaseServices.DuplicateRecordCloning cloning, 
    [MarshalAs(UnmanagedType.U1)] bool deferTranslation
);

其中各个参数的意义如下:

  1. identifiers:需要拷贝的源数据库中的对象ID集合,对象ID可以是实体对象ID,也可以是存储实体的块表记录对象ID;
  2. id:指定目标数据库中用于存放源数据库拷贝实体的所属者对象ID,可以是某个块表记录ID,也可以是BlockTableId;
  3. mapping:用于存储源数据库中拷贝对象id与目标数据库中新对象id之间的映射关系;
  4. cloning:若目标数据库中有相同记录,重复记录处理方式:Ignore(忽略),Replace(替换);
以下分别通过两种方式(拷贝实体和拷贝块表记录)实现了用A图纸中的图元替换B图纸中的块表记录,快速实现图框模板定制。
		//拷贝实体
 		public void CloneEntity()
        {
            try
            {
                string defaultPath = new DirectoryInfo(typeof(CommandDetail).Assembly.Location).Parent.FullName;
                string stdBlkPath = Path.Combine(Path.Combine(defaultPath, "config"), "B.dwg");
                string titlePath = Path.Combine(Path.Combine(defaultPath, "config"), "A.dwg");
                Database titleDb = new Database(false, true);
                titleDb.ReadDwgFile(titlePath, System.IO.FileShare.Read, true, null);
                titleDb.CloseInput(true);

                Database stdBlkDb = new Database(false, true);
                stdBlkDb.ReadDwgFile(stdBlkPath, System.IO.FileShare.ReadWrite, true, null);
                stdBlkDb.CloseInput(true);

                Point3d rbPos = new Point3d(titleDb.Extmax.X, titleDb.Extmin.Y, 0);
                Matrix3d mt = Matrix3d.Displacement(rbPos.GetVectorTo(Point3d.Origin));
                ObjectIdCollection entIds = new ObjectIdCollection();
                using (Transaction trans = titleDb.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)trans.GetObject(titleDb.BlockTableId, OpenMode.ForRead, false);
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                    foreach (ObjectId entId in btr)
                    {
                        Entity ent = trans.GetObject(entId, OpenMode.ForRead) as Entity;
                        if (ent != null)
                        {
                            ent.UpgradeOpen();
                            ent.TransformBy(mt);
                            ent.Layer = "TK1";
                            ent.DowngradeOpen();
                            entIds.Add(entId);
                        }
                    }
                }
                ObjectId titleBtrId = ObjectId.Null;
                using (Transaction trans = stdBlkDb.TransactionManager.StartTransaction())
                {
                    BlockTable stdBt = (BlockTable)trans.GetObject(stdBlkDb.BlockTableId, OpenMode.ForWrite, false);
                    BlockTableRecord stdBtr = trans.GetObject(stdBt[""], OpenMode.ForWrite) as BlockTableRecord;
                    foreach (ObjectId id in stdBtr)
                    {
                        Entity ent= trans.GetObject(id,OpenMode.ForWrite) as Entity;
                        if (ent != null)
                        {
                        	//清空块表记录中的图元
                            ent.Erase();
                        }
                    }
                    titleBtrId = stdBtr.Id;
                    trans.Commit();
                }

                var mappling = new IdMapping();
                titleDb.WblockCloneObjects(entIds, titleBtrId, mappling, DuplicateRecordCloning.Replace, false);
                stdBlkDb.SaveAs(stdBlkPath, DwgVersion.AC1024);

                titleDb.Dispose();
                stdBlkDb.Dispose();
            }
            catch (System.Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }
        //拷贝块表记录
 		public void CloneBlockTableRecord()
        {
            try
            {
                string defaultPath = new DirectoryInfo(typeof(CommandDetail).Assembly.Location).Parent.FullName;
                string stdBlkPath = Path.Combine(Path.Combine(defaultPath, "config"), "B.dwg");
                string titlePath = Path.Combine(Path.Combine(defaultPath, "config"), "A.dwg");
                Database titleDb = new Database(false, true);
                titleDb.ReadDwgFile(titlePath, System.IO.FileShare.Read, true, null);
                titleDb.CloseInput(true);

                Database stdBlkDb = new Database(false, true);
                stdBlkDb.ReadDwgFile(stdBlkPath, System.IO.FileShare.ReadWrite, true, null);
                stdBlkDb.CloseInput(true);

                Point3d rbPos = new Point3d(titleDb.Extmax.X, titleDb.Extmin.Y, 0);
                Matrix3d mt = Matrix3d.Displacement(rbPos.GetVectorTo(Point3d.Origin));
                string csBtrName = "";
                List<string> titleBtrNames = new List<string> { "", ""};
                ObjectIdCollection blkTbRecIds = new ObjectIdCollection();
                List<Entity> cEnts = new List<Entity>();
                using (Transaction trans = titleDb.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)trans.GetObject(titleDb.BlockTableId, OpenMode.ForRead, false);
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
                    foreach (ObjectId entId in btr)
                    {
                        Entity ent=trans.GetObject(entId, OpenMode.ForRead) as Entity;
                        if (ent!=null)
                        {
                            ent.UpgradeOpen();
                            ent.TransformBy(mt);
                            ent.Layer = "TK1";
                            ent.DowngradeOpen();
                            cEnts.Add(ent);
                        }
                    }
                    bt.UpgradeOpen();//切换块表为写的状态
                    foreach (string titleBtrName in titleBtrNames)
                    {
                        //创建一个BlockTableRecord类的对象,表示所要创建的块
                        BlockTableRecord titleBtr = new BlockTableRecord();
                        titleBtr.Name = titleBtrName;
                        //将列表中的实体加入到新建的BlockTableRecord对象
                        cEnts.ForEach(ent => titleBtr.AppendEntity(ent.Clone() as Entity));
                        ObjectId titleBtrId = bt.Add(titleBtr);//在块表中加入blockName块
                        blkTbRecIds.Add(titleBtrId);
                        titleDb.TransactionManager.AddNewlyCreatedDBObject(titleBtr, true);//通知事务处理
                    }
                    bt.DowngradeOpen();//为了安全,将块表状态改为读 
                }
                using (Transaction trans = stdBlkDb.TransactionManager.StartTransaction())
                {
                    BlockTable stdBt = (BlockTable)trans.GetObject(stdBlkDb.BlockTableId, OpenMode.ForWrite, false);
                    foreach (ObjectId btrId in stdBt)
                    {
                        BlockTableRecord stdBtr = trans.GetObject(btrId, OpenMode.ForWrite) as BlockTableRecord;
                        if (stdBtr != null && stdBtr.Name == csBtrName)
                        {
                            stdBtr.Erase();
                        }
                    }
                    trans.Commit();
                }
                var mappling = new IdMapping();
                titleDb.WblockCloneObjects(blkTbRecIds, stdBlkDb.BlockTableId, mappling, DuplicateRecordCloning.Replace, false);
                stdBlkDb.SaveAs(stdBlkPath,DwgVersion.AC1024);

                titleDb.Dispose();
                stdBlkDb.Dispose();
            }
            catch (System.Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从acdbmgd.dll导出的内容,方便参考,格式如下: 类:Autodesk.AutoCAD.DatabaseServices.TextStyleTableRecord:Autodesk.AutoCAD.DatabaseServices.SymbolTableRecord New() 方法: {dtor}() {dtor}() {dtor}() {dtor}() ApplyPaperOrientationTransform(Viewport) ApplyPartialUndo(DwgFiler,RXClass) Audit(AuditInfo) Cancel() Close() CloseAndPage(Boolean) CopyFrom(RXObject) CreateExtensionDictionary() DisableUndoRecording(Boolean) Dispose() DowngradeOpen() DowngradeToNotify(Boolean) DwgIn(DwgFiler) DwgOut(DwgFiler) DxfIn(DxfFiler) DxfOut(DxfFiler) Erase() Erase(Boolean) HandOverTo(DBObject,Boolean,Boolean) ReleaseExtensionDictionary() RemoveField(ObjectId) ResetScaleDependentProperties() SetObjectIdsInFlux() SetPaperOrientation(Boolean) SwapIdWith(ObjectId,Boolean,Boolean) SwapReferences(IdMapping) UpgradeOpen() ViewportDraw(ViewportDraw) XDataTransformBy(Matrix3d) 函数: Clone() AS System.Object CompareTo(Object) AS System.Int32 CreateObjRef(Type) AS System.Runtime.Remoting.ObjRef DecomposeForSave(DwgVersion) AS Autodesk.AutoCAD.DatabaseServices.DecomposeForSaveReplacementRecord DeepClone(DBObject,IdMapping,Boolean) AS Autodesk.AutoCAD.DatabaseServices.DBObject Equals(Object) AS System.Boolean GetHashCode() AS System.Int32 GetLifetimeService() AS System.Object GetObjectSaveVersion(DwgFiler) AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion GetObjectSaveVersion(DxfFiler) AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion GetPersistentReactorIds() AS Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection GetReactors() AS System.Collections.Generic.List`1[[Autodesk.AutoCAD.Runtime.RXObject, acdbmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null]] GetRXClass() AS Autodesk.AutoCAD.Runtime.RXClass GetType() AS System.Type GetXDataForApplication(String) AS Autodesk.AutoCAD.DatabaseServices.ResultBuffer HasPersistentReactor(ObjectId) AS System.Boolean InitializeLifetimeService() AS System.Object QueryX(RXClass) AS System.IntPtr RemoveField() AS Autodesk.AutoCAD.DatabaseServices.ObjectId RemoveField(String) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetAttributes(DrawableTraits) AS System.Int32 SetField(Field) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetField(String,Field) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetFromStyle() AS System.Boolean ToString() AS System.String UpgradeFromNotify() AS System.Boolean ViewportDrawLogicalFlags(ViewportDraw) AS System.Int32 WblockClone(RXObject,IdMapping,Boolean) AS Autodesk.AutoCAD.DatabaseServices.DBObject WorldDraw(WorldDraw) AS System.Boolean X(RXClass) AS System.IntPtr 属性: AcadObject AS System.Object 可读不可写 Annotative AS Autodesk.AutoCAD.DatabaseServices.AnnotativeStates 可读可写 AutoDelete AS System.Boolean 可读可写 BigFontFileName AS System.String 可读可写 ClassID AS System.Guid 可读不可写 Database AS Autodesk.AutoCAD.DatabaseServices.Database 可读不可写 Drawable AS Autodesk.AutoCAD.GraphicsInterface.Drawable 可读不可写 DrawableType AS Autodesk.AutoCAD.GraphicsInterface.DrawableType 可读不可写 ExtensionDictionary AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 FileName AS System.String 可读可写 FlagBits AS System.Byte 可读可写 Font AS Autodesk.AutoCAD.GraphicsInterface.FontDescriptor 可读可写 Handle AS Autodesk.AutoCAD.DatabaseServices.Handle 可读不可写 HasFields AS System.Boolean 可读不可写 HasSaveVersionOverride AS System.Boolean 可读可写 Id AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 IsAProxy AS System.Boolean 可读不可写 IsCancelling AS System.Boolean 可读不可写 IsDependent AS System.Boolean 可读不可写 IsDisposed AS System.Boolean 可读不可写 IsErased AS System.Boolean 可读不可写 IsEraseStatusToggled AS System.Boolean 可读不可写 IsModified AS System.Boolean 可读不可写 IsModifiedGraphics AS System.Boolean 可读不可写 IsModifiedXData AS System.Boolean 可读不可写 IsNewObject AS System.Boolean 可读不可写 IsNotifyEnabled AS System.Boolean 可读不可写 IsNotifying AS System.Boolean 可读不可写 IsObjectIdsInFlux AS System.Boolean 可读不可写 IsPersistent AS System.Boolean 可读不可写 IsReadEnabled AS System.Boolean 可读不可写 IsReallyClosing AS System.Boolean 可读不可写 IsResolved AS System.Boolean 可读不可写 IsShapeFile AS System.Boolean 可读可写 IsTransactionResident AS System.Boolean 可读不可写 IsUndoing AS System.Boolean 可读不可写 IsVertical AS System.Boolean 可读可写 IsWriteEnabled AS System.Boolean 可读不可写 MergeStyle AS Autodesk.AutoCAD.DatabaseServices.DuplicateRecordCloning 可读可写 Name AS System.String 可读可写 ObjectBirthVersion AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion 可读不可写 ObjectId AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 ObliquingAngle AS System.Double 可读可写 OwnerId AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读可写 PaperOrientation AS Autodesk.AutoCAD.DatabaseServices.PaperOrientationStates 可读不可写 PriorSize AS System.Double 可读可写 TextSize AS System.Double 可读可写 UndoFiler AS Autodesk.AutoCAD.DatabaseServices.DwgFiler 可读不可写 UnmanagedObject AS System.IntPtr 可读不可写 XData AS Autodesk.AutoCAD.DatabaseServices.ResultBuffer 可读可写 XScale AS System.Double 可读可写 -------------------------------- 类:Autodesk.AutoCAD.DatabaseServices.TextVerticalMode:System.Enum 函数: CompareTo(Object) AS System.Int32 Equals(Object) AS System.Boolean GetHashCode() AS System.Int32 GetType() AS System.Type GetTypeCode() AS System.TypeCode ToString() AS System.String ToString(IFormatProvider) AS System.String ToString(String,IFormatProvider) AS System.String ToString(String) AS System.String 字段: TextBase AS TextVerticalMode TextBottom AS TextVerticalMode TextTop AS TextVerticalMode TextVerticalMid AS TextVerticalMode value__ AS Int32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值