// Create New STEP-NC Process using C# // ======================================== // // This C# project calls the STEP-NC API using the .NET interface. It // creates a small machining program with a few toolpath moves. // // You can find more examples and other documentation at: // // http://www.steptools.com/support/ // using System; using System.Collections.Generic; using System.Text; using System.IO; using STEPNCLib; namespace stepnc_hello { class Program { static void Main(string[] args) { // Create a trivial STEP-NC file AptStepMaker apt = new AptStepMaker(); Process pro = new Process(); Feature fea = new Feature(); Tolerance tol = new Tolerance(); // start the program apt.PartNo("Makino part"); fea.OpenNewWorkpiece("Makino part"); // Define a tool apt.Millimeters(); apt.CamModeOn(); apt.DefineTool(0.25, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0); // Read the first FFCAM programs ParseClfile("Plane_1.cldata", apt, pro); // Define feature and operation long ws_id = apt.GetCurrentWorkingstep(); pro.PlaneFinishMilling(ws_id, 0, 3); fea.PlanarFace(ws_id, "first plane", 0, 40, 25); apt.SetName(ws_id, "First planar facing operation"); // Read the second FFCM program ParseClfile("Plane_2.cldata", apt, pro); // Define the feature and operation ws_id = apt.GetCurrentWorkingstep(); pro.PlaneFinishMilling(ws_id, 0, 3); fea.PlanarFace (ws_id, "second plane", 0, 20, 20); apt.SetName(ws_id, "Second planar facing operation"); // Read workpiece geometry as STEP apt.Workpiece("hole_model.stp"); // Make geoemtry for Rawpiece long wp_id = apt.GetCurrentWorkplan (); apt.MakeRawBox (wp_id, -50, -25, 0, 50, 25, 31); // Make geometry for cutter long tl_id = apt.GetCurrentTool (); pro.SetToolLength(tl_id, 100); apt.SetToolIdentifier(apt.GetToolNumber(tl_id), "Makino FFCAM tool"); apt.GenerateToolGeometry(tl_id); pro.SetToolOverallAssemblyLength(tl_id, 80); apt.Fixture("Example_vise.stp"); long fixture_id = apt.GetCurrentFixture(); apt.PutWorkpiecePlacement(fixture_id, 0, -25, 41.5, 0, 1, 0, 1, 0, 0); apt.SaveAsModules("training_with_faces"); } static void ParseClfile(string file_name, AptStepMaker apt, Process pro) { StringBuilder sb = new StringBuilder(); if (File.Exists(file_name)) { using (StreamReader sr = new StreamReader(file_name, Encoding.UTF8)) { while (sr.Peek() >= 0) { string stBuffer = sr.ReadLine(); string[] parts = stBuffer.Split('/'); switch (parts[0]) { case "FROM": string[] fnumbers = parts[1].Split(','); double fx = double.Parse(fnumbers[0]); double fy = double.Parse(fnumbers[1]); double fz = double.Parse(fnumbers[2]); double fi = double.Parse(fnumbers[3]); double fj = double.Parse(fnumbers[4]); double fk = double.Parse(fnumbers[5]); if (fk != 1) { long plan_id = apt.GetCurrentWorkplan(); apt.WorkplanSetup(plan_id, fx, fy, fz, fi, fj, fk, 1, 0, 0); } break; case "GOTO": string[] numbers = parts[1].Split(','); double x = double.Parse(numbers[0]); double y = double.Parse(numbers[1]); double z = double.Parse(numbers[2]); apt.GoToXYZ("", x, y, z); break; case "CIRCLE": string[] cnumbers = parts[1].Split(','); double cx = double.Parse(cnumbers[0]); double cy = double.Parse(cnumbers[1]); double cz = double.Parse(cnumbers[2]); double ci = double.Parse(cnumbers[3]); double cj = double.Parse(cnumbers[4]); double ck = double.Parse(cnumbers[5]); double radius = double.Parse(cnumbers[6]); double tol = double.Parse(cnumbers[7]); double tol2 = double.Parse(cnumbers[8]); double tool_diameter = double.Parse(cnumbers[9]); double tool_radius = double.Parse(cnumbers[10]); // set tool radius and diameter from circle data long tool_id = apt.GetCurrentTool(); pro.SetToolCornerRadius(tool_id, tool_radius); pro.SetToolDiameter(tool_id, tool_diameter); string next_line = sr.ReadLine(); string[] next_parts = next_line.Split('/'); if (next_parts[0] != "GOTO") { Console.WriteLine("Error Parsing GOTO following circle:" + next_line); } else { string[] enumbers = next_parts[1].Split(','); double ex = double.Parse(enumbers[0]); double ey = double.Parse(enumbers[1]); double ez = double.Parse(enumbers[2]); if (ck == 1) apt.ArcXYPlane ("", ex, ey, ez, cx, cy, cz, radius, false); else if (ck == -1) apt.ArcXYPlane("", ex, ey, ez, cx, cy, cz, radius, true); else Console.WriteLine("Error Parsing axis for circle:" + stBuffer); } // apt.GoToXYZ("", x, y, z); break; case "RAPID": apt.Rapid(); break; case "FEDRAT": string[] fparms = parts[1].Split(','); if (fparms[0] == "PERMIN") { double feed = double.Parse(fparms[1]); apt.FeedrateUnit("mmpm"); apt.Feedrate(feed); } else { Console.WriteLine("Unknown feed unit:" + fparms[0]); } break; case "SPINDL": string[] sparms = parts[1].Split(','); if (sparms[0] == "RPM") { double speed = double.Parse(sparms[1]); bool ccw = true; if (sparms.Length > 2) { if (sparms[2] == "CCW") ccw = true; else if (sparms[2] == "CLW") ccw = false; else Console.WriteLine("Unknown spindle direction:" + sparms[2]); } apt.SpindleSpeedUnit("rpm"); if (ccw == true) apt.SpindleSpeed(speed); else apt.SpindleSpeed(-speed); } else if (sparms[0] == "OFF") apt.SpindleSpeed(0); else { Console.WriteLine("Unknown spindle unit:" + sparms[0]); } break; case "SELECT": string[] slparms = parts[1].Split(','); if (slparms[0] == "TOOL") { long tool_num = long.Parse(slparms[1]); apt.SELCTLTool(tool_num); } else { Console.WriteLine("Unknown SELECT:" + slparms[0]); } break; case "LOAD": string[] lparms = parts[1].Split(','); if (lparms[0] == "TOOL") { long tool_num = long.Parse(lparms[1]); apt.LoadTool(tool_num); } else { Console.WriteLine("Unknown LOAD:" + lparms[0]); } break; case "UNITS": string[] uparms = parts[1].Split(','); if (uparms[0] == "MM") apt.Millimeters (); else if (uparms[1] == "INCH") apt.Inches(); else { Console.WriteLine("Unknown UNITS:" + uparms[0]); } break; case "SET": string[] tparms = parts[1].Split(','); if (tparms[0] == "MODE") { if (tparms[1] != "ABSOL") Console.WriteLine("Cannot SET/MODE:" + tparms[1]); } else { Console.WriteLine("Unknown SET:" + tparms[0]); } break; case "PPRINT": string[] pparms = parts[1].Split(','); if (pparms[0] == "MOTION" && pparms[1] == "CUT" && pparms[2] == "TYPE") { if (pparms[3] == "FACE-CUT") { long ws_id = apt.GetCurrentWorkingstep(); apt.WorkingstepAddPropertyDescriptiveMeasure(ws_id, "Makino-Motion", "FACE-CUT"); } else Console.WriteLine("Unknown MOTION TYPE:" + pparms[3]); } else { Console.WriteLine(stBuffer); } break; default: Console.WriteLine(stBuffer); break; } } } } } } }