Установить flip state

Автор Тема: Установить flip state  (Прочитано 3852 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Установить flip state
« : 02-04-2020, 15:37:27 »
Здравствуйте!
Создаю blockReference по данным из базы(там все значения правильные - проверено) все работает кроме назначения flip state - оно всегда остается 0. Как это исправить?
Код - C# [Выбрать]
  1.         public void ResurrectDeletedBlockReferenceFromDatabase(List<long> deletedBlockReferences, List<DbBlockReference> dbBlockReferences, string layer)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             Database db = doc.Database;
  5.             Transaction tr = db.TransactionManager.StartTransaction();
  6.  
  7.             List<DbBlockReference> bRefToResurrect = new List<DbBlockReference>();
  8.             foreach (DbBlockReference item in dbBlockReferences)
  9.             {
  10.                 if (deletedBlockReferences.Contains(item.Handle))
  11.                 {
  12.                     bRefToResurrect.Add(item);
  13.                 }
  14.             }
  15.  
  16.             using ( tr )
  17.             {
  18.                 BlockTable bt = (BlockTable) db.BlockTableId.GetObject(OpenMode.ForRead);
  19.                 for ( int i = 0; i < bRefToResurrect.Count; i++ )
  20.                 {
  21.                     string line = bRefToResurrect[ i ].Position.Trim('(', ')');
  22.                     double[] values = line.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(s => double.Parse(s)).ToArray();
  23.                     Point3d position = new Point3d(values);
  24.                     BlockTableRecord btr = (BlockTableRecord) bt[ bRefToResurrect[ i ].Name ].GetObject(OpenMode.ForRead);
  25.                     BlockTableRecord curSpace_btr = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  26.                     BlockReference bRef = new BlockReference(position, btr.ObjectId);
  27.                     bRef.SetDatabaseDefaults();
  28.                     bRef.Layer = layer;
  29.                     bRef.Linetype = bRefToResurrect[ i ].Linetype;
  30.                     bRef.LineWeight = bRefToResurrect[ i ].Lineweight;
  31.                     bRef.ColorIndex = 10;
  32.                     bRef.Rotation = bRefToResurrect[ i ].Rotation;
  33.                     bRef.ScaleFactors = new Scale3d(bRefToResurrect[ i ].ScaleX, bRefToResurrect[ i ].ScaleY, 1);
  34.                    
  35.                     curSpace_btr.AppendEntity(bRef);
  36.                     tr.AddNewlyCreatedDBObject(bRef, true);
  37.                     if ( btr.HasAttributeDefinitions )
  38.                     {
  39.                         foreach ( ObjectId objID in btr )
  40.                         {
  41.                             DBObject dbObject = tr.GetObject(objID, OpenMode.ForRead);
  42.                             if ( dbObject is AttributeDefinition )
  43.                             {
  44.                                 AttributeDefinition attDef = dbObject as AttributeDefinition;
  45.                                 if ( attDef.Constant == false )
  46.                                 {
  47.                                     AttributeReference attRef = new AttributeReference();
  48.                                     attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform);
  49.                                     attRef.Position = attDef.Position.TransformBy(bRef.BlockTransform);
  50.                                     attRef.TextString = attDef.TextString;
  51.                                     bRef.AttributeCollection.AppendAttribute(attRef);
  52.                                     tr.AddNewlyCreatedDBObject(attRef, true);
  53.                                 }
  54.                             }
  55.                         }
  56.                     }
  57.  
  58.                     if ( bRef.IsDynamicBlock )
  59.                     {
  60.                         // BlockTableRecord dynBtr = (BlockTableRecord)tr.GetObject(bRef.DynamicBlockTableRecord, OpenMode.ForRead, false, true);
  61.                         DynamicBlockReferencePropertyCollection props = bRef.DynamicBlockReferencePropertyCollection;
  62.                         foreach ( DynamicBlockReferenceProperty prop in props )
  63.                         {
  64.                             object[] values0 = prop.GetAllowedValues();
  65.  
  66.                             //Switch Property
  67.                             if ( (prop.PropertyName == "Visibility") && !prop.ReadOnly )
  68.                             {
  69.                                 prop.Value = bRefToResurrect[ i ].VisibilityState;
  70.                             }
  71.                             if ((prop.PropertyName.Contains("Flip") && prop.VisibleInCurrentVisibilityState))
  72.                             {
  73.                                 prop.Value = bRefToResurrect[i].Flip;
  74.                             }
  75.                         }
  76.                     }
  77.  
  78.                 }
  79.  
  80.                 tr.Commit();
  81.             }
  82.         }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #1 : 02-04-2020, 15:43:01 »
