Добавление колодца

Автор Тема: Добавление колодца  (Прочитано 11261 раз)

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

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Добавление колодца
« : 24-10-2014, 09:53:41 »
Подскажите пожалуйста, можно ли отловить как нибудь событие добавления колодца с панельки редактирования сети?

Т.е. с панельки редактирования сети добавляется колодец, можно ли как нибудь получить объект  только что созданного колодца?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #1 : 24-10-2014, 10:09:46 »
Можно подписаться на событие добавление объекта в базу данных чертежа и проверять, что добавлен именно колодец. Но, в этом случае, не будет различия - с панельки добавили или каким-то другим способом. Так пойдет?
P.S. Посмотрел события, можно сделать так:
1. Подписываемся в документе на события начала и завершения команды.
2. Если происходит событие начала команды - проверяем, не запускается ли команда AECCLAYOUTPIPEANDSTRUCTURE.
3. Если запущена именно эта команда - подписываемся на событие добавления объекта в базу данных чертежа.
4. Если происходит событие добавления объекта, проверяем, не колодец ли это.
5. Если это колодец - делаем все что нужно.
6. Когда происходит событие завершения команды, смотрим, не завершается ли команда AECCLAYOUTPIPEANDSTRUCTURE.
7. Если завершается именно эта команда, отписываемся от события добавления объекта в базу данных (на которое подписались в п.3)
Код, по идее, несложный получается. Если возникнут проблемы - пишите.
« Последнее редактирование: 24-10-2014, 10:21:45 от Загорулькин Дмитрий »

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #2 : 24-10-2014, 14:55:09 »
Если добавлять колодец в сеть то:
acDB_ObjectAppended  - добавление в базу
e: Autodesk.Civil.DatabaseServices.Pipe

