private void setCoordinateAScale(IDictionary <string, ParsedCmdGroup> block) { foreach (Axis axis in Enum.GetValues(typeof(Axis))) { if (block.ContainsKey(axis.ToString())) { ParsedCmdGroup word = block[axis.ToString()]; switch (axis) { case Axis.X: mbase.ScaleAt(new Vector3D(word.ValueAxis1, 1.0, 1.0), Ptc); Ptc.X = mbase.OffsetX; break; case Axis.Y: mbase.ScaleAt(new Vector3D(1.0, word.ValueAxis1, 1.0), Ptc); Ptc.Y = mbase.OffsetY; break; case Axis.Z: mbase.ScaleAt(new Vector3D(1.0, 1.0, word.ValueAxis1), Ptc); Ptc.Z = mbase.OffsetZ; break; } } } }
private void setCoordinateScale(IDictionary <string, ParsedCmdGroup> block) { // Reset all transformations mbase.M11 = 1; mbase.M12 = 0; mbase.M13 = 0; // x axis mbase.M21 = 0; mbase.M22 = 1; mbase.M23 = 0; // y axis mbase.M31 = 0; mbase.M32 = 0; mbase.M33 = 1; // z axis mbase.OffsetX = 0.0; mbase.OffsetY = 0.0; mbase.OffsetZ = 0.0; // offset Ptc.X = 0.0; Ptc.Y = 0.0; Ptc.Z = 0.0; foreach (Axis axis in Enum.GetValues(typeof(Axis))) { if (block.ContainsKey(axis.ToString())) { ParsedCmdGroup word = block[axis.ToString()]; switch (axis) { case Axis.X: mbase.ScaleAt(new Vector3D(word.ValueAxis1, 1.0, 1.0), Ptc); Ptc.X = mbase.OffsetX; break; case Axis.Y: mbase.ScaleAt(new Vector3D(1.0, word.ValueAxis1, 1.0), Ptc); Ptc.Y = mbase.OffsetY; break; case Axis.Z: mbase.ScaleAt(new Vector3D(1.0, 1.0, word.ValueAxis1), Ptc); Ptc.Z = mbase.OffsetZ; break; } } } }
private void setCoordinateRotate(IDictionary <string, ParsedCmdGroup> block) { // Reset all transformations mbase.M11 = 1; mbase.M12 = 0; mbase.M13 = 0; // x axis mbase.M21 = 0; mbase.M22 = 1; mbase.M23 = 0; // y axis mbase.M31 = 0; mbase.M32 = 0; mbase.M33 = 1; // z axis mbase.OffsetX = 0.0; mbase.OffsetY = 0.0; mbase.OffsetZ = 0.0; // offset Ptc.X = 0.0; Ptc.Y = 0.0; Ptc.Z = 0.0; // rotate center point foreach (Axis axis in Enum.GetValues(typeof(Axis))) { if (block.ContainsKey(axis.ToString())) { ParsedCmdGroup word = block[axis.ToString()]; switch (axis) { case Axis.X: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M11, mbase.M12, mbase.M13), word.ValueAxis1), Ptc); break; case Axis.Y: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M21, mbase.M22, mbase.M23), word.ValueAxis1), Ptc); break; case Axis.Z: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M31, mbase.M32, mbase.M33), word.ValueAxis1), Ptc); break; } } } }
private void setCoordinateATrans(IDictionary <string, ParsedCmdGroup> block) { foreach (Axis axis in Enum.GetValues(typeof(Axis))) { if (block.ContainsKey(axis.ToString())) { ParsedCmdGroup word = block[axis.ToString()]; switch (axis) { case Axis.X: Ptc.X = word.ValueAxis1; mbase.TranslatePrepend(new Vector3D(Ptc.X, 0.0, 0.0)); Ptc.X = mbase.OffsetX; Ptc.Y = mbase.OffsetY; Ptc.Z = mbase.OffsetZ; break; case Axis.Y: Ptc.Y = word.ValueAxis1; mbase.TranslatePrepend(new Vector3D(0.0, Ptc.Y, 0.0)); Ptc.X = mbase.OffsetX; Ptc.Y = mbase.OffsetY; Ptc.Z = mbase.OffsetZ; break; case Axis.Z: Ptc.Z = word.ValueAxis1; mbase.TranslatePrepend(new Vector3D(0.0, 0.0, Ptc.Z)); Ptc.X = mbase.OffsetX; Ptc.Y = mbase.OffsetY; Ptc.Z = mbase.OffsetZ; break; } // machineOffsets[axis] = word.value ; } } // Console.WriteLine("OFFSET" + " " + mbase.OffsetX + " " + mbase.OffsetY + " " + mbase.OffsetZ) ; }
private void setCoordinateARotate(IDictionary <string, ParsedCmdGroup> block) { foreach (Axis axis in Enum.GetValues(typeof(Axis))) { if (block.ContainsKey(axis.ToString())) { ParsedCmdGroup word = block[axis.ToString()]; switch (axis) { case Axis.X: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M11, mbase.M12, mbase.M13), word.ValueAxis1), Ptc); break; case Axis.Y: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M21, mbase.M22, mbase.M23), word.ValueAxis1), Ptc); break; case Axis.Z: mbase.RotateAt(new Quaternion(new Vector3D(mbase.M31, mbase.M32, mbase.M33), word.ValueAxis1), Ptc); break; } } } }
private void parseLine() { // Remove comments between () and all comments after ; StringBuilder parsedLine = new StringBuilder(currentLine); Match g4 = G04.Match(parsedLine.ToString()); Match comment1 = COMMENTS1.Match(parsedLine.ToString()); Match comment2 = COMMENTS2.Match(parsedLine.ToString()); if (g4.Success) { // currentLine.Replace(g4.Value, "") ; } if (comment1.Success && (MachineType == "Fanuc" || MachineType == "Okuma" || MachineType == "Mayak")) { parsedLine.Remove(comment1.Index, comment1.Length); // for Fanuc, Okuma, Haas } if (comment2.Success) { parsedLine.Remove(comment2.Index, comment2.Length); // for Sinumerik } ISet <string> wordcmd = new HashSet <string>(); String parsedWords; if ((parsedWords = findWords(parsedLine)) != null) { wordcmd.Add(parsedWords); } // Console.WriteLine("currentPosition: " + "X:"+ machineStatus.newPosition[MachineStatus.Axis.X].Value + "Y:"+ machineStatus.newPosition[MachineStatus.Axis.Y].Value + "Z:"+ machineStatus.newPosition[MachineStatus.Axis.Z].Value ) ; // Console.WriteLine(machineStatus.newLine) ; // A map that holds all parsed codes IDictionary <string, ParsedWord> block = new Dictionary <string, ParsedWord>(10); IDictionary <string, ParsedCmdGroup> CmdBlock = new Dictionary <string, ParsedCmdGroup>(); // Hold's the current parsed word ParsedWord thisWord; ParsedWord addWord; ParsedCmdGroup thisCmdGroup; // while ((addWord = findWordInBlock(machineStatus.newLine)) != null) // { // int pos = machineStatus.newLine.ToString().IndexOf(addWord.asRead); // machineStatus.newLine.Remove(pos, pos + addWord.asRead.Length - pos).Insert(pos, ""); // // string blockKey = addWord.word; // block.Add(blockKey, addWord); // } while ((thisWord = findWordInBlock(parsedLine)) != null) { // Devide string by block int pos = parsedLine.ToString().IndexOf(thisWord.asRead); parsedLine.Remove(pos, pos + thisWord.asRead.Length - pos).Insert(pos, ""); // We can have multiple G/M words within a block, so we move them to the 'key' string blockKey = thisWord.word; string CmdBlockKey = ""; if (blockKey.Equals("G") || blockKey.Equals("M")) { blockKey = thisWord.parsed.Replace('.', '_'); // Store gwords with a . as _ Example G33.1 } if (blockKey.Contains("TRANS") || blockKey.Contains("ROT") || blockKey.Contains("SCALE") || blockKey.Contains("MIRROR")) { string Block = parsedLine.ToString(); Match CmdMatcher = Gcodepattern.Match(Block); while (CmdMatcher.Success) { string g0 = CmdMatcher.Groups[0].ToString(); string g1 = CmdMatcher.Groups[1].ToString(); string g3 = CmdMatcher.Groups[3].ToString().Replace('.', ','); if (g3 != "") { double v = Convert.ToDouble(g3); string value = String.Format("{0:}", v); thisCmdGroup = new ParsedCmdGroup(blockKey, g1, v, g1 + value, g0); CmdBlockKey = thisCmdGroup.AxisName1; CmdBlock.Add(CmdBlockKey, thisCmdGroup); } CmdMatcher = CmdMatcher.NextMatch(); } parsedLine.Clear(); } if (block.ContainsKey(blockKey)) { throw new SimValidationException("Multiple " + thisWord.word + " words on one line."); } else { block.Add(blockKey, thisWord); } } foreach (KeyValuePair <string, ParsedWord> pair in block) { // Console.WriteLine("Key : " + pair.Key + " " + "Value : " + pair.Value) ; } // First verify if the block itself is valid before we process it if (machineValidator != null) { machineValidator.preVerify(block); } // Copy to intermediate status to ensure our machine status is always valid intermediateStatus.copyFrom(machineStatus); // Notify the controller that we are about to start a new block, the block itself is valid, for example there we be no G1's and G0 on one line foreach (IMachineController controller in this.machineController) { controller.startBlock(this, intermediateStatus, block); } intermediateStatus.startBlock(); // Copy the block to the machine intermediateStatus.setWord(wordcmd); intermediateStatus.setCommandBlk(CmdBlock, block); intermediateStatus.setBlock(block); // Block en, no more data will come in for this block intermediateStatus.endBlock(); // Verify machine's state, for example if a R was found, do we also have a valid G to accompany with it? if (machineValidator != null) { machineValidator.postVerify(intermediateStatus); } // Notify the controller that everything was ok, now teh controller start 'running' the data foreach (IMachineController controller in this.machineController) { controller.endBlock(this, intermediateStatus, block); } // setup new and valid machine status machineStatus.copyFrom(intermediateStatus); }