SDK PartLib

Автор l2qwe, 22.03.12, 15:02:57

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

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

l2qwe

Доброе время суток.

Возможно ли каким либо методом получить(сформировать) перечень(только обозначение) стд.изд. доступных в справочнике?

Где можно взять документацию по Справочнику стандартных изделий.


Chaa

В Program Files\ASCON\PartLib\Clients\PartLibAPI.chm есть описание API, в нем есть "Пример использования методов Request и ExecuteRequest". Думаю с их помощью можно выбрать нужные вам изделия.

l2qwe

Спасибо, в комплексе 2009 PartLibAPI.chm нету, взял с комплекса 2011.
Буду разбирается и наедятся что подойдет к нашей версии.

l2qwe

#3
Первый пример отрабатывает нормально, остальные не компилируются.
Вываливается ошибка на строке BOpartlib.Connect(errMess);

Вот скрин ошибки.

Chaa

Судя по всему не удается подключиться к серверу приложений. Посмотрите метод SetConnectionParams, может необходимо его сначала вызывать.

l2qwe

Описание структуры stConnectionString [in] Строка соединения не нашел.
Попробовал хотя бы вот так
  BOPARTLib := CreateOleObject(C_plClassName) as IPARTLIbProvider;
  BOPARTLib.SetConnectionParams('',false);
  errMess := '';
  BOPARTLib.Connect(errMess);

Не помогло(
с параметром boShowDialog = true вываливается ошибка.
С МиСом подобное было когда не находилась клиентская лицензия(в NetHASP не был прописан ip машины на котором установлен hasp)
На PartLib лицензии раздаются через Flex
Там картина во такая

Users of PartLibClient_Loodsman:  (Total of 9 licenses issued;  Total of 1 license in use)

Может нужна еще какая лицензия или в чем еще может быть проблема?

PS на втором скрине сам клиент запущен.

Cehhby

1) setConnectionParams определяет СП к которому ты подключаешься. в общем случае(когда справочник уже настроен на конкретный СП) вызывать не надо.

2) если нету PartlibApi.chm то значит и апи там офицально нету :). В комплексе 2011 следующий пример работает(пример взят из справки):

uses

//..//

PARTLibClient_TLB,

BOSimple_TLB;



const

C_plClassName = 'PARTLibClient.BOSimpleProvider';



SHOW_MEASURE_DISTANCE           = 1;

SHOW_MEASURE_LENGTH               = 2;

SHOW_MEASURE_DIAMETER           = 4;

SHOW_MEASURE_ANGLE                 = 8;

SHOW_MEASURE_REZBA                 = 16;

SHOW_TKR                                       = 32;

HIDE_INSERT                                     = 64;

SHOW_HOT2D3DCHANGE                 = 128;

DISABLE_POSITIONING_MODELS   = 256;



I_HAVE_KI_ON_SERVER_MACHINE  = '99997';



//----------------------------------------------------------------------------//



var  Location, param :WideString;

      command :integer;

      MethodResponse :IBOResponseDisp;

      BOPARTLib :IPARTLIbProvider;

      responseXML :WideString;

      i :integer;

      errMess :WideString;



Begin

BOPARTLib := CreateOleObject(C_plClassName) as IPARTLIbProvider;

i := BOpartlib.Connect(errMess);

if i=0 then

   begin

     BOPARTLib.SetInstrumentOptions('Kompas', I_HAVE_KI_ON_SERVER_MACHINE, '2D', '3', '',

       SHOW_MEASURE_DISTANCE  or

       SHOW_MEASURE_LENGTH     or

       SHOW_MEASURE_DIAMETER  or

       SHOW_MEASURE_ANGLE        or

       SHOW_TKR );



     command := 0;

     location := '';

     responseXML := '';

     MethodResponse := IBOResponseDisp( BOPARTLib.SelectEx(command, param, Location, 0) );

     if MethodResponse <> nil then

       responseXML := MethodResponse.XML; // XML-код полученного метода!!!

   end;



BOPARTLib.Disconnect;

End.


там в этом XML есть вообще все :)

l2qwe

В общем я взял пример №4

Слепил PARTLibServer_TLB.
заменил
const
//C_plClassName = 'PARTLibClient.BOSimpleProvider';
C_plClassName = 'PARTLibServer.PARTLibServerProvider';

и
  //BOPARTLib := CreateOleObject(C_plClassName) as IPARTLIbProvider;
  BOPARTLib := CreateOleObject(C_plClassName) as IPLSYSTEM;


убрал Connect и Disconnect.

Заработало :)



l2qwe

