.NET

Reply
Member
marcusl
Posts: 5
Registered: ‎03-15-2012
Message 1 of 7 (400 Views)
Accepted Solution

Open file then attach a file to it, save and close

400 Views, 6 Replies
02-04-2013 11:25 PM

Hi,

I am a novice with more little experience with VB.net and AutoCAD.

 

I am trying to, after opening autocad, to have my routine open file A, attach file B, save file A then close file A.

 

I've got the below bit working to the point of opening file A, and then attaching file B.  

 

My problem is that after the the code opens file A, it is not the active file ?? and so when the xref is attached, it does not get attached to file A, but rather whatever drawing that was opened when I started the routine.

 

Here is what I have:

        <CommandMethod("OpenAttach")>
        Public Sub OpenThenAttachXref()
            Dim HostSheet As String = "C:\STTemp\Host.dwg"
            Dim XrefFilePathName As String = "C:\STTemp\Xref.dwg"
            Dim XrefFileName As String = "Xref"
            Dim doc As Document = DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor()
            Dim db As Database = doc.Database
            Dim trans As Transaction = db.TransactionManager.StartTransaction()
            Dim acDocMgr As DocumentCollection = Application.DocumentManager
            Dim acDoc As Document = acDocMgr.MdiActiveDocument

            If File.Exists(HostSheet) Then
                acDocMgr.Open(HostSheet, False)
            Else
                acDocMgr.MdiActiveDocument.Editor.WriteMessage("File " & HostSheet & " does not exist.")
            End If

            Using (trans)
                Try
                    Dim xrefObj As ObjectId = db.AttachXref(XrefFilePathName, XrefFileName)
                    Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead, False)
                    Dim modelSpace As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
                    Dim btr As BlockTableRecord = CType(trans.GetObject(xrefObj, OpenMode.ForWrite), BlockTableRecord)
                    Dim br As BlockReference = New BlockReference(New Point3d(0, 0, 0), xrefObj)

                    modelSpace.AppendEntity(br)
                    trans.AddNewlyCreatedDBObject(br, True)
                    trans.Commit()

                Catch ex As Autodesk.AutoCAD.Runtime.Exception
                    MsgBox(ex.Message & vbLf & ex.StackTrace)
                End Try
            End Using
        End Sub

 Any assistance in this would be greatly appriciated!  This is the last push to setting up over a one thousard files with x-refs.  I have already built a pure VB.net app that builds a job file that contains all host files names and the xref that will get attached to them.

 

Regards,

Marcus

 

 

 

You need to make your command running in Application Context, not Document Context as it currently does.

 

That is, in your CommandMethodAttribute, add CommandFlags.Session:

 

[CommandMethod("OpenAttach", CommandFlags.Session)]

Public Shared Sub OpenThenAttach()

...

End Sub

 

 

Hi,

 

Another way, without openig the host file in the Editor, is using a "side Databse" with the Database.ReadDwgFile method.

 

 [CommandMethod("ReadAttach", CommandFlags.Modal)]
public void ReadAttach()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
string host = @"C:\Temp\A.dwg";
string xref = @"C:\Temp\B.dwg";
if (!File.Exists(host))
ed.WriteMessage("\nFile '{0}' does not exist.", host);
if (!File.Exists(xref))
ed.WriteMessage("\nFile '{0}' does not exist.", xref);
// create a new Database
using (Database sideDb = new Database())
{
// open the host file in the Database
sideDb.ReadDwgFile(host, FileShare.ReadWrite, false, "");
// start a Transaction in the 'side' Database
using (Transaction sideTr = sideDb.TransactionManager.StartTransaction())
{
// attach the xref
ObjectId id = sideDb.AttachXref(xref, Path.GetFileNameWithoutExtension(xref));
BlockTableRecord modelSpace =
(BlockTableRecord)SymbolUtilityServices
.GetBlockModelSpaceId(sideDb)
.GetObject(OpenMode.ForWrite);
BlockReference br = new BlockReference(Point3d.Origin, id);
modelSpace.AppendEntity(br);
sideTr.AddNewlyCreatedDBObject(br, true);
sideTr.Commit();
}
// save the Database
sideDb.SaveAs(host, DwgVersion.Current);
}
}

 VB

 <CommandMethod("ReadAttach", CommandFlags.Modal)> _
Public Sub ReadAttach()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim host As String = "C:\Temp\A.dwg"
Dim xref As String = "C:\Temp\B.dwg"
If Not File.Exists(host) Then
ed.WriteMessage(vbLf & "File '{0}' does not exist.", host)
End If
If Not File.Exists(xref) Then
ed.WriteMessage(vbLf & "File '{0}' does not exist.", xref)
End If
' create a new Database
Using sideDb As New Database()
' open the host file in the Database
sideDb.ReadDwgFile(host, FileShare.ReadWrite, False, "")
' start a Transaction in the 'side' Database
Using sideTr As Transaction = sideDb.TransactionManager.StartTransaction()
' attach the xref
Dim id As ObjectId = sideDb.AttachXref(xref, Path.GetFileNameWithoutExtension(xref))
Dim modelSpace As BlockTableRecord = _
DirectCast(SymbolUtilityServices _
.GetBlockModelSpaceId(sideDb) _
.GetObject(OpenMode.ForWrite), BlockTableRecord)
Dim br As New BlockReference(Point3d.Origin, id)
modelSpace.AppendEntity(br)
sideTr.AddNewlyCreatedDBObject(br, True)
sideTr.Commit()
End Using
' save the Database
sideDb.SaveAs(host, DwgVersion.Current)
End Using
End Sub

 

