Miror и Blockreference

Автор Тема: Miror и Blockreference  (Прочитано 6744 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Miror и Blockreference
« : 12-05-2020, 14:44:04 »
Всех приветствуют.
Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился? Системная переменная не помогает, делаю по примеру из хелпа https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-B0565F5A-03CC-426B-9A1D-4280A6187BDA
Я нашёл вот эту тему https://forums.autodesk.com/t5/net/using-matrix-mirroring-attributes-are-not-following-mirrtext-0/td-p/8643716 , но там что-то жёстко, для такой проблемы  ;D

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #1 : 12-05-2020, 14:50:53 »
Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился?
В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Но возможно в ActiveX/COM:


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

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Miror и Blockreference
« Ответ #2 : 12-05-2020, 14:57:34 »
Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился?
В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Но возможно в ActiveX/COM:

Это как?
Может проще сделать через "SendStringToExecute"?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #3 : 12-05-2020, 15:02:53 »
Может проще сделать через "SendStringToExecute"?
Фуууууууууууу!!!!!!!!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Miror и Blockreference
« Ответ #4 : 12-05-2020, 15:06:11 »
Может проще сделать через "SendStringToExecute"?
Фуууууууууууу!!!!!!!!
Вот сделать обратный блок, это точно фууууууу  ;D Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода, а тут такая засада. Непонятно почему разработчики не предусмотрели это.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #5 : 12-05-2020, 15:08:25 »
Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода
Отзеркалить блок или 20 тысяч строк кода? Что-то ты меня запутал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Miror и Blockreference
« Ответ #6 : 12-05-2020, 15:12:26 »
Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода
Отзеркалить блок или 20 тысяч строк кода? Что-то ты меня запутал.

Да я ошибся, должно было быть так

Просто мне отзеркалить нужно только один раз примерно в 20 тысячах строк кода

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Miror и Blockreference
« Ответ #7 : 12-05-2020, 15:27:43 »


Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился?
Насколько помню, не все хорошо с поворотами или отзеркаливанием атрибутов. У нас делали динамические блоки с ручками, но если честно, как-то сложно и ненадежно с привязками. Может можно обойтись созданием доп. блока?

В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Т.е. после отзеркаливания блока нужно будет свойство Normal у AttributeReference поменять обратно и возможно поменять координаты атрибутов?
После _attsync свойство Normal не слетит обратно?

Отмечено как Решение Lemieux 12-05-2020, 19:57:12

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #8 : 12-05-2020, 15:35:45 »
Попробуй:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(MirrorBlock.MyCommands))]
  10.  
  11. namespace MirrorBlock
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("MirrorBlk")]
  16.     public void MirrorBlk() // This method can have any name
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       PromptEntityOptions peo =
  22.         new PromptEntityOptions("\nВыберите блок:");
  23.       peo.SetRejectMessage("\nЭто не блок!");
  24.       peo.AddAllowedClass(typeof(BlockReference), true);
  25.       PromptEntityResult per = ed.GetEntity(peo);
  26.       if (per.Status != PromptStatus.OK) return;
  27.       PromptPointResult rs1 = ed.GetPoint("\nУкажите первую точку оси");
  28.       if (rs1.Status != PromptStatus.OK) return;
  29.       PromptPointResult rs2 = ed.GetPoint("\nУкажите вторую точку оси");
  30.       if (rs2.Status != PromptStatus.OK) return;
  31.  
  32.       using (Transaction tr = doc.TransactionManager.StartOpenCloseTransaction())
  33.       {
  34.         Entity ent = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Entity;
  35.         dynamic aent = ent.AcadObject;
  36.         aent.Mirror(rs1.Value.ToArray(), rs2.Value.ToArray());
  37.         ent.UpgradeOpen();
  38.         ent.Erase();
  39.         tr.Commit();
  40.       }
  41.     }
  42.   }
  43. }
  44.  

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

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #9 : 12-05-2020, 15:37:18 »
Т.е. после отзеркаливания блока нужно будет свойство Normal у AttributeReference поменять обратно
Причем здесь Normal? Тут скорее Rotation нужно будет поменять.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Miror и Blockreference
« Ответ #10 : 12-05-2020, 15:51:43 »
Причем здесь Normal? Тут скорее Rotation нужно будет поменять.
До этого не пробовал зеркалить и смотреть свойства. Ну да с обычным DbText попробовал, меняются свойства Rotation и IsMirroredInX.

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Miror и Blockreference
« Ответ #11 : 12-05-2020, 20:00:02 »
Попробуй:
Круто, вот это магия! Чем больше пишу модулей тем более интересней становится узнавать архитектуру AutoCAD. Спасибо!

Может можно обойтись созданием доп. блока?
Я уже думал об этом :)

