Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Вильдар от 23-01-2016, 11:19:20

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

modis, а можешь изменить блок в файле примера test.dwg. Что-то у меня сейчас не получается растягивать штриховку параметром растяжения, а не ассоциативностью, почему-то вся штриховка сдвигается, а не растягивается  :-[


Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 23-01-2016, 11:49:31
Попробуй с этим блоком
Я никогда не делал штриховку в блоке. Как ни странно для меня, но ассоциативность пришлось оставить
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 11:53:42
Не. Вот что получается - вся штриховка сдвигается.
Странно, раньше мы, вроде, делали растяжение штриховки линейным параметром (без ассоциативности), тоже все работало  :-[
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 23-01-2016, 11:55:25
Ну не программно если - блок у вас правильно работает?

Еще эту тему посмотрите - http://adn-cis.org/forum/index.php?topic=3348.0
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 12:19:30
Да, непрограммно, правильно работает блок (с ассоциативной штриховкой).

Еще один момент заметил в рабочем варианте.
При копировании блоков с помощью WblockCloneObjects, ассоциативность штриховки в дин блоке пропадает.  :(
Ошибся. WblockCloneObjects тут не причем. какая-то другая причина.  :-[
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 23-01-2016, 12:27:00
Значит придется вам ассоциативность штриховки "восстанавливать". Вот нашел по теме  http://www.acadnetwork.com/index.php?topic=259.0
Но самый лучший вариант - убрать ее нафиг из блока! ИМХО
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 12:30:49
Да, пока тоже думаю создавать штриховку программно.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 14:45:44
Не проверял, но попробуй переключать
HostApplicationServices.WorkingDatabase на открытую базу данных до манипуляций с ней, а затем возвращать обратно.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 14:49:27
Не помогает.  :-[
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 15:08:34
Глянь. Что-то не так?



Код немного порихтовал. Что именно приводит к другому поведению не выяснял.

Код - 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.     }
  43.  


Проверял в AutoCAD 2015 x64 SP2

Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 15:29:21
Спасибо! Скопировал. Попробовал, но у меня тоже самое (.
Попробовал заснять.

AutoCAD 2016 x64 SP1
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 15:41:10
AutoCAD 2016 SP1 x64 Russian (в English аналогично):



У тебя свои какие-нибудь приложения с обработчиками событий не загружены случайно?
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 16:05:20
Нет. Попытался все убрать лишнее. Все сторонние приложения.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 18:13:54
Проверил еще в AutoCAD Civil 3D 2015 и 2016, AutoCAD Architecture 2016 - всё работает нормально. Ищи проблему со своей стороны. Впрочем, если еще кто-то подтвердит такое поведение на моём коде - отправлю в ADN DevHelp.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 19:39:03
Заодно проверь что будет если после завершения твоего кода выполнить _REGENALL - может у тебя просто не выполняется регенерация изображения?
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 19:45:04
Нет. Если зайти в редактор блока и выйти с сохранением, тогда "исправляется" штриховка во всех вхождениях блока.
Пока не нашел причины.
Ассоциативость у штриховки слетает по той же причине - меняю дин параметр блока, он не обновляется и штриховка открепляется от своей полилинии.
Проверю в понедельник на других компах.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 23-01-2016, 19:49:47
Может все-таки попробовать blockReference.RecordGraphicsModified(true)?
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 19:51:37
Да, пробовал. По всякому.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 23-01-2016, 19:54:06
У тебя к этому чертежу привязан файл проверки стандартов (которого у меня нет):
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F64326%2F7842324.5%2F0_116ba7_77465881_orig.png&hash=68a6c114dc845eac471f6de2364ce898)
Ну и еще есть следы от Civil3D и возможно еще чего-то:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F64085%2F7842324.5%2F0_116ba8_80c9e838_orig.png&hash=4d77b4258a28ca4a2fcc0ab34e95a62b)
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 23-01-2016, 20:00:39
Впрочем, если еще кто-то подтвердит такое поведение на моём коде - отправлю в ADN DevHelp
НЕ подтверждаю - тоже попробовал (AutoCad Civil 2016) - сработало как-надо
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 23-01-2016, 21:57:39
У тебя к этому чертежу привязан файл проверки стандартов (которого у меня нет):
Отключил.
Был установлен Civil. Удалил.

Без открытия нового документа работает.
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 24-01-2016, 01:25:30
Похоже тебе придётся переставить AutoCAD начисто. Что-то у тебя с ним не в порядке. Но для начала попробуй создать в нём новый профиль и (перезапустив AutoCAD) проверить снова мой код.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 24-01-2016, 12:30:23
Переустановил автокад. Не помогло. Возможно в виндой что-то. Было одно ЧП - случайно начал удалять все на диске C  :o
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 24-01-2016, 17:27:36
Может в настройках проекта что-то не так.  ::)
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Пекшев aka Modis от 24-01-2016, 17:43:41
Может в настройках проекта что-то не так. 
Ох, Боже! Зачем так много ссылок? Аж 10 штук! Конкретно для этого кода нужны только три: accoremgd.dll, acdbmgd.dll, acmgd.dll

P.S. Прикрепленная dll-ка все-равно у меня сработала как надо
P.P.S. Сервис-паки на автокад все стоят?
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 24-01-2016, 17:46:32
Да. NuGet их все подключает.
При компиляции в сборку включаются зависимости только от используемых в коде сборок.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 24-01-2016, 18:22:00
Давай-ка сделаем обратную процедуру. Проверь этот dll-файл. Команда TEST. Убедись, что запустится команда TEST именно из моей dll-ки.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Вильдар от 24-01-2016, 18:31:37
Сервис-паки на автокад все стоят?
Да. Для 2016 - sp1.

Проверь этот dll-файл.
Проверил. Тоже что и у меня  :'(
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 24-01-2016, 19:05:28
Увы. Идеи закончились. Если ты корректно деинсталлировал AutoCAD, удалил все его следы с диска и реестра, а затем повторно его установил, то у тебя должен быть девственно чистый AutoCAD 2016 SP1. И работать он должен одинаково, что у меня, что у тебя, что у Александр Пекшев aka Modis. Конечно Windows может преподносить сюрпризы, но чтобы они проявлялись так изощренно - очень сомневаюсь.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Максим Маркевич от 29-07-2016, 13:01:45
Код немного порихтовал. Что именно приводит к другому поведению не выяснял.
...
Проверял в 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.     }
Я пытаюсь загнать все в одну транзакцию, но не выходит, блок работает "наполовину", я неправильно понимаю суть транзакции?
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Александр Ривилис от 29-07-2016, 13:47:49
Александр Ривилис, а почему нельзя сделать это в одной транзакции?
В ряде случаев для корректной работы требуется, чтобы примитив был уже добавлен в базу и закрыт. Это приводит к  тому, что AutoCAD выполняет дополнительные действия с примитивом и самой базой (в данном случае добавляет динамические свойства к блоку). И только в следующей транзакции можно быть уверенным, что примитив (в данном случае динамический блок) готов к работе. Иногда это лишнее, а иногда это единственный способ избежать ошибок.
Название: Re: Изменение параметра динамического блока в новом открытом документе?
Отправлено: Максим Маркевич от 29-07-2016, 14:07:19
В ряде случаев для корректной работы требуется, чтобы примитив был уже добавлен в базу и закрыт. Это приводит к  тому, что AutoCAD выполняет дополнительные действия с примитивом и самой базой (в данном случае добавляет динамические свойства к блоку). И только в следующей транзакции можно быть уверенным, что примитив (в данном случае динамический блок) готов к работе. Иногда это лишнее, а иногда это единственный способ избежать ошибок.
Вот, собственно, у меня так и получалось - я вставлял динблок в чертеж и менял в нем кое-какие параметры. Забавно получалось, что внешне блок вставлялся с измененными параметрами, а вот при нажатии на него, ручка была в том месте, где у вхождения блока, причем при расчленении я получал вид как у вхождения. Это все навело меня на мысль, что я что-то неправильно "транзактирую" или же не корректно добавляю инфу о блоке в таблицу блоков.
Off-Topic: показать
Даже хотел было тему создавать, так вот столкнулся с дилемой, создать тему после 30 минут раздумий или после 8 часов раздумий.
В первом случае, я бы получил ответ, например, от Вас (с пометкой, что я не дочитал и не разобрался и что поиском не умею пользоваться - то есть ткнули бы), но вопрос был бы решен за час.
Во втором случае, пришлось искать по форуму и не только, кучу всего читать, разбираться и ДУМАТЬ. Конечно, день потрачен, но вот понимания то больше пришло, в разы.
Так вот, все эти рассуждения к тому, когда же я имею право создавать тему на форуме (через пол часа после "нерешения" вопроса или же через 12 часов) :)
В итоге, я, вроде как, независимо пришел к такому же умозаключению, как в Вашем предыдущем посте, но мне, все равно, понадобилось Ваше авторитетное подтверждение, поэтому я тихонечко спросил в чужой теме. ;)


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