CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

在数据库之间复制对象 (.NET)

2023-1-1 14:05| 发布者: admin| 查看: 486| 评论: 0|来自: AutoCAD

可以在两个数据库之间复制对象。该函数用于复制同一数据库中的对象,而该方法用于将对象从一个数据库复制到另一个数据库。该方法是对象的成员。该方法需要以下参数:CloneWblockCloneObjectsWblockCloneObjectsDatabaseWblockCloneObjects

  • ObjectIdCollection- 要克隆的对象列表。
  • ObjectId - 要克隆的对象的新父对象的 ObjectId。
  • IdMapping- 正在克隆的对象的当前和新对象ID的数据结构。
  • DuplicateRecordCloning - 确定应如何处理重复对象。
  • 延迟翻译 - 控制是否应翻译对象 ID。

将对象从一个数据库复制到另一个数据库

本示例创建两个 Circle 对象,然后使用该方法将这些圆复制到新绘图中。该示例还在复制圆之前使用acad.dwt文件创建新图形。WblockCloneObjects

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("CopyObjectsBetweenDatabases", CommandFlags.Session)> _
Public Sub CopyObjectsBetweenDatabases()
    Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()

    '' Get the current document and database
    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
    Dim acCurDb As Database = acDoc.Database

    '' Lock the current document
    Using acLckDocCur As DocumentLock = acDoc.LockDocument()

        '' Start a transaction
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

            '' Open the Block table for read
            Dim acBlkTbl As BlockTable
            acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)

            '' Open the Block table record Model space for write
            Dim acBlkTblRec As BlockTableRecord
            acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                            OpenMode.ForWrite)

            '' Create a circle that is at (0,0,0) with a radius of 5
            Using acCirc1 As Circle = New Circle()
                acCirc1.Center = New Point3d(0, 0, 0)
                acCirc1.Radius = 5

                '' Add the new object to the block table record and the transaction
                acBlkTblRec.AppendEntity(acCirc1)
                acTrans.AddNewlyCreatedDBObject(acCirc1, True)

                '' Create a circle that is at (0,0,0) with a radius of 7
                Using acCirc2 As Circle = New Circle()
                    acCirc2.Center = New Point3d(0, 0, 0)
                    acCirc2.Radius = 7

                    '' Add the new object to the block table record and the transaction
                    acBlkTblRec.AppendEntity(acCirc2)
                    acTrans.AddNewlyCreatedDBObject(acCirc2, True)

                    '' Add all the objects to copy to the new document
                    acObjIdColl = New ObjectIdCollection()
                    acObjIdColl.Add(acCirc1.ObjectId)
                    acObjIdColl.Add(acCirc2.ObjectId)
                End Using
            End Using

            '' Save the new objects to the database
            acTrans.Commit()
        End Using

        '' Unlock the document
    End Using

    '' Change the file and path to match a drawing template on your workstation
    Dim sLocalRoot As String = Application.GetSystemVariable("LOCALROOTPREFIX")
    Dim sTemplatePath As String = sLocalRoot + "Template\acad.dwt"

    '' Create a new drawing to copy the objects to
    Dim acDocMgr As DocumentCollection = Application.DocumentManager
    Dim acNewDoc As Document = DocumentCollectionExtension.Add(acDocMgr, sTemplatePath)
    Dim acDbNewDoc As Database = acNewDoc.Database

    '' Lock the new document
    Using acLckDoc As DocumentLock = acNewDoc.LockDocument()

        '' Start a transaction in the new database
        Using acTrans = acDbNewDoc.TransactionManager.StartTransaction()

            '' Open the Block table for read
            Dim acBlkTblNewDoc As BlockTable
            acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, _
                                               OpenMode.ForRead)

            '' Open the Block table record Model space for read
            Dim acBlkTblRecNewDoc As BlockTableRecord
            acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), _
                                                  OpenMode.ForRead)

            '' Clone the objects to the new database
            Dim acIdMap As IdMapping = New IdMapping()
            acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, _
                                       DuplicateRecordCloning.Ignore, False)

            '' Save the copied objects to the database
            acTrans.Commit()
        End Using

        '' Unlock the document
    End Using

    '' Set the new document current
    acDocMgr.MdiActiveDocument = acNewDoc
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("CopyObjectsBetweenDatabases", CommandFlags.Session)]
public static void CopyObjectsBetweenDatabases()
{
    ObjectIdCollection acObjIdColl = new ObjectIdCollection();

    // Get the current document and database
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;

    // Lock the current document
    using (DocumentLock acLckDocCur = acDoc.LockDocument())
    {
        // Start a transaction
        using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
        {
            // Open the Block table record for read
            BlockTable acBlkTbl;
            acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                            OpenMode.ForRead) as BlockTable;

            // Open the Block table record Model space for write
            BlockTableRecord acBlkTblRec;
            acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                            OpenMode.ForWrite) as BlockTableRecord;

            // Create a circle that is at (0,0,0) with a radius of 5
            using (Circle acCirc1 = new Circle())
            {
                acCirc1.Center = new Point3d(0, 0, 0);
                acCirc1.Radius = 5;

                // Add the new object to the block table record and the transaction
                acBlkTblRec.AppendEntity(acCirc1);
                acTrans.AddNewlyCreatedDBObject(acCirc1, true);

                // Create a circle that is at (0,0,0) with a radius of 7
                using (Circle acCirc2 = new Circle())
                {
                    acCirc2.Center = new Point3d(0, 0, 0);
                    acCirc2.Radius = 7;

                    // Add the new object to the block table record and the transaction
                    acBlkTblRec.AppendEntity(acCirc2);
                    acTrans.AddNewlyCreatedDBObject(acCirc2, true);

                    // Add all the objects to copy to the new document
                    acObjIdColl = new ObjectIdCollection();
                    acObjIdColl.Add(acCirc1.ObjectId);
                    acObjIdColl.Add(acCirc2.ObjectId);
                }
            }

            // Save the new objects to the database
            acTrans.Commit();
        }

        // Unlock the document
    }

    // Change the file and path to match a drawing template on your workstation
    string sLocalRoot = Application.GetSystemVariable("LOCALROOTPREFIX") as string;
    string sTemplatePath = sLocalRoot + "Template\\acad.dwt";

    // Create a new drawing to copy the objects to
    DocumentCollection acDocMgr = Application.DocumentManager;
    Document acNewDoc = acDocMgr.Add(sTemplatePath);
    Database acDbNewDoc = acNewDoc.Database;

    // Lock the new document
    using (DocumentLock acLckDoc = acNewDoc.LockDocument())
    {
        // Start a transaction in the new database
        using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())
        {
            // Open the Block table for read
            BlockTable acBlkTblNewDoc;
            acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId,
                                                OpenMode.ForRead) as BlockTable;

            // Open the Block table record Model space for read
            BlockTableRecord acBlkTblRecNewDoc;
            acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc[BlockTableRecord.ModelSpace],
                                                    OpenMode.ForRead) as BlockTableRecord;

            // Clone the objects to the new database
            IdMapping acIdMap = new IdMapping();
            acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap,
                                        DuplicateRecordCloning.Ignore, false);

            // Save the copied objects to the database
            acTrans.Commit();
        }

        // Unlock the document
    }

    // Set the new document current
    acDocMgr.MdiActiveDocument = acNewDoc;
}

