Добавил в код из поста 1 (соседняя тема http://adn-cis.org/forum/index.php?topic=3125.0) после строки:Этот код выполнится только после завершения команды. Поэтому какой примитив будет последним - не знаю.
Код - vb.net: [Выделить]
trans.AddNewlyCreatedDBObject(blockRef, True)
Строку:
Код - vb.net: [Выделить]
dwgDoc.SendStringToExecute("_eattedit _l" & vbCr, True, False, False)
'dwgDoc.SendStringToExecute("_eattedit" & vbCr & "_l" & vbCr, True, False, False) -можно еще так. Разницы никакой.
Но при тестировании в ком. строке получаю "Выбранный блок не имеет редактируемых атрибутов".А ты добавил атрибуты к вставке блока? Судя по коду - нет. Читай (и далее по ссылке): http://adn-cis.org/forum/index.php?topic=2937
Этот код выполнится только после завершения команды. Поэтому какой примитив будет последним - не знаю.Этот метод вызывается сразу после вставки блока, так что он и оказывался последним. Пока нареканий не вызывал.
А ты добавил атрибуты к вставке блока? Судя по коду - нет. Читай (и далее по ссылке): http://adn-cis.org/forum/index.php?topic=2937Ого, как все запутано.. Отдельно геометрия, отдельно атрибуты. Причем эту статью я просматривал, но не придал значения, подумал, что просто значения задаются программно, а меня интересует именно ручной ввод. А тут такое.. Спасибо, что наставили на путь истинный :)
Причем эту статью я просматривал, но не придал значения, подумал, что просто значения задаются программно, а меня интересует именно ручной ввод. А тут такое..Там нет ничего сложного. Проверяются типы AttributeDefinition, и к коллекции атрибутов вставки блока добавляются только неконстантные (т.е. именно так, как делает AutoCAD при вставке блока).
После вызова редактора, программа продолжает выполняться как ни в чем не бывало.Уже неоднократно обсуждалось на форуме, что SendStringToExecute выполняется асинхронно, т.е. уже после завершения твоей команды.
P.S.: Ну и внутри транзакции нечего запускать команды AutoCAD.Это не рекомендуется или нельзя ни при каких обстоятельствах? А что если мне нужно вставить блок, заполнить атрибуты, отредактировать блок в зависимости от полученных значений... Неужели придется закрывать транзакцию, вызывать редактор, а потом по новой ко всему подключаться, чтоб добраться до блока? Это ведь невероятное разбухание кода получится..
А что если мне нужно вставить блок, заполнить атрибуты, отредактировать блок в зависимости от полученных значений... Неужели придется закрывать транзакцию, вызывать редактор, а потом по новой ко всему подключаться, чтоб добраться до блока? Это ведь невероятное разбухание кода получится..Хочешь проблем? Тогда можешь не разрывать транзакцию. Ты ведь не знаешь какие механизмы эта команда использует внутри себя.
Хочешь проблем? Тогда можешь не разрывать транзакцию. Ты ведь не знаешь какие механизмы эта команда использует внутри себя.Проблем не хочу. :) Я понял, спасибо. В конце концов, не так уж и страшно откопировать часть кода.
Сохранять можно ObjectId между транзакциями http://adn-cis.org/forum/index.php?topic=570.0То что нужно! У меня даже кое что получилось, сейчас пытаюсь грамотно прикрутить в код.
И еще непонятно зачем ты ObjectId преобразуешь в строку.Для того, чтоб посмотреть в ком строке нуль не нуль? Т.е. посмотреть возвращает что либо или нет.
Только после AppendEntity у него становится не нулевой ObjectId.Да, но существует он только в пределах транзакции. После dispose никак вытянуть значение не получалось. Поэтому, благодаря Вам и ссылке German'a заменил строку:
Поэтому, благодаря Вам и ссылке German'a заменил строку:Был второй вариант. У тебя в старом коде поменять местами ms.AppendEntity(blockRef) и blockID = blockRef.ObjectId, т.е. после вызова ms.AppendEntity(blockRef) blockRef.ObjectId возвращает уже ненулевое (правильное) значение.
Код - vb.net: [Выделить]
ms.AppendEntity(blockRef)
На строку:
Код - vb.net: [Выделить]
blockID = ms.AppendEntity(blockRef)
blockID - объявлен выше старта транзакции. И пока все работает как надо! blockID можно свободно использовать в след. транзакции. Спасибо вам за помощь.
И можно еще маленький вопрос, он слишком незначительный, чтоб создавать тему. Я использую транзакцию, закрываю ее. Выполняю кое-какие манипуляции в коде и после этого снова есть необходимость использовать транзакцию. Я от греха подальше назвал ее другим именем и все. Может быть есть рекомендации по этому поводу? Т.е. можно ли было использовать старое название, или так делать категорически нельзя ,или нежелательно, или если она закрыта, то можно считать будто ее и не было?А это только вопрос синтаксиса языка. Если он не будет ругаться на две переменные с одним именем - можешь использовать, если будет ругаться - значит нет. Имя переменной транзакции не имеет никакого значения. Главное, чтобы не нарушала синтаксис языка (в данном случае языка VB.NET, хотя я настоятельно рекомендую перейти на C#).