Запись значений в доп. колонки. spcDocument

Автор podshibyakinea, 29.05.17, 17:04:54

« предыдущая - следующая »

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

podshibyakinea

Как обратиться к этим ячейкам в спецификации?
Стиль отредактировал - номера их знаю.


podshibyakinea

По учебнику Норсеева нашел  пример. В библиотеке не работает, даже не доходит до выполнения iKompas.ksMessage('1');
Может прокомментируете ?

var
  iKompas: KompasObject;
  iDocument2D: ksDocument2D;
  iDocumentParam: ksDocumentParam;
  iStamp: ksStamp;
  // iViewParam: ksViewParam;
  iTextItemParam: ksTextItemParam;
  iTextItemFont: ksTextItemFont;
  n: integer;
  scale: Double;
  SpcDocument: ksSpcDocument; // API с Спецификацией
  Specification: ksSpecification;

implementation

function LIBRARYNAMEW: PWideChar; pascal;
begin
  // название библиотеки
  Result := 'Запись в доп. колонки';
end;

procedure LIBRARYENTRY(command: WORD); pascal;
var
  str: string;
begin
  str := iKompas.ksSystemPath(0) + '\graphic.lyt'; // путь до системных файлов
  iKompas := KompasObject(CreateKompasObject);
//  if iKompas <> nil then
//  begin
    iKompas.ksMessage('1');
    SpcDocument := ksSpcDocument(iKompas.SpcActiveDocument);
     iKompas.ksMessage('2');
    Specification := ksSpecification(SpcDocument.GetSpecification());
    if SpcDocument = nil then

      Specification.ksSpcObjectCreate(str, 1, 5, 0, 0, 0);

    Specification.ksSetSpcObjectColumnText(SPC_CLM_NAME, 1, 0, 'Спецификация');

    Specification.ksSpcCount(0, '1');

    Specification.ksSpcObjectEnd();

    Specification.ksSpcObjectCreate(str, 1, 20, 0, 0, 0);

    Specification.ksSetSpcObjectColumnText(5, 1, 0, 'Крышка');

    Specification.ksSetSpcObjectColumnText(1, 1, 0, 'А3');

    Specification.ksSpcCount(0, '2');

    Specification.ksSpcPosition(1);

    Specification.ksSpcMassa('25');

    Specification.ksSpcObjectEnd();

    iKompas.Visible := true;
  end;

  // iKompas.ksMessage('Надпись присвоена успешно!');

// end;

end.

Sabahs

Нечего, комментировать, первая строка, уже ошибка.

oit

В LIBRARYENTRY поменяйте 1 и 2 строчку

podshibyakinea

Цитата: Sabahs от 30.05.17, 18:28:17
Нечего, комментировать, первая строка, уже ошибка.


Да, вчера разобрался посмотрел SDK. Нужно было делать сначала так, а далее по моему коду.
kompas:=KompasObject(CreateOleObject('Kompas.Application.5'));
DocumentParam:=ksDocumentParam(kompas.GetParamStruct(ko_DocumentParam));
DocumentParam.Init();
DocumentParam.type_:=4;
DocumentParam.regime:=0;
SheetPar:=ksSheetPar(DocumentParam.GetLayoutParam());
SheetPar.Init();


Новый вопрос. Имеем СП, каким методом дать понять библиотеке какая стока в документе выделена, для работы с ней?

ТрындецЪ

Цитата: podshibyakinea от 31.05.17, 10:13:54
Новый вопрос. Имеем СП, каким методом дать понять библиотеке какая стока в документе выделена, для работы с ней?

Может это ksGetCurrentSpcObject - Получить указатель текущего (выделенного или редактируемого) объекта спецификации

podshibyakinea

Хочу записать значения в доп. колонки СП.
Столкнулся вот с чем.

Сейчас напишу почему SPC_CLM_USER для пользовательских колонок не работает.

Для начала тестировал библиотеку со стилем GRAPHIC с номером Спецификации "1"
Specification.ksSpcObjectCreate(str,1,20,0,0,1);

