Программное создание детали в сборке

Автор Sprinter500, 26.09.19, 12:22:38

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

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


Sprinter500

Цитата: Sabahs от 03.12.19, 21:13:02Случайно не приложение делаете?


Да, в виде приложения (exe-файл), а не библиотеки rtw.

Так, зачем используете API экспортных Функций?
Меняйте их на аналоги.

Sprinter500

Цитата: Sabahs от 04.12.19, 10:40:34Так, зачем используете API экспортных Функций?
Меняйте их на аналоги.

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

Это те, которые сидят в kAPI2D5.DLL, читайте SDK.
Можно приложение в папку Bin КОМПАС кинуть и все будет работать, либо загружать DDL из приложения, но это к КОМПАС отношения не имеет.

Sprinter500

Скомпилировал экзешник в Delphi и бросил его в Bin - теперь не вылетает, но просто создается пустая сборка.

Скиньте все DLL в проект и отлаживайте, хотя я не могу понять, Вашего желания делать приложения, напрямую всё работает быстрее.

DesignЯR

Цитироватьхотя я не могу понять, Вашего желания делать приложения
Судя по сообщениям, Sprinter500 пишет на C#, а это только ActiveX библиотеки. Для создания удобного UserInterface удобнее работать с формами.Панель свойств скудна своими элементами, а в SDK нет примера регистрации OCX элемента для C# ActiveX библиотеки.Например, тот же TreeList отсутствует. Работа с формами возможна только в виде модальных окон, что тоже накладывает свои ограничения, например на Cursor и Placement. Но можно сделать отдельное приложение с возможностью закрепления поверх всех окон, из которого работать с Компасом.У меня таким костылем вставляются в чертеж строки КМД таблиц (с выбором сечения и автоматическим расчетом массы).Может быть,Sprinter500 хочет менять цвет тела(грани,детали) двумя кликами из внешнего приложения, а может,создавать лестницы как в TeklaStructures...  Также не требуются права администратора как при установке ActiveX библиотеки.

Sprinter500

Цитата: DesignЯR от 05.12.19, 09:27:06Судя по сообщениям, Sprinter500 пишет на C#, а это только ActiveX библиотеки. Для создания удобного UserInterface удобнее работать с формами.Панель свойств скудна своими элементами, а в SDK нет примера регистрации OCX элемента для C# ActiveX библиотеки.Например, тот же TreeList отсутствует. Работа с формами возможна только в виде модальных окон, что тоже накладывает свои ограничения, например на Cursor и Placement. Но можно сделать отдельное приложение с возможностью закрепления поверх всех окон, из которого работать с Компасом.У меня таким костылем вставляются в чертеж строки КМД таблиц (с выбором сечения и автоматическим расчетом массы).Может быть,Sprinter500 хочет менять цвет тела(грани,детали) двумя кликами из внешнего приложения, а может,создавать лестницы как в TeklaStructures...  Также не требуются права администратора как при установке ActiveX библиотеки.

Совершенно верно. Дополню:
1. Переходим с VB и Delphi на C#. Переписываем свои старые проекты и осваиваем новое.
2. Именно для удобства создания красивого дружелюбного графического интерфейса было принято решение использовать exe-вариант, а не rtw.
3. С заменой цвета тела разобрался (см. соседнюю ветку). Вообще локальная цель - приложение для создания 3d-объектов по выделенным на 2d чертеже объектам: замкнутым линиям, прямоугольникам, контурам. По кликам на радиокнопках будет выбор что создавать: разбитое 3d-тело по 1 эскизу, множество тел (1 эскиз - 1 контру с чертежа) - тут уже можно эскизы размещать на разных параллельных плоскостях, выбирать цвет тела (эти 2 пункта реализованы), ну и 3 вариантом - стало бы создание локальных компонентов (деталей) в сборке, с возможностью задания не только цвета как у тел, но материалов с разными плотностями. Со сборками пока получилось только создавать детали и сохранять в отдельные файлы, а после вставлять в сборку. Но когда деталей на 1000 штук и более - это уже серьезная нагрузка на жесткий диск, поэтому лучше работать с локальными деталями.
4. Да с правами админа тоже "песня" - вроде как и повесили на нас создание помощников для КОМПАСа через API, а права админа не дают - они у сисадминов, до которых проблематично достучаться, вечно заняты.

