Хаотичный выбор из списка ключевых слов.

Автор Тема: Хаотичный выбор из списка ключевых слов.  (Прочитано 4067 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Обнаружил странное поведение команды-нечеткий выбор варианта из списка ключевых слов. Сначала думал что промахиваюсь мышкой, но варианты которые выбираются, не соседние и расположены далеко друг от друга. Кто-нибудь сталкивался с таким поведением? Смысл команды в том, что она читает из txt файла список уровней и выводит их в качестве ключевых слов. пользователь выбирает кликом мыши нужный вариант и точку вставки, команда вставляет подпись уровня.
Код - C# [Выбрать]
  1. [CommandMethod("0Annotatelevels")]
  2.         public static void LevelAnnotator()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Transaction tr = doc.TransactionManager.StartTransaction();
  7.  
  8.             List<string> listOfLayers = new List<string>();
  9.             string filePath = @"C:\Developments\Lists\101.txt";
  10.  
  11.             StreamReader sr = new StreamReader(filePath, System.Text.Encoding.Default);
  12.  
  13.             string line;
  14.             while ((line = sr.ReadLine()) != null)
  15.             {
  16.                 listOfLayers.Add(line);
  17.             }
  18.  
  19.            
  20.  
  21.             PromptKeywordOptions selectFormat = new PromptKeywordOptions("\nSet level ");
  22.  
  23.             foreach (var layer in listOfLayers)
  24.             {
  25.                 selectFormat.Keywords.Add(layer);
  26.             }
  27.  
  28.             selectFormat.AllowNone = false;
  29.  
  30.             PromptResult selected = doc.Editor.GetKeywords(selectFormat);
  31.             using (tr)
  32.             {
  33.                 BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForWrite);
  34.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  35.                 Point3d point = SelectionUtilities.GetPointFromUser("Set insertion point");
  36.                 using (MText mtext = new MText())
  37.                 {
  38.                     mtext.Location = point;
  39.                     mtext.TextHeight = 500;
  40.                     mtext.Attachment = AttachmentPoint.BottomLeft;
  41.  
  42.                     mtext.Contents = "\\L" + $"{selected.StringResult}";
  43.  
  44.                     mtext.Layer = "-10-Text";
  45.  
  46.                     btr.AppendEntity(mtext);
  47.                     tr.AddNewlyCreatedDBObject(mtext, true);
  48.                 }
  49.  
  50.                 tr.Commit();
  51.             }
  52.         }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Так делать плохо. Делайте нормальный диалог с выбором варианта из списка.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Делайте нормальный диалог с выбором варианта из списка.
Что имеется ввиду? Я не понял. Выбор и так организован в виде списка ключевых слов. И чем грозит? За прототип брал настройку рисования многоугольника, реализованную в самом Autocad.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Ключевые слова идентифицируются по первым заглавным буквам. Если совпали - выбирается первое. Вы уверены что в вашем списке нет совпадений? И вообще все слова с заглавных букв? Никогда не вставляйте в команду опции, которые придумывает пользователь - проблемы гарантированы.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Вы уверены что в вашем списке нет совпадений
Вы правы совпадения первых букв есть

Отмечено как Решение Atomohod 20-03-2019, 22:15:11

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
А еще в командную строку нельзя вставлять слова с пробелом и кучей других символов.
А запрограммировать диалог с единственным лист-боксом - пять минут делов....

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
А еще в командную строку нельзя вставлять слова с пробелом

А как это реализовано в Autocad? Ведь пробел там есть - см. вложение.

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

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
А как это реализовано в Autocad? Ведь пробел там есть - см. вложение
Возможно так, но сам не пробовал
Код - C# [Выбрать]
  1. PromptStringOptions options = new PromptStringOptions(newline + message);
  2. options.AllowSpaces = true;
  3. foreach (string item in keywords)
  4. {
  5. options.Keywords.Add(item);
  6. }
  7. PromptResult prompt = editor.GetString(options);

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Возможно так, но сам не пробовал
Нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Возможно так, но сам не пробовал
Код - C# [Выбрать]
  1. PromptStringOptions options = new PromptStringOptions(newline + message);
  2. options.AllowSpaces = true;
  3. foreach (string item in keywords)
  4. {
  5. options.Keywords.Add(item);
  6. }
  7. PromptResult prompt = editor.GetString(options);
Нет, это разрешает ввод пробела при вводе строки с клавиатуры.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А еще в командную строку нельзя вставлять слова с пробелом

А как это реализовано в Autocad? Ведь пробел там есть - см. вложение.

Есть разница между ключевыми словами и сообщениями в командной строке. Ключевыми словами там явлются только "Inscribed" и "Circumscribed".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А как это реализовано в Autocad? Ведь пробел там есть - см. вложение.
Как вариант:
Код - C# [Выбрать]
  1. [CommandMethod("RunKeywordTest")]
  2. public void Run()
  3. {
  4.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.     PromptKeywordOptions opts = new PromptKeywordOptions("\nSelect option: ");
  6.     opts.Keywords.Add("Option\u00A0name\u00A01");
  7.     opts.Keywords.Add("oPtion\u00A0name\u00A02");
  8.     opts.Keywords.Add("opTion\u00A0name\u00A03");
  9.     opts.Keywords.Add("optIon\u00A0name\u00A04");
  10.     opts.Keywords.Add("optioN\u00A0name\u00A05");            
  11.     ed.GetKeywords(opts);
  12. }
  13.  

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Поиграв с ключевыми словами в итоге так ничего и не добился. Сделал окно с лист-боксом, все работает. Спасибо всем!