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

21/10/2013

Изменение цвета вложенных примитивов AutoCAD с помощью .NET

Меня спрашивали как изменить цвет всех примитивов внутри блоков.

Следующий код использует рекурсивную вспомогательную функцию для итерирования внутри блоков, изменяющую цвет множества примитивов (не вставок блока – для них простая рекурсия):

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.Colors;
  6.  
  7. namespace BlockTest
  8. {
  9.   public class BlockCmds
  10.   {
  11.     [CommandMethod("CC")]
  12.     public void ChangeColor()
  13.     {
  14.       Document doc =
  15.         Application.DocumentManager.MdiActiveDocument;
  16.       Database db = doc.Database;
  17.       Editor ed = doc.Editor;
  18.  
  19.       PromptIntegerResult pr =
  20.         ed.GetInteger(
  21.           "\nВведите индекс цвета для установки всем примитивам: "
  22.         );
  23.  
  24.       if (pr.Status == PromptStatus.OK)
  25.       {
  26.         short newColorIndex = (short)pr.Value;
  27.         ObjectId msId;
  28.         Transaction tr =
  29.           doc.TransactionManager.StartTransaction();
  30.         using (tr)
  31.         {
  32.           BlockTable bt =
  33.             (BlockTable)tr.GetObject(
  34.               db.BlockTableId,
  35.               OpenMode.ForRead
  36.             );
  37.           msId =
  38.             bt[BlockTableRecord.ModelSpace];
  39.  
  40.           // Не обязательно, но быстрее чем прервать транзакцию
  41.           tr.Commit();
  42.         }
  43.         int count =
  44.           ChangeNestedEntitiesToColor(msId, newColorIndex);
  45.         ed.Regen();
  46.         ed.WriteMessage(
  47.           "\nИзменено {0} примити{1} в цвет {2}.",
  48.           count,
  49.           count == 1 ? "в" : "вов",
  50.           newColorIndex
  51.         );
  52.       }
  53.     }
  54.  
  55.     private int ChangeNestedEntitiesToColor(
  56.       ObjectId btrId, short colorIndex)
  57.     {
  58.       int changedCount = 0;
  59.       Document doc =
  60.         Application.DocumentManager.MdiActiveDocument;
  61.       Database db = doc.Database;
  62.       Editor ed = doc.Editor;
  63.       Transaction tr =
  64.         doc.TransactionManager.StartTransaction();
  65.       using (tr)
  66.       {
  67.         BlockTableRecord btr =
  68.           (BlockTableRecord)tr.GetObject(
  69.             btrId,
  70.             OpenMode.ForRead
  71.           );
  72.         foreach (ObjectId entId in btr)
  73.         {
  74.           Entity ent =
  75.             tr.GetObject(entId, OpenMode.ForRead)
  76.             as Entity;
  77.           if (ent != null)
  78.           {
  79.             BlockReference br = ent as BlockReference;
  80.             if (br != null)
  81.             {
  82.               // Рекурсивно для вложенных блоков
  83.               changedCount +=
  84.                 ChangeNestedEntitiesToColor(
  85.                   br.BlockTableRecord,
  86.                   colorIndex
  87.                 );
  88.             }
  89.             else
  90.             {
  91.               if (ent.ColorIndex != colorIndex)
  92.               {
  93.                 changedCount++;
  94.                 // Примитив открыт только для чтения – переключаем
  95.                 // в режим для записи
  96.                 ent.UpgradeOpen();
  97.                 ent.ColorIndex = colorIndex;
  98.                 ent.DowngradeOpen();
  99.               }
  100.             }
  101.           }
  102.         }
  103.         tr.Commit();
  104.       }
  105.       return changedCount;
  106.     }
  107.   }
  108. }

Источник: http://through-the-interface.typepad.com/through_the_interface/2007/02/changing_the_co.html

 

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

Опубликовано 21.10.2013