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

Статьи => Опубликованные статьи => Тема начата: ADSK от 09-06-2014, 19:30:05

Название: Создание анонимного слоя
Отправлено: ADSK от 09-06-2014, 19:30:05
Создание анонимного слоя (http://adn-cis.org/sozdanie-anonimnogo-sloya.html)
Название: Re: Создание анонимного слоя
Отправлено: Gennadiy от 24-06-2014, 21:39:43
Интересно, кто-нибудь пользовался анонимными слоями? Для чего они нужны?
У меня пришла мысль разместить на них примитивы и заблокировать его, чтобы редактировать эти примитивы можно было только
программно (чтобы не создавать Custom Object на ARX а использовать Overrule, т.к. считаю главным недостатком объектов с Overrule
то, что если не загружена программа, то с ними можно делать все что угодно как с обычными примитивами, что далеко не всегда допустимо)
Так вот при попытке присвоения анонимного LayerId созданному примитиву ничего не происходит, слой остается прежним, во всяком случае
в AutoCAD 2010 у меня ничего не получилось, а если на этом анонимном слое нельзя разместить примитивы, зачем он вообще нужен? Может кто поделится опытом и соображениями?

Название: Re: Создание анонимного слоя
Отправлено: Александр Ривилис от 25-06-2014, 02:44:31
Статью переводил я. Поэтому мне и отвечать. Скажу сразу, что проверял в AutoCAD 2014. Создал слой с именем 1. Создал круг и присвоил ему слой 1. После этого игрался со слоем. Присвоив ему свойство Hidden желаемого результата я не добился.
В менеджере слоёв слой виден с именем *1. Единственно что мне не удалось с ним сделать, так это его переименовать - все остальные свойства доступны. Например я поменял ему цвет на 80:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9064%2F7842324.1%2F0_dd0ec_ec12b1e4_orig.png&hash=a1b9cdd32a7d3057da91821e93c8c59e)

Точно также не сложно его и разблокировать.
При этом в тулбаре и в Панели Свойств имени слоя нет:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9320%2F7842324.1%2F0_dd0ed_97d04478_orig.png&hash=75ef438eed45906649ae02cfa5754000)

Т.е. если считать это защитой, то очень условной. Честно говоря практического применения придумать так и не смог.
Присвоить примитиву анонимный слой напрямую у меня тоже не получилось, но это легко обходится предварительным изменением состояния слоя в не анонимный.
На всякий случай код:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. [assembly: CommandClass(typeof(Rivilis.LayerHidden))]
  7.  
  8. namespace Rivilis
  9. {
  10.   public class LayerHidden
  11.   {
  12.     /// <summary>
  13.     /// Изменение свойства слою Hidden на противоположное
  14.     /// </summary>
  15.     [CommandMethod("LayHide")]
  16.     public void LayHide()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       Editor ed = doc.Editor;
  20.       PromptStringOptions pr = new PromptStringOptions("\nУкажите имя слоя: ");
  21.       pr.AllowSpaces = true;
  22.       PromptResult res = ed.GetString(pr);
  23.       if (res.Status != PromptStatus.OK) return;
  24.       using (LayerTable lt = doc.Database.LayerTableId.Open(OpenMode.ForRead) as LayerTable) {
  25.         if (lt.Has(res.StringResult)) {
  26.           using (LayerTableRecord ltr = lt[res.StringResult].Open(OpenMode.ForWrite, true) as LayerTableRecord) {
  27.             ltr.IsHidden = !ltr.IsHidden;
  28.           }
  29.         } else if (lt.Has("*"+res.StringResult)) {
  30.           using (LayerTableRecord ltr = lt["*"+res.StringResult].Open(OpenMode.ForWrite, true) as LayerTableRecord) {
  31.             ltr.IsHidden = !ltr.IsHidden;
  32.           }
  33.         } else {
  34.           using (LayerTableRecord ltr = new LayerTableRecord()) {
  35.             lt.UpgradeOpen();
  36.             ltr.Name = res.StringResult;
  37.             lt.Add(ltr); ltr.IsHidden = true;
  38.             lt.DowngradeOpen();
  39.           }
  40.         }
  41.       }
  42.     }
  43.     /// <summary>
  44.     /// Установка примитиву анонимного слоя
  45.     /// </summary>
  46.     [CommandMethod("SetLay")]
  47.     public void SetLay()
  48.     {
  49.       Document doc = Application.DocumentManager.MdiActiveDocument;
  50.       Editor ed = doc.Editor;
  51.       PromptStringOptions pr = new PromptStringOptions("\nУкажите имя слоя: ");
  52.       pr.AllowSpaces = true;
  53.       PromptResult res = ed.GetString(pr);
  54.       if (res.Status != PromptStatus.OK) return;
  55.       PromptEntityOptions pre = new PromptEntityOptions("\nВыберите примитив: ");
  56.       pre.AllowNone = false;
  57.       PromptEntityResult rese = ed.GetEntity(pre);
  58.       if (rese.Status != PromptStatus.OK) return;
  59.  
  60.       using (LayerTable lt = doc.Database.LayerTableId.Open(OpenMode.ForRead) as LayerTable) {
  61.         if (lt.Has("*" + res.StringResult)) {
  62.           ObjectId layId = lt["*" + res.StringResult];
  63.           using (Entity ent = rese.ObjectId.Open(OpenMode.ForWrite) as Entity) {
  64.             using (LayerTableRecord ltr = layId.Open(OpenMode.ForWrite, true) as LayerTableRecord) {
  65.               ltr.IsHidden = false;
  66.             }
  67.             ent.LayerId = layId;
  68.             using (LayerTableRecord ltr = layId.Open(OpenMode.ForWrite, true) as LayerTableRecord) {
  69.               ltr.IsHidden = true;
  70.             }
  71.           }
  72.         } else {
  73.           ed.WriteMessage("\nНет анонимного слоя <{0}>", res.StringResult);
  74.         }
  75.       }
  76.     }
  77.   }
  78. }

