Изменение параметра динамического блока в новом открытом документе?

Автор Тема: Изменение параметра динамического блока в новом открытом документе?  (Прочитано 19693 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Увы. Идеи закончились. Если ты корректно деинсталлировал AutoCAD, удалил все его следы с диска и реестра, а затем повторно его установил, то у тебя должен быть девственно чистый AutoCAD 2016 SP1. И работать он должен одинаково, что у меня, что у тебя, что у Александр Пекшев aka Modis. Конечно Windows может преподносить сюрпризы, но чтобы они проявлялись так изощренно - очень сомневаюсь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Код немного порихтовал. Что именно приводит к другому поведению не выяснял.
...
Проверял в AutoCAD 2015 x64 SP2
Александр Ривилис, а почему нельзя сделать это в одной транзакции? Я занимаюсь сейчас похожими вещами. Код, что Вы прикрепили в #11 данной темы:
Код - C# [Выбрать]
  1. [CommandMethod("Test", CommandFlags.Session)]
  2.     public void Test()
  3.     {
  4.         // Открытие тестового документа
  5.         string testFile = @"c:\test\test.dwg";
  6.         Document doc = Application.DocumentManager.Open(testFile, false);
  7.         Database db = doc.Database;
  8.         Database dbold = HostApplicationServices.WorkingDatabase;
  9.         HostApplicationServices.WorkingDatabase = db;
  10.         // Блокировка открытого документа
  11.         using (doc.LockDocument()) {
  12.           ObjectId id = ObjectId.Null;
  13.           using (var t1 = db.TransactionManager.StartTransaction()) {
  14.             var bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  15.             var ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
  16.  
  17.             // Вставка дин блока в модель
  18.             BlockReference blRefTest = new BlockReference(Point3d.Origin, bt["test"]);
  19.             id = ms.AppendEntity(blRefTest);
  20.             t1.AddNewlyCreatedDBObject(blRefTest, true);
  21.             t1.Commit();
  22.           }
  23.           using (var t2 = db.TransactionManager.StartTransaction()) {
  24.             BlockReference blRefTest = id.GetObject(OpenMode.ForWrite) as BlockReference;
  25.             // Изменение дин параметра Длины
  26.             setDynParam(blRefTest);
  27.             t2.Commit();
  28.           }
  29.  
  30.         }
  31.         HostApplicationServices.WorkingDatabase = dbold;
  32.     }
  33.  
  34.     private void setDynParam(BlockReference blRefSecHor)
  35.     {
  36.       foreach (DynamicBlockReferenceProperty prop in blRefSecHor.DynamicBlockReferencePropertyCollection) {
  37.         if (prop.PropertyName == "Длина") {
  38.           prop.Value = 6000d;
  39.           return;
  40.         }
  41.       }
  42.     }
Я пытаюсь загнать все в одну транзакцию, но не выходит, блок работает "наполовину", я неправильно понимаю суть транзакции?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис, а почему нельзя сделать это в одной транзакции?
В ряде случаев для корректной работы требуется, чтобы примитив был уже добавлен в базу и закрыт. Это приводит к  тому, что AutoCAD выполняет дополнительные действия с примитивом и самой базой (в данном случае добавляет динамические свойства к блоку). И только в следующей транзакции можно быть уверенным, что примитив (в данном случае динамический блок) готов к работе. Иногда это лишнее, а иногда это единственный способ избежать ошибок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
В ряде случаев для корректной работы требуется, чтобы примитив был уже добавлен в базу и закрыт. Это приводит к  тому, что AutoCAD выполняет дополнительные действия с примитивом и самой базой (в данном случае добавляет динамические свойства к блоку). И только в следующей транзакции можно быть уверенным, что примитив (в данном случае динамический блок) готов к работе. Иногда это лишнее, а иногда это единственный способ избежать ошибок.
Вот, собственно, у меня так и получалось - я вставлял динблок в чертеж и менял в нем кое-какие параметры. Забавно получалось, что внешне блок вставлялся с измененными параметрами, а вот при нажатии на него, ручка была в том месте, где у вхождения блока, причем при расчленении я получал вид как у вхождения. Это все навело меня на мысль, что я что-то неправильно "транзактирую" или же не корректно добавляю инфу о блоке в таблицу блоков.
Off-Topic: показать
Даже хотел было тему создавать, так вот столкнулся с дилемой, создать тему после 30 минут раздумий или после 8 часов раздумий.
В первом случае, я бы получил ответ, например, от Вас (с пометкой, что я не дочитал и не разобрался и что поиском не умею пользоваться - то есть ткнули бы), но вопрос был бы решен за час.
Во втором случае, пришлось искать по форуму и не только, кучу всего читать, разбираться и ДУМАТЬ. Конечно, день потрачен, но вот понимания то больше пришло, в разы.
Так вот, все эти рассуждения к тому, когда же я имею право создавать тему на форуме (через пол часа после "нерешения" вопроса или же через 12 часов) :)
В итоге, я, вроде как, независимо пришел к такому же умозаключению, как в Вашем предыдущем посте, но мне, все равно, понадобилось Ваше авторитетное подтверждение, поэтому я тихонечко спросил в чужой теме. ;)


Сейчас буду пробовать с двумя транзакциями, спасибо Вам за ответ.