public void Textoutput(double robotGeschwindigkeit, double extrusionsGeschwindigkeit, string path, string fileName) { /* * Textoutput für Koordinate(X,Y,Z), Orientierung(Winkel1,Winkel2,Winkel3), Robotergeschwindigkeit, * Extrusionsgeschwindigkeit vom Vorgänger zu diesem Punkt, Nummer der Schicht */ List <bool> absetzPunkte = new List <bool>(); List <double> absetzDouble = new List <double>(); absetzPunkte.Add(false); int index = 0; int index2 = 0; using (StreamWriter outputFile = File.AppendText(path + fileName)) { Voxel v = new Voxel(m_randGraph.GetVoxelKoordinatenAtIndex(0)); Voxel v2; for (int i = 0; i < m_splitList[0].Count; i++) { if (absetzPunkte[i]) { absetzDouble.Add(extrusionsGeschwindigkeit); } else { absetzDouble.Add(0); } index = (int)m_optimizedRand.GetPriorityItem(i); v = new Voxel(m_randGraph.GetVoxelKoordinatenAtIndex(index)); if ((i + 1) < m_splitList[0].Count) { index2 = (int)m_optimizedRand.GetPriorityItem(i + 1); } if ((index2) < m_splitList[0].Count) { v2 = new Voxel(m_randGraph.GetVoxelKoordinatenAtIndex(index2)); absetzPunkte.Add(v.IsNeighbor6(v2)); } outputFile.Write(m_randGraph.GetVoxelKoordinate(0, index) + " " + m_randGraph.GetVoxelKoordinate(1, index) + " " + m_randGraph.GetVoxelKoordinate(2, index) + " " + m_splitList[0][index].getOrientierungAt(0) + " " + m_splitList[0][index].getOrientierungAt(1) + " " + m_splitList[0][index].getOrientierungAt(2) + " " + robotGeschwindigkeit + " " + absetzDouble[i] + " " + m_layerIndex + " " + "\r\n"); } absetzPunkte.Clear(); absetzDouble.Clear(); index = (int)m_optimizedRest.GetPriorityItem(0); v2 = new Voxel(m_restGraph.GetVoxelKoordinatenAtIndex(index)); absetzPunkte.Add(v.IsNeighbor26(v2)); for (int i = 0; i < m_splitList[1].Count; i++) { if (absetzPunkte[i]) { absetzDouble.Add(extrusionsGeschwindigkeit); } else { absetzDouble.Add(0); } index = (int)m_optimizedRest.GetPriorityItem(i); v = new Voxel(m_restGraph.GetVoxelKoordinatenAtIndex(index)); if ((i + 1) < m_splitList[1].Count) { index2 = (int)m_optimizedRest.GetPriorityItem(i + 1); } if ((index2) < m_splitList[1].Count) { v2 = new Voxel(m_restGraph.GetVoxelKoordinatenAtIndex(index2)); absetzPunkte.Add(v.IsNeighbor26(v2)); } outputFile.Write(m_restGraph.GetVoxelKoordinate(0, index) + " " + m_restGraph.GetVoxelKoordinate(1, index) + " " + m_restGraph.GetVoxelKoordinate(2, index) + " " + m_splitList[1][index].getOrientierungAt(0) + " " + m_splitList[1][index].getOrientierungAt(1) + " " + m_splitList[1][index].getOrientierungAt(2) + " " + robotGeschwindigkeit + " " + absetzDouble[i] + " " + m_layerIndex + " " + "\r\n"); } } }
public void Bahnplanung(List <Voxel> voxelList, double robotGeschwindigkeit, double extrusionsGeschwindigkeit, string path, string fileName, int layerIndex) { /* * Teilen der gesamten Voxelliste in Randvoxel und Rest, damit unterschiedliche Bahnen geplant werden können * splitList[0] enthält Schichtränder * splitList[1] enthält alle anderen Voxel */ List <List <Voxel> > splitList = new List <List <Voxel> >(SplitVoxelList(voxelList)); /* * Erstelle zwei Graphen : Randvoxel-Graph und Restvoxel-Graph * False und True zeigen hier jeweils nur an ob es sich bei den Verarbeitungsschritten um * Infillvoxel handelt oder nicht, wegen der Nachbarschaftskontrolle */ Graph_ randGraph = new Graph_(VoxelToGraph(splitList[0], false)); Graph_ restGraph = new Graph_(VoxelToGraph(splitList[1], true)); // Erstellen der Druckfolgen Druckfolge initialRand = new Druckfolge(); Druckfolge initialRest = new Druckfolge(); Druckfolge _2optRand = new Druckfolge(); Druckfolge _2optRest = new Druckfolge(); Druckfolge optimizedRand = new Druckfolge(); Druckfolge optimizedRest = new Druckfolge(); for (int NNRUNS = 0; NNRUNS < 5; NNRUNS++) { Random randomizer = new Random(); int startNodeRand = (randomizer.Next(0, randGraph.GetGraph().Count - 1)); int startNodeRest = (randomizer.Next(0, restGraph.GetGraph().Count - 1)); // Generieren einer NN-Tour mit random Startknoten initialRand = NearestNeighbor(randGraph.DeepCopy(), startNodeRand); initialRest = NearestNeighbor(restGraph.DeepCopy(), startNodeRest); // Verbesserung der initialen Lösung durch 2-opt _2optRand = _2Opt(initialRand, randGraph.DeepCopy(), false); _2optRest = _2Opt(initialRest, restGraph.DeepCopy(), true); //Behalten des besten lokalen Optimums if (_2optRand.GetGesamtkosten() < optimizedRand.GetGesamtkosten()) { optimizedRand = _2optRand.DeepCopy(); } if (_2optRest.GetGesamtkosten() < optimizedRest.GetGesamtkosten()) { optimizedRest = _2optRest.DeepCopy(); } } /* * Textoutput für Koordinate(X,Y,Z), Orientierung(Winkel1,Winkel2,Winkel3), Robotergeschwindigkeit, * Extrusionsgeschwindigkeit vom Vorgänger zu diesem Punkt, Nummer der Schicht */ List <bool> absetzPunkte = new List <bool>(); List <double> absetzDouble = new List <double>(); absetzPunkte.Add(false); int index = 0; int index2 = 0; using (StreamWriter outputFile = File.AppendText(path + fileName)) { Voxel v = new Voxel(randGraph.GetVoxelKoordinatenAtIndex(0)); Voxel v2; for (int i = 0; i < splitList[0].Count; i++) { if (absetzPunkte[i]) { //Hier Extrusionsgeschwindigkeit eintragen absetzDouble.Add(extrusionsGeschwindigkeit); } else { absetzDouble.Add(0); } index = (int)optimizedRand.GetPriorityItem(i); v = new Voxel(randGraph.GetVoxelKoordinatenAtIndex(index)); if ((i + 1) < splitList[0].Count) { index2 = (int)optimizedRand.GetPriorityItem(i + 1); } if ((index2) < splitList[0].Count) { v2 = new Voxel(randGraph.GetVoxelKoordinatenAtIndex(index2)); absetzPunkte.Add(v.IsNeighbor6(v2)); } outputFile.Write(randGraph.GetVoxelKoordinate(0, index) + " " + randGraph.GetVoxelKoordinate(1, index) + " " + randGraph.GetVoxelKoordinate(2, index) + " " + splitList[0][index].getOrientierungAt(0) + " " + splitList[0][index].getOrientierungAt(1) + " " + splitList[0][index].getOrientierungAt(2) + " " + robotGeschwindigkeit + " " + absetzDouble[i] + " " + layerIndex + " " + "\r\n"); } //outputFile.Write("\r\n"); absetzPunkte.Clear(); absetzDouble.Clear(); index = (int)optimizedRest.GetPriorityItem(0); v2 = new Voxel(restGraph.GetVoxelKoordinatenAtIndex(index)); absetzPunkte.Add(v.IsNeighbor6(v2)); for (int i = 0; i < splitList[1].Count; i++) { if (absetzPunkte[i]) { //Hier Extrusionsgeschwindigkeit eintragen absetzDouble.Add(extrusionsGeschwindigkeit); } else { absetzDouble.Add(0); } index = (int)optimizedRest.GetPriorityItem(i); v = new Voxel(restGraph.GetVoxelKoordinatenAtIndex(index)); if ((i + 1) < splitList[1].Count) { index2 = (int)optimizedRest.GetPriorityItem(i + 1); } if ((index2) < splitList[1].Count) { v2 = new Voxel(restGraph.GetVoxelKoordinatenAtIndex(index2)); absetzPunkte.Add(v.IsNeighbor26(v2)); } outputFile.Write(restGraph.GetVoxelKoordinate(0, index) + " " + restGraph.GetVoxelKoordinate(1, index) + " " + restGraph.GetVoxelKoordinate(2, index) + " " + splitList[1][index].getOrientierungAt(0) + " " + splitList[1][index].getOrientierungAt(1) + " " + splitList[1][index].getOrientierungAt(2) + " " + robotGeschwindigkeit + " " + absetzDouble[i] + " " + layerIndex + " " + "\r\n"); } } }