Создается объект в разделе Детали (20) заполняется масса и в доп колонках появляется значение 25
Specification.ksSpcMassa('25');

Далее используем метод ksSetSpcObjectColumnText для записи значения в пользовательские колонки
Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,1,0,'Тест');
Заполняется Код ОКП в доп колонках.

Далее по логике пишем номера своих колонок т.е
Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,10,0,'Тест');
Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,11,0,'Тест');
Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,12,0,'Тест');
И все, Компас вылетает при запуске библиотеки.



Перехожу в свой стиль в библиотеке motor изменяю номер своей колонки с 10 на 1, компилируем! - работает!
Перехожу в свой стиль в библиотеке motor изменяю номер своей колонки с 11 на 1, компилируем! - работает!
Перехожу в свой стиль в библиотеке motor изменяю номер своей колонки с 12 на 1, компилируем! - работает!
Запись происходит в нужную ячейку. т.е api по факту работает только с 1 колонкой в пользовательском формате.

Как записать в мной созданные доп. колонки если их 5 штук.

ТрындецЪ

01.06.17, 10:26:31 #7 Последнее редактирование: 01.06.17, 11:30:29 от ТрындецЪ
Я так понимаю, что у одного объекта спецификации может быть только однанесколько ячеек каждого типа:
SPC_CLM_FORMAT 1 - формат
SPC_CLM_ZONE 2 - зона
SPC_CLM_POS 3 - позиция
SPC_CLM_MARK 4 - обозначение
SPC_CLM_NAME 5 - наименование
SPC_CLM_COUNT 6 - количество
SPC_CLM_NOTE 7 - примечание
SPC_CLM_MASSA 8 - масса
SPC_CLM_MATERIAL 9 - материал
SPC_CLM_USER  10 - пользовательская
SPC_CLM_KOD 11 - код
SPC_CLM_FACTORY 12 - предприятие-изготовитель

Исходя из описания структуры
Синтаксис:
int ksSetSpcObjectColumnText (unsigned int columnType, unsigned int ispoln, unsigned int block, char *s);

Входные параметры:
columnType - тип колонки SPC_CLM_FORMAT...SPC_CLM_USER,
ispoln - номер исполнения данного типа,
block - номер блока исполнений, начиная с 0 (если количество исполне­ний меньше количества исполнений в бланке спецификации),
s - строка, из которой нужно взять текст.

в записи "Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,12,0,'Тест');" число 12 отсылает  не к колонке,а к исполнению объекта спецификации как раз к доп. колонке 12 колонки 10.


podshibyakinea

Что можно использовать для записи в эти колонки?
Вчера пробежался по SDK ничего толкового не нашел.

ТрындецЪ

01.06.17, 11:20:37 #9 Последнее редактирование: 01.06.17, 11:40:08 от ТрындецЪ
Цитата: podshibyakinea от 01.06.17, 10:50:13
Что можно использовать для записи в эти колонки?
Вчера пробежался по SDK ничего толкового не нашел.

Я ошибался, можно оказывается. Попробовал на питоне записать данные в пользовательскую доп.колонку №13, получилось.
iSpc.ksSetSpcObjectColumnText(10, 13, 1, u"Текст")

Посмотрите в настройках стиля спецификации, может отключена возможность редактирования значения доп.колонки.

ТрындецЪ

Вот циклом заполнил все колонкиfor i in range(20):
    for j in range(20):
        iSpc.ksSetSpcObjectColumnText(i, j, 1, u"Т_"+str(i)+"_"+str(j))


podshibyakinea

У меня нет такой настройки. Компас v15
v16.1 тоже смотрел, нет.

ТрындецЪ

Это в настройках конкретного раздела спецификации (Детали, например)

podshibyakinea

Спасибо! Все работает.   :)
Колонки не редактировал, по аналогу сделал цикл и понял как что должно быть заполнено.



А решение такое, может кто будет сталкиваться.

Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,13,1,'Тест');
Specification.ksSetSpcObjectColumnText(SPC_CLM_USER,14,1,'Тест');


Где 13 и 14 это номера колонок в стиле спецификации. т.е вначале я не знал как к ним обратиться правильно.

