Примеры использования API на языке C#

Автор Сергей Фадеев, 01.03.13, 15:33:54

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

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

Сергей Фадеев

КОМПАС 13 SP2. Visual Studio 2010.
Пример создания спецификации и добавление объектов в раздел "Прочие изделия":


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Kompas6Constants;
using KAPITypes;
using Kompas6API5;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private KompasObject kompas;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (kompas == null)
            {
                Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)Activator.CreateInstance(t);
            }

            if (kompas != null)
            {
                kompas.Visible = true;
                kompas.ActivateControllerAPI();
            }

            if (kompas != null)
            {
                ksSpcDocument iDocumentSpc = (ksSpcDocument)kompas.SpcDocument();
                if (iDocumentSpc != null)
                {
                    ksDocumentParam iDocumentParam = (ksDocumentParam)kompas.GetParamStruct((short)StructType2DEnum.ko_DocumentParam);
                    if (iDocumentParam != null)
                    {
                        iDocumentParam.Init();
                        iDocumentParam.type = (int)DocType.lt_DocSpc;// для СП №4

                        ksSheetPar iSheetParam = (ksSheetPar)iDocumentParam.GetLayoutParam();
                        iSheetParam.Init();
                        iSheetParam.layoutName = @"C:\Program Files\ASCON\KOMPAS-3D V13\Sys\graphic.lyt";
                        iSheetParam.shtType = 1;

                        iDocumentSpc.ksCreateDocument(iDocumentParam);

                        for (int i = 1; i < 21; i++)
                        {
                            ksSpecification iSpc = (ksSpecification)iDocumentSpc.GetSpecification();
                            iSpc.ksSpcObjectCreate("", 0, 30, 0, 0, 0);
                            int reference = iSpc.ksSpcObjectEnd();
                            ksSpcObjParam iSpcObjParam = (ksSpcObjParam)kompas.GetParamStruct((short)StructType2DEnum.ko_SpcObjParam);
                            iSpc.ksSpcObjectEdit(reference);
                            iDocumentSpc.ksGetObjParam(reference, iSpcObjParam, ldefin2d.ALLPARAM);
                            iSpcObjParam.blockNumber = 0;
                            iSpcObjParam.draw = 1;
                            iSpcObjParam.firstOnSheet = 0;
                            iSpcObjParam.ispoln = 0;
                            iSpcObjParam.posInc = 1;
                            iSpcObjParam.posNotDraw = 0;
                            iDocumentSpc.ksSetObjParam(reference, iSpcObjParam, ldefin2d.ALLPARAM);
                            iSpc.ksSetSpcObjectColumnText(3, 1, 0, i.ToString());
                            iSpc.ksSetSpcObjectColumnText(4, 1, 0, "АБВГ.123456." + i.ToString()+"\nГОСТ 00");
                            iSpc.ksSetSpcObjectColumnText(5, 1, 0, "Изделие " + i.ToString());
                            iSpc.ksSetSpcObjectColumnText(6, 1, 0, "1");
                            iSpc.ksSetSpcObjectColumnText(7, 1, 0, "Note");
                            reference = iSpc.ksSpcObjectEnd();
                        }

                    }
                }
            }

        }
    }
}

Проект во вложении.
+ Благодарностей: 3

Сергей Фадеев

КОМПАС 13 SP2. Visual Studio 2010.
Пример создания 3d детали:

using System;
using Microsoft.Win32;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using Kompas6Constants;
using Kompas6Constants3D;
using KAPITypes;
using Kompas6API5;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private KompasObject kompas;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (kompas == null)
            {
                Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)Activator.CreateInstance(t);
            }

            if (kompas != null)
            {
                kompas.Visible = true;
                kompas.ActivateControllerAPI();
            }

            if (kompas != null)
            {
                ksDocument3D iDocument3D = (ksDocument3D)kompas.Document3D();
                if (iDocument3D.Create(false /*видимый*/, true /*деталь*/))
                {
                    ksPart iPart = (ksPart)iDocument3D.GetPart((short)Part_Type.pNew_Part); // новый компонент
                    if (iPart != null)
                    {
                        // получим интерфейс базовой плоскости XOY
                        ksEntity planeXOY = (ksEntity)iPart.GetDefaultEntity((short)Obj3dType.o3d_planeXOY); // 1-интерфейс на плоскость XOY
                        ksEntity iSketch = (ksEntity)iPart.NewEntity((short)Obj3dType.o3d_sketch);
                        if (iSketch != null)
                        {
                            // интерфейс свойств эскиза
                            ksSketchDefinition iDefinitionSketch = (ksSketchDefinition)iSketch.GetDefinition();
                            if (iDefinitionSketch != null)
                            {
                                iDefinitionSketch.SetPlane(planeXOY);
                                iDefinitionSketch.angle = 45; // повернем эскиз на 45 град.
                                iSketch.Create();

                                ksDocument2D iDocument2D = (ksDocument2D)iDefinitionSketch.BeginEdit();
                                iDocument2D.ksLineSeg(-40.0, -25.0, 40.0, -25.0, 1);
                                iDocument2D.ksLineSeg(40.0, -25.0, 40.0, 25.0, 1);
                                iDocument2D.ksLineSeg(40.0, 25.0, -40.0, 25.0, 1);
                                iDocument2D.ksLineSeg(-40.0, 25.0, -40.0, -25.0, 1);

                                iDefinitionSketch.EndEdit();

                                ksEntity entityExtr = (ksEntity)iPart.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                                if (entityExtr != null)
                                {
                                    // интерфейс свойств базовой операции выдавливания
                                    ksBossExtrusionDefinition extrusionDef = (ksBossExtrusionDefinition)entityExtr.GetDefinition(); // интерфейс базовой операции выдавливания
                                    if (extrusionDef != null)
                                    {
                                        ksExtrusionParam extrProp = (ksExtrusionParam)extrusionDef.ExtrusionParam(); // интерфейс структуры параметров выдавливания
                                        ksThinParam thinProp = (ksThinParam)extrusionDef.ThinParam();      // интерфейс структуры параметров тонкой стенки
                                        if (extrProp != null && thinProp != null)
                                        {
                                            extrusionDef.SetSketch(iSketch); // эскиз операции выдавливания

                                            extrProp.direction = (short)Direction_Type.dtNormal;      // направление выдавливания (прямое)
                                            extrProp.typeNormal = (short)End_Type.etBlind;      // тип выдавливания (строго на глубину)
                                            extrProp.depthNormal = 100;         // глубина выдавливания
                                            thinProp.thin = true;              // тонкая стенка в два направления
                                            thinProp.normalThickness = 10;      //Толщина стенки в прямом направлении
                                            thinProp.reverseThickness = 10;     //Толщина стенки в обратном направлении
                                            thinProp.thinType = (short)Direction_Type.dtBoth;//Направление формирования тонкой стенки
                                            entityExtr.Create();                // создадим операцию
                                        }
                                    }
                                }
                            }
                        }
                        // создадим новый эскиз
                        ksEntity entitySketch2 = (ksEntity)iPart.NewEntity((short)Obj3dType.o3d_sketch);
                        if (entitySketch2 != null)
                        {
                            // интерфейс свойств эскиза
                            ksSketchDefinition sketchDef2 = (ksSketchDefinition)entitySketch2.GetDefinition();
                            if (sketchDef2 != null)
                            {
                                sketchDef2.SetPlane(planeXOY); // установим плоскость
                                entitySketch2.Create(); // создадим эскиз

                                // интерфейс редактора эскиза
                                ksDocument2D sketchEdit2 = (ksDocument2D)sketchDef2.BeginEdit();
                                sketchEdit2.ksCircle(0, 0, 100, 1);
                                sketchDef2.EndEdit(); // завершение редактирования эскиза

                                // приклеим выдавливанием
                                ksEntity entityBossExtr = (ksEntity)iPart.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                                if (entityBossExtr != null)
                                {
                                    ksBossExtrusionDefinition bossExtrDef = (ksBossExtrusionDefinition)entityBossExtr.GetDefinition();
                                    if (bossExtrDef != null)
                                    {
                                        ksExtrusionParam extrProp = (ksExtrusionParam)bossExtrDef.ExtrusionParam(); // интерфейс структуры параметров выдавливания
                                        ksThinParam thinProp = (ksThinParam)bossExtrDef.ThinParam();      // интерфейс структуры параметров тонкой стенки
                                        if (extrProp != null && thinProp != null)
                                        {
                                            bossExtrDef.SetSketch(entitySketch2); // эскиз операции выдавливания

                                            extrProp.direction = (short)Direction_Type.dtReverse;      // направление выдавливания (обратное)
                                            extrProp.typeNormal = (short)End_Type.etBlind;      // тип выдавливания (строго на глубину)
                                            extrProp.depthReverse = 50;         // глубина выдавливания
                                            thinProp.thin = false;              // без тонкой стенки
                                            entityBossExtr.Create();                // создадим операцию
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

    }
}

Проект во вложении.
+ Благодарностей: 3

Сергей Фадеев

ЛОЦМАН 2011 SP2. Visual Studio 2010.
Пример подключения к ЛОЦМАН из клиентского приложения:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LoodsmanServerApplication;

namespace LoodsmanClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string progid = "LoodsmanServerApplication.MainSystem";
        object inReturnCode;
        object stError;
        DataSet ds;
        private void button1_Click(object sender, EventArgs e)
        {
            MainSystem loodsman = (MainSystem)Activator.CreateInstance(Type.GetTypeFromProgID(progid));
            loodsman.ConnectToDB("Demo", out inReturnCode, out stError);//База с именем Demo

            if ((int)inReturnCode > 0)
            {
                MessageBox.Show(stError.ToString());
                return;
            }

            loodsman.SetFormat("xml", out inReturnCode, out stError);//Устанавливаем формат возврата наборов данных. Наборы данных будут возвращаться в XML-виде
            object infoObject = loodsman.GetInfoAboutVersion("", "", "", 10159, 2, out inReturnCode, out stError);//inMode = 15. Возвращает информацию об объекте
            ds = DataSetInfo(infoObject);
            dataGridView1.DataSource = ds.Tables["row"];


            loodsman.SetFormat("", out inReturnCode, out stError);//Вернем формат возврата наборов данных
        }

        private DataSet DataSetInfo(object xml)
        {
            DataSet dataSet = new DataSet();
            System.Xml.XmlDocument lXmlDoc = new System.Xml.XmlDocument();
            lXmlDoc.LoadXml(xml.ToString());
            dataSet.ReadXml(new System.Xml.XmlNodeReader(lXmlDoc));
            if (dataSet.Tables.Contains("row"))
                foreach (DataRow row in dataSet.Tables[1].Rows)
                {
                    dataSet.Tables["row"].Columns[row["Id"].ToString()].ColumnName = row["Name"].ToString();
                }
            return dataSet;
        }
    }
}


Проект во вложении.

Сергей Фадеев

ВЕРТИКАЛЬ 2011 SP2. Visual Studio 2010.
Пример чтения техпроцесса из клиентского приложения:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using UniReference;
using vkernelLib;

namespace VClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        LogonCom logon;
        IUniRefer uniRef;
        private void button1_Click(object sender, EventArgs e)
        {
            uniRef = new UniReferClass();
            logon = uniRef.GlobalVars().Logon();
            if (!logon.LogonAuto())
            {
                MessageBox.Show(uniRef.GetLastErrorMessage());//Ошибка подключения к UniRefer
                uniRef = null;
                return;
            }
            /*//Логинимся под администратором
            if (!logon.LogonAsParams("Администратор", "111", "Администраторы"))
            {
                MessageBox.Show(uniRef.GetLastErrorMessage());
                uniRef = null;
                return;
            }*/
            IVModel vert_Model = new VModelClass();
            // Загрузим в модель технологию с синхронизацией по серверу
            vert_Model.vrLoadModel(@"C:\Крышка.vtp", null, MODEL_OPEN_MODE.OPEN_FULL_STR_SERVER);
            //Применим к модели параметры безопасности текущей группы в IUniRefer. До применения безопасности модель доступна только для чтения
            vert_Model.vrApplySecurity();
            //Получим итератор от объекта класса root (всегда первый в векторе объектов) по подчиненным связям по фильтру dse
            var vert_Iterator = vert_Model.vrGetObjVector().vrCreateIterator("dse", vert_Model.vrGetObjVector().vrItem(0), true);
            if (vert_Iterator.vrFirst())
            {
                do
                {
                    var vert_Object = vert_Iterator.vrGetObject();//Получим ДСЕ
                    if (vert_Object != null)
                    {
                        // Наименование ДСЕ
                        textBox1.AppendText("ДСЕ: " + vert_Object.vrAttrByName("namedse").vrValue.ToString() + "\r\n");
                        //Получим итератор по подчиненным связям по фильтру operations (список операций)
                        var operations_Iterator = vert_Model.vrGetObjVector().vrCreateIterator("operations", vert_Object, true);
                        if (operations_Iterator.vrFirst())
                        {
                            do
                            {
                                VObject operation = operations_Iterator.vrGetObject();//Операция. Номер и название
                                textBox1.AppendText("Операция: " +
                                    operation.vrAttrByName("indexoper").vrValue.ToString() + " " +
                                    operation.vrAttrByName("nameoper").vrValue.ToString() + "\r\n");
                            } while (operations_Iterator.vrNext());
                        }
                    }

                    //Добавим к ДСЕ новую операцию с названием Тест
                    var new_Operation = vert_Object.vrAddChild("public_oper");
                    new_Operation.vrAttrByName("nameoper").vrValue = "Тест";
                } while (vert_Iterator.vrNext());
            }
            //Сохраним модель в новый файл
            vert_Model.vrSaveModel(@"C:\Крышка_new.vtp", null);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Очистка ILogonCom
            logon = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();

            // Очистка IUniRefer
            uniRef = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
}

Проект во вложении.
+ Благодарностей: 1

Сергей Фадеев


КОМПАС 13 SP2. Visual Studio 2010.
Пример создания библиотеки:
1. Создаем в Visual Studio проект.
Выбираем тип проекта - Библиотека классов.
Вводим имя проекта, например, KompasLibrary.
2. Удаляем из проекта файл Class1.cs, созданный Visual Studio.
3. Добавляем новый класс, например, Sample, редактируем содержимое файла, чтобы оно соответствовало коду ниже


using System;
using KAPITypes;
using Kompas6API5;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Windows.Forms;


namespace KompasLibrary
{
    // Класс Sample - Самая простая библиотека на C#
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Sample
    {
        // Имя библиотеки
        [return: MarshalAs(UnmanagedType.BStr)]
        public string GetLibraryName()
        {
            return "Sample - Самая простая библиотека на C#";
        }


        // Головная функция библиотеки
        public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
        {
            KompasObject kompas = (KompasObject)kompas_;
            kompas.ksMessage("Привет!");
        }


        #region COM Registration
        // Эта функция выполняется при регистрации класса для COM
        // Она добавляет в ветку реестра компонента раздел Kompas_Library,
        // который сигнализирует о том, что класс является приложением Компас,
        // а также заменяет имя InprocServer32 на полное, с указанием пути.
        // Все это делается для того, чтобы иметь возможность подключить
        // библиотеку на вкладке ActiveX.
        [ComRegisterFunction]
        public static void RegisterKompasLib(Type t)
        {
            try
            {
                RegistryKey regKey = Registry.LocalMachine;
                string keyName = @"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");
                regKey.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("При регистрации класса для COM-Interop произошла ошибка:\n{0}", ex));
            }
        }


        // Эта функция удаляет раздел Kompas_Library из реестра
        [ComUnregisterFunction]
        public static void UnregisterKompasLib(Type t)
        {
            RegistryKey regKey = Registry.LocalMachine;
            string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
            RegistryKey subKey = regKey.OpenSubKey(keyName, true);
            subKey.DeleteSubKey("Kompas_Library");
            subKey.Close();
        }
        #endregion
    }
}



4. Добавляем в проект существующий файл описания типов ldefin2d.cs.
5. Добавляем в проект ссылку на Kompas6API5 и System.Windows.Forms.
6. Открываем свойства проекта, страница Приложение.
Щелкаем Сведения о сборке, в окне отмечаем флажок Сделать сборку видимой для COM.
Закрываем, сохраняем.
7. Выбираем конфигурацию Release, перестраиваем проект.
8. Регистрируем сборку в командной строке с помощью RegAsm:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe C:\Release\KompasLibrary.dll /codebase


9. В КОМПАС добавляем описание прикладной библиотеки, вкладка ActiveX, KompasLibrary.Sample.


Проект во вложении.


Все используемые в библиотеке модули должны быть собраны с конфигурацией Any CPU.
На итоговой машине необходимо регистрировать библиотеку с помощью RegAsm <> /codebase.
На итоговой машине должна быть такая же версия .NET Framework.
При компиляции библиотеки рядом создаются модули, которые оборачивают работу с API КОМПАС, например, Interop.Kompas6API5.dll.
Вы должны поставлять данные модули вместе с библиотекой.
Потребуется регистрация данных модулей и Вашей библиотеки через утилиту RegAsm /codebase.
+ Благодарностей: 6

denzlbro

Добрый день! При тестировании примера возникла ошибка "В экземпляре объекта не создана ссылка на объект" на строке: iSpc.ksSpcObjectCreate("", 0, 30, 0, 0, 0);. ПО: Visual Studio 2015, прошу помочь с устранением ошибки.


Цитата: Сергей Фадеев от 01.03.13, 15:33:54
КОМПАС 13 SP2. Visual Studio 2010.
Пример создания спецификации и добавление объектов в раздел "Прочие изделия":


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Kompas6Constants;
using KAPITypes;
using Kompas6API5;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private KompasObject kompas;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (kompas == null)
            {
                Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)Activator.CreateInstance(t);
            }

            if (kompas != null)
            {
                kompas.Visible = true;
                kompas.ActivateControllerAPI();
            }

            if (kompas != null)
            {
                ksSpcDocument iDocumentSpc = (ksSpcDocument)kompas.SpcDocument();
                if (iDocumentSpc != null)
                {
                    ksDocumentParam iDocumentParam = (ksDocumentParam)kompas.GetParamStruct((short)StructType2DEnum.ko_DocumentParam);
                    if (iDocumentParam != null)
                    {
                        iDocumentParam.Init();
                        iDocumentParam.type = (int)DocType.lt_DocSpc;// для СП №4

                        ksSheetPar iSheetParam = (ksSheetPar)iDocumentParam.GetLayoutParam();
                        iSheetParam.Init();
                        iSheetParam.layoutName = @"C:\Program Files\ASCON\KOMPAS-3D V13\Sys\graphic.lyt";
                        iSheetParam.shtType = 1;

                        iDocumentSpc.ksCreateDocument(iDocumentParam);

                        for (int i = 1; i < 21; i++)
                        {
                            ksSpecification iSpc = (ksSpecification)iDocumentSpc.GetSpecification();
                            iSpc.ksSpcObjectCreate("", 0, 30, 0, 0, 0);
                            int reference = iSpc.ksSpcObjectEnd();
                            ksSpcObjParam iSpcObjParam = (ksSpcObjParam)kompas.GetParamStruct((short)StructType2DEnum.ko_SpcObjParam);
                            iSpc.ksSpcObjectEdit(reference);
                            iDocumentSpc.ksGetObjParam(reference, iSpcObjParam, ldefin2d.ALLPARAM);
                            iSpcObjParam.blockNumber = 0;
                            iSpcObjParam.draw = 1;
                            iSpcObjParam.firstOnSheet = 0;
                            iSpcObjParam.ispoln = 0;
                            iSpcObjParam.posInc = 1;
                            iSpcObjParam.posNotDraw = 0;
                            iDocumentSpc.ksSetObjParam(reference, iSpcObjParam, ldefin2d.ALLPARAM);
                            iSpc.ksSetSpcObjectColumnText(3, 1, 0, i.ToString());
                            iSpc.ksSetSpcObjectColumnText(4, 1, 0, "АБВГ.123456." + i.ToString()+"\nГОСТ 00");
                            iSpc.ksSetSpcObjectColumnText(5, 1, 0, "Изделие " + i.ToString());
                            iSpc.ksSetSpcObjectColumnText(6, 1, 0, "1");
                            iSpc.ksSetSpcObjectColumnText(7, 1, 0, "Note");
                            reference = iSpc.ksSpcObjectEnd();
                        }

                    }
                }
            }

        }
    }
}

