Пример работы с основной надписью в спецификации для Kompas.Application.7

Автор Homer, 09.11.15, 14:17:54

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

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

Homer

Здравствуйте всем!

Дело такое:

Необходимо считывать значения из основной надписи чертежей для этого была создана утилита которая средствами API 5 очень хорошо считывала все значения и возвращала в нужном виде. Но теперь заказчику стало необходимо считывать основную надпись из спецификации тоже.

Вот как это работало для обычных чертежей:

KompasObj := KompasObject(CreateOleObject('Kompas.Application.5'));
...
// Получаем интерфейс документа
Document2D := ksDocument2D(KompasObj.Document2D);
//
isOpened := Document2D.ksOpenDocument(filePath, false);
...
outputMsg := KompasAPI.readStamp(ksStamp(Document2D.GetStamp), KompasObj);

где

function readStamp(Stamp: ksStamp; KompasObj: KompasObject):String;
var
  outputMsg : String;
  index, cellIndex : Integer;
  iTextLineDynamicArray, iTextItemDynamicArray :  ksDynamicArray;
  iTextLineParam : ksTextLineParam;
  iTextItemParam : ksTextItemParam;
  cellData : TStringList;
  text : string;
begin
  cellData := TStringList.Create;
  cellData.Delimiter := ' ';
  //cellData.QuoteChar := ' ';
  //
  Stamp.ksOpenStamp;
  cellIndex := 1;
  //
  outputMsg := '{';
  while (cellIndex <= Length(CellIndexes)) do
  begin
    // Choose cell
    Stamp.ksColumnNumber(CellIndexes[cellIndex]);
    // Read data from cell, row by row
    // Initialize variables
    iTextLineParam := ksTextLineParam(KompasObj.GetParamStruct(ko_TextLineParam));
    iTextItemParam := ksTextItemParam(KompasObj.GetParamStruct(ko_TextItemParam));
    // Read from cell into array
    iTextLineDynamicArray := ksDynamicArray(Stamp.ksGetStampColumnText(index));
    // Row by row from cell
    if (iTextLineDynamicArray <> Nil) then
    begin
      index := 0;
      while (index < iTextLineDynamicArray.ksGetArrayCount) do
      begin
        iTextLineDynamicArray.ksGetArrayItem(index, iTextLineParam);
        // Get text from lineParam
        iTextItemDynamicArray := ksDynamicArray(iTextLineParam.GetTextItemArr());
        if (iTextItemDynamicArray.ksGetArrayCount <> 0) then
        begin
          iTextItemDynamicArray.ksGetArrayItem(0, iTextItemParam);
          cellData.Add(iTextItemParam.s);
        end;
        index := index + 1;
      end;
      //
      text := StringReplace(
        StringReplace(
          StringReplace(cellData.DelimitedText, '\', '\\', [rfReplaceAll]),
          '/', '\/', [rfReplaceAll]
        ),
        '"', '\"', [rfReplaceAll]);
    end
    else
    begin
      text := 'Ошибка чтения!';
    end;
    //
    outputMsg :=  outputMsg + '"' + IntToStr(CellIndexes[cellIndex]) + '":"';
    outputMsg :=  outputMsg + text + '",';
    //
    if (cellData.Count <> 0) then
      cellData.Clear;
    //
    cellIndex := cellIndex + 1;
  end;
  //
  Stamp.ksCloseStamp;
  //
  Delete(outputMsg, length(outputMsg), 1);
  Result := outputMsg + '}';
end;

Для спецификации это все перестало работать так как некоторые файлы API5 просто не открывал а для некоторых говорил что версия файла более новая.

В связи с этим я решил попробовать организовать чтение основной надписи средствами API7 и вот тут я застрял на 2-3 недели... Что очень печально на самом деле.

Вот до такого кода я смог дойти а дальше никакого продвижения:

  KompasObjAPI7 := CreateOleObject('Kompas.Application.7') as IApplication;
  KompasObjAPI7.HideMessage := ksHideMessageYes;
  KompasObjAPI7.Visible := true;
  //
  KompasDocument := KompasObjAPI7.Documents.Open('D:\Workspace-eaktd\Cramboo.spw', true, false);
  //
  case KompasDocument.DocumentType of
    ksDocumentUnknown : DocumentTypeTitle := 'Unknown';
    ksDocumentDrawing : DocumentTypeTitle := 'Drawing';
    ksDocumentFragment : DocumentTypeTitle := 'Fragment';
    ksDocumentSpecification : DocumentTypeTitle := 'Specification';
    ksDocumentPart : DocumentTypeTitle := 'Part';
    ksDocumentAssembly : DocumentTypeTitle := 'Assembly';
    ksDocumentTextual : DocumentTypeTitle := 'Textual';
    ksDocumentTechnologyAssembly : DocumentTypeTitle := 'TechnologyAssembly';
  end;

Документ открывается и трактуется как Specification.
Далее я пробовал следующий код но так и не смог получить конкретные значения из ячеек:

  varSpecificationStyle := KompasDocument.SpecificationDescriptions.Active.SpecificationStyle;

здесь все что удалось найти это

  varSpecificationStyle.SpecificationTuning.Sections.Item[0].Number

И честно говоря является ли это ячейками основной надписи я абсолютно не уверен...

В общем прошу Вас товарищи и буду крайне признателен Вам, если вы поделитесь куском кода который открывает Спецификацию и берет из нее все поля из основной надписи, написанную на Delphi с использованием API7.

P/S
Где можно найти хоть какой нибудь мануал или справочник по API Компас? Все выше написанное было добыто путем проб и ошибок, в связи с чем я не уверен что это вообще все грамотно написано.

У IKompasDocument, есть свойство ILayoutSheets - коллекции листов оформления, далее получаете ILayoutSheet, у которого, есть свойство Stamp - основная надпись листа.

Homer

  KompasObjAPI7 := CreateOleObject('Kompas.Application.7') as IApplication;
  KompasObjAPI7.HideMessage := ksHideMessageYes;
  KompasObjAPI7.Visible := true;
  //
  KompasDocument := KompasObjAPI7.Documents.Open('D:\Workspace-eaktd\Cramboo.spw', true, false);
  //
  case KompasDocument.DocumentType of
    ksDocumentUnknown : DocumentTypeTitle := 'Unknown';
    ksDocumentDrawing : DocumentTypeTitle := 'Drawing';
    ksDocumentFragment : DocumentTypeTitle := 'Fragment';
    ksDocumentSpecification : DocumentTypeTitle := 'Specification';
    ksDocumentPart : DocumentTypeTitle := 'Part';
    ksDocumentAssembly : DocumentTypeTitle := 'Assembly';
    ksDocumentTextual : DocumentTypeTitle := 'Textual';
    ksDocumentTechnologyAssembly : DocumentTypeTitle := 'TechnologyAssembly';
  end;
  //
  KompasDocument.Active := true;
  varLayoutSheets := KompasDocument.LayoutSheets;    <- Вот здесь varLayoutSheets  = nil
  Stamp := KompasDocument.LayoutSheets.Item[0].Stamp;
  Text := Stamp.Text[1];
  ShowMessage(Text.Str);


Homer

varLayoutSheets := KompasObjAPI7.ActiveDocument.LayoutSheets;

так тоже nil как ни кручу все время nil

От чего зависит LayoutSheets? Может я что то упустил?

P/S
Проект на Delphi 7, в проект добавлял .pas файлы API.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, KsAPI7, KsTLB, ksConstTLB, DB, DBClient,
  MConnect, SConnect, ScktComp, ComObj;

Файл спецификации сам создал пустышку и добавил в основную надпись пару полей.

#programmer

Из справки:

LayoutSheets - Листы оформления
Тип данных: указатель на интерфейс ILayoutSheets коллекции листов оформления
Синтаксис Automation:
LayoutSheets = iObject.LayoutSheets
Получить свойство 
LayoutSheets = iObject.GetLayoutSheets()
Получить свойство (**)
Синтаксис COM:
iObject->get_LayoutSheets (&LayoutSheets)
Получить свойство

Примечание:
1. Свойство используется только для документа Чертеж.
2. Свойство доступно только для чтения.


Тут нужно получить штамп так:

Документ спецификация (Интерфейс ksSpcDocument)  > ksSpcDocument - методы
GetStamp - Получить указатель на интерфейс основной надписи ksStamp
Синтаксис Automation:
LPDISPATCH GetStamp();
Возвращаемое значение:
- указатель на интерфейс основной надписи ksStamp.

или

LPDISPATCH GetStampEx (long sheetNumb);
Входные параметры:
sheetNumb
- номер листа, начиная с 1.

Возвращаемое значение:
- указатель на интерфейс основной надписи ksStamp.

А дальше как для чертежей.


У меня читает через Api7.
Двойной клик по форме, чтобы загрузить документ.

Homer

Проверил чертеж он вывел Alert с названием, проверил на нескольких спецификациях открывает но не выдает Alert и при закрытии дает такое сообщение: "Документ не найден или неверная структура файла";

P/S
Прикрепил скрины и файл на котором тестил

Vitalij Lysanov

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

Пример записи в формате igs

212,1,7,12.58837890625,3.5,1,1.30899693899575,0.,0,0, 20.5,           895P    462
-271.252292633057,0., 7HРазраб.;                                                   895P    463

где:

7HРазраб.                               -    7 букв и текст "Разраб."

20.5 и -271.252292633057         -      координаты текста

212                                          -      Признак текста.


212,1,7,12.58837890625,3.5,1,1.30899693899575,0.,0,0,20.5,           895P    462
-271.252292633057,0.,7HРазраб.;                                      895P    463
212,1,6,13.3693342208862,3.5,1,1.30899693899575,0.,0,0,37.5,         897P    464
-271.273326873779,0.,6HИванов;                                       897P    465
212,1,7,44.5447387695313,10.,1,1.30899693899575,0.,0,0,              899P    466
97.7276306152344,-284.566646575928,0.,7HCramboo;                     899P    467





#programmer

Проверил.
Через API7 можно прочитать только начиная с версии КОМПАС 15 (в 14 не работает...).
Вот только в справке об этом не написано...

Документ не найден, потому, что у Вас нет документа по умолчанию c:\Program Files\ASCON\KOMPAS-3D V16\Samples\Drawings\12020\12020.spw, который грузит приложение, а Ваш файл читается без проблем.
У Вас Компас, какой версии?

Homer

КОМПАС-3D V14, но скорее всего перейти на новый компас мне не позволят так как производство уже не первый год на 13-14 работает.