Библиотека Activex и Справочник СИ

Автор Semargl1990, 16.10.21, 19:26:25

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

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

Semargl1990

Добрый день!
Написал библиотеку activex, коротко при запуске библиотеки она создает компас приложение Application и там же 3д сборку, в общем получается 2 приложения открыты: в первом, откуда запускается библиотека, 3д сборка и во втором 3д сборка,потом срабатывает код вставки стандартного изделия из ССИ, но почему то изделие вставляется в первую сборку, а не во вторую. Кто может подсказать в чем может быть проблема, может я не понимаю какие то основные принципы библиотеки activex?

p3452

Любое действие, операция всегда выполняется в "активном!" документе (если явно не задан другой документ).
Сделайте "активным" нужный вам документ, или укажите явно в какой документ делать вставку.

Semargl1990

Я так делаю:

Получаю интерфейс второй 3д сборки куда надо вставить стандартное изделие
Document3D ActDoc3D = (Document3D)kompas.ActiveDocument3D();

Потом проверяю через сообщение ksMessage, что это вторая сборка куда нужно вставить, тут все норм
string actdoc3Dname = ActDoc3D.fileName;
kompas.ksMessage(actdoc3Dname);

Далее идет код вставки стандартного изделия и тут стандартное изделие появляется в первом сборке, а не во втором
Может я что-то не понимаю, раз если получил интерфейс второй 3д сборки, то он и становится активным нет?

p3452


Semargl1990

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BOSimple;
using PARTLibClient;
using Kompas6API2D5COM;
using Kompas6API3D5COM;
using Kompas6API5;
using Kompas6Constants;
using Kompas6Constants3D;
using KompasAPI7;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
using System.Runtime.Versioning;
using stdole;
using Microsoft.Win32;
using System.Windows.Forms;

namespace Bibliotheka
{
    class KorobAssembly3D
    {
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        private delegate void iPLInsert3D([Out] out IDispatch retVal, IPARTLibProvider aPLClient, IBOResponse aMethodResponse, ksPlacement aPlacement);


