Пример #1
0
        private void okButton_Click(object sender, EventArgs e)
        {
            List <string> lineNumbers = new List <string>(this.notMoveLines.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList <string>());
            List <MyLine> fixedLines  = new List <MyLine>();

            if (gridName.Text == string.Empty)
            {
                MessageBox.Show("Имя сетки не может быть пустым!");
                return;
            }
            foreach (string str in lineNumbers)
            {
                int idx;
                if (!int.TryParse(str, out idx))
                {
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                MyLine line = parent.currentFullModel.geometryModel.Lines.Find(l => l.Id == idx);
                if (line == null)
                {
                    MessageBox.Show("Не найдена линия с номером " + idx.ToString());
                    return;
                }
                fixedLines.Add(line);
            }
            parent.precision = parent.DefinePrecision();
            if (parent.currentFullModel.geometryModel.Areas.Count != 0)
            {
                errorMessage1.Visible    = false;
                errorBadGridName.Visible = false;

                // создаем новый объект "конечно-элементная модель" и добавляем его в список конечно-элементных моделей.
                foreach (MyFiniteElementModel model in parent.currentFullModel.FiniteElementModels) // проверяем, нет ли модели с таким именем
                {
                    if (model.ModelName == gridName.Text)
                    {
                        errorBadGridName.Visible = true;
                        return;
                    }
                }

                // создаем для новой КЭ модели id
                int id = parent.currentFullModel.IdCandidate;
                currentModel           = (MyFiniteElementModel)Util.getObjectCopy(currentModel);
                currentModel.ModelName = gridName.Text;
                currentModel.Id        = id;
                currentModel.type      = MyFiniteElementModel.GridType.Ruppert;
                currentModel.restoreArraysForOldMethods(parent.currentFullModel.geometryModel);
                parent.clearSelection();
                parent.ReDrawAll();
                this.Hide();
                Optimize(fixedLines);
            }
            else
            {
                errorMessage1.Visible = true;
            }
        }
        private void okButton_Click(object sender, EventArgs e)
        {
            List <string> lineStrings = new List <string>(this.notMoveLines.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList <string>());
            List <MyLine> fixedLines  = new List <MyLine>();

            if (gridName.Text == string.Empty)
            {
                MessageBox.Show("Имя сетки не может быть пустым!");
                return;
            }
            foreach (string str in lineStrings)
            {
                int idx;
                if (!int.TryParse(str, out idx))
                {
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                MyLine line = parent.currentFullModel.geometryModel.Lines.Find(l => l.Id == idx);
                if (line == null)
                {
                    MessageBox.Show("Не найдена линия с номером " + idx.ToString());
                    return;
                }
                fixedLines.Add(line);
            }
            parent.precision = parent.DefinePrecision();
            if (parent.currentFullModel.geometryModel.Areas.Count != 0)
            {
                errorMessage1.Visible    = false;
                errorBadGridName.Visible = false;

                // создаем новый объект "конечно-элементная модель" и добавляем его в список конечно-элементных моделей.
                foreach (MyFiniteElementModel model in parent.currentFullModel.FiniteElementModels) // проверяем, нет ли модели с таким именем
                {
                    if (model.ModelName == gridName.Text)
                    {
                        errorBadGridName.Visible = true;
                        return;
                    }
                }

                // создаем для новой КЭ модели id
                int id = parent.currentFullModel.IdCandidate;
                currentModel           = (MyFiniteElementModel)Util.getObjectCopy(currentModel);
                currentModel.ModelName = gridName.Text;
                currentModel.Id        = id;
                currentModel.restoreArraysForOldMethods(parent.currentFullModel.geometryModel);
                List <MyNode> dontMove = new List <MyNode>();
                for (int i = 1; i < currentModel.INOUT.Count; i++)
                {
                    if (currentModel.INOUT[i] == 0)
                    {
                        continue;
                    }
                    MyNode node = currentModel.Nodes.Find(n => n.Id == i);
                    if (node != null)
                    {
                        dontMove.Add(node);
                    }
                }
                foreach (MyLine line in fixedLines)
                {
                    if (line is MyStraightLine)
                    {
                        dontMove.AddRange(findNodesAtStraightLine(line as MyStraightLine));
                    }
                    else
                    {
                        dontMove.AddRange(findNodesAtArc(line as MyArc));
                    }
                }

                Regularize(dontMove);
                parent.clearSelection();
                parent.ModelCreated(currentModel);
                Close();
            }
            else
            {
                errorMessage1.Visible = true;
            }
        }
        private void okButton_Click(object sender, EventArgs e)
        {
            List <string> lineStrings = new List <string>(this.notMoveLines.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList <string>());
            List <MyLine> fixedLines  = new List <MyLine>();

            foreach (string str in lineStrings)
            {
                int idx;
                if (!int.TryParse(str, out idx))
                {
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }

                MyLine line = (MyLine)parent.currentFullModel.geometryModel.StraightLines.Find(l => l.Id == idx) ?? (MyLine)parent.currentFullModel.geometryModel.Arcs.Find(a => a.Id == idx);
                if (line == null)
                {
                    MessageBox.Show("Не найдена линия с номером " + idx.ToString());
                    return;
                }
                fixedLines.Add(line);
            }
            parent.precision = parent.DefinePrecision();
            if (parent.currentFullModel.geometryModel.Areas.Count != 0)
            {
                errorMessage1.Visible    = false;
                errorBadGridName.Visible = false;

                // создаем новый объект "конечно-элементная модель" и добавляем его в список конечно-элементных моделей.
                foreach (MyFiniteElementModel model in parent.currentFullModel.FiniteElementModels) // проверяем, нет ли модели с таким именем
                {
                    if (model.ModelName == gridName.Text)
                    {
                        errorBadGridName.Visible = true;
                        return;
                    }
                }
                this.Hide();
                parent.StartProgress("Выполняется оптимизация");
                // создаем для новой КЭ модели id
                int id = parent.currentFullModel.IdCandidate;
                currentModel           = (MyFiniteElementModel)Util.getObjectCopy(currentModel);
                currentModel.ModelName = gridName.Text;
                currentModel.Id        = id;
                currentModel.restoreArraysForOldMethods(parent.currentFullModel.geometryModel);

                int[] notMove = new int[currentModel.INOUT.Count];
                notMove.Initialize();
                if (notMoveLines.TextLength != 0)
                {
                    foreach (MyLine fixedLine in fixedLines)
                    {
                        List <MyNode> tempNodes = new List <MyNode>();
                        if (fixedLine is MyStraightLine)
                        {
                            findNodesAtStraightLine(tempNodes, (MyStraightLine)fixedLine);
                            foreach (MyNode node in tempNodes)
                            {
                                node.Type        = NodeType.Fixed;
                                notMove[node.Id] = 1;
                            }
                        }
                        else
                        {
                            findNodesAtArc(tempNodes, (MyArc)fixedLine);
                            foreach (MyNode node in tempNodes)
                            {
                                node.Type        = NodeType.Fixed;
                                notMove[node.Id] = 1;
                                //currentModel.INOUT[node.Id] = 1;
                            }
                        }
                    }
                }

                Regularization(currentModel.NRC, parent.currentFullModel.geometryModel.Areas.Count, currentModel, notMove);
                currentModel.FiniteElements.Clear();
                currentModel.Nodes.Clear();

                for (int i = 1; i <= currentModel.NP; i++) // MAXNP - число узлов
                {
                    currentModel.Nodes.Add(new MyNode(currentModel.CORD[2 * (i - 1) + 1], currentModel.CORD[2 * (i - 1) + 2], i));
                }

                for (int temp = 1; temp <= currentModel.NE; temp++)
                {
                    int           numOfFE    = currentModel.FiniteElements.Count;
                    int           numOfNodes = currentModel.Nodes.Count;
                    List <MyNode> tempNodes  = new List <MyNode>();

                    double X1 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 1] - 1) + 1];
                    double Y1 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 1] - 1) + 2];
                    double X2 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 2] - 1) + 1];
                    double Y2 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 2] - 1) + 2];
                    double X3 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 3] - 1) + 1];
                    double Y3 = currentModel.CORD[2 * (currentModel.NOP[3 * (temp - 1) + 3] - 1) + 2];

                    foreach (MyNode node in currentModel.Nodes)
                    {
                        if (Math.Abs(node.X - X1) <= 0.001 && Math.Abs(node.Y - Y1) <= 0.001)
                        {
                            tempNodes.Add(node);
                        }
                        if (Math.Abs(node.X - X2) <= 0.001 && Math.Abs(node.Y - Y2) <= 0.001)
                        {
                            tempNodes.Add(node);
                        }
                        if (Math.Abs(node.X - X3) <= 0.001 && Math.Abs(node.Y - Y3) <= 0.001)
                        {
                            tempNodes.Add(node);
                        }
                    }
                    MyFiniteElement elem = new MyFiniteElement(numOfFE + 1, 0, tempNodes);
                    elem.DefineArea(parent.currentFullModel.geometryModel.Areas);
                    currentModel.FiniteElements.Add(elem);
                    tempNodes.Clear();
                }
                parent.EndProgress();
                parent.ModelCreated(currentModel);
                Close();
            }
            else
            {
                errorMessage1.Visible = true;
            }
        }