Работа с маскировкой

Автор Тема: Работа с маскировкой  (Прочитано 10581 раз)

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

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Работа с маскировкой
« : 04-12-2013, 15:32:56 »
Обрекла меня жизнь на то что надо включать и отключать контура маскировок через .net

но дальше  данного кода я не ушел,
потому как не могу понять что за обьект мне отдают

Код - C# [Выбрать]
  1. [CommandMethod("wptest")]
  2.         public static void wptest()
  3.         {
  4.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor acEd = acDoc.Editor;
  6.             Database acDB = acDoc.Database;
  7.  
  8.             using (Transaction acTrans = acDB.TransactionManager.StartTransaction())
  9.             {
  10.                 try
  11.                 {
  12.                     DBDictionary theNOD = acTrans.GetObject(acDB.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
  13.                     string wipeotVarName = "ACAD_WIPEOUT_VARS";
  14.                     foreach (DBDictionaryEntry dEntry in theNOD)
  15.                     {
  16.                     acEd.WriteMessage("\n {0}",dEntry.Key);
  17.                     if (dEntry.Key == wipeotVarName)
  18.                     {
  19.                         DBObject currOBJ = acTrans.GetObject(dEntry.Value, OpenMode.ForRead) as DBObject;
  20.                         acEd.WriteMessage("\n " + currOBJ.GetType());
  21.                                            
  22.                     }
  23. }
  24.                               }
  25.                 catch{}
  26. }
  27.         }
  28.  

Помогите люди добрые =)

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Работа с маскировкой
« Ответ #1 : 04-12-2013, 16:34:38 »
Сам нашел ответ и он простой  с версии R19.0 появилась системная переменная WIPEOUTFRAME
В  18 её нет
 
Цитата: Kean Walmsley

Not that I'm aware of. I see there's a read-only property Wipeout.HasFrame, but I can't see a way to control that programmatically (whether in the Wipeout class, its parent RasterImage class or the parallel COM interface).

You might try ADN or the AutoCAD .NET Discussion Group (please let me know what you find out).

Regards,

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Работа с маскировкой
« Ответ #2 : 04-12-2013, 16:35:47 »
Я вообще не понял ту муть, что написана в коде первого сообщения. Решение простое, насколько я вижу в документации:
Код - C# [Выбрать]
  1. Wipeout.HasFrame

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Работа с маскировкой
« Ответ #3 : 04-12-2013, 16:59:10 »
Я вообще не понял ту муть, что написана в коде первого сообщения. Решение простое, насколько я вижу в документации:
Код - C# [Выбрать]
  1. Wipeout.HasFrame
Андрей  в документации оно рид/врайт, по факту только рид (проверено на R18)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Работа с маскировкой
« Ответ #4 : 04-12-2013, 19:04:22 »
Андрей  в документации оно рид/врайт, по факту только рид (проверено на R18)

В R17.2 оно доступно для чтения\записи но, как оказалось, на видимость wipeout не влияет. Видимостью каждого wipeout можно управлять индивидуально, при желании, через свойство Visible. Набросал код по мотивам обозначенной в комментариях статьи:

Код - C# [Выбрать]
  1. // AutoCAD 2009
  2. // Based on the http://through-the-interface.typepad.com/through_the_interface/2007/12/creating-an-aut.html
  3. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  4. using App = Autodesk.AutoCAD.ApplicationServices;
  5. using Db = Autodesk.AutoCAD.DatabaseServices;
  6. using Ed = Autodesk.AutoCAD.EditorInput;
  7. using Rtm = Autodesk.AutoCAD.Runtime;
  8. using Gem = Autodesk.AutoCAD.Geometry;
  9.  
  10. namespace WipeoutApplication {
  11.     public class Commands : Rtm.IExtensionApplication {
  12.  
  13.         static Db.ObjectId id = Db.ObjectId.Null;
  14.  
  15.         [Rtm.CommandMethod("wshow")]
  16.         public void wshow() {
  17.             set_visibility(true);
  18.         }
  19.  
  20.         [Rtm.CommandMethod("whide")]
  21.         public void whide() {
  22.             set_visibility(false);
  23.         }
  24.  
  25.         void set_visibility(System.Boolean value) {
  26.             if (id != Db.ObjectId.Null && !id.IsErased && id.IsValid) {
  27.                 App.Document doc = cad.DocumentManager.MdiActiveDocument;
  28.                 Db.Database db = doc.Database;
  29.  
  30.                 using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  31.                     Db.Wipeout wo = tr.GetObject(id, Db.OpenMode.ForWrite) as Db.Wipeout;
  32.                     wo.Visible = value;
  33.                     tr.Commit();
  34.                 }
  35.             }
  36.         }
  37.  
  38.         public void Initialize() {
  39.             App.Document doc = cad.DocumentManager.MdiActiveDocument;
  40.             Db.Database db = doc.Database;
  41.             Ed.Editor ed = doc.Editor;
  42.             ed.WriteMessage("The library is loaded.\n");
  43.  
  44.             using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  45.                 Db.BlockTable bt = (Db.BlockTable)tr.GetObject(
  46.                     db.BlockTableId, Db.OpenMode.ForRead, false);
  47.                 Db.BlockTableRecord btr = (Db.BlockTableRecord)tr.GetObject(
  48.                     bt[Db.BlockTableRecord.ModelSpace], Db.OpenMode.ForWrite, false);
  49.  
  50.                 Gem.Point2dCollection pts = new Gem.Point2dCollection(5);
  51.  
  52.                 pts.Add(new Gem.Point2d(0.0, 0.0));
  53.                 pts.Add(new Gem.Point2d(100.0, 0.0));
  54.                 pts.Add(new Gem.Point2d(100.0, 100.0));
  55.                 pts.Add(new Gem.Point2d(0.0, 100.0));
  56.                 pts.Add(new Gem.Point2d(0.0, 0.0));
  57.  
  58.                 Db.Wipeout wo = new Db.Wipeout();
  59.                 wo.SetDatabaseDefaults(db);
  60.                 wo.SetFrom(pts, new Gem.Vector3d(0.0, 0.0, 0.1));
  61.                
  62.                 wo.Visible = false; // Look at this.
  63.  
  64.                 btr.AppendEntity(wo);
  65.                 tr.AddNewlyCreatedDBObject(wo, true);
  66.                 id = wo.ObjectId;
  67.                 tr.Commit();
  68.             }
  69.         }
  70.  
  71.         public void Terminate() {
  72.             // throw new System.NotImplementedException();
  73.         }
  74.     }
  75. }