Atomohod,
Предоставь тестовый dwg-файл и тестовый проект - попробую разобраться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #2 : 02-04-2020, 20:54:21 »
Вот пример работающего кода:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. // This line is not mandatory, but improves loading performances
  7. [assembly: CommandClass(typeof(ChangeBlockFlip.MyCommands))]
  8.  
  9. namespace ChangeBlockFlip
  10. {
  11.   public class MyCommands
  12.   {
  13.     [CommandMethod("ChangeBlockFlip")]
  14.     public void ChangeBlockFlipHandler() // This method can have any name
  15.     {
  16.       Document doc = Application.DocumentManager.MdiActiveDocument;
  17.       if (doc == null) return;
  18.       Editor ed = doc.Editor;
  19.       PromptEntityOptions prOpt = new PromptEntityOptions("\nВыберите блок: ");
  20.       prOpt.SetRejectMessage("Это не блок!");
  21.       prOpt.AddAllowedClass(typeof(BlockReference), true);
  22.       PromptEntityResult prRes = ed.GetEntity(prOpt);
  23.       if (prRes.Status == PromptStatus.OK)
  24.       {
  25.         using (Transaction tr = doc.TransactionManager.StartTransaction())
  26.         {
  27.           BlockReference br = tr.GetObject(prRes.ObjectId, OpenMode.ForWrite) as BlockReference;
  28.           DynamicBlockReferencePropertyCollection dbpCol = br.DynamicBlockReferencePropertyCollection;
  29.           foreach (DynamicBlockReferenceProperty dbp in dbpCol)
  30.           {
  31.             if (dbp.PropertyName.Contains("Flip") && !dbp.ReadOnly)
  32.             {
  33.               short oldval = (short) dbp.Value;
  34.               dbp.Value = (short)(1 - oldval); // Было 1 - станет 0 и наоборот. short - обязательно!
  35.             }
  36.           }
  37.           tr.Commit();
  38.         }
  39.       }
  40.     }
  41.   }
  42. }

Вот как это выглядит:

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #3 : 02-04-2020, 21:06:34 »
Почему нельзя использовать проверку prop.VisibleInCurrentVisibilityState? Если у меня в блок записано 4 разных типоразмера двери и для каждого свой флип, то как я узнаю что переключил именно видимый типоразмер без проверки?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #4 : 02-04-2020, 21:07:54 »
Почему нельзя использовать проверку prop.VisibleInCurrentVisibilityState?
Кто сказал, что нельзя???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #5 : 02-04-2020, 21:18:50 »
Замени в своём коде:
Код - C# [Выбрать]
  1. prop.Value = bRefToResurrect[i].Flip;
на
Код - C# [Выбрать]
  1. prop.Value = (short)bRefToResurrect[i].Flip;
Этого должно быть достаточно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #6 : 02-04-2020, 21:21:50 »
Кто сказал, что нельзя???
В рабочем примере удалено и заменено на проверку read only. Но зачем проверять чтение- вроде флип для чтения не бывает?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #7 : 02-04-2020, 21:24:45 »
Кто сказал, что нельзя???
В рабочем примере удалено и заменено на проверку read only. Но зачем проверять чтение- вроде флип для чтения не бывает?
1. Я не использовал рабочий пример, а написал свой - иначе мне еще очень долго пришлось бы ждать готовый демонстрационный проект без всего лишнего.
2. Еще раз - самое главное из-за чего не работал код - это то, что prop.Value не было приведено к типу short.

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #8 : 02-04-2020, 21:29:38 »
Этого должно быть достаточно.
Не помогло. Про шорт я думал вначале - у меня уже в базе это значение в нем хранится. И извлекается для записи в базу тоже шорт:
Код - C# [Выбрать]
  1. string name = default;
  2.                     string currentVisibility = default;
  3.                     short flip = default;
  4.                     if ( bRef.IsDynamicBlock )
  5.                     {
  6.                         // получаем настоящее имя блока.
  7.                         BlockTableRecord blockname = tr.GetObject(bRef.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  8.                         name = blockname.Name;
  9.                         BlockTableRecord dynBtr = (BlockTableRecord) tr.GetObject(bRef.DynamicBlockTableRecord, OpenMode.ForRead, false, true);
  10.                         DynamicBlockReferencePropertyCollection props = bRef.DynamicBlockReferencePropertyCollection;
  11.                         foreach ( DynamicBlockReferenceProperty prop in props )
  12.                         {
  13.                             object[] values = prop.GetAllowedValues();
  14.  
  15.                             //Switch Property
  16.                             if ( (prop.PropertyName == "Visibility") && !prop.ReadOnly )
  17.                             {
  18.                                 currentVisibility = prop.Value.ToString();
  19.                             }
  20.  
  21.                             if ( (prop.PropertyName.Contains("Flip") && prop.VisibleInCurrentVisibilityState) )
  22.                             {
  23.                                 flip = short.Parse(prop.Value.ToString());
  24.                             }
  25.                         }
  26.                     }
Вот как в базе


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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #9 : 02-04-2020, 21:31:44 »
Может Ваш пример работает потому, что он переключает существующее  значение флип, а не устанавливает его при создании как у меня?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #10 : 02-04-2020, 21:42:55 »
Может Ваш пример работает потому, что он переключает существующее  значение флип, а не устанавливает его при создании как у меня?
Мой пример работает потому, что я не переключаю Visibility. Переключать Visibility и проверять prop.VisibleInCurrentVisibilityState следует как минимум в разных транзакциях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #11 : 02-04-2020, 21:58:41 »
Мой пример работает потому, что я не переключаю Visibility
Да я вроде тоже не переключаю - вставка блока создается с нуля, то есть я его инициализирую(устанавливаю). Или я неправильно понимаю механизм? Почему нельзя полностью сформировать вставку блока (положение, видимость, флип и т.д) в одной транзакции?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #12 : 02-04-2020, 22:00:14 »
Или я неправильно понимаю механизм?
Понимаешь неправильно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Установить flip state
« Ответ #13 : 02-04-2020, 22:55:16 »
    Или я неправильно понимаю механизм?

Понимаешь неправильно.
А как они взаимодействуют? Как мне понять где должны быть границы транзакций - что можно в одной, а что надо уже выносить в другую или несколько других?

Отмечено как Решение Atomohod 04-04-2020, 18:32:31

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить flip state
« Ответ #14 : 02-04-2020, 22:56:55 »
Как мне понять где должны быть границы транзакций - что можно в одной, а что надо уже выносить в другую или несколько других?
В одной установи видимость, во второй - всё остальное.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение