| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как поймать изменения в BlockEditor'е?

Как поймать изменения в BlockEditor'е?

Ответ
Поиск в этой теме
Непрочитано 19.02.2014, 15:35 #1
Как поймать изменения в BlockEditor'е?
DanmerRUS
 
Регистрация: 18.02.2014
Сообщений: 4

Доброго времени!
Мне нужно выполнять некоторые действия с блоком, если пользователь его изменил, например в BlockEditor'е, а точнее загружать изменённый BlockTableRecord в базу. На форуме решения не нашёл, в гуглах тоже. Пишу на C# под 2012-ый автокад, .NET 4.
Подскажите, пожалуйста, как это сделать?

Если подписываться на событие BlockTableRecord.Modified, то мы получаем вызов этого блока раз 8 после завершения его редактирования, что не совсем эффективно. Или можно как-то проверять откуда произошло изменение и таким образом обрабатывать только один раз?

Последний раз редактировалось DanmerRUS, 19.02.2014 в 15:46.
Просмотров: 3355
 
Непрочитано 19.02.2014, 15:40
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,831


DanmerRUS, язык хотя бы укажи!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.02.2014, 15:45
#3
DanmerRUS


 
Регистрация: 18.02.2014
Сообщений: 4


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
DanmerRUS, язык хотя бы укажи!
А да, извини.
На C# под автокад 2012, .NET 4
DanmerRUS вне форума  
 
Непрочитано 19.02.2014, 16:01
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,831


Уточняю: прежде всего подобные вещи надо в заголовке темы указывать...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2014, 16:40
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй в событии BlockTableRecord.Modified
добавить сразу после вызова:
Код:
[Выделить все]
Void blk_Modified(object sender, ...e)
{
//тут твой остальной код

blk_Modified-=BlockTableRecord.Modified;
}
что-то типа того
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 19.02.2014, 17:09
#6
DanmerRUS


 
Регистрация: 18.02.2014
Сообщений: 4


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Попробуй в событии BlockTableRecord.Modified
добавить сразу после вызова:
Код:
[Выделить все]
Void blk_Modified(object sender, ...e)
{
//тут твой остальной код

blk_Modified-=BlockTableRecord.Modified;
}
что-то типа того
То есть отписаться сразу после выполнения? Тогда при следующем изменении объекта BlockTableRecord обработки не будет.
DanmerRUS вне форума  
 