podshibyakinea

Каким свойством прочитать значения из этих колонок?

т.е сейчас с формы они записываются, хочу чтобы при нажатии на строку "Деталь001" форма заполнилась значениями от туда.

ТрындецЪ

Цитата: podshibyakinea от 08.06.17, 11:33:13
Каким свойством прочитать значения из этих колонок?

т.е сейчас с формы они записываются, хочу чтобы при нажатии на строку "Деталь001" форма заполнилась значениями от туда.

Почти так же, как и записывали.
# -*- coding: cp1251 -*-

import Kompas10API5 as KAPI
from win32com.client import Dispatch

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)

iDocumentSpc = iKompasObject.SpcActiveDocument()
iSpc = iDocumentSpc.GetSpecification()
obj = iSpc.ksGetCurrentSpcObject() #Получаем текущий выделенный объект
s = iSpc.ksGetSpcObjectColumnText (obj, 10,  1, 0) # Чтение первой пользовательской колонки
print s

podshibyakinea

Спасибо! Работает.
Пример на делфи если кому пригодится.

  Specification := ksSpecification(iSpcDocument.GetSpecification());
  obj := Specification.ksGetCurrentSpcObject();
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(Specification.ksGetSpcObjectColumnText(obj, SPC_CLM_USER, 11, 0));

podshibyakinea

Подскажите, как работать с колонкой "Примечание" в СП, как к ней обратиться?
На форуме по запросу "Примечание" ничего нет.

*SPC_CLM_NOTE не работает с колонкой.

podshibyakinea

   Specification.ksSetSpcObjectColumnText(SPC_CLM_NOTE, 1, 0,'Тест11');

Оказывается работает. Параллельно с вопросом разобрался сам.

SerGoVec

Всем привет!
Задаю вопрос здесь, чтобы не плодить новую тему.

Задача - поменять программно значение в колонке  "Кол." спецификации.
Получить значения из таблицы спецификации не проблема, но проблема изменить значение.
Как это можно сделать?


procedure ChangeColumnCountSPW();
var
  doc: IKompasDocument;
  ks_spcDoc: ksSpcDocument;
  ks_spec: ksSpecification;
  ks_iter: ksIterator;
  ks_spcColumnParam: ksSpcColumnParam; //параметры колонки таблицы спецификации
  objID: Integer;
  countColumn: Integer;
  I: Integer;


begin
  doc := K7.ActiveDocument;

  //работа со спецификацией api 5
  try
    ks_spcDoc := ksSpcDocument(K5.SpcActiveDocument);
    ks_spec := (ks_spcDoc.GetSpecification as ksSpecification);
    countColumn := ks_spec.ksGetSpcTableColumn('',0,0);
    ks_iter := (K5.GetIterator as ksIterator);  //общий итератор
    ks_iter.ksCreateSpcIterator('',0,3);           //итератор для работы с объектами спецификации
   
    if ks_iter = nil then
      Exit;
 
    objID := ks_iter.ksMoveIterator('F');   
   
    if objID = 0 then
      Exit;
   
    //перебор объектов спецификации (вертикаль)
    while objID <> 0 do
    begin
      for I := 1 to countColumn do         //номера колонок начинаются с 1
      begin
        ks_spcColumnParam := (k5.GetParamStruct(ko_SpcColumnParam) as ksSpcColumnParam);
        ks_spec.ksGetSpcColumnType(objID, i, ks_spcColumnParam);

        var colType := ks_spcColumnParam.columnType;
//        if colType = SPC_CLM_COUNT then
//        begin
          var isp := ks_spcColumnParam.ispoln;
          var blok := ks_spcColumnParam.block;
          var txt := ks_spec.ksGetSpcObjectColumnText(objID, colType,isp,blok);

          ks_spec.ksSetSpcObjectColumnText(SPC_CLM_COUNT,isp,blok,'5'); //как пример
//        end;
      end;

      objID := ks_iter.ksMoveIterator('N');
    end;

  finally
    ks_spcDoc := nil;
    //TODO дописать
  end;
end;