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

ADN Club => AutoCAD .NET API => Тема начата: xSAKABSx от 04-12-2013, 15:32:56

Название: Работа с маскировкой
Отправлено: xSAKABSx от 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.  

Помогите люди добрые =)
Название: Re: Работа с маскировкой
Отправлено: xSAKABSx от 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,
Название: Re: Работа с маскировкой
Отправлено: Андрей Бушман от 04-12-2013, 16:35:47
Я вообще не понял ту муть, что написана в коде первого сообщения. Решение простое, насколько я вижу в документации:
Код - C# [Выбрать]
  1. Wipeout.HasFrame
Название: Re: Работа с маскировкой
Отправлено: xSAKABSx от 04-12-2013, 16:59:10
Я вообще не понял ту муть, что написана в коде первого сообщения. Решение простое, насколько я вижу в документации:
Код - C# [Выбрать]
  1. Wipeout.HasFrame
Андрей  в документации оно рид/врайт, по факту только рид (проверено на R18)
Название: Re: Работа с маскировкой
Отправлено: Андрей Бушман от 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) - тынц (https://sites.google.com/site/acadhowtodo/net/command-line/runcommand).
Название: Re: Работа с маскировкой
Отправлено: Александр Ривилис от 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. )

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg823.imageshack.us%2Fimg823%2F9351%2Fr6ug.png&hash=c2145fabc05fa3e42c7c10b724605c85)

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

А самый простой способ - это команда _WIPEOUT _Frame _Off
Название: Re: Работа с маскировкой
Отправлено: Андрей Бушман от 05-12-2013, 06:49:13
Этого будет достаточно или обязателен .NET ?

А самый простой способ - это команда _WIPEOUT _Frame _Off
Поскольку это ветка .NET, то скорее всего ожидался явно не LISP... Обозначенный вами "самый простой способ" я как раз и предлагал выполнить асинхронно, если уж др. способы найдены не будут.
Название: Re: Работа с маскировкой
Отправлено: Александр Ривилис от 05-12-2013, 10:34:27
Поскольку это ветка .NET, то скорее всего ожидался явно не LISP...
На .NET для этого придётся использовать P/Invoke и код из 8 строк на lisp (а можно было и меньше) разрастется до нескольких десятков, еще и будет зависимость от разрядности и версии AutoCAD.
я как раз и предлагал выполнить асинхронно
А зачем асинхронно, если в большинстве случаев возможно синхронно? Кстати, код Тони Танзилло как раз синхронный. :)
Название: Re: Работа с маскировкой
Отправлено: Андрей Бушман от 05-12-2013, 11:12:36
А зачем асинхронно, если в большинстве случаев возможно синхронно? Кстати, код Тони Танзилло как раз синхронный.
я оговорился, конечно же синхронно.
Название: Re: Работа с маскировкой
Отправлено: xSAKABSx от 05-12-2013, 11:25:45
На самом деле сия проблема говорит о нехотении проектировщиков переходить на новые ветки по
сейчас у меня все сидят на 2012 , и противятся новому 2014 ! а он будет поставлен в январе пока сию проблему я решу лиспом  ну а на 14 уже как то полегче будет


P.S. а сколько криков у меня(не у меня конкретно а у проектировщиков) было припереходе с 2008 на 2012 Это просто ужас
 
Название: Re: Работа с маскировкой
Отправлено: xSAKABSx от 05-12-2013, 11:28:13
а по поводу 7 строк кода на лиспе,  можнож одной
(command "_wipeout" "**" "***")
Название: Re: Работа с маскировкой
Отправлено: Александр Ривилис от 05-12-2013, 12:27:31
а по поводу 7 строк кода на лиспе,  можнож одной
(command "_wipeout" "**" "***")
Да. Но я приводил код без использования командных методов (точнее нужно (command "_REGEN") заменить на регенерацию при помощи vla-методов). Впрочем это всё уже не важно если лисповский код тебя устраивает.