Некоторые ньюансы в работе апи разных версий компаса.

Автор graphdark, 03.06.21, 15:37:22

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

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

graphdark

Я понимаю, что канпас-православный продукт созданый во славу... Но хоть одно логическое объяснение есть, почему код написаный для 19го не работает в 18.Я не понимаю, как зарубежные загнивающие солидописцы и альтиум писцы умудрились организовать полную поддержку своих продуктов, без оглядки на версию. Наверно это тайные темные знания полученные бгмерзким способом. Но код, едрить его, код. Как код приложений может меняться на абсолютно, с виду и не только, может меняться? Примеры. В 19 работает, в 18-нет.

  begin
    showMessage('')
    EntityCollection := ksEntityCollection(iPart.EntityCollection(o3d_face));
    EntityConcentric := ksEntity(phantom.GetDefaultEntity(o3d_axisOZ));
    EntityConcidence := ksEntity(phantom.GetDefaultEntity(o3d_planeXOY));
    strPromt := 'Укажите отверстие';
    strPromt1 := 'Укажите плоскость совпадения';
    EntityConcentric2 := ksEntity(iDoc3D.UserSelectEntity(nil,
      'SELECTFILTERPROC', strPromt, hinstance, nil));
    EntityConcidence2 := ksEntity(iDoc3D.UserSelectEntity(nil,
      'SELECTFILTERPROC', strPromt1, hinstance, nil));

    if iDoc3D.UserGetPlacementAndEntity(2) then
    begin
      iPart.SetPlacement(iRequestInfo3D.GetPlacement);
      iDoc3D.SetPartFromFile(path + filename, iPart, true);
      iDoc3D.AddMateConstraint(mc_Concentric, EntityConcentric,
        EntityConcentric2, integer(StUnit.direction), 0, 0);
      iDoc3D.AddMateConstraint(0, EntityConcidence, EntityConcidence2,
        integer(StUnit.direction), 0, 0);
      iPart.UpdatePlacement;
    end;
    iPart.SetUserParam(iUserParam);
    iPart.marking := design;


  ColorParam := ksColorParam(iPart.ColorParam);
  ColorParam.Color := StUnit.ColorVar; // 15387420-голубой;//16744448-синий;
  iPart.SetAdvancedColor(ColorParam.Color, ColorParam.ambient,
    ColorParam.diffuse, ColorParam.specularity, ColorParam.shininess,
    ColorParam.transparency, ColorParam.emission);
  iPart.Update;


 part := kspart(doc3d.GetPart(1));
  entitycollection := ksEntityCollection(Part.EntityCollection(o3d_face));
  EntityFace2 := ksEntity(part.GetDefaultEntity(o3d_planeYOZ));
//  if EntityFace2 = nil then ShowMessage('nil2');
  doc3d.AddMateConstraint(0,EntityFace1,EntityFace2,1,2,0);
  EntityFace2 := ksEntity(entityCollection.GetByName('Concidience',true,true));
  if EntityFace2 = nil then ShowMessage('nil2');
  part := kspart(doc3d.GetPart(2));
  entitycollection := ksEntityCollection(Part.EntityCollection(o3d_face));
  EntityFace2 := ksEntity(entityCollection.GetByIndex(2));
  doc3d.AddMateConstraint(5,EntityFace1,EntityFace2,-1,1,StrToInt(L_Shell.Text));
  doc3d.RebuildDocument();
  doc3d.SaveAs(ExtractFilePath(ParamStr(0)) + 'Result\part.a3d');

Внезапно. Если в этой строке   EntityFace2 := ksEntity(entityCollection.GetByIndex(2)); 2 заменить на 1. Не работает в 19, но работает в 17. Значит они индексы от 0 считают, но иногда.

PS: Я очень хочу, чтобы мне стало стыдно за этот пост. Пока пошел проверять все ранее написанное. Предлагаю в этой теме выкладывать ловушки от аскон, чтобы по граблям не ходить.


Дмитрий22