Непрочитано 19.02.2014, 17:35
1 | #7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от DanmerRUS Посмотреть сообщение
BlockTableRecord.Modified, то мы получаем вызов этого блока раз 8 после завершения его редактирования
А точно именно этого блока? По имени проверяли?Понял, подписывались на событие модификации конкретного описания блока.
Ради интереса запустил регистрацию событий при открытии редактора блоков, сохранении блока и закрытии редактора.
Код:
[Выделить все]
Start command: Name - -BEDIT
SysVar Changed: Name - CANNOSCALE; OldValue - 2:1; New value - 1:1000
SysVar Changed: Name - DIMSCALE; OldValue - 0.5; New value - 1
Object modified: DxfName - AEC_VARS_DWG_SETUP; Handle - 1DB
Object appended: DxfName - BLOCK; Handle - 61FD
Object modified: DxfName - BLOCK; Handle - 61FD
Object modified: DxfName - BLOCK; Handle - 61FD
Object appended: DxfName - ENDBLK; Handle - 61FE
Object modified: DxfName - ENDBLK; Handle - 61FE
Object modified: DxfName - ENDBLK; Handle - 61FE
Object appended: DxfName - BLOCK_RECORD; Handle - 61FC; Name - *U65
Object modified: DxfName - BLOCK_RECORD; Handle - 61FC; Name - *U65
Object modified: DxfName - SORTENTSTABLE; Handle - 5CC
Object appended: DxfName - DICTIONARY; Handle - 15D
Object modified: DxfName - DICTIONARY; Handle - 15D
Object modified: DxfName - BLOCK_RECORD; Handle - 61FC; Name - *U65
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object appended: DxfName - HATCH; Handle - 61FF
Object modified: DxfName - HATCH; Handle - 61FF
Object appended: DxfName - CIRCLE; Handle - 6200
Object modified: DxfName - CIRCLE; Handle - 6200
Object appended: DxfName - CIRCLE; Handle - 6201
Object modified: DxfName - CIRCLE; Handle - 6201
Object appended: DxfName - HATCH; Handle - 6202
Object modified: DxfName - HATCH; Handle - 6202
Object appended: DxfName - CIRCLE; Handle - 6203
Object modified: DxfName - CIRCLE; Handle - 6203
Object appended: DxfName - WIPEOUT; Handle - 6204
Object modified: DxfName - WIPEOUT; Handle - 6204
Object modified: DxfName - HATCH; Handle - 61FF
Object modified: DxfName - CIRCLE; Handle - 6200
Object modified: DxfName - CIRCLE; Handle - 6201
Object modified: DxfName - HATCH; Handle - 6202
Object modified: DxfName - CIRCLE; Handle - 6203
Object modified: DxfName - WIPEOUT; Handle - 6204
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - HATCH; Handle - 61FF
Object modified: DxfName - CIRCLE; Handle - 6200
Object modified: DxfName - CIRCLE; Handle - 6201
Object modified: DxfName - HATCH; Handle - 6202
Object modified: DxfName - CIRCLE; Handle - 6203
Object modified: DxfName - WIPEOUT; Handle - 6204
Object modified: DxfName - DICTIONARY; Handle - 6205
Object appended: DxfName - SORTENTSTABLE; Handle - 6206
Object modified: DxfName - SORTENTSTABLE; Handle - 6206
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object appended: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6207
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6207
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - DMMAP; Handle - 5C3
SysVar Changed: Name - UCSNAME; OldValue - ; New value - 
SysVar Changed: Name - VIEWDIR; OldValue - (0,0,1); New value - (0,0,1)
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
SysVar Changed: Name - CLAYER; OldValue - 0; New value - 0
Object modified: DxfName - DMMAP; Handle - 5C3
End command: Name - -BEDIT
Object modified: DxfName - DMBASEELEMENT; Handle - 5C6
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMBASEELEMENT; Handle - 5C6
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMBASEELEMENT; Handle - 5C6
Object modified: DxfName - DMMAP; Handle - 5C3
Start command: Name - BSAVE
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
SysVar Changed: Name - EXTMAX; OldValue - (1.1,1.1,0); New value - (249.239824107584,367.928757541086,3)
SysVar Changed: Name - EXTMIN; OldValue - (-1.1,-1.10000000000001,0); New value - (-594.465092297405,-288.177576061838,-2.35464798680643)
Object modified: DxfName - SORTENTSTABLE; Handle - 2921
Object modified: DxfName - SORTENTSTABLE; Handle - 6206
Object appended: DxfName - DICTIONARY; Handle - 2920
Object modified: DxfName - DICTIONARY; Handle - 2920
Object appended: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - BLOCK_RECORD; Handle - EA1; Name - смотр_2м
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6207
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - BLOCK_RECORD; Handle - EA1; Name - смотр_2м
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6207
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - DICTIONARY; Handle - 6205
Object appended: DxfName - ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION; Handle - 6209
Object modified: DxfName - ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION; Handle - 6209
Object modified: DxfName - BLOCK_RECORD; Handle - EA1; Name - смотр_2м
Object appended: DxfName - BLOCK; Handle - 620B
Object modified: DxfName - BLOCK; Handle - 620B
Object modified: DxfName - BLOCK; Handle - 620B
Object appended: DxfName - ENDBLK; Handle - 620C
Object modified: DxfName - ENDBLK; Handle - 620C
Object modified: DxfName - ENDBLK; Handle - 620C
Object appended: DxfName - BLOCK_RECORD; Handle - 620A; Name - *U66
Object modified: DxfName - BLOCK_RECORD; Handle - 620A; Name - *U66
SysVar Changed: Name - EXTMAX; OldValue - (249.239824107584,367.928757541086,3); New value - (1.1,1.1,0)
SysVar Changed: Name - EXTMIN; OldValue - (-594.465092297405,-288.177576061838,-2.35464798680643); New value - (-1.1,-1.10000000000001,0)
Object modified: DxfName - SORTENTSTABLE; Handle - 2921
Object appended: DxfName - DICTIONARY; Handle - 2920
Object modified: DxfName - DICTIONARY; Handle - 2920
Object modified: DxfName - BLOCK_RECORD; Handle - 620A; Name - *U66
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object erased: DxfName - BLOCK_RECORD; Handle - 620A; Name - *U66
Object appended: DxfName - HATCH; Handle - 620D
Object modified: DxfName - HATCH; Handle - 620D
Object appended: DxfName - CIRCLE; Handle - 620E
Object modified: DxfName - CIRCLE; Handle - 620E
Object appended: DxfName - CIRCLE; Handle - 620F
Object modified: DxfName - CIRCLE; Handle - 620F
Object appended: DxfName - HATCH; Handle - 6210
Object modified: DxfName - HATCH; Handle - 6210
Object appended: DxfName - CIRCLE; Handle - 6211
Object modified: DxfName - CIRCLE; Handle - 6211
Object appended: DxfName - WIPEOUT; Handle - 6212
Object modified: DxfName - WIPEOUT; Handle - 6212
Object appended: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6214
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6214
Object modified: DxfName - HATCH; Handle - 620D
Object modified: DxfName - CIRCLE; Handle - 620E
Object modified: DxfName - CIRCLE; Handle - 620F
Object modified: DxfName - HATCH; Handle - 6210
Object modified: DxfName - CIRCLE; Handle - 6211
Object modified: DxfName - WIPEOUT; Handle - 6212
Object modified: DxfName - DICTIONARY; Handle - 6213
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6214
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - HATCH; Handle - 620D
Object modified: DxfName - CIRCLE; Handle - 620E
Object modified: DxfName - CIRCLE; Handle - 620F
Object modified: DxfName - HATCH; Handle - 6210
Object modified: DxfName - CIRCLE; Handle - 6211
Object modified: DxfName - WIPEOUT; Handle - 6212
Object modified: DxfName - DICTIONARY; Handle - 6213
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6214
Object modified: DxfName - DICTIONARY; Handle - 6213
Object appended: DxfName - SORTENTSTABLE; Handle - 6215
Object modified: DxfName - SORTENTSTABLE; Handle - 6215
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
End command: Name - BSAVE
Start command: Name - BCLOSE
Object modified: DxfName - DMMAP; Handle - 5C3
Object modified: DxfName - DMMAP; Handle - 5C3
SysVar Changed: Name - UCSNAME; OldValue - ; New value - 
SysVar Changed: Name - CLAYER; OldValue - 0; New value - 0
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object modified: DxfName - ACAD_EVALUATION_GRAPH; Handle - 6207
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION; Handle - 6209
Object modified: DxfName - DICTIONARY; Handle - 6205
Object modified: DxfName - BLOCK_RECORD; Handle - EA1; Name - смотр_2м
SysVar Changed: Name - EXTMAX; OldValue - (1.1,1.1,0); New value - (249.239824107584,367.928757541086,3)
SysVar Changed: Name - EXTMIN; OldValue - (-1.1,-1.1,0); New value - (-594.465092297405,-288.177576061838,-2.35464798680643)
Object modified: DxfName - SORTENTSTABLE; Handle - 5CC
Object modified: DxfName - SORTENTSTABLE; Handle - 6215
Object appended: DxfName - DICTIONARY; Handle - 15D
Object modified: DxfName - DICTIONARY; Handle - 15D
Object appended: DxfName - DICTIONARY; Handle - 6213
Object modified: DxfName - DICTIONARY; Handle - 6213
Object modified: DxfName - BLOCK_RECORD; Handle - 61FC; Name - *U65
Object modified: DxfName - BLOCK_RECORD; Handle - 1F; Name - *Model_Space
Object erased: DxfName - BLOCK_RECORD; Handle - 61FC; Name - *U65
SysVar Changed: Name - CANNOSCALE; OldValue - 1:1000; New value - 2:1
SysVar Changed: Name - DIMSCALE; OldValue - 1; New value - 0.5
Object modified: DxfName - AEC_VARS_DWG_SETUP; Handle - 1DB
End command: Name - BCLOSE

