30/05/2013
Получение размерных ограничений и их ассоциативных свойств в .NET
Вот полезный код для тех из вас, кто работает с .NET Associative API. Ниже пример на C# показывает как выполнить дамп всех размерных ограничений в текущем пространстве (Модели или Листа). Он так же показывает как по объектам накладывающим ограничения найти зависимые примитивы и управляющие ими ассоциативные параметры.
Код - C#: [Выделить]
- /////////////////////////////////////////////////////////////
- // Использование:
- // Вывод в командную строку размерных ограничений
- // в текущей BlockTableRecord
- // Печать типов ограничений, зависимые примитивы и
- // управляющие параметры.
- //
- // Автор: Philippe Leefsma.
- /////////////////////////////////////////////////////////////
- [CommandMethod("DumpDimConstraints")]
- public void DumpDimConstraints()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- ObjectId networkId = AssocNetwork.GetInstanceFromObject(
- db.CurrentSpaceId,
- false,
- true,
- "ACAD_ASSOCNETWORK");
- if (networkId == ObjectId.Null)
- return;
- using (Transaction Tx =
- db.TransactionManager.StartTransaction())
- {
- using (AssocNetwork network =
- Tx.GetObject(
- networkId,
- OpenMode.ForRead, false) as AssocNetwork)
- {
- foreach (ObjectId actionId in network.GetActions)
- {
- if (actionId == ObjectId.Null)
- continue;
- DBObject obj = Tx.GetObject(
- actionId,
- OpenMode.ForRead);
- if (actionId.ObjectClass.IsDerivedFrom(
- RXObject.GetClass(
- typeof(Assoc2dConstraintGroup))))
- {
- Assoc2dConstraintGroup group = obj
- as Assoc2dConstraintGroup;
- foreach(GeometricalConstraint constraint
- in group.Constraints)
- {
- if(constraint.GetRXClass().IsDerivedFrom(
- RXObject.GetClass(
- typeof(ExplicitConstraint))))
- DumpDimConstraint(Tx, constraint
- as ExplicitConstraint);
- }
- }
- }
- }
- }
- }
- void DumpDimConstraint(
- Transaction Tx,
- ExplicitConstraint constraint)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- ed.WriteMessage("\n ---- Размерные ограничения ---- ");
- ed.WriteMessage("\n – Тип ограничения: " +
- constraint.ToString().Remove(0, 34));
- //1- Дамп геометрических зависимостей
- //-> Получение доступа к зависимому примитиву
- DumpConstrainedGeometry(Tx, constraint.ConnectedGeometries);
- //2- Дамп ассоциативных зависимостей
- //-> Получение доступа к примитиву Размера
- AssocDependency dep = Tx.GetObject(
- constraint.DimDependencyId,
- OpenMode.ForRead)
- as AssocDependency;
- Dimension depDim = Tx.GetObject(
- dep.DependentOnObject,
- OpenMode.ForRead)
- as Dimension;
- ed.WriteMessage("\n – Зависимый примитив Размера: " +
- depDim.ToString().Remove(0, 34));
- //3- Дамп AssocValueDependency
- //-> Получение доступа к AssocVariable
- AssocValueDependency valueDep = Tx.GetObject(
- constraint.ValueDependencyId,
- OpenMode.ForRead)
- as AssocValueDependency;
- if (valueDep.DependentOnObject.ObjectClass.IsDerivedFrom(
- RXObject.GetClass(typeof(AssocVariable))))
- {
- AssocVariable var = Tx.GetObject(
- valueDep.DependentOnObject,
- OpenMode.ForRead)
- as AssocVariable;
- ed.WriteMessage("\n – Параметры размерных зависимостей: "
- + var.Name + " = " + var.Expression);
- }
- }
- void DumpConstrainedGeometry(
- Transaction Tx,
- ConstrainedGeometry[] geometries)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- foreach (ConstrainedGeometry goemetry in geometries)
- {
- ed.WriteMessage("\n - Геометрические ограничения: " +
- goemetry.ToString().Remove(0, 34));
- if(goemetry.GeomDependencyId != ObjectId.Null)
- {
- AssocGeomDependency goemDep = Tx.GetObject(
- goemetry.GeomDependencyId,
- OpenMode.ForRead)
- as AssocGeomDependency;
- Entity entity = Tx.GetObject(
- goemDep.DependentOnObject,
- OpenMode.ForRead)
- as Entity;
- ed.WriteMessage(" на ограниченный примитив: " +
- entity.ToString().Remove(0, 34));
- return;
- }
- DumpConstrainedGeometry(Tx, goemetry.ConnectedGeometries);
- }
- }
Вот результат выполнения команды на dwg-файле, в котором я создал радиальный размер, управляющий радиусом круга и параллельный размер, управляющий длиной отрезка:
Обсуждение: http://adn-cis.org/forum/index.php?topic=72.0
Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 01:21:07
Отредактировано 08.06.2013 в 01:21:07