Оффлайн adidas1380

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Miror и Blockreference
« Ответ #12 : 15-02-2021, 00:30:33 »
А как получить теперь ID объекта ,который стал зеркальным сразу в коде получить  если нужно ,например, еще раз отзеркалить? И можно ли пояснить эту строку "dynamic aent = ent.AcadObject;"?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #13 : 15-02-2021, 00:43:51 »
А как получить теперь ID объекта ,который стал зеркальным сразу в коде получить  если нужно ,например, еще раз отзеркалить? И можно ли пояснить эту строку "dynamic aent = ent.AcadObject;"?
Ответ на второй вопрос - мы используем COM/ActiveX модель AutoCAD для операции Mirror. Метод AcadObject как раз и возвращает объект в смысле COM/ActiveX. Что такое dynamic в C# ищи в интернете.
Код - C# [Выбрать]
  1. dynamic aent = ent.AcadObject;
  2. dynamic aentMirr = aent.Mirror(rs1.Value.ToArray(), rs2.Value.ToArray());
1) aentMirr - это отзеркаленный объект.
2) aentMirr.ObjectID - это его ID в смысле COM/ActiveX. Но для работы с ним через в AutoCAD .NET API его нужно преобразовать в ObjectId при помощи метода new ObjectId(aentMirr.ObjectID)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн adidas1380

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Miror и Blockreference
« Ответ #14 : 15-02-2021, 01:05:57 »
Спасибо!

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Miror и Blockreference
« Ответ #15 : 27-02-2024, 21:57:12 »
Доброго времени суток.
Мучаю Mirror для дин. блока уже три дня (нужно отражать несколько блоков за раз). Та же проблема с атрибутами. Хотя до этого благополучно было реализовано на VBA. Только наткнулся на пост, что подтвердило мои "опасения", что легче всего через COM/ActiveX модель AutoCAD. Завтра попробую реализовать. Спасибо!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Miror и Blockreference
« Ответ #16 : 29-02-2024, 21:42:43 »
М.б. mirrtext ?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #17 : 29-02-2024, 21:52:39 »
М.б. mirrtext ?
На реализацию с помощью AutoCAD.NET API не влияет и влияет на реализацию при помощи COM/ActiveX (даже в .NET)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Miror и Blockreference
« Ответ #18 : 01-03-2024, 14:20:07 »
Было два пути:
1 Использовать метод Transform.
2 Сделать через Com/ActiveX (как в старом добром VBA) - спасибо Александр Ривилис, за подсказку по реализации.
Т.к. в блоке куча атрибутов, то первый способ потребует использовать "бубен" чтобы нормально отразить каждый (переменная MIRRTEXT не влияет). Поэтому второй способ значительно проще (4 строчки кода):

Код - C# [Выбрать]
  1. // Переходим в COM/ActiveX
  2. dynamic acComObject = blockRef.AcadObject; // Преобразуем BlockReference в COM/ActiveX объект AutoCAD
  3. dynamic acComObjectMirr = acComObject.Mirror(wcsInsertionPoint.ToArray(), wcsInnerPoint.ToArray()); // Mirror of the COM/ActiveX object
  4.  
  5. IntPtr pointer = (IntPtr)acComObjectMirr.ObjectId; // Получаем указатель на COM/ActiveX объект
  6. acMirroredObjectId = new ObjectId(pointer); // ObjectId отраженного .NET объекта по указателю на COM/ActiveX объект
  7.  

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Miror и Blockreference
« Ответ #19 : 27-03-2024, 13:41:47 »
Доброго дня.
Нашел проблему с отражением, которую не могу никак решить:
Есть динамический блок внутри которого есть Размер.
Необходимо отразить блок, чтобы при этом направление размерного текста не переворачивалось "с заду на перед".
Могу это сделать используя динамический параметр отражения, но хотелось бы применить средства, описанные в этой ветке, не используя внутреннюю динамику в блоке (пытаюсь максимально "облегчить" блок). С текстом, атрибутами блока проблем нету, а вот с размерами))))

p.s. стандартная комманда Mirror также зеркалит размерный текст.
p.s.s. mirrtext  не влияет



Может у старейшин есть какие-либо мысли как это решить?

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Miror и Blockreference
« Ответ #20 : 27-03-2024, 14:16:22 »
есть какие-либо мысли как это решить
Возможно вопрос относится к другой теме, не программирования

Скорее всего нужно переделать опреации в динамическом блоке:
1. Размер не должен участвовать в операции отзеркаливания, только треугольник. Добавить смещение размера
2. Либо зеркалить размер без текста. Значение размера вывести атрибутом, который не зеркалиться а смещается.
3. Отзеркаливание заменить на видимость(левую и правую половинку можно скрывать.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Miror и Blockreference
« Ответ #21 : 31-03-2024, 17:51:02 »
Может у старейшин есть какие-либо мысли как это решить?
Фактически тебе придется создать новый блок (BlockTableRecord) на основе существующего, в котором будут правильно отзеркаленые размеры и тексты. Не думаю что это лучше и проще, чем использовать динамический параметр отражения.
« Последнее редактирование: 31-03-2024, 20:32:51 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Miror и Blockreference
« Ответ #22 : 04-04-2024, 15:06:17 »
Большое спасибо за ответы!
По результату есть два приемлемых пути решения:
1 Использовать в блоке "Размер" (в этом случае изменения будут динамически отображаться) и динамиечские параметры отражения.
2 Отказаться от динамических параметров, а вместо размера использовать атрибут с полем внутри для отображения значения (в этом случае изменения увидим только после обновления поля в атрибуте).