Итого - 4 вызова события модификации открываемого блока.
Я проверял в 2014, в 2012 аналогично должно быть, по идее.
Выводы:
- Редактирование блока начинается командой BEDIT, завершается командой BCLOSE.
- Сохранение изменений в определении блока производится командой BSAVE.
Так что, можно добавить события на запуск-завершение этих команд, отследить определения блоков, которые они затрагивали, вычислить нужные и обновить.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 19.02.2014 в 17:55.
Do$ вне форума  
 
Автор темы   Непрочитано 21.02.2014, 07:16
#8
DanmerRUS


 
Регистрация: 18.02.2014
Сообщений: 4


Do$, спасибо!

Тут еще и проблема в том, что если мы закрываем редактор и сохраняем, то BSAVE не вызывается.

Проблема решена так:
Имеется HashSet<ObjectId> ModifiedBlocksIds, в котором хранятся Id всех изменённых BTR'ов(BlockTableRecord).
Имеется флаг IsModified, который позволяет/запрещает сохранение в ModifiedBlocksIds;
Обработка события Modified BTR'а :
Код:
[Выделить все]
		internal static void TemplateOnModified(object sender, EventArgs eventArgs)
		{
			if (!IsModified)
			{
				return;
			}

			var btr = sender as BlockTableRecord;
			
			if (btr == null)
			{
				return;
			}

			ModifiedBlocksIds.Add(btr.ObjectId);
		}
