/***********************************************************************
* FileName: DBDictionaryClass .CS
* File Created: 2010-4-9 15:26
* Description: 数据字典,数据字典引用
* Purpose :
* History:
* Creator : 成吉思汗
********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Client.AutoCad
{
public class DBDictionaryClass
{
#region 添加词典
/// <summary>
/// 添加词典
/// </summary>
/// <param name="dictionaryname">数据字典名称</param>
public void AddDBDictionary(string dictionaryname)
{
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
//获取命名对象词典(NOD)
Autodesk.AutoCAD.DatabaseServices.DBDictionary NOD = trans.GetObject(db.NamedObjectsDictionaryId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.DBDictionary;
// 声明一个新的词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary newdictionary;
// 判断是否存在COPYRIGHT词典,没有则创建
if (NOD.Contains(dictionaryname))
{
// 获取newdictionary词典
newdictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(NOD.GetAt(dictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
}
else
{
//在NOD下创建newdictionary词典
newdictionary = new Autodesk.AutoCAD.DatabaseServices.DBDictionary();
NOD.SetAt(dictionaryname, newdictionary);
trans.AddNewlyCreatedDBObject(newdictionary, true);
}
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
}
/// <summary>
/// 添加数据字典A上添加数据字典B
/// </summary>
/// <param name="dictionaryname">数据字典A名称</param>
/// <param name="sondictionarayname">数据字典B名称</param>
public void AddDBDictionary(string dictionaryname,string sondictionarayname)
{
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
//获取命名对象词典(NOD)
Autodesk.AutoCAD.DatabaseServices.DBDictionary NOD = trans.GetObject(db.NamedObjectsDictionaryId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.DBDictionary;
// 声明一个新的词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary newdictionary;
// 判断是否存在newdictionary词典,没有则创建
// 获取newdictionary词典
if (NOD.Contains(dictionaryname))
newdictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(NOD.GetAt(dictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
else
{
//在NOD下创建newdictionary词典
newdictionary = new Autodesk.AutoCAD.DatabaseServices.DBDictionary();
NOD.SetAt(dictionaryname, newdictionary);
trans.AddNewlyCreatedDBObject(newdictionary, true);
}
// 在newdictionary中,获取或创建 sondictionarayname 词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary newsondictionary;
if (newdictionary.Contains(sondictionarayname))
newsondictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(newdictionary.GetAt(sondictionarayname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
else
{
newsondictionary = new Autodesk.AutoCAD.DatabaseServices.DBDictionary();
newdictionary.UpgradeOpen();
newdictionary.SetAt(sondictionarayname, newsondictionary);
trans.AddNewlyCreatedDBObject(newsondictionary, true);
}
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
trans.Abort();
}
finally
{
trans.Dispose();
}
}
#endregion
#region 在DBDictionary上添加扩展记录
/// <summary>
/// 在DBDictionary上添加扩展记录
/// </summary>
/// <param name="dictionaryname">在即将要的数据字典上添加扩展记录的数据字典名称</param>
/// <param name="xrecordname">即将要添加扩展记录的名称</param>
/// <param name="obj">添加扩展记录的数据</param>
public void AddXrecord(string dictionaryname,string xrecordname,Object obj)
{
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
//获取命名对象词典(NOD)
Autodesk.AutoCAD.DatabaseServices.DBDictionary NOD = trans.GetObject(db.NamedObjectsDictionaryId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.DBDictionary;
// 声明一个新的词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary dictionary;
// 通过Xrecord和ResultBuffer添加扩展数据
Autodesk.AutoCAD.DatabaseServices.Xrecord xrec;
// 判断是否存在dictionary词典,没有则创建
if(NOD.Contains(dictionaryname))
{
// 获取dictionary词典
dictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(NOD.GetAt(dictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
}
else
{
goto label;
}
if(dictionary.Contains(xrecordname))
{
xrec = (Autodesk.AutoCAD.DatabaseServices.Xrecord)trans.GetObject(dictionary.GetAt(xrecordname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
}
else
{
xrec = new Autodesk.AutoCAD.DatabaseServices.Xrecord();
xrec.Data = new Autodesk.AutoCAD.DatabaseServices.ResultBuffer(new Autodesk.AutoCAD.DatabaseServices.TypedValue((int)Autodesk.AutoCAD.DatabaseServices.DxfCode.Text, obj));
dictionary.SetAt(xrecordname, xrec);
trans.AddNewlyCreatedDBObject(xrec, true);
}
label:
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
trans.Abort();
}
finally
{
trans.Dispose();
}
}
#endregion
#region 获取字典上的扩展记录
/// <summary>
/// 获取字典上的扩展记录
/// </summary>
/// <param name="dictionaryname">数据字典名称</param>
/// <param name="xrecordname">扩展记录名称</param>
/// <returns>返回对象</returns>
public System.Object GetXRecordInDBDictionary(string dictionaryname, string xrecordname)
{
Autodesk.AutoCAD.DatabaseServices.TypedValue val = new Autodesk.AutoCAD.DatabaseServices.TypedValue();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
// 获取NOD
Autodesk.AutoCAD.DatabaseServices.DBDictionary NOD = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead, false);
// 获取dictionary词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary dictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(NOD.GetAt(dictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
// 获取 扩展记录Xrecord
Autodesk.AutoCAD.DatabaseServices.Xrecord authorXRec = (Autodesk.AutoCAD.DatabaseServices.Xrecord)trans.GetObject(dictionary.GetAt(xrecordname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.ResultBuffer resBuf = authorXRec.Data;
val = resBuf.AsArray()[0];
return val.Value;
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
trans.Abort();
return val.Value;
}
finally
{
trans.Dispose();
}
}
/// <summary>
/// 获取字典上的扩展记录
/// </summary>
/// <param name="dictionaryname">数据字典A名称</param>
/// <param name="sondictionaryname">在数据字典A里的数据字典B</param>
/// <param name="xrecordname">扩展记录名称</param>
/// <returns>返回对象</returns>
public System.Object GetXRecordInDBDictionary(string dictionaryname,string sondictionaryname,string xrecordname)
{
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.TypedValue val = new Autodesk.AutoCAD.DatabaseServices.TypedValue();
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
// 获取NOD
Autodesk.AutoCAD.DatabaseServices.DBDictionary NOD = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead, false);
// 获取dictionary词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary dictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(NOD.GetAt(dictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
// 获取sondictionary词典
Autodesk.AutoCAD.DatabaseServices.DBDictionary sondictionary = (Autodesk.AutoCAD.DatabaseServices.DBDictionary)trans.GetObject(dictionary.GetAt(sondictionaryname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
// 获取 扩展记录Xrecord
Autodesk.AutoCAD.DatabaseServices.Xrecord authorXRec = (Autodesk.AutoCAD.DatabaseServices.Xrecord)trans.GetObject(sondictionary.GetAt(xrecordname), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.ResultBuffer resBuf = authorXRec.Data;
val = resBuf.AsArray()[0];
return val.Value;
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
trans.Abort();
return val.Value;
}
finally
{
trans.Dispose();
}
}
#endregion
}
}