ADN Open CIS
Сообщество программистов Autodesk в СНГ

30/05/2013

Получение размерных ограничений и их ассоциативных свойств в .NET

Вот полезный код для тех из вас, кто работает с .NET Associative API. Ниже пример на C# показывает как выполнить дамп всех размерных ограничений в текущем пространстве (Модели или Листа). Он так же показывает как по объектам накладывающим ограничения найти зависимые примитивы и управляющие ими ассоциативные параметры.

Код - C#: [Выделить]
  1. /////////////////////////////////////////////////////////////
  2. // Использование:
  3. //      Вывод в командную строку размерных ограничений
  4. //      в текущей BlockTableRecord
  5. //      Печать типов ограничений, зависимые примитивы и
  6. //      управляющие параметры.
  7. //
  8. // Автор: Philippe Leefsma.
  9. /////////////////////////////////////////////////////////////
  10. [CommandMethod("DumpDimConstraints")]
  11. public void DumpDimConstraints()
  12. {
  13.     Document doc = Application.DocumentManager.MdiActiveDocument;
  14.     Database db = doc.Database;
  15.     Editor ed = doc.Editor;
  16.  
  17.     ObjectId networkId = AssocNetwork.GetInstanceFromObject(
  18.         db.CurrentSpaceId,
  19.         false,
  20.         true,
  21.         "ACAD_ASSOCNETWORK");
  22.  
  23.     if (networkId == ObjectId.Null)
  24.         return;
  25.  
  26.     using (Transaction Tx =
  27.         db.TransactionManager.StartTransaction())
  28.     {
  29.         using (AssocNetwork network =
  30.             Tx.GetObject(
  31.                 networkId,
  32.                 OpenMode.ForRead, false) as AssocNetwork)
  33.         {
  34.             foreach (ObjectId actionId in network.GetActions)
  35.             {
  36.                 if (actionId == ObjectId.Null)
  37.                     continue;
  38.  
  39.                 DBObject obj = Tx.GetObject(
  40.                     actionId,
  41.                     OpenMode.ForRead);
  42.  
  43.  
  44.                 if (actionId.ObjectClass.IsDerivedFrom(
  45.                     RXObject.GetClass(
  46.                         typeof(Assoc2dConstraintGroup))))
  47.                 {
  48.                     Assoc2dConstraintGroup group = obj
  49.                         as Assoc2dConstraintGroup;
  50.  
  51.                     foreach(GeometricalConstraint constraint
  52.                         in group.Constraints)
  53.                     {
  54.                         if(constraint.GetRXClass().IsDerivedFrom(
  55.                             RXObject.GetClass(
  56.                                 typeof(ExplicitConstraint))))
  57.                             DumpDimConstraint(Tx, constraint
  58.                            as ExplicitConstraint);
  59.                     }
  60.                 }
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. void DumpDimConstraint(
  67.     Transaction Tx,
  68.     ExplicitConstraint constraint)
  69. {
  70.     Document doc = Application.DocumentManager.MdiActiveDocument;
  71.     Editor ed = doc.Editor;
  72.  
  73.     ed.WriteMessage("\n ---- Размерные ограничения ---- ");
  74.  
  75.     ed.WriteMessage("\n – Тип ограничения: " +
  76.         constraint.ToString().Remove(0, 34));
  77.  
  78.     //1- Дамп геометрических зависимостей
  79.     //-> Получение доступа к зависимому примитиву
  80.     DumpConstrainedGeometry(Tx, constraint.ConnectedGeometries);
  81.  
  82.     //2- Дамп ассоциативных зависимостей
  83.     //-> Получение доступа к примитиву Размера
  84.     AssocDependency dep = Tx.GetObject(
  85.         constraint.DimDependencyId,
  86.         OpenMode.ForRead)
  87.             as AssocDependency;
  88.  
  89.     Dimension depDim = Tx.GetObject(
  90.         dep.DependentOnObject,
  91.         OpenMode.ForRead)
  92.             as Dimension;
  93.  
  94.     ed.WriteMessage("\n – Зависимый примитив Размера: " +
  95.         depDim.ToString().Remove(0, 34));
  96.  
  97.     //3- Дамп AssocValueDependency
  98.     //-> Получение доступа к AssocVariable
  99.     AssocValueDependency valueDep = Tx.GetObject(
  100.         constraint.ValueDependencyId,
  101.         OpenMode.ForRead)
  102.             as AssocValueDependency;
  103.  
  104.     if (valueDep.DependentOnObject.ObjectClass.IsDerivedFrom(
  105.         RXObject.GetClass(typeof(AssocVariable))))
  106.     {
  107.         AssocVariable var = Tx.GetObject(
  108.             valueDep.DependentOnObject,
  109.             OpenMode.ForRead)
  110.                 as AssocVariable;
  111.  
  112.         ed.WriteMessage("\n – Параметры размерных зависимостей: "
  113.             + var.Name + " = " + var.Expression);
  114.     }
  115. }
  116.  
  117. void DumpConstrainedGeometry(
  118.     Transaction Tx,
  119.     ConstrainedGeometry[] geometries)
  120. {
  121.     Document doc = Application.DocumentManager.MdiActiveDocument;
  122.     Editor ed = doc.Editor;
  123.  
  124.     foreach (ConstrainedGeometry goemetry in geometries)
  125.     {
  126.         ed.WriteMessage("\n  - Геометрические ограничения: " +
  127.             goemetry.ToString().Remove(0, 34));
  128.  
  129.         if(goemetry.GeomDependencyId != ObjectId.Null)
  130.         {
  131.             AssocGeomDependency goemDep = Tx.GetObject(
  132.                 goemetry.GeomDependencyId,
  133.                 OpenMode.ForRead)
  134.                     as AssocGeomDependency;
  135.  
  136.             Entity entity = Tx.GetObject(
  137.                 goemDep.DependentOnObject,
  138.                 OpenMode.ForRead)
  139.                     as Entity;
  140.  
  141.             ed.WriteMessage(" на ограниченный примитив: " +
  142.                 entity.ToString().Remove(0, 34));
  143.  
  144.             return;
  145.         }
  146.  
  147.         DumpConstrainedGeometry(Tx, goemetry.ConnectedGeometries);
  148.     }
  149. }


Вот результат выполнения команды на dwg-файле, в котором я создал радиальный размер, управляющий радиусом круга и параллельный размер, управляющий длиной отрезка:

 

Источник: http://adndevblog.typepad.com/autocad/2013/02/retrieving-dimensional-constraints-and-their-associative-properties.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=72.0

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 01:21:07