Miror и Blockreference

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

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

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

  • ADN Club
  • *****
  • Сообщений: 536
  • Карма: 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
  • *****
  • Сообщений: 13868
  • Карма: 1785
  • Рыцарь 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 »
Спасибо!