Конференция nanoCAD
Показать сообщение отдельно
Непрочитано 05.10.2011, 11:17 #1
C# .net переопределение динамического блока из внешнего файла
bargool
 
Санкт-Петербург
Регистрация: 16.08.2006
Сообщений: 501

Есть динамический блок с атрибутами и прочими извращениями в текущем файле и в неком эталонном постороннем файле.
Необходимо обновить блок в текущем файле в соответствии с изменившимся эталоном.
Я догадался до такого способа, но может, можно сделать всё проще?
Код:
[Выделить все]
[CommandMethod("blockRedefine", CommandFlags.Session)]
public void blockRedefine()
{
	// "Текущий" документ
	currDwg = Application.DocumentManager.MdiActiveDocument;
	currDatabase = currDwg.Database;
	DocumentCollection docManager = Application.DocumentManager;
	//открываем файл с эталонным блоком в режиме для чтения
	Document frameDoc = docManager.Open(@"Путь до файла.dwg", true);
	Database frameDb = frameDoc.Database;
	ObjectIdCollection frameCollection = new ObjectIdCollection();
	using (DocumentLock docLock = frameDoc.LockDocument())
	{
		using (Transaction transaction = frameDb.TransactionManager.StartTransaction())
		{
			BlockTable frameBlockTable = (BlockTable)transaction.GetObject(frameDb.BlockTableId, OpenMode.ForRead);
			// Пытаемся открыть эталонный блок
			BlockTableRecord frameBlock = transaction.GetObject(frameBlockTable["Frame"], OpenMode.ForRead) as BlockTableRecord;
			// если получилось - описание блока есть, добавляем в ObjectIdCollection для переноса в "текущий" документ
			if (frameBlock != null)
			{
				frameCollection.Add(frameBlock.ObjectId);
			}
		}

	}
	// Переключаемся на "текущий документ"
	docManager.MdiActiveDocument = currDwg;
	using (DocumentLock docLock = currDwg.LockDocument())
	{
		using (Transaction transaction = currDatabase.TransactionManager.StartTransaction())
		{
			BlockTable blockTable = (BlockTable)transaction.GetObject(currDatabase.BlockTableId, OpenMode.ForRead);
			IdMapping idmapping = new IdMapping();
			// пишем определение эталонного блока в "текущий" файл с заменой
			frameDb.WblockCloneObjects(frameCollection, blockTable.ObjectId, idmapping, DuplicateRecordCloning.Replace, false);
			transaction.Commit();
		}
	}
	// закрываем уже ненужный файл с эталонным блоком
	frameDoc.CloseAndDiscard();
	// Теперь надо обновить уже вставленные вхождения блока. Следующая конструкция работает, но мне крайне не нравится
	currDwg.SendStringToExecute("attsync\n", true, false, false);
	currDwg.SendStringToExecute("n\n", true, false, false);
	currDwg.SendStringToExecute("Frame\n", true, false, false);
}
Есть ли более корректный способ обновления описания блока, и самое главное, как более корректно и безгеморройно обновить вхождения блока?
Код тестовый, за отсутствие должных проверок не бить

Последний раз редактировалось bargool, 05.10.2011 в 13:27.
Просмотров: 11724
 
Размещение рекламы