Работа с выдленными ячейками таблицы

Автор Sprinter500, 28.04.10, 19:06:07

« назад - далее »

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

Sprinter500

 :) Всем доброго вре мени суток! Подскажите пожалуйста, как библиотеке или программе прочесть данные из выделенных ячеек таблицы в КОМПАСе ? Буду рад как алогоритму, ответу на то какие функции используются, примеру из нескольких строк на любом языке и др.
Также хотелось бы знать обратную ситуацию: как вставить данные в выделенные ячейки таблицы КОМПАСа.

Sprinter500

 :( Неужели, никто не знает ответ на это вопрос?!

zaev7


bergovin

30.04.10, 18:23:32 #3 Последнее редактирование: 30.04.10, 18:33:46 от bergovin
Цитата: Sprinter500 от 30.04.10, 16:25:03
:( Неужели, никто не знает ответ на это вопрос?!
вы SDK смотрели?

Sub EditTable(doc As Object)      ' просмотр таблицы
  ' редактирование таблицы
  Dim pObj As Long
  Dim iInfo As Object
  Set iInfo = iKompasObject.GetParamStruct(ko_RequestInfo)
  If Not iInfo Is Nothing Then
    Dim x As Double
    Dim y As Double
    iInfo.prompt = "Укажите таблицу"
    ' взять таблицу на чертеже
    Dim j As Long
    j = doc.ksCursor(iInfo, x, y, Nothing)
    If j Then
      pObj = doc.ksFindObj(x, y, 100000)
      If j And doc.ksExistObj(pObj) Then
        ' узнаем тип объекта
        Dim typeObj As Integer
        typeObj = doc.ksGetObjParam(pObj, Nothing, 0)      ' указатель на графический объект
        ' проверить полученный объкет  - таблица
        If typeObj = TABLE_OBJ Then
          Dim numb As Long
          ' открыть таблицу для редактирования
          doc.ksOpenTable pObj
          Dim iPar As Object ' ksTextParam
          Set iPar = iKompasObject.GetParamStruct(ko_TextParam)
          If Not iPar Is Nothing Then
            iPar.Init
            ' в цикле будем брать все существующие ячейки
            Do While ((doc.ksGetTableColumnText(numb, iPar)))
              iKompasObject.ksMessage "numb = " & numb
              Dim iArrpLineText As Object ' ksDynamicArray
              Set iArrpLineText = iPar.GetTextLineArr
              Dim iItemLineText As Object ' ksTextLineParam
              Set iItemLineText = iKompasObject.GetParamStruct(ko_TextLineParam)
              If Not iItemLineText Is Nothing And Not iArrpLineText Is Nothing Then
                iItemLineText.Init
                For i = 0 To iArrpLineText.ksGetArrayCount - 1
                  iArrpLineText.ksGetArrayItem i, iItemLineText
                  iKompasObject.ksMessage "i = " & i & " style = " & iItemLineText.Style
                  Dim iArrpTextItem As Object
                  Set iArrpTextItem = iItemLineText.GetTextItemArr
                  Dim iItem As Object
                  Set iItem = iKompasObject.GetParamStruct(ko_TextItemParam)
                  iItem.Init
                  If Not iItem Is Nothing And Not iArrpTextItem Is Nothing Then
                    For j = 0 To iArrpTextItem.ksGetArrayCount - 1
                      iArrpTextItem.ksGetArrayItem j, iItem
                      Dim iTextItemFont As Object ' ksTextItemFont
                      Set iTextItemFont = iItem.GetItemFont
                      If iItem.Type Then
                        iKompasObject.ksMessage "компонента = " & j & " тип = " & iItem.Type & " номер спецзнака = " & iItem.GetISNumb
                      Else
                        iKompasObject.ksMessage "компонента = " & j & " h = " & iTextItemFont.HEIGHT & " s = " & iItem.s & " fontName = " & iTextItemFont.FontName & " битвектор = " & iTextItemFont.bitVector
                      End If
                    Next
                    iArrpTextItem.ksDeleteArray ' очистим массив компонент
                  End If
                Next
                ' очистим массив текстовых строк
                iArrpLineText.ksDeleteArray
              End If
            Loop
            ' берем ячейку 2
            doc.ksColumnNumber 2
            doc.ksText 0, 0, 0, 5, 1, 0, "вторая ячейка"
 
            doc.ksDivideTableItem 3, 1, 2
            doc.ksColumnNumber 4
            doc.ksText 0, 0, 0, 5, 1, 0, "4"
 
            doc.ksEndObj ' закрыли объект "таблица"
          End If
        Else
          iKompasObject.ksError "это не таблица"
        End If
      Else
        iKompasObject.ksError "нет объекта"
      End If
    End If
  End If
End Sub

Sprinter500

Смотрел. Проблема не в этом. В приведенном примере, перебираются все ячейки таблицы по порядку без исключения. А мне нужно работать с выделенными мышью ячеками - то есть далеко не со всеми!

bergovin

Цитата: Sprinter500 от 01.05.10, 13:09:37
Смотрел. Проблема не в этом. В приведенном примере, перебираются все ячейки таблицы по порядку без исключения. А мне нужно работать с выделенными мышью ячеками - то есть далеко не со всеми!
Ну по всей видимости, по аналогии, как сдесь указывается таблица (через коодианаты курсора), так сделать и с ячейкой

Sprinter500

Так как необходимо работать с несолькими выдленными черным цветом ячейками, а не с одной, то метод по координатам курсора не годится. Держать курсор одновременно над несолькми ячейками не получится, для этого наверное надо двигать мышью со скоростью света  :)

Bordes

Ячейки таблицы вроде можно выделить только при непосредственном редактировании содержимого таблицы, а когда какой-то объект редактируется, его (и его содержимое) библиотеки наверное не могут обрабатывать...
Как вариант, если в таблице нет сложного форматирования текста -  передать таблицу (в смысле ее содержимое) куда-то (в Grid окна библиотеки, в эл. таблицу), где можно будет выделять ячейки и работать с их содержимым, а потом все данные отправляются обратно в КОМПАС-таблицу.

Sprinter500

Ну, если переносить выделенное содержимое, куда то и там обрабтывать вручную, то теряется весь смысл написания программы. Допустим, мне надо получить, произведение двух выделенных столбцов в третьем столбце. Получается для этого мне надо скопировать выделенное в EXCEL (что невозможно), а затем обратно, что трудно даже в 11, а в  9-ке вообще нельзя. А пока что приходится работать калькулятором, и вручную вбивать произведение двух столбцов...Вот для этого ( и некотроых других целей я и хочу написать программу). "Лентяй!" - скажите, Вы. Но лень - двигатель прогресса!

Bordes

Цитата: Sprinter500 от 05.05.10, 19:55:26
Ну, если переносить выделенное содержимое, куда то и там обрабтывать вручную, то теряется весь смысл написания программы. Допустим, мне надо получить, произведение двух выделенных столбцов в третьем столбце. Получается для этого мне надо скопировать выделенное в EXCEL (что невозможно), а затем обратно, что трудно даже в 11, а в  9-ке вообще нельзя.
Предлагалось перенести ВСЮ таблицу (а не только выделенные ячейки, до которых добраться нельзя) туда, где можно ее обработать (НЕ ОБЯЗАТЕЛЬНО ВРУЧНУЮ) желаемым образом. Будьте внимательны, пожалуйста, иначе пропадает охота советовать.  :~

Дополнительно, для простых случаев совсем не обязательно выделять диапазон ячеек визуально - его можно просто задать, например, А1:А100, а уж дальше можно получить значения из ячеек указанных диапазонов и обработать их, поместив результат в так же указанный диапазон ячеек.

Sprinter500

А1:А100 - это формат, применимый к КОМПАСу или только к Excel?

Maxagg

Решение.
1. Программно скопировать выделенные ячейки
2. Создать дополнительную таблицу близнеца без значений
3. Вставить из буфера
4. Сделать расчеты (здесь метод перебора будет работать, т.к. другие ячейки пустые)
5. Занести полученные данные куда надо
6. удалить таблицу близнеца


Bordes

Решение для простого случая:
Библиотека просить пользователя указать таблицу (как графический объект)
Библиотека запрашивает у пользователя номера столбцов, которые надо обработать
Библиотека запрашивает у пользователя номер столбца, в который нужно поместить результаты
Библиотека берет значения из указанных столбцов, обрабатывает их и помещает в столбец результатов.
Выделять ничего не надо, ткнуть курсором в таблицу и ввести несколько цифр. Все.

Bordes

Цитата: Максимилиан от 12.05.10, 14:04:09
Решение.
1. Программно скопировать выделенные ячейки
...
Вот тут можно поподробнее? как это сделать для компасовской таблицы?

Sprinter500

Цитата: Максимилиан от 12.05.10, 14:04:09
Решение.
1. Программно скопировать выделенные ячейки
2. Создать дополнительную таблицу близнеца без значений
3. Вставить из буфера
4. Сделать расчеты (здесь метод перебора будет работать, т.к. другие ячейки пустые)
5. Занести полученные данные куда надо
6. удалить таблицу близнеца

Пункты 2-6 я догадываюсь как делать - писал уже программы, работающие с таблицами в Компасе. Но вся соль в пункте 1.

Sprinter500

Цитата: Bordes от 12.05.10, 14:23:03
Решение для простого случая:
Библиотека просить пользователя указать таблицу (как графический объект)
Библиотека запрашивает у пользователя номера столбцов, которые надо обработать
Библиотека запрашивает у пользователя номер столбца, в который нужно поместить результаты
Библиотека берет значения из указанных столбцов, обрабатывает их и помещает в столбец результатов.
Выделять ничего не надо, ткнуть курсором в таблицу и ввести несколько цифр. Все.

А как заранее узать номера столбцов, строк, ячеек на произвольной (уже созданной ранее) таблице, причем если нужны не полностью столбцы сверху донизу, а некоторый диапазон ячеек? Ситуация осложняется тем, что на некоторых таблицах могут быть объединенные ячейки. По-моему, без выделения ячеек не обойтись ....

Maxagg

Пункт 1 можно сделать через винапи
После нажатия на кнопку расчета делаем окно компаса активным
serforegroundwindow
и используем функцию
keybd_event

вот процедура для нажатия клавиш в неактивном окне
procedure EmulateKey(Wnd: HWND; VKey: Integer);
asm
   push 0
   push edx
   push 0101H //WM_KEYUP
   push eax
   push 0
   push edx
   push 0100H //WM_KEYDOWN
   push eax
   call PostMessage
   call PostMessage
end;

// Пример использования:
EmulateKey(kompas.ksgetHWindow, VK_control);

Bordes

Цитата: Sprinter500 от 12.05.10, 16:58:16
А как заранее узать номера столбцов, строк, ячеек на произвольной (уже созданной ранее) таблице,....
Не понял вопроса, кто и зачем должен заранее узнавать номера? Предполагалось, что пользователь посмотрит на таблицу глазами, а руками введет в программу нужные номера.... :)

Цитата: Sprinter500 от 12.05.10, 16:58:16
...причем если нужны не полностью столбцы сверху донизу, а некоторый диапазон ячеек?...
Для обработки диапазонов ячеек можно вводить номер столбца, номер начальной, номер конечной ячейки в это столбце.

Цитата: Sprinter500 от 12.05.10, 16:58:16
Ситуация осложняется тем, что на некоторых таблицах могут быть объединенные ячейки. По-моему, без выделения ячеек не обойтись ....
Дак и не настаиваю, хотите - выделяйте...  :)

Bordes

Цитата: Максимилиан от 13.05.10, 05:28:02
Пункт 1 можно сделать через винапи
После нажатия на кнопку расчета делаем окно компаса активным
...
Спасибо за ответ конечно, но честно говоря, все равно не могу разглядеть пути к получению значений выделенных ячеек....

Sprinter500

Объединные ячейки сбивают станадартную нумерацию в Компасе. В 99% случаев мне приходится иметь дело с таблицами, содержащими объединенные ячйки нескольких столбцов или строк. Как быть в этом случае?