:(   а надо вставлять в сеть колоцец, как быть?

если добавлять колодец отдельно стоящий, то
acDB_ObjectAppended  - добавление в базу
e: Autodesk.Civil.DatabaseServices.Structure

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #3 : 24-10-2014, 15:04:32 »
Ну все правильно - если колодец в сеть добавлять, то он автоматом еще и присоединяющую трубу до колодца вставит. Получается, что сперва труба добавится, а потом колодец.
Или, что не так? Не понимаю.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #4 : 24-10-2014, 15:11:35 »
При чем при первом открытии чертежа и первом вызове команды возвращается Autodesk.Civil.DatabaseServices.PartDef

как получить только что созданный  объект Structrure, если вернулся PartDef или Pipe?


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #5 : 24-10-2014, 15:21:22 »
Пропускать их, пока не дойдет до объекта Structure (пункты 4 и 5 моего алгоритма).

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #6 : 24-10-2014, 17:26:54 »
Проблема в том, что PartDef или Pipe или Stucture срабатывает только один раз на append  и больше ничего нет :(

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #7 : 24-10-2014, 17:32:09 »
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.EditorInput;
  5.  
  6. using CivDb = Autodesk.Civil.DatabaseServices;
  7. using CivAp = Autodesk.Civil.ApplicationServices;
  8.  
  9. namespace Civil2015Test
  10. {
  11.     public class TestStructureAddEvent
  12.     {
  13.         [CommandMethod("TestAddReactor")]
  14.         public void AddReactor()
  15.         {
  16.             Document adoc = Application.DocumentManager.MdiActiveDocument;            
  17.  
  18.             // На случай повторного запуска
  19.             adoc.CommandWillStart -= adoc_CommandWillStart;
  20.             adoc.CommandEnded -= adoc_CommandEnded;
  21.             adoc.CommandCancelled -= adoc_CommandEnded;
  22.             adoc.CommandFailed -= adoc_CommandEnded;
  23.  
  24.             adoc.CommandWillStart += adoc_CommandWillStart;
  25.             adoc.CommandEnded += adoc_CommandEnded;
  26.             adoc.CommandCancelled += adoc_CommandEnded;
  27.             adoc.CommandFailed += adoc_CommandEnded;
  28.         }
  29.  
  30.         [CommandMethod("TestRemoveReactor")]
  31.         public void DelReactor()
  32.         {
  33.             Document adoc = Application.DocumentManager.MdiActiveDocument;          
  34.            
  35.             adoc.CommandWillStart -= adoc_CommandWillStart;
  36.             adoc.CommandEnded -= adoc_CommandEnded;
  37.             adoc.CommandCancelled -= adoc_CommandEnded;
  38.             adoc.CommandFailed -= adoc_CommandEnded;
  39.         }
  40.  
  41.         void adoc_CommandEnded(object sender, CommandEventArgs e)
  42.         {
  43.             if (e.GlobalCommandName.Equals("AECCLAYOUTPIPEANDSTRUCTURE"))
  44.             {
  45.                 ((Document)sender).Database.ObjectAppended -= Database_ObjectAppended;
  46.             }
  47.         }
  48.  
  49.         void adoc_CommandWillStart(object sender, CommandEventArgs e)
  50.         {
  51.             if (e.GlobalCommandName.Equals("AECCLAYOUTPIPEANDSTRUCTURE"))
  52.             {
  53.                 Document adoc = (Document)sender;
  54.                 // На всякий случай
  55.                 adoc.Database.ObjectAppended -= Database_ObjectAppended;
  56.                 adoc.Database.ObjectAppended += Database_ObjectAppended;
  57.             }
  58.         }
  59.  
  60.         void Database_ObjectAppended(object sender, ObjectEventArgs e)
  61.         {
  62.             if (e.DBObject is CivDb.Structure)
  63.             {
  64.                 CivDb.Structure structure = e.DBObject as CivDb.Structure;
  65.                 Application.ShowAlertDialog(string.Format("Добавлен колодец {0} в сеть {1}", structure.Name, structure.NetworkName));
  66.             }
  67.         }
  68.     }
  69. }
https://screencast.autodesk.com/main/details/1ffd84ea-14c1-41b9-b176-9452ab1e4cf1
« Последнее редактирование: 24-10-2014, 18:24:48 от Загорулькин Дмитрий »

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #8 : 27-10-2014, 10:04:42 »
Заработало - спасибо.
Проблема в пятницу скорее всего была связана с событиями += и -=.
Сейчас поставил на конец открытия документа CommandWillStart+=.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #9 : 27-10-2014, 10:52:22 »
Заработало - спасибо.
Пожалуйста!
Сейчас поставил на конец открытия документа CommandWillStart+=.
Может, интересно будет: http://adn-cis.org/forum/index.php?topic=876.msg3790#msg3790

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #10 : 27-10-2014, 11:00:39 »
Только вот теперь думаю как из Database_ObjectAppended собрать идешники колодцев и передать их все в adoc_CommandEnded ....

Такое теоретически возможно?

Отмечено как Решение Doublefish 27-10-2014, 13:19:48

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #11 : 27-10-2014, 11:16:33 »
Только вот теперь думаю как из Database_ObjectAppended собрать идешники колодцев и передать их все в adoc_CommandEnded ....

Такое теоретически возможно?
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. using CivDb = Autodesk.Civil.DatabaseServices;
  6.  
  7. namespace Civil2015Test
  8. {
  9.     public class TestStructureAddEvent
  10.     {
  11.         // Коллекция для хранения ID колодцев между методами.
  12.         private ObjectIdCollection structureIds = new ObjectIdCollection();
  13.  
  14.         [CommandMethod("TestAddReactor")]
  15.         public void AddReactor()
  16.         {
  17.             Document adoc = Application.DocumentManager.MdiActiveDocument;          
  18.  
  19.             // На случай повторного запуска
  20.             adoc.CommandWillStart -= adoc_CommandWillStart;
  21.             adoc.CommandEnded -= adoc_CommandEnded;
  22.             adoc.CommandCancelled -= adoc_CommandEnded;
  23.             adoc.CommandFailed -= adoc_CommandEnded;
  24.  
  25.             adoc.CommandWillStart += adoc_CommandWillStart;
  26.             adoc.CommandEnded += adoc_CommandEnded;
  27.             adoc.CommandCancelled += adoc_CommandEnded;
  28.             adoc.CommandFailed += adoc_CommandEnded;
  29.         }
  30.  
  31.         [CommandMethod("TestRemoveReactor")]
  32.         public void DelReactor()
  33.         {
  34.             Document adoc = Application.DocumentManager.MdiActiveDocument;            
  35.            
  36.             adoc.CommandWillStart -= adoc_CommandWillStart;
  37.             adoc.CommandEnded -= adoc_CommandEnded;
  38.             adoc.CommandCancelled -= adoc_CommandEnded;
  39.             adoc.CommandFailed -= adoc_CommandEnded;
  40.         }
  41.  
  42.         void adoc_CommandEnded(object sender, CommandEventArgs e)
  43.         {
  44.             if (e.GlobalCommandName.Equals("AECCLAYOUTPIPEANDSTRUCTURE"))
  45.             {
  46.                 Document adoc = (Document)sender;
  47.                 adoc.Database.ObjectAppended -= Database_ObjectAppended;
  48.                 // Если коллекция колодцев непустая
  49.                 if (structureIds.Count > 0)
  50.                 {
  51.                     // Производим ее обработку
  52.                     using (Transaction tr = adoc.Database.TransactionManager.StartTransaction())
  53.                     {
  54.                         foreach (ObjectId structureId in structureIds)
  55.                         {
  56.                             CivDb.Structure structure = tr.GetObject(structureId, OpenMode.ForRead) as CivDb.Structure;
  57.                             adoc.Editor.WriteMessage("\nДобавлен колодец {0} в сеть {1}", structure.Name, structure.NetworkName);
  58.                         }
  59.                         tr.Commit();
  60.                     }
  61.                     // И очищаем ее
  62.                     structureIds.Clear();
  63.                 }
  64.             }
  65.         }
  66.  
  67.         void adoc_CommandWillStart(object sender, CommandEventArgs e)
  68.         {
  69.             if (e.GlobalCommandName.Equals("AECCLAYOUTPIPEANDSTRUCTURE"))
  70.             {
  71.                 Document adoc = (Document)sender;
  72.                 // На всякий случай
  73.                 adoc.Database.ObjectAppended -= Database_ObjectAppended;
  74.                 adoc.Database.ObjectAppended += Database_ObjectAppended;
  75.             }
  76.         }
  77.  
  78.         void Database_ObjectAppended(object sender, ObjectEventArgs e)
  79.         {
  80.             if (e.DBObject is CivDb.Structure)
  81.             {              
  82.                 // Добавляем ID колодца во коллекцию
  83.                 structureIds.Add(e.DBObject.Id);
  84.             }
  85.         }
  86.     }
  87. }
  88.  
« Последнее редактирование: 27-10-2014, 11:29:28 от Загорулькин Дмитрий »

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #12 : 27-10-2014, 12:19:39 »
И как это я сам не догадался :(


« Последнее редактирование: 27-10-2014, 12:29:28
сейчас 12:19 - где то время не перевилось

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #13 : 27-10-2014, 12:50:58 »
Если в adoc_CommandEnded для добавленного колодца выполнить команду которая изменяет одно свойство колодца, то значение не сохраняется  :(((
Если команду запустить отдельно и выбрать колодец в моделе (т.е. получаем тот же ид), то свойство изменяется и значение сохранятся нормально.

Из adoc_CommandEnded нельзя изменять значения свойств созданного колодца или есть какой то нюанс с запуском команды?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление колодца
« Ответ #14 : 27-10-2014, 12:56:39 »
Я изначально забыл tr.Commit() вставить. Скорее всего, из-за этого.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавление колодца
« Ответ #15 : 27-10-2014, 13:13:12 »
« Последнее редактирование: 27-10-2014, 12:29:28
сейчас 12:19 - где то время не перевилось
Поменяй у себя в Профиль->Основная информация->Внешний вид форума.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #16 : 27-10-2014, 13:59:52 »
Действительно дело было в  tr.Commit()  даже если  openMode.ForRead, а потом в команде изменения был свой commit на openmode.forwrite.

Спасибо.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление колодца
« Ответ #17 : 27-10-2014, 14:01:38 »
Обновил профиль - спасибо.