VBA/ActiveX Code Reference

Sub CopyObjectsBetweenDatabases()
    Dim DOC0 As AcadDocument
    Dim circleObj1 As AcadCircle, circleObj2 As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius1 As Double, radius2 As Double
    Dim objCollection(0 To 1) As Object
    Dim retObjects As Variant
 
    ' Define the Circle object
    centerPoint(0) = 0: centerPoint(1) = 0: centerPoint(2) = 0
    radius1 = 5#: radius2 = 7#
 
    ' Add two circles to the current drawing
    Set circleObj1 = ThisDrawing.ModelSpace.AddCircle _
                     (centerPoint, radius1)
    Set circleObj2 = ThisDrawing.ModelSpace.AddCircle _
                     (centerPoint, radius2)
 
    ' Save pointer to the current drawing
    Set DOC0 = ThisDrawing.Application.ActiveDocument
 
    ' Copy objects
    '
    ' First put the objects to be copied into a form compatible
    ' with CopyObjects
    Set objCollection(0) = circleObj1
    Set objCollection(1) = circleObj2
 
    ' Create a new drawing and point to its model space
    Dim Doc1MSpace As AcadModelSpace
    Dim DOC1 As AcadDocument
 
    Set DOC1 = Documents.Add
    Set Doc1MSpace = DOC1.ModelSpace
 
    ' Copy the objects into the model space of the new drawing. A
    ' collection of the new (copied) objects is returned.
    retObjects = DOC0.CopyObjects(objCollection, Doc1MSpace)
End Sub

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 11:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部