• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Пример вставки изделий из Библиотеки "Стандартные изделия"

Автор AndriiSvityi, 10.07.20, 21:51:47

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

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

AndriiSvityi

Приветствую, поделитесь пожалуйста примером вставки изделий из Библиотеки "Стандартные изделия". Конкретно, меня интересует вставка подшипника с возможность настроки параметров вставки (начальных координат, угла поворота, выбора какой стороной 3D модель подшипника вставить в 2D чертеж).

Дядя Костя

Да блин, опять этот бесячий раздел, надо выгнать программистов на отдельный форум  :w:

Semargl1990

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
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 CreateLotok;


namespace StPartTo3D
{

    [ClassInterface(ClassInterfaceType.AutoDual)]

    public class InsertKompas

    {
        #region Методы для работы библиотеки в Компас
        private KompasObject _kompas;



        // Название библиотеки
        [return: MarshalAs(UnmanagedType.BStr)]
        public string GetLibraryName()
        {
            return "Kompas_Library";
        }

        // Головная функция библиотеки
        public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
        {
            _kompas = (KompasObject)kompas_;
            switch (command)
            {
                case 1:
                    InsertInKompas(_kompas);
                    break;
            }
        }

        // Функция получения меню
        // Описание функции можно найти в SDK API Компас
        [return: MarshalAs(UnmanagedType.BStr)]
        public string ExternalMenuItem(short number, ref short itemType, ref short command)
        {
            var result = string.Empty;
            itemType = 1; // "MENUITEM"
            switch (number)
            {
                case 1:
                    result = "Вставить";
                    command = 1;
                    break;
                //
                // Для корректной работы библиотеки необходимо добавить конец меню (или подменю)
                //
                case 2:
                    command = -1;
                    itemType = 3; // "ENDMENU"
                    break;
            }
            return result;
        }
        #endregion

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

        private void InsertInKompas(KompasObject kompas)
        {

            IntPtr pDll = IntPtr.Zero;
            pDll = LoadLibrary("C:\\Program Files\\ASCON\\KOMPAS-3D v17\\Libs\\PARTLib\\Clients\\plclient_kompas.dll");
            var pProc3D = GetProcAddress(pDll, "PLInsert3D");
            var PLInsert3D = (iPLInsert3D)Marshal.GetDelegateForFunctionPointer(pProc3D, typeof(iPLInsert3D));
         
           
            IApplication kompasApp = kompas.ksGetApplication7();
            var ActDoc3D = (Document3D)kompas.ActiveDocument3D();
           
           
            IPARTLibProvider aPLClient = null;
            aPLClient = new BOSimpleProvider();
            aPLClient.Connect("");

            var docType = GetDocType(kompasApp);

            var ksPart = (part)ActDoc3D.GetPart((short)Part_Type.pTop_Part);
            ksPlacement aPlacement = null;
            aPlacement = ksPart.GetPlacement();

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

            IDispatch kPart;
            switch (docType)
            {
                case DocumentTypeEnum.ksDocumentAssembly:
                    // Задаем место в сборке
                    aPlacement.SetOrigin(0, 0, 0);
                    PLInsert3D(out kPart, aPLClient, aMethodResponce, aPlacement);
                    break;
            }

            Lotok iCreateLotok = new Lotok();
            iCreateLotok.CreateLotok(kompas);


            aPLClient.Disconnect();
            FreeLibrary(pDll);

        }



        //public partial class FormDll : Form
        //{
        //    public FormDll()
        //    {
        //        InitializeComponent();
        //    }
        //}

        private DocumentTypeEnum GetDocType(IApplication kompasApp)
        {
            return kompasApp.ActiveDocument == null ? DocumentTypeEnum.ksDocumentUnknown : kompasApp.ActiveDocument.DocumentType;
        }

       

        [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);




        [ComRegisterFunction]
        public static void RegisterKompasLib(Type t)

        {
            RegistryKey regKey = Registry.LocalMachine;

            try
            {
                var keyName = string.Format("{0}{1}{2}", @"SOFTWARE\Classes\CLSID\{", t.GUID.ToString(), "}");
                regKey = regKey.OpenSubKey(keyName, true);
                regKey.CreateSubKey("Kompas_Library");
                regKey = regKey.OpenSubKey("InprocServer32", true);
                regKey.SetValue(null, System.Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\mscoree.dll");
            }

            catch (Exception ex)

            {
                MessageBox.Show(string.Format("При регистрации класса для COM-Interop произошла ошибка:\n{0}", ex));
            }

            finally

            {
                regKey.Close();
            }

        }



        // Эта функция удаляет раздел Kompas_Library из реестра

        [ComUnregisterFunction]

        public static void UnregisterKompasLib(Type t)

        {
            RegistryKey regKey = Registry.LocalMachine;
            var keyName = string.Format("{0}{1}{2}", @"SOFTWARE\Classes\CLSID\{", t.GUID.ToString(), "}");
            RegistryKey subKey = regKey.OpenSubKey(keyName, true);

            try

            {
                subKey.DeleteSubKey("Kompas_Library");
            }

            finally { subKey.Close(); }

        }

    }


}

Semargl1990

Добрый день! Не буду создавать доп. тему т.к. относится к вставке ст. изделия в 3д сборку.
В общем так, создал библиотеку Activex, создал форму windows куда забиваю длину, ширину, высоту короба по этим данным создаю в общем 3д сборку, ниже я создал 3д сборку.
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;

            //Создаю 3д сборку в другом окне
            Document3D AssemblyDoc3D = (Document3D)kompas.Document3D();
            AssemblyDoc3D.Create(false, false);

            //Вызываю класс Bolt3D и процедуру InsertBolt3D чтобы вставить ст. изделие в сборку.
            Bolt3D PasteBolt = new Bolt3D();
            PasteBolt.InsertBolt3D(kompas);
           
            //Вот код в классе  Bolt3D
            [UnmanagedFunctionPointer(CallingConvention.StdCall)]
            private delegate void iPLInsert3D([Out] out IDispatch retVal, IPARTLibProvider aPLClient, IBOResponse
            aMethodResponse, ksPlacement aPlacement);
           
            public void InsertBolt3D(KompasObject 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();
            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);
           
            Подскажите почему так получается?