Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 12-05-2020, 14:44:04

Название: Miror и Blockreference
Отправлено: Lemieux от 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
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 12-05-2020, 14:50:53
Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился?
В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Но возможно в ActiveX/COM:
(https://live.staticflickr.com/65535/49885810118_38981a092b_o.png)

Название: Re: Miror и Blockreference
Отправлено: Lemieux от 12-05-2020, 14:57:34
Кто-то пробовал зеркалить блок с текстовым атрибутом, чтобы при этом атрибут не зеркалился?
В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Но возможно в ActiveX/COM:
(https://live.staticflickr.com/65535/49885810118_38981a092b_o.png)
Это как?
Может проще сделать через "SendStringToExecute"?
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 12-05-2020, 15:02:53
Может проще сделать через "SendStringToExecute"?
Фуууууууууууу!!!!!!!!
Название: Re: Miror и Blockreference
Отправлено: Lemieux от 12-05-2020, 15:06:11
Может проще сделать через "SendStringToExecute"?
Фуууууууууууу!!!!!!!!
Вот сделать обратный блок, это точно фууууууу  ;D Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода, а тут такая засада. Непонятно почему разработчики не предусмотрели это.
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 12-05-2020, 15:08:25
Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода
Отзеркалить блок или 20 тысяч строк кода? Что-то ты меня запутал.
Название: Re: Miror и Blockreference
Отправлено: Lemieux от 12-05-2020, 15:12:26
Просто мне отзеркалить нужно только один раз примерно 20 тысячах строк кода
Отзеркалить блок или 20 тысяч строк кода? Что-то ты меня запутал.

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

Просто мне отзеркалить нужно только один раз примерно в 20 тысячах строк кода
Название: Re: Miror и Blockreference
Отправлено: Привалов Дмитрий от 12-05-2020, 15:27:43


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

В .NET API это невозможно. Т.е. требуется обратное отзеркаливание атрибута.
Т.е. после отзеркаливания блока нужно будет свойство Normal у AttributeReference поменять обратно и возможно поменять координаты атрибутов?
После _attsync свойство Normal не слетит обратно?
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 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.  

Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 12-05-2020, 15:37:18
Т.е. после отзеркаливания блока нужно будет свойство Normal у AttributeReference поменять обратно
Причем здесь Normal? Тут скорее Rotation нужно будет поменять.
Название: Re: Miror и Blockreference
Отправлено: Привалов Дмитрий от 12-05-2020, 15:51:43
Причем здесь Normal? Тут скорее Rotation нужно будет поменять.
До этого не пробовал зеркалить и смотреть свойства. Ну да с обычным DbText попробовал, меняются свойства Rotation и IsMirroredInX.
Название: Re: Miror и Blockreference
Отправлено: Lemieux от 12-05-2020, 20:00:02
Попробуй:
Круто, вот это магия! Чем больше пишу модулей тем более интересней становится узнавать архитектуру AutoCAD. Спасибо!

Может можно обойтись созданием доп. блока?
Я уже думал об этом :)
Название: Re: Miror и Blockreference
Отправлено: adidas1380 от 15-02-2021, 00:30:33
А как получить теперь ID объекта ,который стал зеркальным сразу в коде получить  если нужно ,например, еще раз отзеркалить? И можно ли пояснить эту строку "dynamic aent = ent.AcadObject;"?
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 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)
Название: Re: Miror и Blockreference
Отправлено: adidas1380 от 15-02-2021, 01:05:57
Спасибо!
Название: Re: Miror и Blockreference
Отправлено: Валерий Ивлев от 27-02-2024, 21:57:12
Доброго времени суток.
Мучаю Mirror для дин. блока уже три дня (нужно отражать несколько блоков за раз). Та же проблема с атрибутами. Хотя до этого благополучно было реализовано на VBA. Только наткнулся на пост, что подтвердило мои "опасения", что легче всего через COM/ActiveX модель AutoCAD. Завтра попробую реализовать. Спасибо!
Название: Re: Miror и Blockreference
Отправлено: Алексей Кулик от 29-02-2024, 21:42:43
М.б. mirrtext ?
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 29-02-2024, 21:52:39
М.б. mirrtext ?
На реализацию с помощью AutoCAD.NET API не влияет и влияет на реализацию при помощи COM/ActiveX (даже в .NET)
Название: Re: Miror и Blockreference
Отправлено: Валерий Ивлев от 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.  
Название: Re: Miror и Blockreference
Отправлено: Валерий Ивлев от 27-03-2024, 13:41:47
Доброго дня.
Нашел проблему с отражением, которую не могу никак решить:
Есть динамический блок внутри которого есть Размер.
Необходимо отразить блок, чтобы при этом направление размерного текста не переворачивалось "с заду на перед".
Могу это сделать используя динамический параметр отражения, но хотелось бы применить средства, описанные в этой ветке, не используя внутреннюю динамику в блоке (пытаюсь максимально "облегчить" блок). С текстом, атрибутами блока проблем нету, а вот с размерами))))

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

(https://i.postimg.cc/Q9Kn2Kyd/Mirror-block.jpg) (https://postimg.cc/Q9Kn2Kyd)

Может у старейшин есть какие-либо мысли как это решить?
Название: Re: Miror и Blockreference
Отправлено: Привалов Дмитрий от 27-03-2024, 14:16:22
есть какие-либо мысли как это решить
Возможно вопрос относится к другой теме, не программирования

Скорее всего нужно переделать опреации в динамическом блоке:
1. Размер не должен участвовать в операции отзеркаливания, только треугольник. Добавить смещение размера
2. Либо зеркалить размер без текста. Значение размера вывести атрибутом, который не зеркалиться а смещается.
3. Отзеркаливание заменить на видимость(левую и правую половинку можно скрывать.
Название: Re: Miror и Blockreference
Отправлено: Александр Ривилис от 31-03-2024, 17:51:02
Может у старейшин есть какие-либо мысли как это решить?
Фактически тебе придется создать новый блок (BlockTableRecord) на основе существующего, в котором будут правильно отзеркаленые размеры и тексты. Не думаю что это лучше и проще, чем использовать динамический параметр отражения.
Название: Re: Miror и Blockreference
Отправлено: Валерий Ивлев от 04-04-2024, 15:06:17
Большое спасибо за ответы!
По результату есть два приемлемых пути решения:
1 Использовать в блоке "Размер" (в этом случае изменения будут динамически отображаться) и динамиечские параметры отражения.
2 Отказаться от динамических параметров, а вместо размера использовать атрибут с полем внутри для отображения значения (в этом случае изменения увидим только после обновления поля в атрибуте).