using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.Gis.Map;
using Autodesk.Gis.Map.ObjectData;
using Autodesk.Gis.Map.Utilities;
using System;
using System.Collections.Generic;
using System.Globalization;
using MapCon = Autodesk.Gis.Map.Constants;
using MapOD = Autodesk.Gis.Map.ObjectData;
using System.Linq;
namespace C3dTest
{
class ObjectDataTest
{
public static bool AddObjectData(Dictionary<string, string> dataDict, MapOD.Table table, ObjectId objId)
{
if (dataDict == null || dataDict.Count == 0) return false;
try
{
// Создаём новую запись (используем конструкцию using вместо прямого вызова Dispose)
using (MapOD.Record newRec = Record.Create())
{
// Приводим запись в соответствие с таблицей
table.InitRecord(newRec);
// Получаем коллекцию описаний полей таблицы
MapOD.FieldDefinitions fieldDefs = table.FieldDefinitions;
// Проходим по описаниям полей таблицы
for (int i = 0; i < fieldDefs.Count; i++)
{
// Текущее описание
FieldDefinition fieldDef = fieldDefs[i];
// Имя текущего описания поля
string fieldName = fieldDef.Name;
// Пробуем получить из словаря данные с ключом,
// соответствующим названию поля в таблице
KeyValuePair<string, string> dataKeyValue = dataDict
.FirstOrDefault(item => item.Key.Equals
(fieldName, StringComparison.InvariantCultureIgnoreCase));
// Если не нашли - переходим к следующему описанию поля
if (string.IsNullOrEmpty(dataKeyValue.Key)) continue;
// значение, которое необходимо записать
string dataValue = dataKeyValue.Value;
// если тип поля - целое число
if (fieldDef.Type == MapCon.DataType.Integer)
{
// и если данные приводятся к целому числу
int value;
if (Int32.TryParse
(dataValue,
NumberStyles.Integer,
CultureInfo.InvariantCulture, out value))
{
// записываем приведённое значение
newRec[i].Assign(value);
}
}
// если тип поля - вещественное число
else if (fieldDef.Type == MapCon.DataType.Real)
{
// и данные приводятся к вещественному числу
double value;
if (double.TryParse
(dataValue,
NumberStyles.Number,
CultureInfo.InvariantCulture,
out value))
{
// записываем приведённое значение
newRec[i].Assign(value);
}
}
// если тип поля - строка
else if (fieldDef.Type == MapCon.DataType.Character)
{
// записываем строку
newRec[i].Assign(dataValue);
}
// другие варианты не рассматриваем
else
{
}
}
// добавляем запись в таблицу
table.AddRecord(newRec, objId);
}
return true;
}
catch (MapException ex)
{
}
catch (System.AccessViolationException ex)
{
}
return false;
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================
}
}