Работа со спецификацией

Автор Georg, 26.01.04, 14:52:32

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

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

Georg

Подскажите, пожалуйста, как программно вставить запись в спецификации после указанной пользователем записи, т.е. выделенной.

Georg

Не понял - то ли никто не создает спецификации (я имею ввиду программистов), то ли слишком простой/сложный вопрос.
А суть в том, что на основании нескольких спецификаций необходимо создать некий сводный документ. На некоторых предпритиях используются сводные/производственные спецификации, в которых расписывается состав основного узла с составом всех входящих узлов.
Может кто ответит на мой вопрос (см. выше)?

caduser

Объект спецификации создаётся функцией:
//------------------------------------------------------------------------------
// Создать объект спецификации
// составной объект
// Объект создается функцией ksSpcObjectEnd();
// для атрибутов, описанных  по ключам нужно указать тип в numb, потому что типов
// с одинаковыми ключами можент быть несколько
// nameLib и styleNumb - используются только для объектов СП в графическом документе,
// в спецификации не используются
// ---
ksSpcObjectCreate( char          *nameLib,    // имя библиотеки стилей
                                unsigned int   styleNumb,  // номер стиля спецификации
                                unsigned short secNumb,    // номер раздела
                                unsigned short subSecNumb, // номер подраздела
                                double         numb,       // для базового объекта- тип атрибута, который задан по ключам или 0
                                                           // для вспомогательного объекта - номер базового объекта, к которому прикрепляется вспомогательный либо 0
                                unsigned char  typeObj );  // тип объекта 0- базовый объект 1- вспомогательный

Для случая "Создать объект спецификации после выделеного объекта", но если включена сортировка в разделе, то не имеет значения где будет создан объект т.к. он всеравно будет отсортирован КОМПАСом.

Возможно пригодится и такая функция:
//------------------------------------------------------------------------------
// Получить  указатель  текущего объекта СП ( выделенного или редактируемого в таблице СП )
// Функция работает для видимых таблиц СП
// ---
ksGetCurrentSpcObject();

Если подробнее изложите задачу возможно найдется другое приемлимое решение.

caduser

Цитироватьсуть в том, что на основании нескольких спецификаций необходимо создать некий сводный документ.

Была похожая задача. Сделал очень простую библиотеку которая выводит стандартное окно для выбора файлов чертежей или спецификаций, затем читает из выбранных файлов объекты спецификаций в буфер и вставляет все в сводный файл спецификации. При этом суммируются значения колонок "Количество".

Georg

Уважаемый Caduser!

Требуется составить несколько другой документ.
Вид его привожу ниже (с колонками количества сам разберусь) для
состава узла Г98М-1400 "Крышка цилиндров":

Обозначение           Наименование

Г98М-140001           Крышка цилиндра                |
Г98М-140003           Прокладка                           |  это детали,
Г98-140005              Шпилька                              |  стандартные
                               Болт М8.....                          | и материалы
                               Болт М12                             | головного узла
                               Клей Герметик УГ-8              |

Г98М-1401               Коромысло газового клапана          (это подузел)

Г98М-140103           Ролик                           |
Г98М-140104           Ось                              | это состав подузла
Г98М-140105           Толкатель                     |  Г98М-1401
                               Гайка М22.....               |
                               Винт-пробка М8х8         |

Г98М-1402               Запрессовка втулки      ( это подузел)

Г98М-140201            Коромысло                   | это состав подузла
Г98М-140202            Втулка                          | Г98М-1402

Ясно, что такой документ не имеет не имеет структуру разделов,
но это меня не волнует. И сортировки там нет.
Другое дело, что я хочу взять состав из спецификации головного узла, в новый документ вставить детали, стандарные, прочие, материалы, узлы (именно в указанном порядке).
Затем указать вручную на запись подузла и после него вставить состав этого подузла, выбрав информацию из соответствующей спецификации.

Вот именно поэтому я и запрашиваю, как вставить записи после записи, указанной пользователем, в документе с отсутствием сортировки.

С уважением
Георгий

Georg

Привет Caduser!
Из Аскона сообщили, что моя задача о вставке записи в спецификацию после указанной пользователем решается только следующим образом:
1. чтение последующих записей
2. их удаление
3. вставка новой записи
4. вставка удаленных записей
Других способов нет.

