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

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

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

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


Sprinter500

Цитата: Sabahs от 08.12.19, 09:43:18А там мало, что поменялось.
WKMPS.rar

Спасибо большое !!! Скомпилировал, работает.

Заметил, что идет сначала сохранение деталей в файлы в m3d, а затем вставка их локальными деталями. А возможно ли обойтись без операций чтения-записи на жесткий диск, то есть создание локальных деталей сразу, минуя этап с m3d?

Sprinter500

Переписал код (предложенный глубокоуважаемым Sabahs) из под Delphi в C#. Работает (напомню - он из работает с созданием и сохранением деталей, с последующей вставкой в сборку и превращением их в локальные детали, что и требовалось)
Вот сам код:

        void CreateAssembly()
        {
            IDocuments pDocuments = appl.Documents;
            if (pDocuments != null)
            {
                string FileNameSB = label3.Text + "Local.a3d";
                string FileNameLoc = label3.Text;
                IKompasDocument DocumentSB = pDocuments.Add(DocumentTypeEnum.ksDocumentAssembly, true);
                if (DocumentSB != null)
                {
                    IKompasDocument3D Doc3DSB = DocumentSB as IKompasDocument3D;
                    if (Doc3DSB != null)
                    {
                        ksDocument3D pDocument3D5SB = (ksDocument3D)kompas.ActiveDocument3D();
                        IPart7 Part7SB = Doc3DSB.TopPart;
                        if ((Part7SB != null) && (pDocument3D5SB != null))
                        {
                            IParts7 Parts7SB = Part7SB.Parts;
                            if (Parts7SB != null)
                            {
                                ksPart pPart5SB = (ksPart)pDocument3D5SB.GetPart((short)Part_Type.pTop_Part);
                                if (pPart5SB != null)
                                {
                                    for (int J = 1; J <= 3; J++)
                                    {
                                        IKompasDocument DocumentLoc = pDocuments.Add(DocumentTypeEnum.ksDocumentPart, true);
                                        IKompasDocument3D Doc3DLoc = DocumentLoc as IKompasDocument3D;
                                        if (Doc3DLoc != null)
                                        {
                                            ksDocument3D pDocument3D5Loc = (ksDocument3D)kompas.ActiveDocument3D();
                                            IPart7 Part7Loc = Doc3DLoc.TopPart;
                                            if ((Part7Loc != null) && (pDocument3D5Loc != null))
                                            {
                                                ksPart pPart5Loc = (ksPart)(pDocument3D5Loc.GetPart((short)Part_Type.pTop_Part));
                                                if (pPart5Loc != null)
                                                {
                                                    pPart5Loc.useColor = (int)UseColor.useColorOur;
                                                    string Sm = "";
                                                    switch (J)
                                                    {
                                                        case 1:
                                                            pPart5Loc.name = "Жёлтенькая";
                                                            pPart5Loc.SetAdvancedColor(ColorTranslator.ToWin32(Color.FromArgb(0x7FFFD4)), 0.5, 0.6, 0.5, 0.8, 0.8, 1);
                                                            pPart5Loc.Update();
                                                            Part7Loc.SetMaterial("Пластилин цветной", 0.0033);
                                                            Sm = "Пластилин";
                                                            break;
                                                        case 2:
                                                            pPart5Loc.name = "Розовенькая";
                                                            pPart5Loc.SetAdvancedColor(ColorTranslator.ToWin32(Color.FromArgb(0x7FFFD4)), 0.5, 0.6, 0.5, 0.8, 0.8, 1);
                                                            pPart5Loc.Update();
                                                            Part7Loc.SetMaterial("Просто цветной", 0.066);
                                                            Sm = "цветной";
                                                            break;
                                                        case 3:
                                                            pPart5Loc.name = "Беленькая";
                                                            pPart5Loc.SetAdvancedColor(ColorTranslator.ToWin32(Color.FromArgb(0x7FFFD4)), 0.5, 0.6, 0.5, 0.8, 0.8, 1);
                                                            pPart5Loc.Update();
                                                            Part7Loc.SetMaterial("Тут изум, цветной", 0.0099);
                                                            Sm = "Изум";
                                                            break;
                                                    }
                                                    Part7Loc.Marking = Sm;
                                                    Part7Loc.Update();
                                                    IModelObject PlaneLocXY = Part7Loc.DefaultObject[ksObj3dTypeEnum.o3d_planeXOY];
                                                    IModelContainer ModelContainerLoc = Part7Loc as IModelContainer;
                                                    if (ModelContainerLoc != null)
                                                    {
                                                        ISketchs SketchsLoc = ModelContainerLoc.Sketchs;
                                                        if (SketchsLoc != null)
                                                        {
                                                            ISketch SketchLoc = SketchsLoc.Add();
                                                            if (SketchLoc != null)
                                                            {
                                                                if (PlaneLocXY != null)
                                                                {
                                                                    SketchLoc.Plane = PlaneLocXY;
                                                                    IKompasDocument2D Doc2D = SketchLoc.BeginEdit() as IKompasDocument2D;
                                                                    if (Doc2D != null)
                                                                    {
                                                                        IViewsAndLayersManager pViewsAndLayersManager = Doc2D.ViewsAndLayersManager;
                                                                        if (pViewsAndLayersManager != null)
                                                                        {
                                                                            IViews pViews = pViewsAndLayersManager.Views;
                                                                            if (pViews != null)
                                                                            {
                                                                                IView pView = pViews.View[0];
                                                                                if (pView != null)
                                                                                {
                                                                                    IDrawingContainer pDrawingContainer = pView as IDrawingContainer;
                                                                                    if (pDrawingContainer != null)
                                                                                    {
                                                                                        ICircles pCircles = pDrawingContainer.Circles;
                                                                                        if (pCircles != null)
                                                                                        {
                                                                                            ICircle pCircle = pCircles.Add();
                                                                                            if (pCircle != null)
                                                                                            {
                                                                                                pCircle.Xc = (J - 1) * 250;
                                                                                                pCircle.Yc = 0;
                                                                                                pCircle.Radius = 100;
                                                                                                pCircle.Style = 1;
                                                                                                pCircle.Update();
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                    SketchLoc.EndEdit();
                                                                    IExtrusions ExtrusionsLoc = ModelContainerLoc.Extrusions;
                                                                    if (ExtrusionsLoc != null)
                                                                    {
                                                                        IExtrusion ExtrusionLoc = ExtrusionsLoc.Add(ksObj3dTypeEnum.o3d_bossExtrusion);
                                                                        if (ExtrusionLoc != null)
                                                                        {
                                                                            ExtrusionLoc.Sketch = (Sketch)SketchLoc;
                                                                            ExtrusionLoc.Direction = (ksDirectionTypeEnum)Direction_Type.dtBoth;
                                                                            ExtrusionLoc.ExtrusionType[false] = (ksEndTypeEnum)End_Type.etBlind;
                                                                            ExtrusionLoc.Depth[false] = 50;
                                                                            ExtrusionLoc.ExtrusionType[true] = (ksEndTypeEnum)End_Type.etBlind;
                                                                            ExtrusionLoc.Depth[true] = 50;
                                                                            ExtrusionLoc.Update();
                                                                        }
                                                                    }
                                                                    Part7Loc.Update();
                                                                    pDocument3D5Loc.RebuildDocument();
                                                                    pDocument3D5Loc.SaveAs(FileNameLoc + Sm + ".m3d");
                                                                    pDocument3D5Loc.close();
                                                                    pPart5Loc = (ksPart)pDocument3D5SB.GetPart((short)Part_Type.pNew_Part);
                                                                    if (pPart5Loc != null)
                                                                    {
                                                                        if (pDocument3D5SB.SetPartFromFile(FileNameLoc + Sm + ".m3d", pPart5Loc, false))
                                                                        {
                                                                            Part7Loc = Parts7SB.Part[J - 1];
                                                                            if (Part7Loc != null)
                                                                            {

                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                pDocument3D5SB.RebuildDocument();
                                pDocument3D5SB.SaveAs(FileNameSB);
                            }
                        }
                    }
                }
            }
        }

Sprinter500

УРА!!! Понял как обойтись без записи деталей в файлы m3d и чтения их с жесткого диска, что снижает скорость за счет лишних операций. Итак, вот что надо было сделать:

        public void CreateNewPart()
        {
            ksPart prt = (ksPart)doc3D.GetPart((short)Part_Type.pTop_Part);  // новый компонент
            ksEntity bPlane = (ksEntity)prt.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
            ksPart part = (ksPart)doc3D.CreatePartInAssembly("", bPlane);
            doc3D.SetPartFromFile("", part, false);
            IPart7 part7 = (IPart7)kompas.TransferInterface(part, (int)ksAPITypeEnum.ksAPI7Dual, 0);
            if (part != null)
            {
   part.BeginEdit();
   // Тут создаем геометрию детали ....
   part.EndEdit(false);
            }
        }


Однако опять всплыла проблема, что не задается материал. Задаются только имя, обозначение и цвет.

                part.useColor = (int)UseColor.useColorOur;
                part.SetAdvancedColor(ColorTranslator.ToWin32(Color.FromArgb(0x7FFFD4)), 0.5, 0.6, 0.8, 0.8, 1.0, 0.5);
                part.name = "Name333";
                part.marking = "Marking333";

Осталось только решить как задать материал в уже существующей локальной детали.