        public void CreateKorobAssembly3D(KompasObject kompas, double H, double B, double L, double S, double R, string SavePath, string Des)
        {
            kompas = new Kompas6API5.Application();
            kompas.Visible = true;
           

            //Создание сборки
            Document3D AssemblyDoc3D = (Document3D)kompas.Document3D();
            AssemblyDoc3D.Create(false, false);

            part iPart = (part)AssemblyDoc3D.GetPart(-1);   //Верхний компонент

            IApplication kompas7 = kompas.ksGetApplication7();

            IKompasDocument3D kompasDoc7 = (IKompasDocument3D)kompas7.ActiveDocument;
           
            IPart7 Part7 = (IPart7) kompasDoc7.TopPart;

            //Вставить лоток
            #region
            string cutDes = Des.Remove(Des.Length - 1);
            Part7.Parts.AddFromFile(SavePath + "\\" + cutDes + "1" + " - Лоток" + ".m3d", true, true);

            //Установить лоток по координатам
            part iPartLotok = (part) AssemblyDoc3D.GetPart(0); // первая деталь в сборке

            ksPlacement iplaclotok = (ksPlacement) iPartLotok.GetPlacement();

            iplaclotok.SetOrigin (0, 0, 0);
            iPartLotok.SetPlacement (iplaclotok);
            iPartLotok.UpdatePlacement();
            iPartLotok.Update();
            #endregion
            //Вставить крышку
            #region
           
            Part7.Parts.AddFromFile(SavePath + "\\" + cutDes + "2" + " - Крышка" + ".m3d", true, true);

            //Установить крышку по координатам
            part iPartKryshka = (part)AssemblyDoc3D.GetPart(1); // вторая деталь в сборке

            ksPlacement iplackryshka = (ksPlacement)iPartKryshka.GetPlacement();

            iplackryshka.SetOrigin(0, 0, 0);
            iPartKryshka.SetPlacement(iplackryshka);
            iPartKryshka.UpdatePlacement();
            iPartKryshka.Update();
            #endregion
            //Вставить перегородку
            #region
            Part7.Parts.AddFromFile(SavePath + "\\" + cutDes + "3" + " - Перегородка" + ".m3d", true, true);

            //Установить перегородку по координатам
            part iPartPeregorodka = (part)AssemblyDoc3D.GetPart(2); // третья деталь в сборке

            ksPlacement iplacperegorodka = (ksPlacement)iPartPeregorodka.GetPlacement();

            iplacperegorodka.SetOrigin(0, 0, 0);
            iPartPeregorodka.SetPlacement(iplacperegorodka);
            iPartPeregorodka.UpdatePlacement();
            iPartPeregorodka.Update();
            #endregion

            //Добавить сопражение лоток + СК
            #region
            part iPartAssembly1 = (part) AssemblyDoc3D.GetPart(-1);
            ksEntityCollection iPartAssemblyPointCSCollec1 = (ksEntityCollection) iPartAssembly1.EntityCollection(4);
            ksEntity iPartAssemblyPointCS1 = (ksEntity) iPartAssemblyPointCSCollec1.GetByIndex(0);

            part iPart1 = (part) AssemblyDoc3D.GetPart(0);
            ksEntityCollection iPart1PointCSCollec1 = (ksEntityCollection) iPart1.EntityCollection(4);
            ksEntity iPart1PointCS1 = (ksEntity)iPart1PointCSCollec1.GetByIndex(0);
            AssemblyDoc3D.AddMateConstraint (0, iPartAssemblyPointCS1, iPart1PointCS1, 0, 0, 0);
            AssemblyDoc3D.RebuildDocument();
            #endregion
            //Добавить сопражение лоток + крышка
            #region
            ksEntityCollection iPart1FaceCollec1 = iPart1.EntityCollection(6);
            iPart1FaceCollec1.SelectByPoint(S / 2, 10, 0);
            ksEntity iPart1Face1 = iPart1FaceCollec1.First();

            part iPart2 = AssemblyDoc3D.GetPart(1);
            ksEntityCollection iPart2FaceCollec1 = iPart2.EntityCollection(6);
            iPart2FaceCollec1.SelectByPoint(-3 / 2, 10, 0);
            ksEntity iPart2Face1 = iPart2FaceCollec1.First();
            AssemblyDoc3D.AddMateConstraint(0, iPart1Face1, iPart2Face1, 1, 0, 0);
            AssemblyDoc3D.RebuildDocument();


            ksEntityCollection iPart1FaceCollec2 = iPart1.EntityCollection(6);
            iPart1FaceCollec2.SelectByPoint(10, 0, 1);
            ksEntity iPart1Face2 = iPart1FaceCollec2.First();

            ksEntityCollection iPart2FaceCollec2 = iPart2.EntityCollection(6);
            iPart2FaceCollec2.SelectByPoint(-10, 3, 1);
            ksEntity iPart2Face2 = iPart2FaceCollec2.First();
            AssemblyDoc3D.AddMateConstraint(5, iPart1Face2, iPart2Face2, -1, 0, 3);
            AssemblyDoc3D.RebuildDocument();


            ksEntityCollection iPart1FaceCollec3 = iPart1.EntityCollection(6);
            iPart1FaceCollec3.SelectByPoint(H, 1, 1);
            ksEntity iPart1Face3 = iPart1FaceCollec3.First();

            ksEntityCollection iPart2FaceCollec3 = iPart2.EntityCollection(6);
            iPart2FaceCollec3.SelectByPoint(-3, 10, 1);
            ksEntity iPart2Face3 = iPart2FaceCollec3.First();
            AssemblyDoc3D.AddMateConstraint(0, iPart1Face3, iPart2Face3, -1, 0, 0);
            AssemblyDoc3D.RebuildDocument();
            #endregion
            //Добавить сопражение лоток + перегородка
            #region
            ksEntityCollection iPart1FaceCollec4 = iPart1.EntityCollection(6);
            iPart1FaceCollec4.SelectByPoint(S / 2, 10, 0);
            ksEntity iPart1Face4 = iPart1FaceCollec4.First();

            part iPart3 = AssemblyDoc3D.GetPart(2);
            ksEntityCollection iPart3FaceCollec1 = iPart3.EntityCollection(6);
            iPart3FaceCollec1.SelectByPoint(1, -1, 0);
            ksEntity iPart3Face1 = iPart3FaceCollec1.First();
            AssemblyDoc3D.AddMateConstraint(0, iPart1Face4, iPart3Face1, 1, 0, 0);
            AssemblyDoc3D.RebuildDocument();


            ksEntityCollection iPart1FaceCollec5 = iPart1.EntityCollection(6);
            iPart1FaceCollec5.SelectByPoint(S, 10, 1);
            ksEntity iPart1Face5 = iPart1FaceCollec5.First();

            ksEntityCollection iPart3FaceCollec2 = iPart3.EntityCollection(6);
            iPart3FaceCollec2.SelectByPoint(0, -1, 1);
            ksEntity iPart3Face2 = iPart3FaceCollec2.First();
            AssemblyDoc3D.AddMateConstraint(0, iPart1Face5, iPart3Face2, -1, 0, 0);
            AssemblyDoc3D.RebuildDocument();


            ksEntityCollection iPart1FaceCollec6 = iPart1.EntityCollection(6);
            iPart1FaceCollec6.SelectByPoint(10, S, 1);
            ksEntity iPart1Face6 = iPart1FaceCollec6.First();

            ksEntityCollection iPart3FaceCollec3 = iPart3.EntityCollection(6);
            iPart3FaceCollec3.SelectByPoint(10, -2, 1);
            ksEntity iPart3Face3 = iPart3FaceCollec3.First();
            AssemblyDoc3D.AddMateConstraint(5, iPart1Face6, iPart3Face3, -1, 0, 50);
            AssemblyDoc3D.RebuildDocument();
            #endregion
           
            kompas.ksExecuteLibraryCommand("plclient_kompas.dll", 1);

            //Вставка болта в 3д сборку
            #region
            //Bolt3D PasteBolt = new Bolt3D();
            //PasteBolt.InsertBolt3D(kompas);
            IntPtr pDll = IntPtr.Zero;
            pDll = LoadLibrary("plclient_kompas.dll");
            IntPtr pProc3D = GetProcAddress(pDll, "PLInsert3D");
            iPLInsert3D PLInsert3D = (iPLInsert3D)Marshal.GetDelegateForFunctionPointer(pProc3D, typeof(iPLInsert3D));
            Document3D ActDoc3D = (Document3D)kompas.ActiveDocument3D();
           
            string actdoc3Dname = ActDoc3D.fileName;
            kompas.ksMessage(actdoc3Dname);

            IPARTLibProvider aPLClient = null;
            aPLClient = new BOSimpleProvider();
            aPLClient.Connect("");
            part ksPart = (part)ActDoc3D.GetPart(-1);
                       
            ksPlacement aPlacement = ksPart.GetPlacement();

            BOResponse aMethodResponce = aPLClient.GetMethod("PART:A_Root±Pac-16±GMC50±GMC8[a11;260;20;Стандартный;Ст2 ГОСТ 380-94]", "КОМПАС 3D");

            IDispatch kPart;


            aPlacement.SetOrigin(0, 0, 0);
            ksPart.UpdatePlacement();
            PLInsert3D(out kPart, aPLClient, aMethodResponce, aPlacement);
       
            aPLClient.Disconnect();
            FreeLibrary(pDll);
           
            #endregion
           

            //Сохранить короб
            #region
            AssemblyDoc3D.fileName = SavePath + "\\" + Des + " - Короб" + ".a3d";
            AssemblyDoc3D.UpdateDocumentParam();

            iPart.marking = Des;
            iPart.name = "Короб";
            iPart.Update();

            AssemblyDoc3D.Save();
            AssemblyDoc3D.close();
            kompas.Quit();
            #endregion

            //string actdoc = AssemblyDoc3D.fileName;
            //kompas.ksMessage(actdoc);

            //Вставка болта в 3д сборку
            //Bolt3D PasteBolt = new Bolt3D();
            //PasteBolt.InsertBolt3D(AssemblyDoc3D, kompasDoc7, kompas);

        }