Теперь новый вопрос. Приходилось ли тебе делать многострочную запись в колонке спецификации? Если "Да", то каким образом?

Georg

caduser

Многострочную запись можно сделать вставляя в конце каждой строки  символы "\n".

Georg

Привет!
с ’/n’ многострочного текста не получается.

Georg

Кстати, и с ’\n’ тоже.

Alik

У меня так работает.....

//--------------------------------------------------------------------
 ksSpcObjectCreate( Pchar(Buff + ’graphic.lyt’),1,5,0,0,0 );
    StrCopy(s, ’Первая строка’+#13#10+’Вторая строка’);
    ksSpcChangeValue( 5 , 1, Addr(s), STRING_ATTR_TYPE  );
  ksSpcObjectEnd( );
//--------------------------------------------------------------------

ViСТоr

Нужно использовать принцип формирования текста формата Компас 4
на пример:
@/ - переход на новую строчку
$d - числител
;   - знаменатель
$  - конец дроби и т.д.
Вкачестве примера может служить объект спецификации создаваемый в библиотеке армтруб - трубы 8732 и 10704 они создаются на основе атрибута из spc.lat трубы 8732 и 10704
В Компас 6+ появилась возможность устанавливать и получать текст объекта спецификации в виде массива строк. Т.е. также как для обычного текста.
см функции ksGetSpcObjectColumnTextEx и ksSetSpcObjectColumnTextEx  

sorockinalex

насчёт GetSpcColumnTextEx:
запутался... как мне в цикле получить в переменную s1 каждую строку текста отдельно?, чтобы сделать s2 c символами переноса...
массив cellstring получил... по хорошему было бы удобно так cellstring.getarrayitem, но так ведь нельзя! Как тут делается? Помогите, пожалуйста!

       cellstring:=ksDynamicArray(spec.ksGetSpcObjectColumnTextEx(Obj_f,k1, k2,0));
        textlinepar:=ksTextLineParam(kompas.GetParamStruct(ko_TextLineParam));
        textitempar:=ksTextItemParam(kompas.GetParamStruct(ko_TextItemParam));

        for m:=1 to  cellstring.ksGetArrayCount do
        begin
          cellstring.ksGetArrayItem(m, textlinepar);
          linearr:=textlinepar.GetTextItemArr;
          linearr.ksGetArrayItem(1, textitempar)  ;
          showmessage(textitempar.s);
          textitempar.
          s2:=s2+s1+#13#10;
          showmessage(s2);
        end;

sorockinalex

сделал так:
...
//создаём массив
TextLineArray:=ksDynamicArray(spec.ksGetSpcObjectColumnTextEx(Obj_f,k1, k2,0));
//присваиваем переменной результат выполнения функции
s:=BuildStringWithSplittersFromArrayItems(TextLineArray)
...
function BuildStringWithSplittersFromArrayItems(TextLineArray: ksdynamicarray):string;
var
  s1,s2:string;
  m,n,k:integer;
  linearr:ksDynamicArray;
  textlinepar:ksTextLineParam;
  textitempar: ksTextItemParam;
begin
  textlinepar:=ksTextLineParam(kompas.GetParamStruct(ko_TextLineParam));
  textlinepar.Init;
  textitempar:=ksTextItemParam(kompas.GetParamStruct(ko_TextItemParam));
  textitempar.Init;

  k:=TextLineArray.ksGetArrayCount-1;
  for m:=0 to  (k) do
  begin
    TextLineArray.ksGetArrayItem(m, textlinepar);
    linearr:=ksDynamicArray(textlinepar.GetTextItemArr);
    s1:='';
    for n:=0 to (linearr.ksGetArrayCount-1) do
    begin
      linearr.ksGetArrayItem(n, textitempar);
      s1:=s1+textitempar.s;
    end;
    s2:=s2+s1;
    if m<>k then s2:=s2+chr(13)+chr(10)
  end;
  Result:=s2;
end;
[code]

sorockinalex

ребят, задавал этот вопрос в соседней теме, никто не ответил, может глюк форума...
поэтому задаю тут:
как при чтении объектов спецификации узнать базовый это объект или вспомогательный?