Sprinter500

Цитата: Sabahs от 04.12.19, 19:49:22Скиньте все DLL в проект и отлаживайте, хотя я не могу понять, Вашего желания делать приложения, напрямую всё работает быстрее.

Теперь сделал так. Скинул DLL в проект. Теперь тоже не ругается, но все также пустая сборка создается. Может где-то я опечатался при перепечатывании со скрина. Вот код на Delphi если что:

procedure CreateAssembly();
var
  FileNameSB, FileNameLoc: string;
  DocumentSB, DocumentLoc: IKompasDocument;
  Doc3DSB, Doc3DLoc: IKompasDocument3D;
  Document3DSB, Document3DLoc: IDocument3D;
  pDocument3D5SB, pDocument3D5Loc: ksDocument3D;
  Part7SB, Part7Loc: IPart7;
  Parts7SB: IParts7;
  PartSB, PartLoc: IPart;
  pPart5SB, pPart5Loc: ksPart;
  PlaneLocXY: IModelObject;
  //PlaneLocXY: Plane;
  ModelContainerLoc: IModelContainer;
  SketchsLoc: ISketchs;
  SketchLoc: ISketch;
  ExtrusionsLoc: IExtrusions;
  ExtrusionLoc: IExtrusion;
  I: Integer;
begin
  pDocuments:=KompasAPI.Documents;
  if pDocuments<>nil then
  begin
    FileNameSB:='C:\111\222';
    FileNameLoc:= FileNameSB;
    DocumentSB:=pDocuments.Add(ksDocumentAssembly,True);
    if DocumentSB<>nil then
    begin
      Doc3DSB:=DocumentSB as IKompasDocument3D;
      if Doc3DSB<>nil then
      begin
        Document3DSB:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3DSB),ksAPI3DCom,0)) as IDocument3D;
        pDocument3D5SB:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3DSB),ksAPI5Auto,0)) as ksDocument3D;
        Part7SB:=Doc3DSB.TopPart;
        if (Part7SB<>nil) and (Document3DSB<>nil) and (pDocument3D5SB<>nil) then
        begin
          Parts7SB:=Part7SB.Parts;
          if Parts7SB<>nil then
          begin
            PartSB:=IPart(Document3DSB.GetPart(pTop_Part));
            pPart5SB:=ksPart(pDocument3D5SB.GetPart(pTop_Part));
            if PartSB<>nil then
            begin
              for J := 1 to 3 do
              begin
                DocumentLoc:=pDocuments.Add(ksDocumentPart,True);
                Doc3DLoc:=DocumentLoc as IKompasDocument3D;
                if Doc3DLoc<>nil then
                begin
                  Document3DLoc:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3DLoc),ksAPI3DCom,0)) as IDocument3D;
                  pDocument3D5Loc:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3DLoc),ksAPI5Auto,0)) as ksDocument3D;
                  Part7Loc:=Doc3DLoc.TopPart;
                  if (Part7Loc<>nil) and (Document3DLoc<>nil) and (pDocument3D5Loc<>nil) then
                  begin
                    pPart5Loc:=ksPart(pDocument3D5Loc.GetPart(pTop_Part));
                    PartLoc:=IPart(Document3DLoc.GetPart(pTop_Part));
                    if (PartLoc<>nil) and (pPart5Loc<>nil) then
                    begin
                      //pPart5Loc.useColor:=useColorOur;
                      case J of
                        1: PartLoc.SetAdvancedColor($00FFFF,0.5,0.6,0.5,0.8,0.8,1);
                        2: PartLoc.SetAdvancedColor($FF00FF,0.5,0.6,0.5,0.8,0.8,1);
                        3: PartLoc.SetAdvancedColor($F0F0F0,0.5,0.6,0.5,0.8,0.8,1);
                      end;
                      PartLoc.SetName(PWideChar('Пластилиновая деталь'+IntToStr(J)));
                      Part7Loc.SetMaterial('Пластилин цветной',0.0033);
                      Part7Loc.Marking:='Обозначение '+IntToStr(J);
                      Part7Loc.Update;
                      PlaneLocXY:=Part7Loc.DefaultObject[o3d_planeXOY];
                      ModelContainerLoc:=Part7Loc as IModelContainer;
                      if ModelContainerLoc<>nil then SketchsLoc:=ModelContainerLoc.Sketchs;
                      if SketchsLoc<>nil then SketchLoc:=SketchsLoc.Add;
                      if SketchLoc<>nil then
                      begin
                        if PlaneLocXY<>nil then SketchLoc.Plane:=PlaneLocXY;
                        SketchLoc.BeginEdit;

                          Circle((I-1)*250,0,100,1);

                        SketchLoc.EndEdit;
                        ExtrusionsLoc:= ModelContainerLoc.Extrusions;
                        if ExtrusionsLoc<>nil then ExtrusionLoc:=ExtrusionsLoc.Add(o3d_BossExtrusion);
                        if ExtrusionLoc<>nil then
                        begin
                          ExtrusionLoc.Sketch:=SketchLoc;
                          ExtrusionLoc.Direction:= dtBoth;
                          ExtrusionLoc.ExtrusionType[false]:=etBlind;
                          ExtrusionLoc.Depth[false]:=50;
                          ExtrusionLoc.ExtrusionType[true]:=etBlind;
                          ExtrusionLoc.Depth[true]:=50;
                          ExtrusionLoc.Update;
                        end;
                      end;
                      Part7loc.Update;
                      Document3DLoc.RebuildDocument;
                      Document3DLoc.SetFileName(PWideChar(FileNameLoc+IntToStr(J)));
                      Document3DLoc.Save;
                      Document3DLoc.Close;
                      PartLoc:=IPart(Document3DSB.GetPart(pNew_Part));
                      if PartLoc<>nil then
                      begin
                        if Document3DSB.SetPartFromFile(PWideChar(FileNameLoc+IntToStr(J)),PartLoc,0)=1 then
                        begin
                          Part7Loc:=Parts7SB.Part[J-1];
                          if Part7Loc<>nil then
                          begin
      //////
                          end;
                        end;
                      end;
                    end;
                    Document3DSB.RebuildDocument;
                    Document3DSB.SetFileName(PWideChar(FileNameSB));
                    Document3DSB.Save;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;

