Изменение нескольких свойств динамического блока

Автор Тема: Изменение нескольких свойств динамического блока  (Прочитано 4256 раз)

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

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Доброго времени суток, Уважаемые!

Ситуация: динамический блок загружается из другого файла. У этого динблока есть 2 параметра Width и Height. При изменении этих параметров (программное изменение) изменяется только ОДИН параметр. Как решить проблему, чтобы менялись ОБА параметра
Код - C [Выбрать]
  1.             this.format = new AFormat(format, (int)crat, orientation);
  2.             string fileName = "Test.dwg", blockName = "Test";
  3.             try
  4.             {
  5.                 using (DocumentLock acLckDoc = this.document.LockDocument())
  6.                 {
  7.                     using (Transaction acTrans = this.database.TransactionManager.StartTransaction())
  8.                     {
  9.                         BlockTable acBlkTbl = acTrans.GetObject(this.database.BlockTableId, OpenMode.ForRead) as BlockTable;
  10.                         ObjectId blkRecId = ObjectId.Null;
  11.                         blkRecId = acBlkTbl[blockName];
  12.                         this.format = new AFormat(format, crat, orientation);
  13.                         this.BRef = new BlockReference(new Point3d(0, 0, 0), blkRecId);
  14.                         DynamicBlockReferencePropertyCollection blkPropCollect = this.BRef.DynamicBlockReferencePropertyCollection;
  15.                         foreach (DynamicBlockReferenceProperty prop in blkPropCollect)
  16.                         {
  17.                             object[] values = prop.GetAllowedValues();
  18.                             if (prop.PropertyName == "Width" && !prop.ReadOnly)
  19.                             {
  20.                                 if (this.format.Orientation == "HEIGHT")
  21.                                     prop.Value = values[this.format.index];
  22.                                 else
  23.                                     prop.Value = values[this.format.index+1];
  24.                             }
  25.                             if (prop.PropertyName == "Height" && !prop.ReadOnly)
  26.                             {
  27.                                 if (this.format.Orientation == "HEIGHT")
  28.                                     prop.Value = values[this.format.index+1];
  29.                                 else
  30.                                     prop.Value = values[this.format.index];
  31.                             }
  32.                             editor.WriteMessage("\n" + prop.PropertyName);
  33.                         }
  34.                         BlockJig entJig = new BlockJig(this.BRef);
  35.                         BlockTableRecord ms = (BlockTableRecord)acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  36.                         PromptResult pr = this.editor.Drag(entJig);
  37.                         if (pr.Status == PromptStatus.OK)
  38.                         {
  39.                             ms.AppendEntity(this.BRef);
  40.                             acTrans.AddNewlyCreatedDBObject(this.BRef, true);
  41.                         }
  42.                         acTrans.Commit();
  43.                     }
  44.                 }
  45.             }
  46.             catch (System.Exception e)
  47.             {
  48.                 MessageBox.Show(e.Message);
  49.             }
  50.  

Собственно, интересует фрагмент
Код - C [Выбрать]
  1.                         foreach (DynamicBlockReferenceProperty prop in blkPropCollect)
  2.                         {
  3.                             object[] values = prop.GetAllowedValues();
  4.                             if (prop.PropertyName == "Width" && !prop.ReadOnly)
  5.                             {
  6.                                 if (this.format.Orientation == "HEIGHT")
  7.                                     prop.Value = values[this.format.index];
  8.                                 else
  9.                                     prop.Value = values[this.format.index+1];
  10.                             }
  11.                             if (prop.PropertyName == "Height" && !prop.ReadOnly)
  12.                             {
  13.                                 if (this.format.Orientation == "HEIGHT")
  14.                                     prop.Value = values[this.format.index+1];
  15.                                 else
  16.                                     prop.Value = values[this.format.index];
  17.                             }
  18.                             editor.WriteMessage("\n" + prop.PropertyName);
  19.                         }
  20.  
При трассировке программа заходит во все необходимые условия, но именно изменения, как таковые срабатывают только на параметр Width
« Последнее редактирование: 29-05-2018, 10:21:44 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
garmayev,
Прочитай у меня в подписи про форматирование кода на нашем форуме и исправь его в своём сообщении!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
garmayev
А если вручную менять свойство Height, то всё работает? Для проверки не хватает самого блока (dwg-файла). И понимания того, какие разрешенные значения заданы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
А если вручную менять свойство Height

Если менять свойства из пространства модели мышкой, то все меняется.
При попытке программного изменения - фиг вам (индейская национальная изба)

