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

ADN Club => AutoCAD .NET API => Тема начата: Борис_С от 23-11-2020, 15:55:19

Название: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 15:55:19
Всем доброго дня!
Посадил на чертеж однострочный текст.
Выделил этот текст с помощью прямоугольника.
Записал координаты 2-х противоположных точек прямоугольника.
Реализовал то же самое в С#.
C# говорит, что выделен один элемент, но визуально он никак не помечен.
Почему?
Вот код:
Код - C# [Выбрать]
  1.         [CommandMethod("NCS_SET_HLINKS")]
  2.         public static void CmdSetLinks()
  3.         {
  4.             try
  5.             {
  6.                 // Get the current document and database, and start a transaction
  7.                 Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  8.                 // Get the current document editor
  9.                 Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  10.  
  11.                 PromptSelectionResult acSSPrompt;
  12.                 acSSPrompt = acDocEd.SelectCrossingWindow(new Point3d(1408, 3601, 0),
  13.                                                           new Point3d(4178, 4820, 0));
  14.  
  15.                 // If the prompt status is OK, objects were selected
  16.                 if (acSSPrompt.Status == PromptStatus.OK)
  17.                 {
  18.                     SelectionSet acSSet = acSSPrompt.Value;
  19.  
  20.                     Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Число выбранных объектов: " +
  21.                                                 acSSet.Count.ToString());
  22.                 }
  23.                 else
  24.                 {
  25.                     Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Число выбранных объектов: 0");
  26.                 }
  27.             }
  28.             catch (System.Exception e)
  29.             {
  30.                 Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  31.                 acDocEd .WriteMessage(String.Format("Ошибка загрузки надстройки NormaCS: {0}{1}" + Environment.NewLine, e.Message, e.StackTrace));
  32.             }
  33.         }
  34.  
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 17:39:02
Борис_С,
Приветствую на форуме!
1. Прочитайте у меня в подписи правило форматирования кода на форуме и соблюдайте его.
2. Вы ошиблись разделом форума и я перенес тему в соответствующий раздел.
Название: Re: Почему выбранный объект не выделяется
Отправлено: avc от 23-11-2020, 17:42:15
Для задания списка выбранных используй Editor.SetImpliedSelection
А если надо просто подсветить,  то используй Entity.Highlight
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 17:43:37
C# говорит, что выделен один элемент, но визуально он никак не помечен.
1. Он и не должен быть помечен. Вы видимо не понимаете что делает используемый метод.
2. Если бы заданные координаты были вне области экрана, то вообще ничего бы не выбралось.
Что именно вы хотите в результате получить?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 17:46:57
Мне нужно посадить гиперссылку на часть текста. Как я понимаю, для начала мне нужно выделить этот кусок текста.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 17:52:03
Мне нужно посадить гиперссылку на часть текста.
На часть текста??? Гиперссылку можно присвоить всему примитиву целиком. Или вы о чем-то другом?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 17:56:48
Мне поставлена такая задача. Проанализировать все тексты документа. Выловить из всего массива текстов нужные куски и поставить на них гиперссылки. Похоже, что в автокаде это в принципе невозможно. Так?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 18:02:11
Мне поставлена такая задача. Проанализировать все тексты документа. Выловить из всего массива текстов нужные куски и поставить на них гиперссылки. Похоже, что в автокаде это в принципе невозможно. Так?
Можно присвоить гиперссылку всему текстовому примитиву (DBText и MText), а можно добавить поле (Field) с гиперссылкой внутри текста. Так что вам нужно?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 18:05:03
Вот пример гиперссылки внутри однострочного текста (поле):

(https://live.staticflickr.com/65535/50637200038_dd41a30850_o.png)

Код этого поля:
%<\AcVar \href "https://adn-cis.org##https://adn-cis.org#1">%

Название: Re: Почему выбранный объект не выделяется
Отправлено: avc от 23-11-2020, 18:06:13
Почему выбранный объект не выделяется
Это задача перебора всех текстов и вставки полей, и это уже не имеет никакого отношения к поставленной теме. Выделение рамкой и подсветка примитивов тут вообще не причем.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 18:10:09
Почему выбранный объект не выделяется
Это задача перебора всех текстов и вставки полей, и это уже не имеет никакого отношения к поставленной теме. Выделение рамкой и подсветка примитивов тут вообще не причем.
А можно не показывать гиперссылку. Просто удалить часть текста, добавить поле (c тем же текстом) и на него повесить гиперссылку. Это будет то, что нужно.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 18:11:48
А можно не показывать гиперссылку. Просто удалить часть текста, добавить поле (c тем же текстом) и на него повесить гиперссылку. Это будет то, что нужно.
Я ошибся. Процетировал не тот текст.
А можно не показывать гиперссылку. Просто удалить часть текста, добавить поле (c тем же текстом) и на него повесить гиперссылку. Это будет то, что нужно.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 18:14:28
А можно не показывать гиперссылку. Просто удалить часть текста, добавить поле (c тем же текстом) и на него повесить гиперссылку. Это будет то, что нужно.
На один текстовый примитив можно повесить только одну гиперссылку. А если в у вас в одном текстовом примитиве сразу несколько текстов нужно заменить гиперссылками?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 18:16:19
Короче говоря - нарисуйте то что вам нужно получить средствами AutoCAD, а мы постараемся показать как это сделать программно.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 23-11-2020, 18:18:05
Сколько полей можно добавлять в текстовый примитив? Если несколько, то на каждое поле можно повесить гиперссылку. Так?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 23-11-2020, 21:12:34
Сколько полей можно добавлять в текстовый примитив? Если несколько, то на каждое поле можно повесить гиперссылку. Так?

Да. Так возможно.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 14:13:57
Короче говоря - нарисуйте то что вам нужно получить средствами AutoCAD, а мы постараемся показать как это сделать программно.
Александр, добрый день!
Хочу воспользоваться вашим предложением.
Подскажите, пожалуйста, как вставить поле в текстовый примитив.
Спасибо.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 14:19:25
Александр, добрый день!
Хочу воспользоваться вашим предложением.
Подскажите, пожалуйста, как вставить поле в текстовый примитив.
Спасибо.
Это я показал выше: https://adn-cis.org/forum/index.php?topic=10156.msg46216#msg46216
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 14:25:27
Вы написали, что покажете, как это сделать программно.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 14:28:47
Вы написали, что покажете, как это сделать программно.
Укажите пример текста (например, "Мой сайт") и пример гиперссылки (например, "https://adn-cis.org")
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 14:51:41
Винт B.М5-6g*20.36.016 ГОСТ 1491-80.
Удалить текст ГОСТ 1491-80 и вставить в это место поле с тем же текстом и адресом www.mail.ru
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 15:59:54
Не слишком чисто и красиво, но сойдёт:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. #pragma warning disable 0618
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(AddHyperInDBText.MyCommands))]
  10.  
  11. namespace AddHyperInDBText
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("HReplace")]
  16.     public void HReplace()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       PromptEntityOptions opt = new PromptEntityOptions("\nВыберите однострочный текст: ");
  22.       opt.SetRejectMessage("Это не однострочный текст!");
  23.       opt.AddAllowedClass(typeof(DBText), false);
  24.       PromptEntityResult res = ed.GetEntity(opt);
  25.       if (res.Status == PromptStatus.OK)
  26.       {
  27.         using (DBText text = res.ObjectId.Open(OpenMode.ForWrite) as DBText)
  28.         {
  29.           string str = text.TextString;
  30.           if (str.Contains("ГОСТ 1491-80")) {
  31.             str = str.Replace("ГОСТ 1491-80", "%<\\AcVar \\href \"https://www.mail.ru##ГОСТ 1491-80#1\">%");
  32.             text.TextString = str;
  33.           }
  34.         }
  35.         ed.Command("_UPDATEFIELD", res.ObjectId, "");
  36.       }
  37.     }
  38.   }
  39. }
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 16:24:23
Спасибо.
В какой сборке сидит Autodesk.AutoCAD.Runtime?
Транслятор ругается на ed.Command. Может потому, что не подключен Autodesk.AutoCAD.Runtime.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 16:26:25
Спасибо.
В какой сборке сидит Autodesk.AutoCAD.Runtime?
Транслятор ругается на ed.Command. Может потому, что не подключен Autodesk.AutoCAD.Runtime.
Нужно подключить acmgd.dll, acdbmgd.dll, accoremgd.dll
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 16:29:23
Они все подключены.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 16:31:28
Версия AutoCAD?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 16:33:21
2020
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 16:37:56
2020
Значит снова что-то не то сделал. Класс Editor с методом Command в пространстве имён  Autodesk.AutoCAD.EditorInput, которая из accoremgd.dll
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 17:26:01
Так без команд:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. #pragma warning disable 0618
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(AddHyperInDBText.MyCommands))]
  10.  
  11. namespace AddHyperInDBText
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("HReplace")]
  16.     public void HReplace()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       PromptEntityOptions opt = new PromptEntityOptions("\nВыберите однострочный текст: ");
  22.       opt.SetRejectMessage("Это не однострочный текст!");
  23.       opt.AddAllowedClass(typeof(DBText), false);
  24.       PromptEntityResult res = ed.GetEntity(opt);
  25.       if (res.Status == PromptStatus.OK)
  26.       {
  27.         using (DBText text = res.ObjectId.Open(OpenMode.ForWrite) as DBText)
  28.         {
  29.           string str = text.TextString;
  30.           if (str.Contains("ГОСТ 1491-80")) {
  31.             str = str.Replace("ГОСТ 1491-80", "%<\\AcVar \\href \"http://www.mail.ru##ГОСТ 1491-80#1\">%");
  32.             text.TextString = str;
  33.           }
  34.         }
  35.         doc.Database.EvaluateFields();
  36.       }
  37.     }
  38.   }
  39. }
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 17:36:32
Разобрался. Проект достался мне по-наследству. Там все dll брались из версии 2013.
Взял dll из ObjectArx 2020, но теперь задача не собирается.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 17:38:41
Борис_С,
Создай новый проект.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 17:46:17
Все получилось. Нужно было просто поменять версию Net Framework
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 17:54:46
Работает. А можно как-то менять цвет поля?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 17:58:19
Работает. А можно как-то менять цвет поля?
Еще одно правило форума: "Один вопрос - одна тема".
Кроме того этот вопрос к AutoCAD API отношения не имеет.
https://forum.dwg.ru/showthread.php?t=61985 - тут о том, что цвет поменять нельзя.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 24-11-2020, 18:07:25
Хорошо. Сейчас буду разбираться с кодом.
А где еще можно почитать о коде, кроме https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-C3F3C736-40CF-44A0-9210-55F6A939B6F2 ?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 24-11-2020, 18:10:27
Борис_С,
В ObjectARX SDK есть документация и примеры. Ну и этот форум и сайт, если на русском.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 03-12-2020, 16:19:16
Александр, вы предложили создать поля таким образом:
Код - C# [Выбрать]
  1. using (DBText text = res.ObjectId.Open(OpenMode.ForWrite) as DBText)
  2.         {
  3.           string str = text.TextString;
  4.           if (str.Contains("ГОСТ 1491-80")) {
  5.             str = str.Replace("ГОСТ 1491-80", "%<\\AcVar \\href \"https://www.mail.ru##ГОСТ 1491-80#1\">%");
  6.             text.TextString = str;
  7.           }
  8.         }
  9.         ed.Command("_UPDATEFIELD", res.ObjectId, "");
  10.  
А если однострочный текст уже содержит поля, как тогда быть?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 03-12-2020, 16:31:41
А если однострочный текст уже содержит поля, как тогда быть?
Тогда плохо. Я вижу пока только один вариант - убрать все поля и добавить своё.
Название: Re: Почему выбранный объект не выделяется
Отправлено: Борис_С от 03-12-2020, 16:47:11
У меня есть готовый документ. Я не должен ничего из него удалять. Мне нужно только поставить гиперссылки на фрагменты текста. Получается, что это нерешаемая задача для AutoCAD?
Название: Re: Почему выбранный объект не выделяется
Отправлено: Александр Ривилис от 03-12-2020, 16:49:38
Получается, что это нерешаемая задача для AutoCAD?
Пока я не получу ответа из ADN DevHelp - я ничего сказать не могу. Жди.