Пример #1
0
        public void Create3DPCB()
        {
            if (Directory.Exists("D:\\PDM\\"))
            {
                pdm_path = "D:\\PDM\\";
            }
            else if (Directory.Exists("C:\\PDM\\"))
            {
                pdm_path = "C:\\PDM\\";
            }
            else
            {
                MessageBox.Show("Не найден путь PDM"); return;
            }
            //iSwApp.CommandInProgress = true;
            Board  board;
            string filename;

            filename = iSwApp.GetOpenFileName("Открыть файл", "", "xml Files (*.xml)|*.xml|", out _, out _, out _); //Board.GetFilename();
            if (string.IsNullOrWhiteSpace(filename))
            {
                return;
            }
            board = Board.GetfromXML(filename);
            if (board == null)
            {
                MessageBox.Show("XML с неверной структурой", "Ошибка чтения файла"); return;
            }
            ModelDoc2   swModel;
            AssemblyDoc swAssy;
            ModelView   activeModelView;

            iSwApp.UnloadAddIn(sAddinName);

            //Новая сборка платы
            double swSheetWidth = 0, swSheetHeight = 0;
            string boardName;
            int    Errors = 0, Warnings = 0;

            swAssy  = (AssemblyDoc)iSwApp.NewDocument(pdm_path + "EPDM_LIBRARY\\EPDM_SolidWorks\\EPDM_SWR_Templates\\Модуль_печатной_платы.asmdot", (int)swDwgPaperSizes_e.swDwgPaperA2size, swSheetWidth, swSheetHeight);
            swModel = (ModelDoc2)swAssy;
            //Сохранение
            boardName = filename.Remove(filename.Length - 3) + "SLDASM";
            swModel.Extension.SaveAs(boardName, (int)swSaveAsVersion_e.swSaveAsCurrentVersion, (int)swSaveAsOptions_e.swSaveAsOptions_UpdateInactiveViews, null, ref Errors, ref Warnings);
            //**********

            //Доска
            Component2 board_body;
            PartDoc    part;
            ModelDoc2  swCompModel;
            Feature    swRefPlaneFeat, plane;

            swAssy.InsertNewVirtualPart(null, out board_body);
            board_body.Select4(false, null, false);
            swAssy.EditPart();
            swCompModel = (ModelDoc2)board_body.GetModelDoc2();
            part        = (PartDoc)swCompModel;
            part.SetMaterialPropertyName2("-00", "гост материалы.sldmat", "Rogers 4003C");

            int j = 1;

            do
            {
                swRefPlaneFeat = (Feature)swCompModel.FeatureByPositionReverse(j);
                j++;
            }while (swRefPlaneFeat.Name != "Спереди");

            plane = (Feature)board_body.GetCorresponding(swRefPlaneFeat);
            plane.Select2(false, -1);

            swModel.SketchManager.InsertSketch(false);
            swModel.SketchManager.AddToDB = true;

            //Эскизы
            swModel.SketchManager.DisplayWhenAdded = false;
            //Контур
            foreach (object skt in board.sketh)
            {
                if (skt.GetType().FullName == "SWAddin.Line")
                {
                    Line sk = (Line)skt; swModel.SketchManager.CreateLine(sk.x1, sk.y1, 0, sk.x2, sk.y2, 0);
                }
                if (skt.GetType().FullName == "SWAddin.Arc")
                {
                    Arc sk = (Arc)skt; swModel.SketchManager.CreateArc(sk.xc, sk.yc, 0, sk.x1, sk.y1, 0, sk.x2, sk.y2, 0, sk.direction);
                }
            }
            swModel.FeatureManager.FeatureExtrusion3(true, false, false, 0, 0, board.thickness, board.thickness, false, false, false, false, 0, 0, false, false, false, false, true, true, true, 0, 0, false);
            swModel.ClearSelection2(true);
            //Вырезы
            if (board.cutout.Count > 2)
            {
                plane.Select2(false, -1);
                swModel.SketchManager.InsertSketch(false);
                swModel.SketchManager.AddToDB = true;
                foreach (object skt in board.cutout)
                {
                    if (skt.GetType().FullName == "SWAddin.Line")
                    {
                        Line sk = (Line)skt; swModel.SketchManager.CreateLine(sk.x1, sk.y1, 0, sk.x2, sk.y2, 0);
                    }
                    if (skt.GetType().FullName == "SWAddin.Arc")
                    {
                        Arc sk = (Arc)skt; swModel.SketchManager.CreateArc(sk.xc, sk.yc, 0, sk.x1, sk.y1, 0, sk.x2, sk.y2, 0, sk.direction);
                    }
                }
                swModel.FeatureManager.FeatureCut4(true, false, true, 1, 0, board.thickness, board.thickness, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, false, true, true, true, true, false, 0, 0, false, false);
            }

            //Отверстия
            if (board.circles.Count > 0)
            {
                List <Circle> items;
                items = board.circles.FindAll(hole => hole.radius.CompareTo(0.001) > 0);
                if (items.Count > 0)
                {
                    plane.Select2(false, -1);
                    swModel.SketchManager.InsertSketch(false);
                    swModel.SketchManager.AddToDB = true;
                    foreach (Circle c in items)
                    {
                        swModel.SketchManager.CreateCircleByRadius(c.xc, c.yc, 0, c.radius);
                    }

                    swModel.FeatureManager.FeatureCut4(true, false, true, 1, 0, board.thickness, board.thickness, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, false, true, true, true, true, false, 0, 0, false, false);
                }
                items = board.circles.FindAll(hole => hole.radius.CompareTo(0.001) <= 0);
                if (items.Count > 0)
                {
                    plane.Select2(false, -1);
                    swModel.SketchManager.InsertSketch(false);
                    swModel.SketchManager.AddToDB = true;
                    foreach (Circle c in items)
                    {
                        swModel.SketchManager.CreateCircleByRadius(c.xc, c.yc, 0, c.radius);
                    }

                    swModel.FeatureManager.FeatureCut4(true, false, true, 1, 0, board.thickness, board.thickness, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, false, true, true, true, true, false, 0, 0, false, false);
                }
            }
            //swModel.FeatureManager.FeatureCut3(true, false, true, 1, 0, board.thickness, board.thickness, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, false, true, true, true, true, false, 0, 0, false);

            swModel.SketchManager.DisplayWhenAdded = true;
            swModel.SketchManager.AddToDB          = false;
            swAssy.HideComponent();
            swAssy.ShowComponent();
            swModel.ClearSelection2(true);
            swAssy.EditAssembly();

            string path, sample;

            switch (board.ver)
            {
            case 1:
                path = pdm_path + "Прочие изделия\\ЭРИ";
                break;

            case 2:
                path = pdm_path + "Прочие изделия\\Footprint";
                break;

            default:
                path = pdm_path + "Прочие изделия\\ЭРИ";
                break;
            }
            List <string> allFoundFiles = new List <string>(Directory.GetFiles(path, "*.SLD*", SearchOption.AllDirectories));

            allFoundFiles.AddRange(Directory.GetFiles(pdm_path + "Прочие изделия\\ЭРИ\\T", "*.SLD*", SearchOption.AllDirectories));
            List <string> allFind;
            Dictionary <string, string> empty    = new Dictionary <string, string>();
            Dictionary <string, string> hollow   = new Dictionary <string, string>();
            Dictionary <string, string> multiple = new Dictionary <string, string>();

            foreach (Component comp in board.components)
            {
                //Выбор по какому полю искать 3Д модель
                //sample = comp.part_Number;
                sample = comp.title.Replace((char)47, (char)95);
                sample = sample.Replace((char)92, (char)95);

                if (board.ver == 2)
                {
                    sample = comp.footprint.Replace((char)47, (char)95);
                    sample = sample.Replace((char)92, (char)95);
                    if ((sample.EndsWith("N") & !sample.EndsWith("DN")) | (sample.EndsWith("M") & !sample.EndsWith("DM")) | (sample.EndsWith("L") & !sample.EndsWith("DL")))
                    {
                        sample = sample.Remove(sample.Length - 1);
                    }
                    if (sample.EndsWith("DN") | sample.EndsWith("DM") | sample.EndsWith("DL"))
                    {
                        sample = sample.Remove(sample.Length - 2);
                    }
                }
                //Ищем пустые футпринты
                if (string.IsNullOrEmpty(sample))
                {
                    if (!hollow.ContainsKey(comp.title))
                    {
                        hollow.Add(comp.title, comp.title);
                    }
                }
                //Ищем повторы
                allFind = allFoundFiles.FindAll(item => item.IndexOf(sample, StringComparison.OrdinalIgnoreCase) != -1);
                if (allFind.Count > 1)
                {
                    if (!multiple.ContainsKey(comp.title))
                    {
                        multiple.Add(comp.title, comp.footprint);
                    }
                }
                //Регистронезависимый поиск
                comp.fileName = allFoundFiles.Find(item => item.IndexOf(sample, StringComparison.OrdinalIgnoreCase) != -1);
                //comp.fileName = allFoundFiles.Find(item => item.Contains(sample));
                if (string.IsNullOrWhiteSpace(comp.fileName) & (board.ver != 2))
                {
                    sample        = comp.part_Number.Replace((char)47, (char)95);
                    sample        = sample.Replace((char)92, (char)95);
                    comp.fileName = allFoundFiles.Find(item => item.IndexOf(sample, StringComparison.OrdinalIgnoreCase) != -1);
                }

                if (string.IsNullOrWhiteSpace(comp.fileName))
                {
                    comp.fileName = pdm_path + "Прочие изделия\\ЭРИ\\Zero.SLDPRT";
                    if (!empty.ContainsKey(sample))
                    {
                        empty.Add(sample, sample);
                    }
                }
            }

            double[] transforms, dMatrix;
            string[] coordSys, names;
            double   alfa, beta, gamma, x, y, z;

            names      = new string[board.components.Count];
            coordSys   = new string[board.components.Count];
            dMatrix    = new double[16];
            transforms = new double[board.components.Count * 16];

            for (int i = 0; i < board.components.Count; i++)
            {
                names[i] = board.components[i].fileName;
            }
            int n = 0;

            foreach (Component comp in board.components)
            {
                alfa = 0;
                x    = comp.x;
                y    = comp.y;
                //z = comp.z;
                if (comp.layer == 1) //Если Top
                {
                    //z = (comp.z + comp.standOff) standOff не учитывается
                    z    = board.thickness;
                    beta = -Math.PI / 2;
                }
                else             //Иначе Bottom
                {
                    // z = (comp.z - comp.standOff) standOff не учитывается
                    z    = 0;
                    beta = Math.PI / 2;
                }
                gamma = -(comp.rotation / 180) * Math.PI;

                dMatrix[0]  = Math.Cos(alfa) * Math.Cos(gamma) - Math.Sin(alfa) * Math.Cos(beta) * Math.Sin(gamma);
                dMatrix[1]  = -Math.Cos(alfa) * Math.Sin(gamma) - Math.Sin(alfa) * Math.Cos(beta) * Math.Cos(gamma);
                dMatrix[2]  = Math.Sin(alfa) * Math.Sin(beta); //1 строка матрицы вращения
                dMatrix[3]  = Math.Sin(alfa) * Math.Cos(gamma) + Math.Cos(alfa) * Math.Cos(beta) * Math.Sin(gamma);
                dMatrix[4]  = -Math.Sin(alfa) * Math.Sin(gamma) + Math.Cos(alfa) * Math.Cos(beta) * Math.Cos(gamma);
                dMatrix[5]  = -Math.Cos(alfa) * Math.Sin(beta); //2 строка матрицы вращения
                dMatrix[6]  = Math.Sin(beta) * Math.Sin(gamma);
                dMatrix[7]  = Math.Sin(beta) * Math.Cos(gamma);
                dMatrix[8]  = Math.Cos(beta);                      //3 строка матрицы вращения
                dMatrix[9]  = x; dMatrix[10] = y; dMatrix[11] = z; //Координаты
                dMatrix[12] = 1;                                   //Масштаб
                dMatrix[13] = 0; dMatrix[14] = 0; dMatrix[15] = 0; //Ничего

                for (int k = 0; k < dMatrix.Length; k++)
                {
                    transforms[n * 16 + k] = dMatrix[k];
                }
                n++;
            }

            //Вставка
            swAssy.AddComponents3(names, transforms, coordSys);

            //Фиксация
            swModel.Extension.SelectAll();
            swAssy.FixComponent();
            swModel.ClearSelection2(true);

            activeModelView             = (ModelView)swModel.ActiveView;
            activeModelView.DisplayMode = (int)swViewDisplayMode_e.swViewDisplayMode_ShadedWithEdges;
            //****************************

            UserProgressBar pb;

            iSwApp.GetUserProgressBar(out pb);

            //Заполнение поз. обозначений
            List <Component2> compsColl = new List <Component2>(); //Коллекция из компонентов сборки платы
            Feature           swFeat;
            Component2        compTemp;

            pb.Start(0, board.components.Count, "Поиск");
            int itm = 0;

            swFeat = (Feature)swModel.FirstFeature();
            while (swFeat != null)
            {
                pb.UpdateProgress(itm);
                //pb.UpdateTitle(itm);
                if (swFeat.GetTypeName().Equals("Reference")) //Заполняем коллекцию изделиями
                {
                    compTemp = (Component2)swFeat.GetSpecificFeature2();
                    compsColl.Add(compTemp);
                }
                swFeat = (Feature)swFeat.GetNextFeature();
                itm++;
            }
            pb.End();

            compsColl[0].Name2 = board.designator + (char)32 + "Плата печатная"; //Пререименовываем деталь
            if (compsColl.Count - 1 == board.components.Count)                   //Проверка чтобы не сбились поз. обозначения, если появятся значит все правильно иначе они не нужны
            {
                for (int i = 0; i < board.components.Count; i++)
                {
                    compsColl[i + 1].ComponentReference = board.components[i].physicalDesignator; //Заполняем поз. обозначениями
                }
            }

            string estr = "";

            iSwApp.LoadAddIn(sAddinName);

            if (empty.Count != 0 | hollow.Count != 0 | multiple.Count != 0)
            {
                if (empty.Count != 0)
                {
                    estr = "Отсутствуют 3d модели футпринтов" + System.Environment.NewLine;
                    StreamWriter writer = new StreamWriter(filename.Remove(filename.Length - 4) + "_footprint" + ".txt", false);
                    foreach (KeyValuePair <string, string> str in empty)
                    {
                        estr = estr + str.Key + System.Environment.NewLine; writer.WriteLine(str.Value);
                    }
                    writer.Close();
                }
                if (hollow.Count != 0)
                {
                    estr = estr + "У этих компонентов пустые строки футпринтов" + System.Environment.NewLine;
                    foreach (KeyValuePair <string, string> str in hollow)
                    {
                        estr = estr + str.Key + System.Environment.NewLine;
                    }
                }
                if (multiple.Count != 0)
                {
                    estr = estr + "Найдено несколько футпринтов этих компонентов" + System.Environment.NewLine;
                    StreamWriter writer_m = new StreamWriter(filename.Remove(filename.Length - 4) + "_дубляжи" + ".txt", false);
                    foreach (KeyValuePair <string, string> str in multiple)
                    {
                        estr = estr + str.Key + "->" + str.Value + System.Environment.NewLine; writer_m.WriteLine(str.Key + "->" + str.Value);
                    }
                    writer_m.Close();
                }

                MessageBox.Show(estr, "Внимание");
                //swApp.SendMsgToUser2("Не найдены" + estr, 2, 2);
            }
            //iSwApp.CommandInProgress = false;
            //**************
        }