Sprinter500

Еще не пойму зачем нужны PartSB и pPart5SB - им присваиваются указатели на TopPart, но затем они нигде не используются, кроме проверки их на nil:

PartSB:=IPart(Document3DSB.GetPart(pTop_Part));
pPart5SB:=ksPart(pDocument3D5SB.GetPart(pTop_Part));

А может, проект прикрепите или я писать за Вас должен?

Sprinter500


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

DesignЯR

А ещё лучше exeшник выложите, а то покупать лицензию на Embarcodero Studio - тоже не каждый может себе позволить, а цитируя Sabahs,
ЦитироватьPS. Ломанное, правильно работать не будет.(27.11.17, 11:48:58)

Sprinter500

Вот другие варианты архива. Надеюсь подходящие.

06.12.19, 09:41:08 #36 Последнее редактирование: 06.12.19, 12:40:38 от Sabahs
И в чём, была проблема?
Посмотреть SDK, немного подумать и воспользоваться отладчиком.

WKMPS.rar
HatchBack.rar

Sprinter500

Цитата: Sabahs от 06.12.19, 09:41:08И в чём, была проблема?
Посмотреть SDK, немного подумать и воспользоваться отладчиком.

WKMPS.rar
HatchBack.rar

Спасибо за помощь, но что-то у меня в том числе Ваш скомпилированный Exe-шник работают несколько странно: создаются и сохраняются на жестком диске три файла детали и отдельно пустая сборка. Или у Вас работает иначе или я не правильно выразился, пытаясь объяснить какую проблему требуется решить - если так то приношу извинения.

Итак: Приложение должно
1 -  создавать сборку (или подключаться к уже открытой).
2 -  создать несколько локальных деталей, то есть такие которые содержаться в самой сборке и не ссылаются на внешние файлы
3 -  в каждой локальной детали должен быть задан материал и цвет.

Снимок.JPG

Немного подправил, работает.
Приложение создаёт сборку с нуля, КОМПАС может быть не запущен.
Loc_2.png
HatchBack.rar

Sprinter500

Цитата: Sabahs от 07.12.19, 10:57:35Немного подправил, работает.
Приложение создаёт сборку с нуля, КОМПАС может быть не запущен.
Loc_2.png
HatchBack.rar

Вот теперь то что нужно, строится сборка с локальными деталями. А можно исправленный код увидеть?