Проект во вложении.

Дмитрий22

Цитата: denzlbro от 16.01.18, 14:47:07
Добрый день! При тестировании примера возникла ошибка "В экземпляре объекта не создана ссылка на объект" на строке: iSpc.ksSpcObjectCreate("", 0, 30, 0, 0, 0);. ПО: Visual Studio 2015, прошу помочь с устранением ошибки.

Проверьте путь в переменной

iSheetParam.layoutName = @"C:\Program Files\ASCON\KOMPAS-3D V13\Sys\graphic.lyt";
+ Благодарностей: 1

denzlbro

Добрый день! Спасибо за помощь,действительно,путь необходимо было изменить. Но возникла такая же проблема при создании 3d-модели, а именно в строке:
                                iDocument2D.ksLineSeg(-40.0d, -25.0d, 40.0d, -25.0d, 1);

Переменная iDocument2D имеет значение null. Прошу помочь с устранением ошибки.

Откуда нам знать, как Вы получили iDocument2D.
Тем более выше, есть готовый пример http://forum.ascon.ru/index.php/topic,23942.msg170842.html#msg170842

denzlbro

Использовал этот пример, ничего не меняя.

Дмитрий22

Ошибка скорее всего в этой строчке примера:

ksPart iPart = (ksPart)iDocument3D.GetPart((short)Part_Type.pNew_Part);

должно быть:

ksPart iPart = (ksPart)iDocument3D.GetPart((short)Part_Type.pTop_Part);

т. к. мы создаем деталь, а pNew_Part вроде как для сборок, хотя я в 3D программировании еще тот мастак.
+ Благодарностей: 1

Пример для V13 и там этот код работал для 3D детали, а в более поздних версиях уже нужно делать, как показано выше.