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

ADN Club => AutoCAD .NET API => Тема начата: maximum62 от 28-11-2014, 16:14:27

Название: Реализация небольшого плагина WPF.Как организовать изменение свойств примитивов?
Отправлено: maximum62 от 28-11-2014, 16:14:27
 Добрый день. Я пытаюсь написать небольшой плагин который позволяет изменять некоторые свойства объектов на чертеже, проблема в том что я пытаюсь найти наиболее правильный способ реализации.  В качестве отображения информации пытаюсь использовать WPF , и если я правильно понимаю, то все нужно сделать по паттерну MVVM. С данным паттерном только только начал знакомится, так что не судите строго. Как я понял то нужно описать класс оболочку для обеспечения доступности к свойствам объекта автокада, может кто нибудь подсказать как это правильно сделать?
Название: Re: Реализация небольшого плагина
Отправлено: Андрей Бушман от 28-11-2014, 16:18:03
Т.е. вопрос о получении всех графических примитивов, расположенных в определённом слое уже отвалился?  ;D По поводу MVVM, простым языком, в общих чертах можно прочитать тут (http://megadarja.blogspot.ru/2010/04/mvvm-wpf.html).

Название: Re: Реализация небольшого плагина
Отправлено: maximum62 от 28-11-2014, 16:35:42
Ну тут, да, отвалился со временем) этот пример то я разбирал, просто там по сути класс в модели уже готовый для работы, мне же нужно подготовить классы примитивов для их обработки, и вот тут как раз начинаются проблемы и вопросы, каким образом можно это можно реализовать ? опять же есть предположение сделать дополнительный класс в котором в качестве свойств будет список объектов чертежа, и соответственно установлены get и set для необходимых свойств, но вот реализовать не получается это, да и кажется что подход не верный
Название: Re: Реализация небольшого плагина
Отправлено: Андрей Бушман от 28-11-2014, 16:44:59
Ну тут, да, отвалился со временем)
В том смысле, что отпала надобность? Или всё же был написан код получения идентификаторов всех примитивов, находящемся на некотором слое? Если второй вариант, то любопытно было бы глянуть для сравнения.

эту шпаргалку то я читал, просто там по сути класс в модели уже готовый для работы, мне же нужно подготовить классы примитивов для их обработки, и вот тут как раз начинаются проблемы и вопросы, каким образом можно это можно реализовать ?
Я не понял вопроса. Что именно не ясно из материала, обозначенного по ссылке? Кроме того, никто ведь силком не заставляет использовать именно MVVM. Кстати, очень хорошая книжка по паттернам указана здесь (http://adn-cis.org/forum/index.php?topic=400.0) в п.17.

Какие свойства каких объектов планируется изменять и как это ожидаемо должно выглядеть? Смотрели PropertyGrid, может это похоже на ожидаемое?
Название: Re: Реализация небольшого плагина
Отправлено: maximum62 от 28-11-2014, 16:55:02
Получилось сгруппировать в словарь по ключу - слой, но код получился корявенький, в более читаемый вид приведу, выложу. Для той задачи которую я сейчас пытаюсь выполнить, это уже как второстепенный подпункт. Сначала я пытаюсь просто реализовать  изменение свойств объектов. В качестве первого свойства пытаюсь изменить цвет объекта. Из материала то все ясно, просто у меня пока что не получается адаптировать всю информацию под данную реализацию. Если я правильно понимаю то MVVM наиболее "правильный" если использовать WPF. Не смотрел, сейчас посмотрю.
Название: Re: Реализация небольшого плагина
Отправлено: Андрей Бушман от 28-11-2014, 16:57:12
Всё, я домой. Если интересно, то для сравнения вот код получения всех примитивов, находящихся в базе данных чертежа на конкретном слое:
Код - C# [Выбрать]
  1. // © Andrey Bushman, 2014
  2.  
  3. /// <summary>
  4. /// Sample: get all ids of entities which are located on some layer
  5. /// (0 for example).
  6. /// </summary>
  7. [Rt.CommandMethod("Test", Rt.CommandFlags.Modal)]
  8. public void Command_Test() {
  9.     Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  10.  
  11.     if (null == doc) {
  12.         return;
  13.     }
  14.  
  15.     Db.Database db = doc.Database;
  16.     Ed.Editor ed = doc.Editor;
  17.  
  18.     Rt.RXClass entityRXType = Rt.RXClass.GetClass(typeof(Db.Entity));
  19.  
  20.     using (doc.LockDocument()) {
  21.         // Ids of all entities
  22.         // Code of the GetDBObjectIds method look here:
  23.         // http://adn-cis.org/forum/index.php?topic=1060.msg5315#msg5315
  24.         Db.ObjectId[] entityIds = db.GetDBObjectIds(n => !n.IsErased &&
  25.             !n.IsEffectivelyErased && n.ObjectClass.IsDerivedFrom(
  26.             entityRXType));
  27.  
  28.         // target layer
  29.         Db.ObjectId layerId = db.LayerZero; // for example
  30.         // result what you need
  31.         List<Db.ObjectId> resultIds = new List<Db.ObjectId>();
  32.  
  33.         using (Db.Transaction tr = db.TransactionManager
  34.             .StartTransaction()) {
  35.             foreach (Db.ObjectId id in entityIds) {
  36.                 Db.Entity entity = tr.GetObject(id, Db.OpenMode
  37.                     .ForRead, false, true) as Db.Entity;
  38.  
  39.                 if (entity.LayerId == layerId) {
  40.                     resultIds.Add(id);
  41.                 }
  42.             }
  43.             tr.Commit();
  44.         }
  45.     }
  46. }
Название: Re: Реализация небольшого плагина
Отправлено: German от 28-11-2014, 18:02:29
maximum62, может полезно будет, если не читал еще http://adn-cis.org/forum/index.php?topic=804.msg3134#msg3134
Название: Re: Реализация небольшого плагина
Отправлено: Алексей Кулик от 28-11-2014, 22:12:27
maximum62, настоятельно советую изменить название темы в соответствии с правилами форума!
Название: Re: Реализация небольшого плагина WPF.Как организовать изменение свойств примитивов?
Отправлено: maximum62 от 08-12-2014, 00:13:55
German,  действительно оказалось полезно. Решил так же организовать структуру по шаблону mvvm.