Как удалить поле из однострочного текста

Автор Тема: Как удалить поле из однострочного текста  (Прочитано 10159 раз)

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Добрый день!
Подскажите, п-ста, как удалить поле из однострочного текста.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
DBObject.RemoveField() ?
Или DBText.ConvertFieldToText, которая превращает в обычный текст и удаляет поле.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Как я понимаю, DBText.ConvertFieldToText удаляет все поля и превращает их в текст.
А если нужно удалить одно поле и превратить его в текст?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А если нужно удалить одно поле и превратить его в текст?
Тогда наверное DBObject.RemoveField(ObjectId idField). Попробуй.
Есть еще Field.FindField которое позволяет найти позицию поля внутри текста. Если его вырезать, а вместо его вставить Field.Value, то наверное будет то, что тебе нужно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Написал такой код:
Код - C# [Выбрать]
  1.                     using (DBText text = acTrans.GetObject(acObjId, OpenMode.ForWrite) as DBText)
  2.                     {
  3.                         if (text.HasFields)
  4.                         {
  5.                             ObjectId FieldId = text.GetField();
  6.                             field = acTrans.GetObject(FieldId, OpenMode.ForRead) as Field;
  7.                             ObjectId[] objectIds = field.GetChildrenIds();
  8.                             for (int i = 0; i < objectIds.Length; i++)
  9.                             {
  10.                                 field = acTrans.GetObject(objectIds[i], OpenMode.ForRead) as Field;
  11.                                 if (field != null && field.HyperLink != null)
  12.                                 {
  13.                                     DBObject dBObject = ((DBObject)text);
  14.                                     dBObject.RemoveField(objectIds[i]);
  15.                                     break;
  16.                                 }
  17.                             }
  18.                         }
  19.                     }
  20.  
На операторе dBObject.RemoveField(objectIds); происходит исключение eKeyNotFound
Где я не прав?

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

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Если я не вру, то это означает, что в API ошибка. Так?

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Для создания поля я использовал оператор
text.TextString = "Винт B.М5-6g*20.36.016 ГОСТ 1491-80  %<\\AcVar \\href \"https://www.mail.ru##ГОСТ 1491-81#0\">%."
Почему поле не удаляется оператором
text.TextString = "Винт B.М5-6g*20.36.016 ГОСТ 1491-80  ГОСТ 1491-81."

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если я не вру, то это означает, что в API ошибка. Так?
Думаю что это не ошибка, а так задумано. Впрочем, задам как я этот вопрос в ADN DevHelp. На просторах интернета ничего подобного я не нашел.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Для создания поля я использовал оператор
text.TextString = "Винт B.М5-6g*20.36.016 ГОСТ 1491-80  %<\\AcVar \\href \"https://www.mail.ru##ГОСТ 1491-81#0\">%."
Почему поле не удаляется оператором
text.TextString = "Винт B.М5-6g*20.36.016 ГОСТ 1491-80  ГОСТ 1491-81."
Потому что в первый раз AutoCAD интерпретировал это строку и создал на её основе поле. Дальнейшие изменения этой строки поле не удаляют. Но в данном случае всё проще. Удалить всё поле можно так:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. [assembly: CommandClass(typeof(FieldRemove.MyCommands))]
  7.  
  8. namespace FieldRemove
  9. {
  10.   public class MyCommands
  11.   {
  12.     [CommandMethod("RemoveFieldsWithHyperlink")]
  13.     public void MyCommand()
  14.     {
  15.       // Put your command code here
  16.       Document doc = Application.DocumentManager.MdiActiveDocument;
  17.       if (doc == null) return;
  18.       Editor ed = doc.Editor;
  19.       PromptEntityOptions opts =
  20.         new PromptEntityOptions("\nВыберите DBText: ");
  21.       opts.SetRejectMessage("\nЭто не DBText!");
  22.       opts.AddAllowedClass(typeof(DBText), true);
  23.       PromptEntityResult res = ed.GetEntity(opts);
  24.       if (res.Status != PromptStatus.OK)
  25.         return;
  26.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  27.       {
  28.         DBText text = tr.GetObject(res.ObjectId, OpenMode.ForWrite) as DBText;
  29.         if (text != null && text.HasFields)
  30.         {
  31.           ObjectId idField = text.GetField();
  32.           Field field = tr.GetObject(idField, OpenMode.ForWrite) as Field;
  33.           field.Erase();
  34.           text.RecordGraphicsModified(true);
  35.         }
  36.         tr.Commit();
  37.       }
  38.     }
  39.   }
  40. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Этот код удаляет все поля в моем чертеже. Я его немножко подкорректировал:
Код - C# [Выбрать]
  1.         public static void MyCommand()
  2.         {
  3.             // Put your command code here
  4.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (doc == null) return;
  6.             Editor ed = doc.Editor;
  7.             PromptEntityOptions opts =
  8.               new PromptEntityOptions("\nВыберите DBText: ");
  9.             opts.SetRejectMessage("\nЭто не DBText!");
  10.             opts.AddAllowedClass(typeof(DBText), true);
  11.             PromptEntityResult res = ed.GetEntity(opts);
  12.             if (res.Status != PromptStatus.OK)
  13.                 return;
  14.             using (Transaction tr = doc.TransactionManager.StartTransaction())
  15.             {
  16.                 DBText text = tr.GetObject(res.ObjectId, OpenMode.ForWrite) as DBText;
  17.                 if (text != null && text.HasFields)
  18.                 {
  19.                     ObjectId idField = text.GetField();
  20.                     Field field = tr.GetObject(idField, OpenMode.ForWrite) as Field;
  21.                     ObjectId[] objectIds = field.GetChildrenIds();
  22.                     field = tr.GetObject(objectIds[0], OpenMode.ForWrite) as Field;
  23.                     field.Erase();
  24.                     text.RecordGraphicsModified(true);
  25.                 }
  26.                 tr.Commit();
  27.             }
  28.         }
  29.  
Но и в этом случае 1-ое поле не удаляется.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Борис_С,
В таком виде я тоже пробовал, перед тем как писать предыдущий пример. И так как он не работает, то и не стал его предлагать. Запрос в ADN DevHelp я написал. Как только будет ответ - сообщу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
А если нужно удалить одно поле и превратить его в текст?
Тогда наверное DBObject.RemoveField(ObjectId idField). Попробуй.
Есть еще Field.FindField которое позволяет найти позицию поля внутри текста. Если его вырезать, а вместо его вставить Field.Value, то наверное будет то, что тебе нужно.
Хочу разобраться с методом
Код - C# [Выбрать]
  1. public static bool FindField(
  2.     string text,
  3.     int iSearchFrom,
  4.     ref int nStartPos,
  5.     ref int nEndPos
  6. );
Не очень понимаю, что должно сидеть в text и в iSearchFrom.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не очень понимаю, что должно сидеть в text и в iSearchFrom.
В text - содержимое DBText (в данном случае). В iSearchFrom - начальная позиция в text для поиска поля.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Я посадил в text DBText.TextString, в iSearchFrom 1
Метод вернул false.