*Expert Elite*
norman.yuan
Posts: 998
Registered: ‎04-27-2009
Message 2 of 7 (379 Views)

Re: Open file then attach a file to it, save and close

02-05-2013 06:35 AM in reply to: marcusl

You need to make your command running in Application Context, not Document Context as it currently does.

 

That is, in your CommandMethodAttribute, add CommandFlags.Session:

 

[CommandMethod("OpenAttach", CommandFlags.Session)]

Public Shared Sub OpenThenAttach()

...

End Sub

 

 

*Expert Elite*
_gile
Posts: 2,084
Registered: ‎04-29-2006
Message 3 of 7 (349 Views)

Re : Open file then attach a file to it, save and close

02-05-2013 01:05 PM in reply to: marcusl

Hi,

 

Another way, without openig the host file in the Editor, is using a "side Databse" with the Database.ReadDwgFile method.

 

        [CommandMethod("ReadAttach", CommandFlags.Modal)]
        public void ReadAttach()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            string host = @"C:\Temp\A.dwg";
            string xref = @"C:\Temp\B.dwg";
            if (!File.Exists(host))
                ed.WriteMessage("\nFile '{0}' does not exist.", host);
            if (!File.Exists(xref))
                ed.WriteMessage("\nFile '{0}' does not exist.", xref);
            // create a new Database
            using (Database sideDb = new Database())
            {
                // open the host file in the Database
                sideDb.ReadDwgFile(host, FileShare.ReadWrite, false, "");
                // start a Transaction in the 'side' Database
                using (Transaction sideTr = sideDb.TransactionManager.StartTransaction())
                {
                    // attach the xref
                    ObjectId id = sideDb.AttachXref(xref, Path.GetFileNameWithoutExtension(xref));
                    BlockTableRecord modelSpace =
                        (BlockTableRecord)SymbolUtilityServices
                        .GetBlockModelSpaceId(sideDb)
                        .GetObject(OpenMode.ForWrite);
                    BlockReference br = new BlockReference(Point3d.Origin, id);
                    modelSpace.AppendEntity(br);
                    sideTr.AddNewlyCreatedDBObject(br, true);
                    sideTr.Commit();
                }
                // save the Database
                sideDb.SaveAs(host, DwgVersion.Current);
            }
        }

 VB

        <CommandMethod("ReadAttach", CommandFlags.Modal)> _
        Public Sub ReadAttach()
            Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
            Dim host As String = "C:\Temp\A.dwg"
            Dim xref As String = "C:\Temp\B.dwg"
            If Not File.Exists(host) Then
                ed.WriteMessage(vbLf & "File '{0}' does not exist.", host)
            End If
            If Not File.Exists(xref) Then
                ed.WriteMessage(vbLf & "File '{0}' does not exist.", xref)
            End If
            ' create a new Database
            Using sideDb As New Database()
                ' open the host file in the Database
                sideDb.ReadDwgFile(host, FileShare.ReadWrite, False, "")
                ' start a Transaction in the 'side' Database
                Using sideTr As Transaction = sideDb.TransactionManager.StartTransaction()
                    ' attach the xref
                    Dim id As ObjectId = sideDb.AttachXref(xref, Path.GetFileNameWithoutExtension(xref))
                    Dim modelSpace As BlockTableRecord = _
                        DirectCast(SymbolUtilityServices _
                            .GetBlockModelSpaceId(sideDb) _
                            .GetObject(OpenMode.ForWrite), BlockTableRecord)
                    Dim br As New BlockReference(Point3d.Origin, id)
                    modelSpace.AppendEntity(br)
                    sideTr.AddNewlyCreatedDBObject(br, True)
                    sideTr.Commit()
                End Using
                ' save the Database
                sideDb.SaveAs(host, DwgVersion.Current)
            End Using
        End Sub

 

Gilles Chanteau
Member
marcusl
Posts: 5
Registered: ‎03-15-2012
Message 4 of 7 (327 Views)

Re : Open file then attach a file to it, save and close

02-06-2013 11:03 AM in reply to: _gile

Thanks so much Guys!  I had to take a day from codeing to take care of other pressing items, but tonight I will apply your solutions.

 

Thanks Again Gentleman, your are life savers!

Marcus

 

Member
marcusl
Posts: 5
Registered: ‎03-15-2012
Message 5 of 7 (302 Views)

Re: Open file then attach a file to it, save and close

02-11-2013 03:42 PM in reply to: marcusl

Gentleman,

Both solutions worked perfectly.  Thanks for the help..  I am attaching files like a madman now!

 

Regards,

Marcus

 

Member
marcusl
Posts: 5
Registered: ‎03-15-2012
Message 6 of 7 (291 Views)

Re : Open file then attach a file to it, save and close

02-12-2013 04:21 PM in reply to: _gile

_gile,

 

How would I use your same side transaction but attach as an overlay, not an attachment?

 

Thanks,

Marcus

 

Member
marcusl
Posts: 5
Registered: ‎03-15-2012
Message 7 of 7 (290 Views)

Re : Open file then attach a file to it, save and close

02-12-2013 04:27 PM in reply to: marcusl

Never mind!! I figured it out... just had to look!

 

Dim id As ObjectId = sideDb.OverlayXref(Xref, Path.GetFileNameWithoutExtension(Xref))

 

:smileytongue:

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.
Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.