Во вложении блок, который я накидал

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если менять свойства из пространства модели мышкой, то все меняется.
У меня вручную меняется только ширина. Высота не меняется. Запиши видео как это у тебя работает вручную. Похоже нужно править сам блок. Кроме того сначала BlockReference нужно добавлять в базу, а уже потом можно менять его динамические свойства.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
сначала BlockReference нужно добавлять в базу

Вот функция импорта блока в новый чертеж

Код - C# [Выбрать]
  1.         public static void ImportBlock(string fileName, string blockName)
  2.         {
  3.             using (DocumentLock lockdoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  4.             {
  5.                 Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  6.                 using (Database OpenDb = new Database(false, true))
  7.                 {
  8.                     OpenDb.ReadDwgFile(fileName, System.IO.FileShare.ReadWrite, true, "");
  9.  
  10.                     ObjectIdCollection ids = new ObjectIdCollection();
  11.                     using (Transaction trans = OpenDb.TransactionManager.StartTransaction())
  12.                     {
  13.                         BlockTable bt = (BlockTable)trans.GetObject(OpenDb.BlockTableId, OpenMode.ForRead);
  14.  
  15.                         if (bt.Has(blockName))
  16.                         {
  17.                             ids.Add(bt[blockName]);
  18.                         }
  19.  
  20.                         if (ids.Count != 0)
  21.                         {
  22.                             Database destdb = doc.Database;
  23.                             IdMapping iMap = new IdMapping();
  24.                             destdb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
  25.                         }
  26.                         trans.Commit();
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.  

А как создать блок, у которого можно поменять ширину и высоту? Просто я до этого в автокаде вообще не работал, вот и приходится изучать все методом научного тыка и тупейшими вопросами опытным людям =)

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

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

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Не могли бы вы накидать простой блок (рамку, прямоугольник), который можно было изменять программно?

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

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

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Простите, что долго не отвечал.
Да, дело оказалось в неправильном блоке.

Перерисовал блок в соответствии с данной статьей
Ширина и высота изменяются, но при первом же программном изменении размеров - перестает реагировать ручной метод (т.е. из пространства модели, если меняю параметр - то "фиг вам, называется"), если же блок вставлять "как есть", и уже потом вручную менять размер - то все в порядке.

Я так понимаю слетает какой-то слушатель события. Как подписаться/переписать этот слушатель?

Т.е. мне нужно, чтобы:
1. был динамический блок, который я импортирую из другого чертежа
2. изменялся программно сразу же, как я его вставил
3. имел параметр, который пользователь может сам изменить вручную (формат рамки)

Вот код, которым я меняю его параметр:
Код - C# [Выбрать]
  1.         public void Resize()
  2.         {
  3.             foreach (DynamicBlockReferenceProperty obj in this.BRef.DynamicBlockReferencePropertyCollection)
  4.             {
  5.                 if (obj.PropertyName != "Origin")
  6.                 {
  7.                     editor.WriteMessage(obj.PropertyName + "\n");
  8.                     foreach (Object value in obj.GetAllowedValues())
  9.                     {
  10.                         editor.WriteMessage("Значение: " + value + "\n");
  11.                         if (value.ToString() == "A" + format.index + " (" + ((format.Orientation == "WIDTH") ? "Width)" : "Height)"))
  12.                         {
  13.                             obj.Value = value;
  14.                         }
  15.                     }
  16.  
  17.                 }
  18.             }
  19.         }
  20.  

И собственно сам блок во вложении
« Последнее редактирование: 06-06-2018, 14:25:43 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так понимаю слетает какой-то слушатель события. Как подписаться/переписать этот слушатель?
Такого нет. У тебя в коде я не вижу транзакции. Поэтому неясно подтверждается она или нет. Посмотрел блок. Тебе достаточно изменять в нём свойство Format. Height и Width будут меняться автоматически.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн garmayevАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
У тебя в коде я не вижу транзакции

Транзакция подтверждается. Т.е. в пространстве модели размер блока изменяется. Не изменяется свойство Format на палитре свойств.

Тебе достаточно изменять в нём свойство Format
Если вставить блок и изменить это свойство "ручками" (т.е. на палитре свойств), то все нормально, стоит только изменить его программно, как реакция блока на это свойство с палитре теряется

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
garmayev
Надеюсь ты уже сделал то, что я предложил выше:
Тебе достаточно изменять в нём свойство Format. Height и Width будут меняться автоматически.
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение