как передать объект в метод

Автор Тема: как передать объект в метод  (Прочитано 20008 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
нашел необходимые выноски по тексту. занес их в listview.
при выделении необходимых в listview хочу их изменить.

Код - C# [Выбрать]
  1. public partial class ChangerForm : Form
  2.     {
  3.         public ChangerForm()
  4.         {
  5.             InitializeComponent();
  6.             this.find.Focus();
  7.         }
  8.  
  9.         List<ObjectId> ent = new List<ObjectId>();
  10.  
  11.         private void ButtonFind_Click(object sender, EventArgs e)
  12.         {
  13.             infoList.Items.Clear();
  14.            
  15.             int l = 0, ll = 0, imt=0, iot=0, iml=0;
  16.             Document doc = App.DocumentManager.MdiActiveDocument;
  17.             Database db = doc.Database;
  18.  
  19.             using (DocumentLock dl = doc.LockDocument())
  20.             {
  21.                 using (Transaction tr = doc.TransactionManager.StartTransaction())
  22.                 {
  23.                     BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  24.                     DBDictionary dbl = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  25.  
  26.                     if (allSpace.Checked) ll = dbl.Count-1;
  27.                     else if (inModel.Checked) ll = 0;
  28.                     else if (inLauouts.Checked && ++l == 1) ll = dbl.Count-1;
  29.  
  30.                     List<ObjectId> item = new List<ObjectId>();
  31.                     foreach (DBDictionaryEntry dblay in dbl) item.Add(dblay.Value);
  32.  
  33.                     for (int i = l; i <= ll; i++)
  34.                     {
  35.                         Layout lay = tr.GetObject(item[i], OpenMode.ForRead) as Layout;
  36.                         BlockTableRecord btlay = tr.GetObject(lay.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
  37.                        
  38.                         foreach (ObjectId obid in btlay)
  39.                         {
  40.                             object obj = obid.GetObject(OpenMode.ForRead);
  41.                             if (obj is MLeader)
  42.                             {
  43.                                 MLeader ml = obj as MLeader;
  44.                                 if (ml.MText.Text.IndexOf(find.Text) >= 0 && (skip.Text == "" || ml.MText.Text.IndexOf(skip.Text) == -1))
  45.                                 {                                    
  46.                                     ent.Add(obid);
  47.                                     infoList.Items.Add(new ListViewItem(new[] { lay.LayoutName, "Выноска", ml.MText.Text }));
  48.                                 }
  49.                             }
  50.                         }
  51.  
  52.                     }
  53.                     tr.Commit();
  54.                 }
  55.             }
  56.         }
  57.  
  58.         private void ChangeHand_Click(object sender, EventArgs e)
  59.         {
  60.             Document doc = App.DocumentManager.MdiActiveDocument;
  61.  
  62.             using (DocumentLock dl = doc.LockDocument())
  63.             {
  64.                 using (Transaction tr = doc.TransactionManager.StartTransaction())
  65.                 {
  66.                     var k = infoList.SelectedIndices;
  67.  
  68.                     MLeader ol = ent.ElementAt(k[0]).GetObject(OpenMode.ForWrite) as MLeader;
  69.  
  70.                     ol.MText.Contents = ol.MText.Text.Replace(find.Text, need.Text);
  71.  
  72.                     tr.Commit();
  73.                 }
  74.             }
  75.         }
  76. }
  77.  
  78.  

Что я не так делаю?
проверил id получаемых выносок те же что в первом методе. вроде все что нужно но текст в итоге не меняется

« Последнее редактирование: 16-09-2018, 15:14:53 от simson43 »

Отмечено как Решение simson43 16-09-2018, 15:07:20

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #1 : 16-09-2018, 14:43:07 »
Попробуй заменить:
Код - C# [Выбрать]
  1. ol.MText.Contents = ol.MText.Text.Replace(find.Text, "need.Text");
на
Код - C# [Выбрать]
  1. MText mt = ol.MText;
  2. mt.Text = mt.Text.Replace(find.Text, "need.Text");
  3. ol.MText = mt;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: как передать объект в метод
« Ответ #2 : 16-09-2018, 14:48:27 »
да точно. должно работать.
только mt.contents мне кажется ибо text только get
Код - C# [Выбрать]
  1. mt.Conents= mt.Text.Replace(find.Text, "need.Text");

спасибо большое

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #3 : 16-09-2018, 14:54:43 »
только mt.contents мне кажется ибо text только get
Да. Основная моя мысль в коде была в том, что нужно из MLeader сначала получить MText, потом MText модифицировать и затем установить MLeader.MText в новое значение MText.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: как передать объект в метод
« Ответ #4 : 16-09-2018, 15:07:17 »
а как быть с тем что при замене contents на text слетает все форматирование мтекста?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #5 : 16-09-2018, 15:09:37 »
а как быть с тем что при замене contents на text слетает все форматирование мтекста?
Замени:
Код - C# [Выбрать]
  1. mt.Conents= mt.Text.Replace(find.Text, "need.Text");
на
Код - C# [Выбрать]
  1. mt.Conents= mt.Conents.Replace(find.Text, "need.Text");
и надейся, что форматирование не слетит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: как передать объект в метод
« Ответ #6 : 16-09-2018, 15:13:46 »
в таком случае если внутри contents например такое
\О785\о длина
то в text такое
785 длина
и попытаться найти в contents "785 длина" то ничего не выйдет.
ну и так же с любым другим форматированием. это непредсказуемо что там может быть..
искать разумнее мне кажется в Text, а вот как заменить чтоб ничего не испортилось?


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #7 : 16-09-2018, 15:17:16 »
а вот как заменить чтоб ничего не испортилось?
Это достаточно сложно. Для этого следует использовать метод MText.ExplodeFragments, выполнять поиск и замену во фрагментах, а потом объединять их. Ну а если поисковый текст окажется сразу в нескольких фрагментах, то это еще сложнее...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: как передать объект в метод
« Ответ #8 : 16-09-2018, 15:26:05 »
Спасибо буду пробовать

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: как передать объект в метод
« Ответ #9 : 16-09-2018, 22:37:48 »
Несколько комментариев к коду:
1. Куча-мала из объектов транзакций и объектов полученных через ObjectId.GetObject. Я б не стал так рисковать. Это ж работа без транзакций, так? А тогда, объект полученный без транзакции должен быть ликвидирован. Т.е. забыт using
2. MText, полученный из MLeader по документации тоже должен быть ликвидирован. Т.е. тоже берите через using
3. Нет проверки ContentType - на выноске вовсе не обязательно текст, может быть и блок. И тогда надо работать с атрибутами блока. Или менять ContentType
4. И не зачем объявлять переменные типа object.
Код - C# [Выбрать]
  1. object obj = obid.GetObject(OpenMode.ForRead); if (obj is MLeader) {  MLeader ml = obj as MLeader; ...
можно записать как
Код - C# [Выбрать]
  1.  if (tr.GetObject(obid, OpenMode.ForRead) is MLeader ml) {

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: как передать объект в метод
« Ответ #10 : 16-09-2018, 22:57:59 »
Спасибо за замечания. Учту
По поводу строчки кода последней.
Впервые встречаю такой синтаксис is mleader ml
Т е если обьект является выноской он сразу присовится переменной ml?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: как передать объект в метод
« Ответ #11 : 16-09-2018, 23:02:05 »
Да именно так. Эту фичу только в последней студии добавили к оператору is .
Но даже без этого вы всегда сразу можете присвоить MLeader ml = tr.GetObject(...) as MLeader и потом проверить на null. Если тип не совпадет as выдаст null. Тип object использовать незачем.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #12 : 16-09-2018, 23:03:18 »
1. Куча-мала из объектов транзакций и объектов полученных через ObjectId.GetObject. Я б не стал так рисковать. Это ж работа без транзакций, так?
Нет. Это работа с TopTransaction (если конечно хотя бы одна транзакция запущена).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: как передать объект в метод
« Ответ #13 : 16-09-2018, 23:04:35 »
Нет.
Не явное использование TopTransaction ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: как передать объект в метод
« Ответ #14 : 16-09-2018, 23:05:29 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение