[assembly: Autodesk.AutoCAD.Runtime.CommandClass(typeof(TestProject.TestClass))]
namespace TestProject
{
using System;
using System.Collections.Specialized;
using Autodesk.AutoCAD.ApplicationServices.Core;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.Civil.DatabaseServices;
using Autodesk.Gis.Map;
using Autodesk.Gis.Map.Classification;
using Trace = System.Diagnostics.Trace;
using System.Collections;
using Autodesk.Gis.Map.ObjectData;
using Autodesk.Gis.Map.Project;
/// <summary>
/// Тестовый класс для демонстрации ошибки, связанной с повторной классификацией объекта.
/// </summary>
public class TestClass : IExtensionApplication
{
/// <summary>
/// Инициализация расширения.
/// </summary>
public void Initialize()
{
HostMapApplicationServices.Application.LogIn("SuperUser", "SUPERUSER");
}
/// <summary>
/// Закрытие расширения.
/// </summary>
public void Terminate()
{
}
/// <summary>
/// Классификация точки первым классом.
/// </summary>
[CommandMethod("CLASSIFY1")]
public void ClassifyOne()
{
var objId = GetCogoPoint();
Classify(objId, "Класс 1", "Свойство 1", "Свойство 2");
}
/// <summary>
/// Классификация точки вторым классом.
/// </summary>
[CommandMethod("CLASSIFY2")]
public void ClassyfyTwo()
{
var objId = GetCogoPoint();
Unclassify(objId, "Класс 1");
Classify(objId, "Класс 2", "Свойство 3", "Свойство 4");
}
/// <summary>
/// Классификация объекта и выставление ему пользовательских свойств.
/// </summary>
/// <param name="objectId">Идентификатор объекта.</param>
/// <param name="className">Имя результирующего класса.</param>
/// <param name="properties">Массив имен свойств.</param>>
private static void Classify(ObjectId objectId, string className, params string[] properties)
{
var manager = HostMapApplicationServices.Application.ActiveProject.ClassificationManager;
// здесь классифицируем
using (var ids = new ObjectIdCollection { objectId })
using (var failIds = new ObjectIdCollection())
{
var errorCodes = new FeatureClassErrorCodeCollection();
// manager.Unclassify(objectId); <-- Не помогает
manager.Classify(failIds, errorCodes, ids, className, true, true);
manager.Audit(objectId, true, true);
}
// ниже выставляем значения свойств
using (var featureClassDefinition = manager[className])
{
var collection = new StringCollection { "Пользовательский" };
foreach (var propertyName in properties)
{
using (var property = featureClassDefinition.GetProperty(collection, propertyName))
{
var value = property.FromString(DateTime.Now.Millisecond.ToString());
try
{
property.SetValue(objectId, value, true);
}
catch (MapFeatureClassException mfce)
{
Trace.WriteLine((FeatureClassErrorCode)mfce.ErrorCode);
throw;
}
}
}
}
}
/// <summary>
/// Получение идентификатора первой попавшейся коготочки.
/// </summary>
/// <returns>Идентификатор коготочки.</returns>
private static ObjectId GetCogoPoint()
{
var doc = Application.DocumentManager.MdiActiveDocument;
using (var trans = doc.TransactionManager.StartTransaction())
using (var bt = (BlockTable)trans.GetObject(doc.Database.BlockTableId, OpenMode.ForRead))
using (var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead))
{
foreach (var objectId in btr)
{
using (var dbObj = trans.GetObject(objectId, OpenMode.ForRead))
{
if (dbObj is CogoPoint)
{
return objectId;
}
}
}
trans.Commit();
}
return ObjectId.Null;
}
/// <summary>
/// Деклассификация объекта и удаление его пользовательских свойств.
/// </summary>
/// <param name="objectId">Идентификатор объекта.</param>
/// <param name="className">Имя класса.</param>
private static void Unclassify(ObjectId objectId, string className)
{
var manager = HostMapApplicationServices.Application
.ActiveProject.ClassificationManager;
manager.Unclassify(objectId);
MapApplication mapApp = HostMapApplicationServices.Application;
ProjectModel activeProj = mapApp.ActiveProject;
Tables odTables = activeProj.ODTables;
try
{
using (Transaction tr = objectId.Database.TransactionManager.StartTransaction())
{
ObjectId nodId = objectId.Database.NamedObjectsDictionaryId;
DBDictionary nod = tr.GetObject(nodId, OpenMode.ForRead) as DBDictionary;
ObjectId acadOCId = nod.GetAt("ACAD_OC");
DBDictionary acadOc = tr.GetObject(acadOCId, OpenMode.ForRead) as DBDictionary;
ObjectId defFileId = acadOc.GetAt("DefinitionFile");
DBDictionary defFile = tr.GetObject(defFileId, OpenMode.ForRead) as DBDictionary;
ObjectId classDataId = defFile.GetAt(className);
DataTable classData = tr.GetObject(classDataId, OpenMode.ForWrite) as DataTable;
for (int i = 0; i < classData.NumRows; i++)
{
if (classData.GetCellAt(i, 0).Value.Equals(objectId))
{
classData.RemoveRowAt(i);
break;
}
}
tr.Commit();
}
}
catch (MapException exc)
{
}
}
}
}