Global data can be temporally stored in memory at the document level.
When the AutoCAD program loads a managed application, it queries the application's assembly for one or more PerDocumentClass custom attributes. If instances of this attribute are found, an instance of each attribute's associated type is created for each document open in the AutoCAD drawing environment. New instances of the types are then created for any documents that are opened thereafter.
The type associated with a PerDocumentClass attribute must provide either a Public constructor that takes a document argument or a Public Static Create method that takes a document argument and returns an instance of the type. If the Create method exists, it will be used, otherwise the constructor will be used. The document that the type instance is being created for will be passed as the document argument so that the type instance knows with which document it is associated.
The following procedure describes how to use the PerDocumentClass attribute.
...
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
<Assembly: PerDocumentClass(GetType(PerDocData))>
' Defines a global class for constant values
Public NotInheritable Class CSPerDocConsts
Private Sub New()
End Sub
Public Const dbLocVarName As String = "dbLoc"
End Class
' Defines the main class
Public Class PerDocCommands
' Creates a command that returns the current value of the per document data
<CommandMethod("DatabaseLocation")> _
Public Sub DatabaseLocation()
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim pDData As PerDocData = DirectCast(acDoc.UserData(CSPerDocConsts.dbLocVarName), PerDocData)
If pDData Is Nothing Then
acDoc.Editor.WriteMessage(vbLf & "No user data assigned.")
Else
acDoc.Editor.WriteMessage(vbLf & pDData.DbLocation)
End If
End Sub
End Class
' Defines the class that wuill be used to initialize the per document data
Public Class PerDocData
' Define the internal/member variables of the class
Private _stDbLoc As String
' Expose a public property that returns the value of the internal variable
Public ReadOnly Property DbLocation() As String
Get
Return _stDbLoc
End Get
End Property
' Public constructor that requires a Document object
' Created by AutoCAD when the application is loaded
Public Sub New(acDoc As Document)
_stDbLoc = ""
acDoc.UserData.Add(CSPerDocConsts.dbLocVarName, Me)
End Sub
' Create method: Required constructor for the class
Public Shared Function Create(acDoc As Document) As PerDocData
Dim pDData As New PerDocData(acDoc)
pDData._stDbLoc = "C:\ABCApp\Data\" & acDoc.Name.Remove(acDoc.Name.Length - 4) & ".db"
Return pDData
End Function
End Class
...
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
[assembly: PerDocumentClass(typeof(CSPerDoc.PerDocData))]
namespace CSPerDoc
{
// Defines a global class for constant values
public static class CSPerDocConsts
{
public const string dbLocVarName = "dbLoc";
}
// Defines the main class
public class PerDocCommands
{
// Creates a command that returns the current value of the per document data
[CommandMethod("DatabaseLocation")]
public void DatabaseLocation()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
PerDocData pDData = (PerDocData) acDoc.UserData[CSPerDocConsts.dbLocVarName];
if (pDData == null) {
acDoc.Editor.WriteMessage("\nNo user data assigned.");
} else {
acDoc.Editor.WriteMessage("\n" + pDData.DbLocation);
}
}
}
// Defines the class that wuill be used to initialize the per document data
public class PerDocData
{
// Define the internal/member variables of the class
private string _stDbLoc;
// Expose a public property that returns the value of the internal variable
public string DbLocation
{
get { return _stDbLoc; }
}
// Public constructor that requires a Document object
// Created by AutoCAD when the application is loaded
public PerDocData(Document acDoc)
{
_stDbLoc = @"";
acDoc.UserData.Add(CSPerDocConsts.dbLocVarName, this);
}
// Create method: Required constructor for the class
public static PerDocData Create(Document acDoc)
{
PerDocData pDData = new PerDocData(acDoc);
pDData._stDbLoc = @"C:\\ABCApp\\ProjectData\\" + acDoc.Name.Remove(acDoc.Name.Length - 4) + ".db";
return pDData;
}
}
}