Использование данных ячейки таблици

Автор Тема: Использование данных ячейки таблици  (Прочитано 3844 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Добрый день !
Подскажите неопытному пользователю как можно использовать ранние заданные значения в ячейки таблици типа   "2 ", "3" (ячеек [0,0] и [0,1]) выполнить скажем "2 * 3 " и вставить полученный результат в ячейку [0,3] этой же таблице .
Среда разработки C# , Autocad 2017

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ну вообще-то последовательность действий вы уже написал: взять два значения, перемножить их и результат вставить в ячейку.
Но, судя по наличию этого вопроса и его содержимому, Вы хотите, что мы Вам готовый код предложили. Неееет! Тут так не делается!
Начните писать плагин и если возникнут вопросы - спрашивайте - подскажем

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот большое количество примеров работы с таблицами. Посмотрев их можно решить вашу задачу влёт

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Ну вообще-то последовательность действий вы уже написал: взять два значения, перемножить их и результат вставить в ячейку.
Но, судя по наличию этого вопроса и его содержимому, Вы хотите, что мы Вам готовый код предложили. Неееет! Тут так не делается!
Начните писать плагин и если возникнут вопросы - спрашивайте - подскажем
Прошу прощения за скудный вопрос. Вот пример кода.
Интересующая строка ".....var clResual = cl1 * cl2; ....." .Как выполнить операцию над данными?.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.DatabaseServices;
  10. using Autodesk.AutoCAD.ApplicationServices;
  11.  
  12. namespace test1
  13. {
  14.     public class Class1
  15.     {
  16.         [CommandMethod("test")]
  17.  
  18.         public void test()
  19.         {
  20.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  21.             Database db = ed.Document.Database;
  22.             PromptEntityOptions peo = new PromptEntityOptions("Вибрати таблиці");
  23.             PromptEntityResult per = ed.GetEntity(peo);
  24.  
  25.             if (per.Status == PromptStatus.OK)
  26.             {
  27.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  28.                 {
  29.                     Table tb = (Table)tr.GetObject(per.ObjectId, OpenMode.ForWrite);
  30.                     tb.Cells[0, 0].Value = 3;
  31.                     tb.Cells[0, 1].Value = 2;
  32.                     tb.Cells[0, 3].Value = 2;
  33.  
  34.                     var cl1 = tb.Cells[0, 0];
  35.                     var cl2 = tb.Cells[0, 1];
  36.  
  37.                     var clResual = cl1 * cl2;
  38.                     tb.Cells[0, 4].Value = clResual;
  39.  
  40.                     tr.Commit();
  41.                 }
  42.             }
  43.         }
  44.     }
  45. }
  46.  
« Последнее редактирование: 12-02-2018, 15:56:56 от Александр Ривилис »

Отмечено как Решение Александр Ривилис 10-02-2018, 22:49:13

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
graveman13
Приветствую на форуме!
1. Прочитайте у меня в подписи как следует форматировать код на форуме и в дальнейшем неукоснительно соблюдайте это правило.
2. cl1 и cl2 - это строки. Их следует преобразовать в int (или double в зависимости от того какие типы значений могут быть), выполнить над ними операцию умножения и обратно превратить в строку. Например, как-то так (код не тестировал):
Код - C# [Выбрать]
  1. var clResual = (Convert.ToInt32(cl1) * Convert.ToInt32(cl2)).ToString();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
вообще забудьте про var

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
graveman13
Приветствую на форуме!
1. Прочитайте у меня в подписи как следует форматировать код на форуме и в дальнейшем неукоснительно соблюдайте это правило.
2. cl1 и cl2 - это строки. Их следует преобразовать в int (или double в зависимости от того какие типы значений могут быть), выполнить над ними операцию умножения и обратно превратить в строку. Например, как-то так (код не тестировал):
Код - C# [Выбрать]
  1. var clResual = (Convert.ToInt32(cl1) * Convert.ToInt32(cl2)).ToString();
Спасибо за подсказку!. Помогло данное решение.

 
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2.                 {
  3.                     Table tb = (Table)tr.GetObject(per.ObjectId, OpenMode.ForWrite);
  4.                     tb.Cells[0, 0].Value = 3;
  5.                     tb.Cells[0, 1].Value = 2;
  6.  
  7.                     string cl1 = tb.Cells[0, 0].GetTextString(FormatOption.ForEditing);
  8.                     string cl2 = tb.Cells[0, 1].GetTextString(FormatOption.ForEditing);
  9.  
  10.                     tb.Cells[0, 3].TextString = (Convert.ToDouble(cl1) * Convert.ToDouble(cl2)).ToString();
  11.                     tr.Commit();
  12.                 }
  13.  

Но входе вариантов встретил еще одну проблему. Ниже приведенный код это проработка для будущих проектов. Задумка состоит у выборе нескольких таблиц их анализе и сведение данных в "таблицу  результатов". Данный код  это попытка упростить задачу - разобраться. В  коде "таблицу  результатов" [10,3]
создаю массив массивов и записываю из выбранных таблиц  данные. Потом заношу данные из массива в новою "таблицу  результатов". Но почему то записываются только последовании элементы таблици из набора. Возможно есть решение даной проблемы?. 
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.ApplicationServices;
  10. using Autodesk.AutoCAD.Geometry;
  11.  
  12. namespace selectTable
  13. {
  14.     public class Class1
  15.     {
  16.         [CommandMethod("selTb")]
  17.         public void selectTable()
  18.         {
  19.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  20.             Database db = ed.Document.Database;
  21.            
  22.             PromptSelectionResult psr = ed.GetSelection();
  23.             SelectionSet sst = psr.Value;
  24.             ObjectId[] oi = sst.GetObjectIds();
  25.  
  26.             PromptPointResult ppr = ed.GetPoint("Выбрать место вст. тб.");
  27.  
  28.             Table tbB = new Table();
  29.             tbB.SetSize(10, 3);
  30.             tbB.Position = ppr.Value;
  31.  
  32.             string[][] array = new string[oi.Length][];
  33.             for (int i = 0; i < array.Length; i++)
  34.             {
  35.                 array[i] = new string[2];
  36.             }
  37.             using (Transaction tr = db.TransactionManager.StartTransaction())
  38.             {
  39.             for (int i = 0; i < oi.Length; i++)
  40.             {
  41.                     Table tbA = (Table)tr.GetObject(oi[i], OpenMode.ForRead);
  42.                 for (int j = 0; j < array[i].Length; j++)
  43.                 {
  44.                         array[i][j] = tbA.Cells[i, j].TextString;
  45.                 }
  46.             }
  47.                 tbB.Cells[0, 0].TextString = array[0][0];
  48.                 tbB.Cells[0, 1].TextString = array[0][1];
  49.                 tbB.Cells[1, 0].TextString = array[1][0];
  50.  
  51.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  52.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  53.                 btr.AppendEntity(tbB);
  54.                 tr.AddNewlyCreatedDBObject(tbB, true);
  55.                 tr.Commit();
  56.             }
  57.         }
  58.     }
  59. }
  60.  





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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. У нас принято "один вопрос - одна тема". В следующий раз создавай новую тему.
2. При получении решения на заданный вопрос следует отмечать ответ кнопкой Решение. Я уже отметил.
3. Этот вопрос я не понял. Что не так? Я вижу, что в выходную таблицу записываются только три значения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
1. У нас принято "один вопрос - одна тема". В следующий раз создавай новую тему.
2. При получении решения на заданный вопрос следует отмечать ответ кнопкой Решение. Я уже отметил.
3. Этот вопрос я не понял. Что не так? Я вижу, что в выходную таблицу записываются только три значения.
1.2. Понял.
3. Получается вот так. Как не крутил не могу понят почему.


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
3. Получается вот так. Как не крутил не могу понят почему.
Ну если бы запустил под отладчиком, то сразу бы увидев что к чему.
Вот так получается после исправлений:


А это исправленный код:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.ApplicationServices;
  10. using Autodesk.AutoCAD.Geometry;
  11.  
  12. namespace selectTable
  13. {
  14.   public class Class1
  15.   {
  16.     [CommandMethod("selTb")]
  17.     public void selectTable()
  18.     {
  19.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  20.       Database db = ed.Document.Database;
  21.  
  22.       PromptSelectionResult psr = ed.GetSelection();
  23.       SelectionSet sst = psr.Value;
  24.       ObjectId[] oi = sst.GetObjectIds();
  25.  
  26.       PromptPointResult ppr = ed.GetPoint("Выбрать место вст. тб.");
  27.  
  28.       Table tbB = new Table();
  29.       tbB.SetSize(10, 3);
  30.       tbB.Position = ppr.Value;
  31.  
  32.       string[][] array = new string[oi.Length][];
  33.       for (int i = 0; i < array.Length; i++)
  34.       {
  35.         array[i] = new string[2];
  36.       }
  37.       using (Transaction tr = db.TransactionManager.StartTransaction())
  38.       {
  39.         for (int i = 0; i < oi.Length; i++)
  40.         {
  41.           Table tbA = (Table)tr.GetObject(oi[i], OpenMode.ForRead);
  42.           for (int j = 0; j < array[i].Length; j++)
  43.           {
  44.             array[i][j] = tbA.Cells[0, j].TextString; // <<<- Вот тут у тебя была ерунда
  45.           }
  46.         }
  47.         for (int i = 0; i < oi.Length; i++)
  48.         {
  49.           for (int j = 0; j < array[i].Length; j++)
  50.           {
  51.             tbB.Cells[i, j].TextString = array[i][j];
  52.           }
  53.         }
  54.         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  55.         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  56.         btr.AppendEntity(tbB);
  57.         tr.AddNewlyCreatedDBObject(tbB, true);
  58.         tr.Commit();
  59.       }
  60.     }
  61.   }
  62. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0

Спасибо!.Да элементарная ошибка,  недосмотрел ((.