Блок не реагирует на изменение дин свойств

Автор Тема: Блок не реагирует на изменение дин свойств  (Прочитано 11063 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте.
Вставляю блок в новый чертеж при помощи WblockCloneObjects. После вставки блок не реагирует на изменение дин свойств - то есть свойство переключено, но изменения отображения не происходит, блок отображается по-старому. Как можно исправить такую ошибку?
Изменение свойств выполняю таким кодом:
Код - C# [Выбрать]
  1.  public static void SetDynamicBlockProperty(Database db, List<string> blockNames)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             //Database db = doc.Database;
  5.             Editor ed = doc.Editor;
  6.  
  7.             ObjectIdCollection ids = new ObjectIdCollection();
  8.             using (Transaction tr = db.TransactionManager.StartTransaction())
  9.             {
  10.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);
  11.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false, true);
  12.                 foreach (ObjectId entity in btr)
  13.                 {
  14.                     Entity ent = (Entity)tr.GetObject(entity, OpenMode.ForRead);
  15.                     if (ent is BlockReference)
  16.                     {
  17.                         BlockReference bref = tr.GetObject(entity, OpenMode.ForRead, false, true) as BlockReference;
  18.                         ids.Add(bref.BlockTableRecord);
  19.                         if (bref.IsDynamicBlock)
  20.                         {
  21.                             double ang = -1011;
  22.                             BlockTableRecord dynBtr = (BlockTableRecord)tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForWrite, false, true);
  23.                             if (blockNames.Contains(dynBtr.Name))
  24.                             {
  25.                                 DynamicBlockReferencePropertyCollection props = bref.DynamicBlockReferencePropertyCollection;
  26.                                 foreach (DynamicBlockReferenceProperty prop in props)
  27.                                 {
  28.                                     // object[] values = prop.GetAllowedValues();
  29.  
  30.                                     //Switch Property
  31.                                     if (prop.PropertyName.Contains("Visibility") && !prop.ReadOnly)
  32.                                     {
  33.                                         if (prop.Value.ToString() == Selector.VisibilityStates.Removed)
  34.                                         {
  35.                                             prop.Value = Selector.VisibilityStates.Fitted;
  36.                                         }
  37.  
  38.                                         if (prop.Value.ToString() == Selector.VisibilityStates.Hole)
  39.                                         {
  40.                                             prop.Value = Selector.VisibilityStates.HorizontalManhole;
  41.                                         }
  42.                                         if (prop.Value.ToString() == Selector.VisibilityStates.Projection)
  43.                                         {
  44.                                             prop.Value = Selector.VisibilityStates.Projection;
  45.                                         }
  46.                                     }
  47.                                     if (prop.PropertyName == "Angle1" && !prop.ReadOnly)
  48.                                     {
  49.                                         ang = double.Parse(prop.Value.ToString());
  50.                                     }
  51.  
  52.  
  53.                                     if (prop.PropertyName.Contains("Angle") && !prop.ReadOnly && ang != -1011)
  54.                                     {
  55.                                         prop.Value = ang;
  56.                                     }
  57.  
  58.  
  59.  
  60.                                 }
  61.                             }
  62.                         }
  63.                     }
  64.                 }
  65.  
  66.                 var x = MoveWipeoutsToBottom(tr, ids);
  67.                 tr.Commit();
  68.             }
  69.  
  70.             ed.Regen();
  71.         }




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

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

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
bref для чтения открыт

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Сделай отдельную команду, которая выбирает динамический блок и проверяет переключение видимости.
Проверил на отдельной команде
Код - C# [Выбрать]
  1. using System.Collections.Generic;
  2. using System.Linq;
  3.  
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8.  
  9. using DrawingSynchronizer;
  10.  
  11. namespace ClassLibrary5
  12. {
  13.     public class Class1
  14.     {
  15.         [CommandMethod("bll")]
  16.         public static void SetDynamicBlockProperty()
  17.         {
  18.             Document doc = Application.DocumentManager.MdiActiveDocument;
  19.             Database db = doc.Database;
  20.             Editor ed = doc.Editor;
  21.             List<Entity> blockNames = SelectObjectsOnScreen();
  22.  
  23.             ObjectIdCollection ids = new ObjectIdCollection();
  24.             using (Transaction tr = db.TransactionManager.StartTransaction())
  25.             {
  26.                 BlockReference bref = tr.GetObject(blockNames.First().ObjectId, OpenMode.ForWrite, false, true) as BlockReference;
  27.                 ids.Add(bref.BlockTableRecord);
  28.                 if (bref.IsDynamicBlock)
  29.                 {
  30.                     double ang = -1011;
  31.                     BlockTableRecord dynBtr = (BlockTableRecord)tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForWrite, false, true);
  32.  
  33.                     DynamicBlockReferencePropertyCollection props = bref.DynamicBlockReferencePropertyCollection;
  34.                     foreach (DynamicBlockReferenceProperty prop in props)
  35.                     {
  36.                         // object[] values = prop.GetAllowedValues();
  37.  
  38.                         //Switch Property
  39.                         if (prop.PropertyName.Contains("Visibility") && !prop.ReadOnly)
  40.                         {
  41.                             if (prop.Value.ToString() == Selector.VisibilityStates.Removed)
  42.                             {
  43.                                 prop.Value = Selector.VisibilityStates.Fitted;
  44.                             }
  45.  
  46.                             if (prop.Value.ToString() == Selector.VisibilityStates.Hole)
  47.                             {
  48.                                 prop.Value = Selector.VisibilityStates.HorizontalManhole;
  49.                             }
  50.                             if (prop.Value.ToString() == Selector.VisibilityStates.Projection)
  51.                             {
  52.                                 prop.Value = Selector.VisibilityStates.Projection;
  53.                             }
  54.                         }
  55.                        
  56.                     }
  57.                 }
  58.  
  59.                 tr.Commit();
  60.             }
  61.  
  62.             ed.Regen();
  63.         }
  64.  
  65.         public static List<Entity> SelectObjectsOnScreen()
  66.         {
  67.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  68.             Document doc = Application.DocumentManager.MdiActiveDocument;
  69.             Database db = doc.Database;
  70.             Transaction tr = db.TransactionManager.StartTransaction();
  71.  
  72.             List<Entity> listOfEntities = new List<Entity>();
  73.  
  74.             using (tr)
  75.             {
  76.                 // Request for objects to be selected in the drawing area
  77.                 PromptSelectionResult PrSeRes = doc.Editor.GetSelection();
  78.  
  79.                 // If the prompt status is OK, objects were selected
  80.                 if (PrSeRes.Status == PromptStatus.OK)
  81.                 {
  82.                     SelectionSet SelSet = PrSeRes.Value;
  83.  
  84.                     // Step through the objects in the selection set
  85.                     foreach (SelectedObject SelObj in SelSet)
  86.                     {
  87.                         // Check to make sure a valid SelectedObject object was returned
  88.                         if (SelObj != null)
  89.                         {
  90.                             // Open the selected object for write
  91.                             Entity entity = (Entity)tr.GetObject(SelObj.ObjectId, OpenMode.ForRead, false, true);
  92.  
  93.                             if (entity != null)
  94.                             {
  95.                                 listOfEntities.Add(entity);
  96.                             }
  97.                         }
  98.                     }
  99.                 }
  100.  
  101.                 tr.Commit();
  102.             }
  103.  
  104.             return listOfEntities;
  105.         }
  106.     }
  107. }
  108. namespace DrawingSynchronizer
  109. {
  110.     public class Selector
  111.     {
  112.         public struct VisibilityStates
  113.         {
  114.             public static readonly string Fitted = "Fitted";
  115.             public static readonly string Removed = "Removed";
  116.             public static readonly string Hole = "Hole";
  117.             public static readonly string HorizontalManhole = "Horizontal manhole";
  118.             public static readonly string Projection = "Projection";
  119.         }
  120.     }
  121. }
  122.  
  123.  

Блок не реагирует на нее.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Хочется очень сильно ругаться. Ты в очередной раз наступаешь на те же самые грабли в функции SelectObjectsOnScreen.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Хочется очень сильно ругаться. Ты в очередной раз наступаешь на те же самые грабли в функции SelectObjectsOnScreen.

Вспомнил про передачу ObectId вместо объектов. Исправил.
Код - C# [Выбрать]
  1. using System.Collections.Generic;
  2. using System.Linq;
  3.  
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8.  
  9. using DrawingSynchronizer;
  10.  
  11. namespace ClassLibrary5
  12. {
  13.     public class Class1
  14.     {
  15.         [CommandMethod("bll")]
  16.         public static void SetDynamicBlockProperty()
  17.         {
  18.             Document doc = Application.DocumentManager.MdiActiveDocument;
  19.             Database db = doc.Database;
  20.             Editor ed = doc.Editor;
  21.             List<ObjectId> blockNames = SelectObjectsOnScreen();
  22.  
  23.             ObjectIdCollection ids = new ObjectIdCollection();
  24.             using (Transaction tr = db.TransactionManager.StartTransaction())
  25.             {
  26.                 BlockReference bref = tr.GetObject(blockNames.First(), OpenMode.ForWrite, false, true) as BlockReference;
  27.                 ids.Add(bref.BlockTableRecord);
  28.                 if (bref.IsDynamicBlock)
  29.                 {
  30.                     double ang = -1011;
  31.                     BlockTableRecord dynBtr = (BlockTableRecord)tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForWrite, false, true);
  32.  
  33.                     DynamicBlockReferencePropertyCollection props = bref.DynamicBlockReferencePropertyCollection;
  34.                     foreach (DynamicBlockReferenceProperty prop in props)
  35.                     {
  36.                         // object[] values = prop.GetAllowedValues();
  37.  
  38.                         //Switch Property
  39.                         if (prop.PropertyName.Contains("Visibility") && !prop.ReadOnly)
  40.                         {
  41.                             if (prop.Value.ToString() == Selector.VisibilityStates.Removed)
  42.                             {
  43.                                 prop.Value = Selector.VisibilityStates.Fitted;
  44.                             }
  45.  
  46.                             if (prop.Value.ToString() == Selector.VisibilityStates.Hole)
  47.                             {
  48.                                 prop.Value = Selector.VisibilityStates.HorizontalManhole;
  49.                             }
  50.                             if (prop.Value.ToString() == Selector.VisibilityStates.Projection)
  51.                             {
  52.                                 prop.Value = Selector.VisibilityStates.Projection;
  53.                             }
  54.                         }
  55.                     }
  56.                 }
  57.  
  58.                 tr.Commit();
  59.             }
  60.  
  61.             ed.Regen();
  62.         }
  63.  
  64.         public static List<ObjectId> SelectObjectsOnScreen()
  65.         {
  66.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  67.             Document doc = Application.DocumentManager.MdiActiveDocument;
  68.             Database db = doc.Database;
  69.             Transaction tr = db.TransactionManager.StartTransaction();
  70.  
  71.             List<ObjectId> listOfEntities = new List<ObjectId>();
  72.  
  73.             using (tr)
  74.             {
  75.                 // Request for objects to be selected in the drawing area
  76.                 PromptSelectionResult PrSeRes = doc.Editor.GetSelection();
  77.  
  78.                 // If the prompt status is OK, objects were selected
  79.                 if (PrSeRes.Status == PromptStatus.OK)
  80.                 {
  81.                     SelectionSet SelSet = PrSeRes.Value;
  82.  
  83.                     // Step through the objects in the selection set
  84.                     foreach (SelectedObject SelObj in SelSet)
  85.                     {
  86.                         // Check to make sure a valid SelectedObject object was returned
  87.                         if (SelObj != null)
  88.                         {
  89.                             listOfEntities.Add(SelObj.ObjectId);
  90.                         }
  91.                     }
  92.                 }
  93.  
  94.                 tr.Commit();
  95.             }
  96.  
  97.             return listOfEntities;
  98.         }
  99.     }
  100. }
  101.  
  102.  
  103. namespace DrawingSynchronizer
  104. {
  105.     public class Selector
  106.     {
  107.         public struct VisibilityStates
  108.         {
  109.             public static readonly string Fitted = "Fitted";
  110.             public static readonly string Removed = "Removed";
  111.             public static readonly string Hole = "Hole";
  112.             public static readonly string HorizontalManhole = "Horizontal manhole";
  113.             public static readonly string Projection = "Projection";
  114.         }
  115.     }
  116. }

Прикладываю файл примера
Еще из примечательного - при попытке ctrl+c блока выдается сообщение Failed copy to clipboard.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
посмотри какие значения возвращает prop.GetAllowedValues() для твоего дин свойства

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
посмотри какие значения возвращает prop.GetAllowedValues() для твоего дин свойства
Посмотрел. Все как надо - 5 возможных состояний блока.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Получи возможные значения дин. свойства.
Проверь что среди них есть то, которое ты хочешь установить.
Потом, у тебя меняется видимость, только для первого выбранного блока. Может для него ничего и не меняется, по твоим ифам  :o
Пройдись отладкой, посмотри что происходит.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Уровень кода низковат. Надо бы основны подтянуть по шарпу. Там Совершенный код почитать  8)

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще из примечательного - при попытке ctrl+c блока выдается сообщение Failed copy to clipboard.
В AutoCAD 2020 копирует и нормально вставляет. При этом блок исправляется. Попробуй вызывать BlockReference.ResetBlock , а после этого назначать динамические свойства. Вполне возможно, что он у тебя при вставке уже каким-то образом был испорчен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
В AutoCAD 2020 копирует и нормально вставляет
У меня 2015 :(

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
В AutoCAD 2020 копирует и нормально вставляет
У меня 2015 :(
Проверил в AutoCAD 2015 SP2 (со всеми обновлениями) - блок копируется и вставляется без ошибок. При этом становится нормальным. И ResetBlock исправляет.


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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
ResetBlock исправляет
. У меня при вызове Reset все установки блока сбрасываются и он меняет свое положение (Align меняет свое значение на умолчание). То есть чертеж искажается. Да, блок восстанавливает работоспособность, но проходить сотню блоков в чертеже и заново их перепривязывать трудоемко. Это не подходит. Есть какой-нибудь другой способ?