        //COM register
        #region
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr LoadLibrary(string libFilename);

        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)]
        static internal extern IntPtr GetProcAddress(IntPtr HModule, [MarshalAs(UnmanagedType.LPStr), In] string funcName/*lpcstr*/);

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool FreeLibrary(IntPtr hModule);
        #endregion
Вообще кто-то создавал библиотеку activex и вставлял в 3д сборку в другом окне стандартное изделие?

p3452

Код не просто "проблемный" - компилятор выдает кучу ошибок и предупреждений!?
В качестве общих рекомендаций:
- Не путать интерфейсы,
- Проверять все созданные интерфейсы на NULL,
- Набрать в строке поиска слово "PARTLib" и просмотреть 99(!) тем...

+ Благодарностей: 1

Semargl1990

Попытаюсь объяснить рисунками:
Открываю Компас сборку, добавляю библиотеку
p1.PNG
Запускаю библиотеку
p2.png
Открывается форма, нажимаю ввести данные короба
p3.PNG
Далее заполняю все данные и нажимаю начать
p4.PNG
Создается сборку в Компасе 2
p5.png
Но стандартное изделие появляется в Компасе 1, сборка 1
p6.png
Почему господа знатоки?)

Semargl1990


p3452

Как вариант - откройте Панель задач и посмотрите сколько у вас Компас-ов запущено?
Если несколько, значит вы не перехватываете интерфейс открытого Компаса, а создаете новые процессы...

Semargl1990

Вообще так и задумывалось, втором процессе все сделать, т.к. программно не удалось получить №1 процесс, да и вручную процесс №1 щелчком мыши не получается выделить, блокирует windows form. Или надо сделать так, чтобы не блокировало Windows form процесс №1, или отключить эту форму, но я думал можно обойтись без всего этого.
Как сделать так, чтобы виндовс форма не блокировало процесс №1? 

p3452

Что-то вы намудри-и-ли и говорите о маловероятных событиях!
См. примеры в SDK Компас, если галку поставили при инсталляции (или доустановите)...
Конкретный пример НЕблокировки Windows формой Компаса:
..\SDK\Samples\CSharp\Automation\CSharp Steps.sln

откройте  ksContr
+ Благодарностей: 1

Semargl1990

Что-то не пойму этот ksContr, какой результат работы этого примера? Описания нет что делает этот пример. Получается ksContr это пример для exe библиотеки?
Не могли бы вы пару скриншот работы этого примера показать?

p3452

?
Открываем решение (см. пост 10), назначаем "запускаемым" ksConr, запускаем:
Sharp_Step_ksContr.png
+ Благодарностей: 1

Semargl1990

Все, я решил как сделать так, чтобы форма не блокировала окно компаса,
надо просто применить метод Show при создании формы, а не ShowDialog (см. ниже пример).

public void RunInfoForm()
        {
            // создаем форму
            InfoForm f = new InfoForm();
            // показываем ее в режиме окна
            f.Show();
        }

p3452

+ Благодарностей: 1