• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Discussion Groups

    .NET

    Reply
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-12-2012 11:20 PM in reply to: _gile

    Do you have some example of code for XRecords and DBDictionary?

     

    I'm searching, but it hard to find what I need.

    Please use plain text.
    *Expert Elite*
    Posts: 1,640
    Registered: ‎04-29-2006

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

    09-12-2012 11:55 PM in reply to: GrzesiekGP

    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;
                }
            }

     

     

     

    Gilles Chanteau
    Please use plain text.
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-13-2012 12:09 AM in reply to: _gile

    Thank you very much for help.

     

    Please tell me one more thinkg. Am I able to get specified TypedValue from ResultBuffer?

    If not I suppose that the best way would be to put all values into dictionary<int,string>. Am I right?

    Please use plain text.
    *Expert Elite*
    Posts: 1,640
    Registered: ‎04-29-2006

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

    09-13-2012 12:20 AM in reply to: GrzesiekGP

    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;

    Gilles Chanteau
    Please use plain text.
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-13-2012 12:53 AM in reply to: _gile

    Thank you for the help :smileyhappy:

    Please use plain text.
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-13-2012 02:58 AM in reply to: _gile

    Please let me know one more thing.

     

    Am I able to get all keys from my dictionary?

     

    I would to allow user to select from which Key in my dictionary user want to see his variables.

     

    In example:

     

    SetXrecord("myDict", "keysFirst", rb);

    SetXrecord("myDict", "keysSecond", rb);

    SetXrecord("myDict", "keysThird", rb);

     

    And now I want to list: keysFirst,keysSecond,keysThird.

     

    Ok, I've got it:

     List<string> _keys = new List<string>();
                    foreach (DBDictionaryEntry entry in dict)
                    {
                        _keys.Add(entry.Key);
                    }
                    return string.Join(",", _keys.ToArray());

     

     

    Please use plain text.
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-13-2012 11:15 AM in reply to: GrzesiekGP

    One more to do :smileyhappy: Removing keys :smileytongue:

     

    I have this code:

     

    public static void RemoveXrecord(string dictName, string key)
            {
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Database db = doc.Database;
                DocumentLock dl = doc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true);
                using (dl)
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        DBDictionary NOD = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead);
                        if (!NOD.Contains(dictName))
                            return;
                        DBDictionary dict = tr.GetObject(NOD.GetAt(dictName), OpenMode.ForWrite) as DBDictionary;
                        if (dict == null || !dict.Contains(key))
                            return;
                        dict.Remove(key);
                    }
                }
            }

     But key still exist after removing :smileysad:

    Please use plain text.
    *Expert Elite*
    Posts: 1,640
    Registered: ‎04-29-2006

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

    09-13-2012 11:51 AM in reply to: GrzesiekGP

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

    Gilles Chanteau
    Please use plain text.
    Valued Contributor
    GrzesiekGP
    Posts: 54
    Registered: ‎02-03-2012

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

    09-13-2012 11:56 AM in reply to: _gile

    Lol, I'm blind :smileytongue:

     

    Thank you!

    Please use plain text.
    Active Contributor
    RichardCammeray
    Posts: 35
    Registered: ‎12-08-2010

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

    09-13-2012 04:15 PM in reply to: GrzesiekGP

    Once you work with Dictionaries very useful is ArxDbd utility for testing.

    http://otb.manusoft.com/2009/09/arxdbg-utility.htm

    Please use plain text.