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

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Добрый день всем.
Некорректное поведение дин блока при изменении его параметра, если это выполняется в новом открытом документе.
Тестовый пример:
Код - 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.       }
Результат на первой картинке. А должно быть как на второй.
Ассоциативная штриховка не обновилась.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Могу предположить, что сам блок сделан неверно. Ассоциативность в автокаде, лично для меня, вещь не надежная - стараюсь ей не пользоваться (особенно касается размеров)
Скорее всего в блоке в параметр растяжения нужно добавить и штриховку тоже. ИМХО

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Если не открывать новый документ, а выполнить изм дин параметра блока в текущем документе, то все норм.

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



Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Попробуй с этим блоком
Я никогда не делал штриховку в блоке. Как ни странно для меня, но ассоциативность пришлось оставить

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Не. Вот что получается - вся штриховка сдвигается.
Странно, раньше мы, вроде, делали растяжение штриховки линейным параметром (без ассоциативности), тоже все работало  :-[

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ну не программно если - блок у вас правильно работает?

Еще эту тему посмотрите - http://adn-cis.org/forum/index.php?topic=3348.0

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Да, непрограммно, правильно работает блок (с ассоциативной штриховкой).

Еще один момент заметил в рабочем варианте.
При копировании блоков с помощью WblockCloneObjects, ассоциативность штриховки в дин блоке пропадает.  :(
Ошибся. WblockCloneObjects тут не причем. какая-то другая причина.  :-[
« Последнее редактирование: 23-01-2016, 14:50:19 от vildar82 »

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Значит придется вам ассоциативность штриховки "восстанавливать". Вот нашел по теме  http://www.acadnetwork.com/index.php?topic=259.0
Но самый лучший вариант - убрать ее нафиг из блока! ИМХО

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Да, пока тоже думаю создавать штриховку программно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не проверял, но попробуй переключать
HostApplicationServices.WorkingDatabase на открытую базу данных до манипуляций с ней, а затем возвращать обратно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Глянь. Что-то не так?



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

Код - 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

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Спасибо! Скопировал. Попробовал, но у меня тоже самое (.
Попробовал заснять.

AutoCAD 2016 x64 SP1

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
AutoCAD 2016 SP1 x64 Russian (в English аналогично):



У тебя свои какие-нибудь приложения с обработчиками событий не загружены случайно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Нет. Попытался все убрать лишнее. Все сторонние приложения.