Создание анонимного слоя

Автор Тема: Создание анонимного слоя  (Прочитано 6655 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ADSKАвтор темы

  • Administrator
  • Сообщений: 0
  • Карма: 2

Оффлайн Gennadiy

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Создание анонимного слоя
« Ответ #1 : 24-06-2014, 21:39:43 »
Интересно, кто-нибудь пользовался анонимными слоями? Для чего они нужны?
У меня пришла мысль разместить на них примитивы и заблокировать его, чтобы редактировать эти примитивы можно было только
программно (чтобы не создавать Custom Object на ARX а использовать Overrule, т.к. считаю главным недостатком объектов с Overrule
то, что если не загружена программа, то с ними можно делать все что угодно как с обычными примитивами, что далеко не всегда допустимо)
Так вот при попытке присвоения анонимного LayerId созданному примитиву ничего не происходит, слой остается прежним, во всяком случае
в AutoCAD 2010 у меня ничего не получилось, а если на этом анонимном слое нельзя разместить примитивы, зачем он вообще нужен? Может кто поделится опытом и соображениями?


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание анонимного слоя
« Ответ #2 : 25-06-2014, 02:44:31 »
Статью переводил я. Поэтому мне и отвечать. Скажу сразу, что проверял в AutoCAD 2014. Создал слой с именем 1. Создал круг и присвоил ему слой 1. После этого игрался со слоем. Присвоив ему свойство Hidden желаемого результата я не добился.
В менеджере слоёв слой виден с именем *1. Единственно что мне не удалось с ним сделать, так это его переименовать - все остальные свойства доступны. Например я поменял ему цвет на 80:


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



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

Код - 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. }

Т.е. использовать анонимные слои для защиты от умышленного изменения примитива не получится, т.к. с анонимным слоем вручную можно делать всё что угодно кроме изменения его имени.
« Последнее редактирование: 25-06-2014, 03:04:43 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Gennadiy

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Создание анонимного слоя
« Ответ #3 : 25-06-2014, 09:27:11 »
Странно.  Протестировал выложенный код на своём AutoCAD 2014, правда русском,
у меня слой в менеджере слоев не виден.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание анонимного слоя
« Ответ #4 : 25-06-2014, 12:54:18 »
Странно.  Протестировал выложенный код на своём AutoCAD 2014, правда русском,
у меня слой в менеджере слоев не виден.
Теперь и у меня не виден. :) Если повторить точно ту же последовательность действий, которую я описал (т.е. создаём новый чертеж, создаём слой 1, рисуем круг, переносим круг на слой 1 и выполняем LAYHIDE для этого слоя), то будет как у меня (т.е. слой виден в диспетчере слоёв). Но если сохранить чертеж, закрыть его и потом повторно открыть, то этого слоя в диспетчере слоёв уже не видно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Gennadiy

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Создание анонимного слоя
« Ответ #5 : 25-06-2014, 13:20:23 »
Забавно, виден только в такой последовательности, причем первоначально создавать анонимный слой нужно через менеджер слоев, тогда остается
видимым в диспетчере после команды LAYHIDE, а если первоначально через LAYHIDE создать, то сразу не будет виден, также если через LAYHIDE создать другой слой, то из диспетчера слоев исчезнут все анонимные слои, которые там были видны со звездочкой, а если восстановить тот же слой в нормальное состояние, то вообще непредсказуемые глюки начинаются. Одно радует, что при правильном использовании можно все-таки заблокировать объекты от ручного изменения путём блокировки анонимного слоя.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Создание анонимного слоя
« Ответ #6 : 25-06-2014, 23:32:31 »
Вариант использования:
Часто в договорах прописано, что бы передавались заказчику файлы dwg, можно таким способом попробовать блокировать чертежи от изменений.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание анонимного слоя
« Ответ #7 : 26-06-2014, 00:25:03 »
Уж очень это простой вариант защиты. Лучше уж распечатывать в растровый или PDF-файл и использовать его как подложку в пустом DWG-файле. Формально условия будут соблюдены.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Создание анонимного слоя
« Ответ #8 : 26-06-2014, 08:55:38 »
да, про _layulk я как то забыл...
нда, штука интересная, но вот зачем она нужна...