Т.е. использовать анонимные слои для защиты от умышленного изменения примитива не получится, т.к. с анонимным слоем вручную можно делать всё что угодно кроме изменения его имени.
Название: Re: Создание анонимного слоя
Отправлено: Gennadiy от 25-06-2014, 09:27:11
Странно.  Протестировал выложенный код на своём AutoCAD 2014, правда русском,
у меня слой в менеджере слоев не виден.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs29.postimg.org%2Fkjbwe9jo3%2Fclip.jpg&hash=c2e770548a0dc335ae8502d5ce75e627) (http://postimg.org/image/kjbwe9jo3/full/)
Название: Re: Создание анонимного слоя
Отправлено: Александр Ривилис от 25-06-2014, 12:54:18
Странно.  Протестировал выложенный код на своём AutoCAD 2014, правда русском,
у меня слой в менеджере слоев не виден.
Теперь и у меня не виден. :) Если повторить точно ту же последовательность действий, которую я описал (т.е. создаём новый чертеж, создаём слой 1, рисуем круг, переносим круг на слой 1 и выполняем LAYHIDE для этого слоя), то будет как у меня (т.е. слой виден в диспетчере слоёв). Но если сохранить чертеж, закрыть его и потом повторно открыть, то этого слоя в диспетчере слоёв уже не видно.
Название: Re: Создание анонимного слоя
Отправлено: Gennadiy от 25-06-2014, 13:20:23
Забавно, виден только в такой последовательности, причем первоначально создавать анонимный слой нужно через менеджер слоев, тогда остается
видимым в диспетчере после команды LAYHIDE, а если первоначально через LAYHIDE создать, то сразу не будет виден, также если через LAYHIDE создать другой слой, то из диспетчера слоев исчезнут все анонимные слои, которые там были видны со звездочкой, а если восстановить тот же слой в нормальное состояние, то вообще непредсказуемые глюки начинаются. Одно радует, что при правильном использовании можно все-таки заблокировать объекты от ручного изменения путём блокировки анонимного слоя.
Название: Re: Создание анонимного слоя
Отправлено: Владимир Шу от 25-06-2014, 23:32:31
Вариант использования:
Часто в договорах прописано, что бы передавались заказчику файлы dwg, можно таким способом попробовать блокировать чертежи от изменений.
Название: Re: Создание анонимного слоя
Отправлено: Александр Ривилис от 26-06-2014, 00:25:03
Уж очень это простой вариант защиты. Лучше уж распечатывать в растровый или PDF-файл и использовать его как подложку в пустом DWG-файле. Формально условия будут соблюдены.
Название: Re: Создание анонимного слоя
Отправлено: Владимир Шу от 26-06-2014, 08:55:38
да, про _layulk я как то забыл...
нда, штука интересная, но вот зачем она нужна...