Добрый день!
Очень информативный заголовок в теме.)
Не ругайтесь Вы так. Эмоции в сторону. У SW тоже не все гладко бывает. Ветка с макросами от Lenon завалена ошибками "Run-time error 62 "Input past end of file". Причем для разных версий SW разные ошибки.
https://cccp3d.ru/topic/6622-%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-sw-%D0%BF%D0%BE-%D0%B3%D0%BE%D1%81%D1%82/page/197/#comments
API Компаса меняется, т. к. меняется функционал, не все возможно оттестировать. Пишите в техподдержку, они поправят, если это реальная ошибка. Я писал запросы по API, Аскон исправлял APi. Например, писал запрос SD#7259559, что при  экспорте в TIFF через APi "Отсутствует возможность управления свойством - "Весь документ в один файл". Оказалось, просто в справке по APi недостаточно описана работа с этим свойством. В новых версиях библиотека из-за этого работала не правильно. Пообщались с техподдержкой, разобрались. Обещали справку поправить.

graphdark

Цитата: Дмитрий22 от 03.06.21, 16:05:34Не ругайтесь Вы так. Эмоции в сторону.
Просто полгода работы. Все было здорово. Начали тестить и крашится. 2 дня убил на изучение проблемы и как водой окатило. Счас починил временные сопряжения, воевал с цветом, выяснилось, что модели стали кривыми. А именно размеры с внешними переменными. Спасибо за совет, пойду ТП терзать.

Цитата: graphdark от 03.06.21, 16:38:35Просто полгода работы. Все было здорово. Начали тестить и крашится. 2 дня убил на изучение проблемы и как водой окатило. Счас починил временные сопряжения, воевал с цветом, выяснилось, что модели стали кривыми. А именно размеры с внешними переменными. Спасибо за совет, пойду ТП терзать.
Правильно, что вылетает.
Где проверки?

graphdark

Цитата: graphdark от 03.06.21, 15:37:22if iDoc3D.UserGetPlacementAndEntity(2) then
    begin
      iPart.SetPlacement(iRequestInfo3D.GetPlacement);
      iDoc3D.SetPartFromFile(path + filename, iPart, true);
      iDoc3D.AddMateConstraint(mc_Concentric, EntityConcentric,
        EntityConcentric2, integer(StUnit.direction), 0, 0);
      iDoc3D.AddMateConstraint(0, EntityConcidence, EntityConcidence2,
        integer(StUnit.direction), 0, 0);
      iPart.UpdatePlacement;
    end;
    iPart.SetUserParam(iUserParam);
    iPart.marking := design;

Эти ошибки поправил, расскажу как.

    if iDoc3D.UserGetPlacementAndEntity(2) then
    begin
      iPart.SetPlacement(iRequestInfo3D.GetPlacement);
      iDoc3D.SetPartFromFile(path + filename, iPart, true);
      iDoc3D.AddMateConstraint(mc_Concentric, EntityConcentric,
        EntityConcentric2, integer(StUnit.direction), 1, 0);
      iDoc3D.AddMateConstraint(0, EntityConcidence, EntityConcidence2,
        integer(StUnit.direction), 1, 0);
      iPart.UpdatePlacement;
    end;

Пытался вспомнить. Выходит, что я просто зафиксировал 1 деталь.

Цитата: graphdark от 03.06.21, 15:37:22ColorParam := ksColorParam(iPart.ColorParam);
  ColorParam.Color := StUnit.ColorVar; // 15387420-голубой;//16744448-синий;
  iPart.SetAdvancedColor(ColorParam.Color, ColorParam.ambient,
    ColorParam.diffuse, ColorParam.specularity, ColorParam.shininess,
    ColorParam.transparency, ColorParam.emission);
  iPart.Update;

Просто добавить ipart.UseColor := 0;

Все обошлось малой кровью.

graphdark

Удивительный нюанс. Вставка в сборку у всех +- одинаковая, до сих пор не знал, как отключить редактирование по 2му клику. В смысле я нашел, как это сделать, однако данный способ срабатывал через раз. И что-то мне кажется версия компаса в этом замешана.
  iRequestInfo3D.CreatePhantom;
  phantom := ksPart(iRequestInfo3D.GetIPhantom);
  phantom.standardComponent := true;
Для фантома назначить тру для стандарт компонент, просто гадание. И ведь помогло. Редактирование по 2му клику не работает теперь всегда.

graphdark

Цитата: graphdark от 03.06.21, 15:37:22PS: Я очень хочу, чтобы мне стало стыдно за этот пост.
Не стало стыдно, но я поработал в T-Flex и прям мое увожение разработчикам из Аскона.