В результате создаётся wipeout, отображением которого управляем индивидуально. Однако этот вариант годится скорее для таких случаев, когда ты хочешь перехватить управление отображением wipeout.

В более ранних версиях AutoCAD, где не доступна указанная тобою переменная WIPEOUTFRAME, можно прибегнуть к синхронному вызову команд в командной строке AutoCAD, запустив обозначенным способом команду FRAME с соответствующей опцией и присвоением ей нужного значения (ON\OFF) - тынц.
« Последнее редактирование: 04-12-2013, 23:09:58 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13868
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с маскировкой
« Ответ #5 : 04-12-2013, 23:36:00 »
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:WipeFrameVis ( / n newvis)
  2.  (if (setq n (dictsearch (namedobjdict) "ACAD_WIPEOUT_VARS")) (progn
  3.     (setq newvis (abs (1- (cdr (assoc 70 n)))))
  4.     (entmod (subst (cons 70 newvis) (assoc 70 n) n))
  5.     (command "_REGEN")
  6.  ))
  7.  (princ)
  8. )



Этого будет достаточно или обязателен .NET ?

А самый простой способ - это команда _WIPEOUT _Frame _Off
« Последнее редактирование: 05-12-2013, 00:57:36 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Работа с маскировкой
« Ответ #6 : 05-12-2013, 06:49:13 »
Этого будет достаточно или обязателен .NET ?

А самый простой способ - это команда _WIPEOUT _Frame _Off
Поскольку это ветка .NET, то скорее всего ожидался явно не LISP... Обозначенный вами "самый простой способ" я как раз и предлагал выполнить асинхронно, если уж др. способы найдены не будут.

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

  • Administrator
  • *****
  • Сообщений: 13868
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с маскировкой
« Ответ #7 : 05-12-2013, 10:34:27 »
Поскольку это ветка .NET, то скорее всего ожидался явно не LISP...
На .NET для этого придётся использовать P/Invoke и код из 8 строк на lisp (а можно было и меньше) разрастется до нескольких десятков, еще и будет зависимость от разрядности и версии AutoCAD.
я как раз и предлагал выполнить асинхронно
А зачем асинхронно, если в большинстве случаев возможно синхронно? Кстати, код Тони Танзилло как раз синхронный. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Работа с маскировкой
« Ответ #8 : 05-12-2013, 11:12:36 »
А зачем асинхронно, если в большинстве случаев возможно синхронно? Кстати, код Тони Танзилло как раз синхронный.
я оговорился, конечно же синхронно.

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Работа с маскировкой
« Ответ #9 : 05-12-2013, 11:25:45 »
На самом деле сия проблема говорит о нехотении проектировщиков переходить на новые ветки по
сейчас у меня все сидят на 2012 , и противятся новому 2014 ! а он будет поставлен в январе пока сию проблему я решу лиспом  ну а на 14 уже как то полегче будет


P.S. а сколько криков у меня(не у меня конкретно а у проектировщиков) было припереходе с 2008 на 2012 Это просто ужас
 

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Работа с маскировкой
« Ответ #10 : 05-12-2013, 11:28:13 »
а по поводу 7 строк кода на лиспе,  можнож одной
(command "_wipeout" "**" "***")

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

  • Administrator
  • *****
  • Сообщений: 13868
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с маскировкой
« Ответ #11 : 05-12-2013, 12:27:31 »
а по поводу 7 строк кода на лиспе,  можнож одной
(command "_wipeout" "**" "***")
Да. Но я приводил код без использования командных методов (точнее нужно (command "_REGEN") заменить на регенерацию при помощи vla-методов). Впрочем это всё уже не важно если лисповский код тебя устраивает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение