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

14/01/2015

Установка прозрачности слоя в .NET

Слою можно назначить (начиная с версии AutoCAD 2011) прозрачность при помощи диалога команды слой.

Это пример того, как можно достигнуть такого же результата при помощи AutoCAD .Net API.

Перед тем как попробовать этот код не забудьте установить системную переменную TRANSPARENCYDISPLAY в 1.

Код - C#: [Выделить]
  1.   public class Class1
  2.   {
  3.     [CommandMethod("Test")]
  4.     public void TestMethod()
  5.     {
  6.       SetLayerTransparency("Autodesk", 50);
  7.     }
  8.  
  9.     /// Установка прозрачности слою
  10.     // Может быть в диапазоне от 0 (непрозрачный) до 90 (наиболее прозрачный)
  11.     /// возвращает ObjectId слоя
  12.     private ObjectId SetLayerTransparency (string layerName, Byte layerTransparency)
  13.     {
  14.       Document activeDoc = Application.DocumentManager.MdiActiveDocument;
  15.  
  16.       Database db = activeDoc.Database;
  17.       ObjectId layerId = ObjectId.Null;
  18.       bool done = false;
  19.  
  20.       using (Transaction tr = db.TransactionManager.StartTransaction()) {
  21.         LayerTable lt = tr.GetObject (db.LayerTableId,  OpenMode.ForRead) as LayerTable;
  22.  
  23.         if (lt.Has(layerName)) {
  24.           layerId = lt[layerName];
  25.           LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForWrite) as LayerTableRecord;
  26.  
  27.           // Устанавливаем цвет для того чтобы быть уверенными, что регенерация обновит
  28.           // все примитивы этого слоя.         
  29.           ltr.Color = ltr.Color;
  30.  
  31.           Byte alpha = (Byte) (255 * (100 - layerTransparency) / 100);
  32.           Transparency trans = new Transparency(alpha);
  33.  
  34.           ltr.Transparency = trans;
  35.           done = true;
  36.         }
  37.         tr.Commit();
  38.       }
  39.  
  40.       if (done) {
  41.         RefreshEntities(layerId);
  42.         // (или)
  43.         //activeDoc.Editor.Regen();
  44.       }
  45.  
  46.       return layerId;
  47.     }
  48.  
  49.     // Отмечаем примитивы, которые ссылаются на слой
  50.     // как "Модифицированные"
  51.     private void RefreshEntities(ObjectId layerId)
  52.     {
  53.       Document activeDoc = Application.DocumentManager.MdiActiveDocument;
  54.  
  55.       Database db = activeDoc.Database;
  56.       using (Transaction tr =
  57.       db.TransactionManager.StartTransaction()) {
  58.         BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  59.  
  60.         BlockTableRecord btr =
  61.           tr.GetObject (bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  62.  
  63.         foreach (ObjectId entityId in btr) {
  64.           Entity ent = tr.GetObject (entityId, OpenMode.ForRead) as Entity;
  65.  
  66.           if (ent.LayerId.Equals(layerId)) {
  67.             ent.UpgradeOpen();
  68.             ent.RecordGraphicsModified(true);
  69.           }
  70.         }
  71.         tr.Commit();
  72.       }
  73.     }
  74.   }

 

Источник: http://adndevblog.typepad.com/autocad/2012/04/setting-layer-transparency.html

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

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