Обработка завершения выполнения команды в документе:
Код:
[Выделить все]
		private static void DocOnCommandEnd(object sender, CommandEventArgs commandEventArgs)
		{
			var doc = (Document)sender;

			switch (commandEventArgs.GlobalCommandName)
			{
				case "-BEDIT":
					TemplateBlock.IsModified = true;

					break;

				case "BCLOSE":
					TemplateBlock.IsModified = false;

					foreach (var btrId in TemplateBlock.ModifiedBlocksIds)
					{
						TemplateBlock.UpdateBlockToDatabase(btrId, doc);
					}
					TemplateBlock.ModifiedBlocksIds.Clear();

					break;

				case "BSAVE":
					TemplateBlock.IsModified = false;
					foreach (var btrId in TemplateBlock.ModifiedBlocksIds)
					{
						TemplateBlock.UpdateBlockToDatabase(btrId, doc);
					}
					TemplateBlock.ModifiedBlocksIds.Clear();
					TemplateBlock.IsModified = true;

					break;
			}
		}
Таким образом обработка изменения элемента хоть и вызывается много раз, но она не такая ресурсоёмкая, как раньше.
DanmerRUS вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как поймать изменения в BlockEditor'е?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоение номера изменения ingin2009 Прочее. Архитектура и строительство 38 01.11.2019 05:12
Вносить или не вносить изменения в ПСД? grigor79 Организация проектирования и оформление документации 11 10.02.2014 11:47
Как правильно внести изменения в штамп чертежа? sniper060989 Прочее. Архитектура и строительство 2 24.06.2013 19:23
Имеем ли мы право вносить изменения в чужую проектную документацию и каким образом оформлять правильно изменения в этом случае в со-ии с ГОСТ 21.1101? Red_line Прочее. Архитектура и строительство 4 26.01.2012 21:50