public static Body MultiCylinder(int circlePointsCount, double firstRadius, double secondRadius, double height) { Body newCube = new Body() { name = "MultiCylinder" }; double alfa = 2 * Math.PI / circlePointsCount; double padding; if (firstRadius > secondRadius) padding = firstRadius; else padding = secondRadius; var firstConnection = new Connection(); var secondConnection = new Connection(); Point firstPoint, secondPoint; Connection heightConnection; for (int i = 0; i < circlePointsCount; i++) { heightConnection = new Connection(); firstPoint = new Point() { X = padding + firstRadius * Math.Cos(alfa * i), Y = padding + firstRadius * Math.Sin(alfa * i), Z = 0 }; secondPoint = new Point() { X = padding + secondRadius * Math.Cos(alfa * i), Y = padding + secondRadius * Math.Sin(alfa * i), Z = height }; heightConnection.points.Add(secondPoint); heightConnection.points.Add(firstPoint); firstConnection.points.Add(firstPoint); secondConnection.points.Add(secondPoint); newCube.connections.Add(heightConnection); newCube.points.Add(firstPoint); newCube.points.Add(secondPoint); } firstConnection.points.Add(firstConnection.points.First()); secondConnection.points.Add(secondConnection.points.First()); newCube.connections.Add(firstConnection); newCube.connections.Add(secondConnection); newCube.GenerateAxles(); newCube.ReloadBody(); return newCube; }
public Connection export() { var exportConnection= new Connection(); foreach (var point in points) { var newPoint = new Point() { X = point.X, Y = point.Y, Z = point.Z }; exportConnection.points.Add(newPoint); } exportConnection.color = color; exportConnection.name = name; return exportConnection; }
/// <summary> /// Чтение тела из файла. /// </summary> /// <param name="source">Пишется относительный путь к файлу, пример - source/car.txt</param> /// <param name="shouldClear">Нужно ли очистить тело, перед чтением из файла. </param> public bool LoadingFromResource(string source, bool shouldClear) { if (shouldClear) { points.Clear(); connections.Clear(); //очищаем тело axles.customs.Clear(); } try { FileStream stream = File.Open(source, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(stream); // открытие файла и запуск читалки try { string currentPositionInFile = reader.ReadLine(); // начниаем с точек if (currentPositionInFile == "Points") { currentPositionInFile = reader.ReadLine(); do { var coordinates = currentPositionInFile.Split(' '); // разбиваем строку на массив points.Add(new Point() // создаём точку, парсим координаты, заносим в список { X = int.Parse(coordinates[0]), Y = int.Parse(coordinates[1]), Z = int.Parse(coordinates[2]) }); currentPositionInFile = reader.ReadLine(); } while (currentPositionInFile != "Connections"); // заканчиваем соединенями } else return false; if (currentPositionInFile == "Connections") // продолжаем соединениями { currentPositionInFile = reader.ReadLine(); do { var connectionPointsNumbers = currentPositionInFile.Split(' ').ToList(); // разбиваем на массив номеров точек var newConnection = new Connection(); // создаём новое соединение var nameAndColorCheckTemp = 0; while (!int.TryParse(connectionPointsNumbers[0], out nameAndColorCheckTemp)) // проверяем на кастомные имя и цвет { var nameAndColorParseTemp = connectionPointsNumbers[0]; if (nameAndColorParseTemp[0] != '#') newConnection.name = nameAndColorParseTemp; else { System.Windows.Media.Color currentColor = System.Windows.Media.Colors.Red; try { try { currentColor = (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(nameAndColorParseTemp); } catch { var color = Color.FromName(nameAndColorParseTemp.Substring(1)); { currentColor = new System.Windows.Media.Color() { A = color.A, R = color.R, G = color.G, B = color.B }; } } } catch { } newConnection.color = new System.Windows.Media.SolidColorBrush(currentColor); } connectionPointsNumbers.Remove(nameAndColorParseTemp); } foreach (string pointNumber in connectionPointsNumbers) // идём по номерам { var currentPoint = points[int.Parse(pointNumber) - 1]; // парсим номер, берём точку, заносим в соединение newConnection.points.Add(currentPoint); } connections.Add(newConnection); // добавляем соединение в тело currentPositionInFile = reader.ReadLine(); } while (currentPositionInFile != "Axles"); } else return false; if (currentPositionInFile == "Axles") // продолжаем осями { var axlesSet = new AxleSet() { customs = axles.customs }; // создаем сет осей currentPositionInFile = reader.ReadLine(); do { var axleInfo = currentPositionInFile.Split(' '); // разбиваем строку на инфу. собираем две точки и ось var firstPointInfo = axleInfo.Skip(1).TakeWhile(x => x != ",").ToArray(); var secondPointInfo = axleInfo.Skip(5).ToArray(); var firstPoint = new Point() { X = double.Parse(firstPointInfo[0]), Y = double.Parse(firstPointInfo[1]), Z = double.Parse(firstPointInfo[2]) }; var secondPoint = new Point() { X = double.Parse(secondPointInfo[0]), Y = double.Parse(secondPointInfo[1]), Z = double.Parse(secondPointInfo[2]) }; var axle = new Axle() { info = axleInfo[0], firstPoint = firstPoint, secondPoint = secondPoint }; switch (axle.info) // заносим ось в сет { case "x": axlesSet.X = axle; break; case "y": axlesSet.Y = axle; break; case "z": axlesSet.Z = axle; break; default: axlesSet.customs.Add(axle); break; } points.Add(firstPoint); // обязательно заносим точки в тело, потому что они у нас динамические points.Add(secondPoint); currentPositionInFile = reader.ReadLine(); } while (currentPositionInFile != "End"); axles = axlesSet; // добавляем ось в сет } else return false; } catch (Exception exp) { return false; } reader.Close(); stream.Close(); ReloadBody(); // переобрабатываем тело return true; } catch (Exception exp) { return false; // Если произошла ошибка в чтении файла } }