Получается не то, что хотелось.
Задача получит общий список обозначений стд.изд. вида "Болт M12-8gx60.36.019  ГОСТ 7805-70"
Делаю по примеру 4.

  SetTopic('Find'); // топик - поиск
  AddRequestAttribute('ToolID',      'Kompas');
  AddRequestAttribute('PackageCode', 'Root'); // начинать с корневого пакета
  AddRequestAttribute('Document',    '2D'); // среди 2D-моделей
  AddRequestAttribute('ContextID',   '0'); // для спецификация
  AddRequestAttribute('Filter',      '?ОЛТ*'); //поиск в названии по маске
  BOPARTLib.ExecuteRequest; // запрос на обработку

  IBOR := IBOResponseDisp(BOPARTLib.Response);

  //Names := GetResponseAttribute(0,0).Value; // все найденные имена
  //Codes := GetResponseAttribute(0,1).Value; // ObjectID всех найденных объектов

  Memo1.Text := IBOR.XML;

Получаю

Болт ГОСТ 7805-70 (исп 1)
Болт ГОСТ 7805-70 (исп 2)
Болт ГОСТ 15589-70 (исп 1)
Болт ГОСТ 15589-70 (исп 2)
Болт ГОСТ 15589-70 (исп 3)
....
Root±30±20±10±80±10±©{}30±©{BASE}130±30
Root±30±20±10±80±10±©{}30±©{BASE}130±40
Root±30±20±10±80±10±©{}30±80±©{BASE}60
Root±30±20±10±80±10±©{}30±80±©{BASE}80
Root±30±20±10±80±10±©{}30±80±©{BASE}90
....





Cehhby

1)
ЦитироватьC_plClassName = 'PARTLibServer.PARTLibServerProvider';
ты подключаешься к СП напрямую. его API не документировано(и скорее всего не будет документировано). тебе лучше подключаться все же к клиенту СИ.

2) в версии 2009 можно получать обозначения экземпляров через их Location


l2qwe

А как получить все возможный Location?

я пробовал

Location := 'Root±30±20±10±80±10±©{}30±©{BASE}130±40'; // этот Location взял из полученных в IBOR := IBOResponseDisp(BOPARTLib.Response);
BOPARTLib.GetObjectInfo(Location, CID, OID);
IBOB := BOPARTLib.GetObject(CID, OID, 0);

BOPARTLib.GetObjectInfo(Location, CID, OID);
возвращает пустые CID и OID

l2qwe

Ошибку понял, я не верный Location указываю, надо в начало добавить PART:

l2qwe

вот это исполнить получилось, но
IBOB := BOPARTLib.GetObject(CID, OID, 0);
но IBOB у меня получается не конечный объект, как мне получить всевозможные обозначения(разного размера и тп.)?

l2qwe

Для объекта, который получил через поиск, "Болт ГОСТ 7805-70 (исп 2)", Location := 'PART:Root±30±20±10±80±10±©{}30±©{BASE}130±40'

Выполняю вот такое.
  Location := 'PART:Root±30±20±10±80±10±©{}30±©{BASE}130±40';
  BOPARTLib.GetObjectInfo(Location, CID, OID);
  IBOB := BOPARTLib.GetObject(CID, OID, 0);
  for i := 0 to IBOB.Objects.Count-1 do
  begin
    tempIBOB := IBOB.Objects.Item[i];
    Memo1.Text :=Memo1.Text + #13+#10 + tempIBOB.ClassID +'-$-'+  tempIBOB.Attribute['Value'].Value;
  end;

в Мемо получаю во такой результат

B46A_19C9EB1FF3004994-$-0
B46A_5E7039074EF8473D-$-1
B46A_8342071FFC15428A-$-NULL_VALUE
B46A_A074A970D8094099-$-True
B46A_BDD96F5CA50B41B4-$-NULL_VALUE
BASE_27409DF1233040FA-$-0
BASE_50037741FC214DF4-$-NULL_VALUE
BASE_81B93DB2953840A8-$-NULL_VALUE
BASE_A2215E523CBA4FE5-$-NULL_VALUE
Designation-$-NULL_VALUE
DocDesignation-$-ГОСТ 7805-70
Document-$-0
HOOKPARAMS-$-0
KOMPAS_SPEC_PATTERN-$-NULL_VALUE
MATERIAL-$-0
MCC-$-0
R_DYNAMICCLASSIFICATION-$-0
Root±30±20±10±10-$-0
Root±30±20±10±20-$-0
Root±30±20±10±30-$-0
Root±30±20±10±70-$-
Root±30±20±10±80±10±60-$-2
Root±30±20±10±80±10±©{}30±10-$-0
Root±30±20±10±80±10±©{}30±50-$-NULL_VALUE
Root±30±20±10±80±10±©{}30±90±©{BASE}20-$-Класс точности А
Root±30±20±10±80±10±©{}30±90±©{BASE}30-$-0
Root±30±20±10±80±10±©{}30±90±©{BASE}40-$-0
Root±30±20±10±80±10±©{}30±90±©{BASE}50-$-0
Root±30±20±10±80±10±©{}30±90±©{BASE}60-$-0
Root±30±20±10±80±10±©{}30±90±©{BASE}Cla100-$-0
Root±30±20±10±80±10±©{}30±90±©{BASE}Cla90-$-1
Root±30±20±10±80±10±©{}30±©{BASE}140-$-
Root±30±20±10±80±10±©{}30±©{BASE}180-$-NULL_VALUE
Root±30±20±10±80±10±©{}30±©{BASE}Cla-56-$-NULL_VALUE
Root±30±20±10±80±10±©{}30±©{BASE}Cla-66-$-NULL_VALUE
Root±30±20±10±80±10±©{}30±©{BASE}Cla34-$-0
Root±30±20±10±80±10±©{}30±©{BASE}GMC-6±Cla10-$-NULL_VALUE
Root±30±20±10±80±20-$-0
Root±30±20±10±80±40-$-NULL_VALUE
Root±30±20±10±80±©{}30-$-0
Root±30±20±10±90-$-0
Specification-$-0
dimension_type-$-NULL_VALUE
enterpriseCode-$-NULL_VALUE
product_class-$-NULL_VALUE
spcSectionName-$-Стандартные изделия


