.NET

Reply
Valued Contributor
GrzesiekGP
Posts: 67
Registered: ‎02-03-2012
Message 1 of 20 (922 Views)
Accepted Solution

Save some variables into DWG file - how? C#.

922 Views, 19 Replies
09-12-2012 10:13 AM

Hello!

 

Please let me know if I'm able to save some variables into current DWG?

 

I would like to provide availability for user to save some data which is different for each DWG file.

 

Thanks.

Here're two little example to set and get xrecord data (ResultBuffer as for Xdata) in a named dictionary child of the root NamedObjectsDictionary (NOD).

 /// <summary>
/// Add or edit a Xrecord data in a named dictionary (the dictionary and xrecord are created if not already exist)
/// </summary>
/// <param name="dictName">The dictionary name</param>
/// <param name="key">the xrecord key</param>
/// <param name="resbuf">the xrecord data</param>
public void SetXrecord(string dictName, string key, ResultBuffer resbuf)
{
Document doc = acadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBDictionary NOD =
(DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead);
DBDictionary dict;
if (NOD.Contains(dictName))
{
dict = (DBDictionary)tr.GetObject(NOD.GetAt(dictName), OpenMode.ForWrite);
}
else
{
dict = new DBDictionary();
NOD.UpgradeOpen();
NOD.SetAt(dictName, dict);
tr.AddNewlyCreatedDBObject(dict, true);
}
Xrecord xRec = new Xrecord();
xRec.Data = resbuf;
dict.SetAt(key, xRec);
tr.AddNewlyCreatedDBObject(xRec, true);
tr.Commit();
}
}
/// <summary>
/// Gets an xrecord data in a named dictionary
/// </summary>
/// <param name="dictName">The dictionary name</param>
/// <param name="key">The xrecord key</param>
/// <returns>The xrecord data or null if the dictionary or the xrecord do not exist</returns>
public ResultBuffer GetXrecord(string dictName, string key)
{
Document doc = acadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBDictionary NOD =
(DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead);
if (!NOD.Contains(dictName))
return null;
DBDictionary dict = tr.GetObject(NOD.GetAt(dictName), OpenMode.ForRead) as DBDictionary;
if (dict == null || !dict.Contains(key))
return null;
Xrecord xRec = tr.GetObject(dict.GetAt(key), OpenMode.ForRead) as Xrecord;
if (xRec == null)
return null;
return xRec.Data;
}
}

 

 

 

As for Xdata you have to use a ResultBuffer to set data in a Xrecord and the Xrecord.Data property is a ResultBuffer.

Assuming your xrecord contains a single data of type String, you can get the data this way:

 

ResultBuffer resbuf = GetXrecord(theDictName, theXrecKey);

string theFirstData =(string) resbuf.AsArray()[0].Value;

It looks like you forgot to call: tr.Commit();

*Expert Elite*
arcticad
Posts: 1,285
Registered: ‎06-21-2004
Message 2 of 20 (916 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 10:47 AM in reply to: GrzesiekGP
Board Manager
StephenPreston
Posts: 419
Registered: ‎05-22-2006
Message 3 of 20 (906 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 11:52 AM in reply to: arcticad

Further to arcticad's reply, you'd typically store global data on the Named Objects Dictionary, and data related to a particular entity as xdata on that entity or as an xrecord in its extension dictionary.

 

But if you're storing 'variables' (sysvars), then you migh prefer to use the Autodesk.AutoCAD.Runtime.Variable class. You can specify whether the variable is per session, per user, per profile or per database.

 

 

Cheers,

Stephen Preston
Autodesk Developer Network
*Expert Elite*
arcticad
Posts: 1,285
Registered: ‎06-21-2004
Message 4 of 20 (895 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 01:17 PM in reply to: StephenPreston

I don't seem to find any information on how to use Autodesk.AutoCAD.Runtime.Variable

Can you point me in the direction.

Thanks.

---------------------------



(defun botsbuildbots() (botsbuildbots))
Valued Contributor
RichardCammeray
Posts: 56
Registered: ‎12-08-2010
Message 5 of 20 (881 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 05:02 PM in reply to: GrzesiekGP

I used LispVariable to store data in file so user could use them in Text Field.

Here are examples how to get and set Lisp Variables I used.

http://www.theswamp.org/index.php?topic=35714.0

 

Richard.

Valued Contributor
RichardCammeray
Posts: 56
Registered: ‎12-08-2010
Message 6 of 20 (877 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 05:22 PM in reply to: GrzesiekGP

I forgot to say then these variables are not saved in drawing.

Richard

Valued Contributor
GrzesiekGP
Posts: 67
Registered: ‎02-03-2012
Message 7 of 20 (854 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 10:28 PM in reply to: GrzesiekGP

Thank you for the links.

 

Following the first, I have question - am I able to set my XData without selecting an entity?

*Expert Elite*
_gile
Posts: 2,115
Registered: ‎04-29-2006
Message 8 of 20 (852 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 10:35 PM in reply to: arcticad

Hi articad,

 

You can see this thread about custom Variables.

IMO, the main issue with Autodesk.AutoCAD.Runtim.Variable is the variable has to be registered in HKLM which most often requires administrator user account.

Gilles Chanteau
Valued Contributor
RichardCammeray
Posts: 56
Registered: ‎12-08-2010
Message 9 of 20 (848 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 10:41 PM in reply to: GrzesiekGP

Use DBDictionary to save data (XRecord) in file.

Try to search for   NamedObjectsDictionary (NOD) you should find many examples in this forum.

 

Richard

*Expert Elite*
_gile
Posts: 2,115
Registered: ‎04-29-2006
Message 10 of 20 (844 Views)

Re: Save some variables into DWG file - how? C#.

09-12-2012 10:43 PM in reply to: GrzesiekGP

Hi GrzesiekGP,

 

If you want to go the Xdata route without selecting an entity, you can set your Xdata on any DBObject (i.e. layer "0", model space BlockTableRecord) but, IMO, you'd rather use a DBDictionary and Xrecord.

Gilles Chanteau
Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Announcements
Are You Going To Be @ AU 2014? Feel free to drop by our AU topic post and share your plans, plug a class that you're teaching, or simply check out who else from the community might be in attendance. Ohh and don't forgot to stop by the Autodesk Help | Learn | Collaborate booths in the Exhibit Hall and meet our community team if you get a chance!