Удаление элементов в API

Автор Тема: Удаление элементов в API  (Прочитано 2977 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Удаление элементов в API
« : 18-11-2020, 10:56:45 »
Задача была простая - форма с двумя кнопками: 1 - выбирает объекты, 2 - удаляет их.
Скажу сразу, если писать без окон все прекрасно работает, но с формами не получается уже два дня.
Возможно тема пересекается с https://adn-cis.org/forum/index.php?topic=9744.msg42859#msg42859.
Смысл ошибки понятен, но где открывать и закрывать транзакцию не понимаю.
Может вообще обработчик событий писать в другом классе? Спасибо.
За код сильно не ругайте:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.Revit.UI;
  3. using Autodesk.Revit.DB;
  4. using Autodesk.Revit.UI.Selection;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7.  
  8. namespace Shcool
  9. {
  10.     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
  11.     [Autodesk.Revit.DB.Macros.AddInId("C84184CD-3C7D-4295-AC04-8C8A8EB02901")]
  12.         public partial class ThisApplication
  13.         {
  14.  
  15.                 UIDocument uidoc;
  16.                 Document doc;
  17.  
  18.                 public void FirstStep()
  19.                 {
  20.                         uidoc = this.ActiveUIDocument;
  21.                         doc = uidoc.Document;
  22.            
  23.                         using(Transaction trans = new Transaction(doc, "DeleteObject"))
  24.                                 {
  25.                                         trans.Start();
  26.                        
  27.                                         GoGlamGo goGlamGo = new GoGlamGo(this);
  28.                                         goGlamGo.Run();
  29.                        
  30.                                         trans.Commit();
  31.                                 }
  32.                 }
  33.         }
  34.        
  35.         public class GoGlamGo
  36.         {
  37.                 UIDocument uidoc;
  38.                 Document doc;
  39.                 RVObjecstSelect rVObjectsSelect;
  40.                 IList<Reference> rl;
  41.                 List<FamilyInstance> filist = new List<FamilyInstance>();
  42.  
  43.                 public GoGlamGo(Shcool.ThisApplication _this)
  44.                         {
  45.                                 uidoc = _this.ActiveUIDocument;
  46.                                 doc = uidoc.Document;
  47.                                 rVObjectsSelect = new RVObjecstSelect();
  48.                                 rVObjectsSelect.btselectobj.Click += (s, a) => GetFIList();
  49.                                 rVObjectsSelect.btdeleteobj.Click += (s, a) => DeleteObj(filist);
  50.                         }
  51.                
  52.                 public void Run()
  53.                         {
  54.                                 rVObjectsSelect.Show();
  55.                         }
  56.                
  57.                 public RVObjecstSelect UF
  58.                 {
  59.                         get {return rVObjectsSelect;}
  60.                 }
  61.  
  62.                 public List<FamilyInstance> GetFIList()
  63.                 {
  64.                         rVObjectsSelect.Hide();
  65.                        
  66.                         Selection sel = uidoc.Selection;
  67.                         rl = sel.PickObjects(ObjectType.Element, "Select elements:");
  68.                        
  69.                         rVObjectsSelect.Show();
  70.                        
  71.                         filist = new List<FamilyInstance>();
  72.                              
  73.                         foreach (Reference rf in rl)
  74.                         {
  75.                                 filist.Add(doc.GetElement(rf) as FamilyInstance);
  76.                         }
  77.                        
  78.                         return filist;
  79.                 }
  80.                
  81.                        
  82.         private void DeleteObj(List<FamilyInstance> filist)
  83.         {
  84.                 foreach (FamilyInstance fi in FIList)
  85.                 {
  86.                         doc.Delete(fi.Id);
  87.                 }
  88.         }
  89.        
  90.         public List<FamilyInstance> FIList
  91.         {
  92.                 get
  93.                 {
  94.                         rVObjectsSelect.Close();
  95.                         return filist;
  96.                 }
  97.         }
  98. }
  99. }
  100.  

Вот ошибка при удалении...

« Последнее редактирование: 18-11-2020, 11:50:12 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020


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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #2 : 18-11-2020, 12:06:27 »
Код - C# [Выбрать]
  1.  
  2.         public void FirstStep()
  3.         {
  4.                 uidoc = this.ActiveUIDocument;
  5.                 doc = uidoc.Document;
  6.            
  7.                 using(Transaction trans = new Transaction(doc, "DeleteObject"))
  8.                 {
  9.                         trans.Start();
  10.                        
  11.                         GoGlamGo goGlamGo = new GoGlamGo(this);
  12.                         goGlamGo.Run();
  13.                        
  14.                         trans.Commit();
  15.                 }
  16.         }
  17.  

Этот код выполняется до конца и транзакция закрывается, нужно как-то на ожидание закрытия формы ставить...
Т.е. форма появляется, а выполнение кода не прерывается...
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #3 : 18-11-2020, 12:20:32 »
ОТВЕТ:
Для выбора элементов из модели совершенно без разницы модальный или немодальный диалог. ExternalEvent нужно использовать когда требуется внесение изменений в модель
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Удаление элементов в API
« Ответ #4 : 18-11-2020, 12:35:22 »
транзакция нужна только для удаления

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #5 : 18-11-2020, 22:24:29 »
накидал пример - https://knowledge.autodesk.com/ru/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2014/RUS/Revit/files/GUID-0A0D656E-5C44-49E8-A891-6C29F88E35C0-htm.html
компилируется, но выдает:



есть мысли? Спасибо...
пример из SDK компилируется, но вылетает с ошибкой... Что я не так делаю!?
« Последнее редактирование: 18-11-2020, 23:10:38 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Удаление элементов в API
« Ответ #6 : 19-11-2020, 08:12:45 »
какой то объект не создал
вот этого явно нет
Код - C# [Выбрать]
  1.     public Result OnStartup(UIControlledApplication application)
  2.     {
  3.         m_MyForm = null;   // no dialog needed yet; the command will bring it
  4.         thisApp = this;  // static access to this application instance
  5.  
  6.         return Result.Succeeded;
  7.     }

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #7 : 19-11-2020, 09:13:10 »
Эти строки есть, но thisApp = this, видимо, при старте Ревита создается, а если я запускаюсь потом...
Буду разбираться...
---
Не хватает у меня знаний, подскажите что подразумевается под this? Спасибо...
« Последнее редактирование: 19-11-2020, 12:04:36 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Удаление элементов в API
« Ответ #8 : 19-11-2020, 12:44:33 »
IExternalApplication надо прописывать в .addin
тогда Revit отробатывает метод OnStartup и там ловищь эот экземпляр

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #9 : 19-11-2020, 13:18:58 »
вот тут:  <FullClassName>{Name}.Command</FullClassName>?
а на стадии отладки?
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #11 : 19-11-2020, 15:23:13 »
 так .addin подгружается с загрузкой ревита, как бы при отладке? сорри за тупые вопросы...
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Удаление элементов в API
« Ответ #12 : 19-11-2020, 16:05:00 »
1. Загружаешь Revit
2. Включаешь отладку

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #13 : 19-11-2020, 17:59:14 »
вроде получилось.
при компиляции addin сразу определяется ревитом и во внешних командах появляется...
я просто пока обходился без addin, учусь :)
« Последнее редактирование: 20-11-2020, 09:26:39 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Отмечено как Решение Александр Ривилис 22-11-2020, 19:29:33

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Удаление элементов в API
« Ответ #14 : 20-11-2020, 12:37:16 »
Получилось так (без OnStart):
Код - C# [Выбрать]
  1. #region Namespaces
  2. using System.Collections.Generic;
  3. using Autodesk.Revit.ApplicationServices;
  4. using Autodesk.Revit.Attributes;
  5. using Autodesk.Revit.DB;
  6. using Autodesk.Revit.UI;
  7. using Autodesk.Revit.UI.Selection;
  8. #endregion
  9.  
  10. namespace __Holly
  11. {
  12.     [Transaction(TransactionMode.Manual)]
  13.     public class Command : IExternalCommand
  14.     {
  15.         UIDocument uidoc;
  16.         Document doc;
  17.  
  18.         public Result Execute(
  19.           ExternalCommandData commandData,
  20.           ref string message,
  21.           ElementSet elements)
  22.         {
  23.             UIApplication uiapp = commandData.Application;
  24.             uidoc = uiapp.ActiveUIDocument;
  25.             Application app = uiapp.Application;
  26.             doc = uidoc.Document;
  27.  
  28.             IExternalEventHandler handler_event = new HoleRevit();
  29.             ExternalEvent exEvent = ExternalEvent.Create(handler_event);
  30.  
  31.             Form1 form = new Form1(exEvent);
  32.  
  33.             form.btSelect.Click += (s, a) =>
  34.             {
  35.                 form.Hide();
  36.                 Info.FIList = Oper(ObjSelect());
  37.                 form.Show();
  38.             };
  39.  
  40.             form.btDelete.Click += (s, a) =>
  41.             {
  42.                 exEvent.Raise(); // -  тут удаление
  43.                 form.Close();
  44.             };
  45.  
  46.             form.Show();
  47.  
  48.             return Result.Succeeded;
  49.         }
  50.         private IList<Reference> ObjSelect()
  51.         {
  52.             Selection sel = uidoc.Selection;
  53.             return sel.PickObjects(ObjectType.Element);
  54.         }
  55.  
  56.         private List<FamilyInstance> Oper(IList<Reference> rl)
  57.         {
  58.             List<FamilyInstance> filist = new List<FamilyInstance>();
  59.  
  60.             foreach (Reference rf in rl)
  61.             {
  62.                 Element el = doc.GetElement(rf);
  63.                 filist.Add(el as FamilyInstance);
  64.             }
  65.  
  66.             return filist;
  67.         }
  68.     }
  69. }
  70.  
  71.  
« Последнее редактирование: 20-11-2020, 13:28:27 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020