Не могу понять как получить все возможные размеры.

Cehhby

Все возможные размеры и их обозначения можно получить начиная с версии 2011.
В версии 2009 вы можете через Select выбрать экземпляр и получить по нему всю необходимую информацию.
Так же прочитайте раздел справки по Location-ам, то что вы используете не полностью совпадает с ним.

dimaschig

Всем доброго времени суток.
Пишу плагин для Лоцмана на Delphi 7, в котором необходимо открыть "Корпоративный справочник Стандартные Изделия v3" и передать наименование выбранного изделия на форму плагина. В примерах справки PartLibAPI.chm указано, что необходимо использовать PARTLibClient_TLB.dcu. Где мне найти этот файл, если в "C:\Program Files\ASCON\" его нет?

Cehhby

Если у вас корпоративный справочник, то , по-умолчанию он ставится в Program Files\ASCON\Partlib. Соответственно указанная вами библиотека типов получается из в Program Files\ASCON\Partlib\Clients\PartlibClient.dll.

bbb

Цитата: Cehhby от 13.08.13, 07:59:22
Если у вас корпоративный справочник, то , по-умолчанию он ставится в Program Files\ASCON\Partlib. Соответственно указанная вами библиотека типов получается из в Program Files\ASCON\Partlib\Clients\PartlibClient.dll.

А можно поподробнее как она получается?

Взял пример из PartLibAPI.chm при сборке в Delphi ошибка: файл PartLibClient_TLB.dcu не найден...

Cehhby

Чтобы получить требуемый файл вам надо воспользоваться функцией "Import Type Library" в Delphi (ей на вход - partlibClient.dll). Она находится в либо в меню проекта либо в меню установки компонентов (зависит от версии IDE). С помощью нее сгенерится PartlibClient_TLB.pas и BOSimple_TLB.pas которые надо подрубить к проекту. DCU файлы после этого сгенерятся сами.

bbb

Цитата: Cehhby от 02.02.15, 08:36:16
Чтобы получить требуемый файл вам надо воспользоваться функцией "Import Type Library" в Delphi (ей на вход - partlibClient.dll). Она находится в либо в меню проекта либо в меню установки компонентов (зависит от версии IDE). С помощью нее сгенерится PartlibClient_TLB.pas и BOSimple_TLB.pas которые надо подрубить к проекту. DCU файлы после этого сгенерятся сами.
Спасибо, сделал тоже самое из командной строки с помощью implib.exe.

Далее пробую вставить СИ из справочника в сборку.
Вот из примера:

BOPARTLib := CreateOleObject(C_plClassName) as IPARTLIbProvider;
Location := '';
BOPARTLib.Select(false, Location, 0);

aMethodResponse := IBOResponseDisp(BOPARTLib.GetMethod(Location,'КОМПАС-3D'));
iPrt := ksPart(PLInsert3D(BOPARTLib, aMethodResponse, nil) );

Открывается справочник, выбираю СИ-Применить, но в сборку ничего не вставляется (хотя Location получает).

Во первых в справке у GetMethod название метода 'КОМПАС 3D' и 'КОМПАС 2D' через пробел, а не тире. При таком варианте GetMethod выдает ошибку:  "Critical Errror. GetMethod  Неверные параметры топика" , если написать через тире то нормально отрабатывает, aMethodResponse заполняется (вопрос это ошибка в справке?).
В следующей строке iPrt получает nil (функция PLInsert3D возвращает nil).
Как правильно  вставить СИ в сборку, зная его Location?