/
spruttechnology
/
cam-api-examples
Обзор
Документация
Войти
/
spruttechnology
/
cam-api-examples
Код
Запросы
3
Задачи
Пакеты
0
Релизы
1
Аналитика
v19/develop
Geometry/AddinImportSvgNet/project/main/Program.cs
186 строк
6 KB
renal
Stabilization with fresh update of CAM
10 апр 2026, 15:28
10 апр 2026, 15:28
ff452f8
Код
Авторство
О чём код?
using CAMHelper.NativeLibUtils; using Geometry.VecMatrLib; using STGeomApiTypes; using STTypes; namespace AddinImportSvgNet; /// <summary> /// Addin to import .svg files into CAM geometry /// </summary> public static class Program { private delegate IntPtr GetGeomFilerDelegate(); /// <summary> /// Using STGeomFile.dll, this addin imports SVG files into CAM geometry. /// </summary> public static void Main(string [] args) { // read params if (args.Length < 1) throw new Exception("Usage: AddinImportSvgNet <in-file> <out-file>"); var svgFile = args[0]; var sgfFilePath = args.Length > 1 ? args[1] : "temp.sgf"; // connect STGeomFile.dll var currentFolder = @"C:/Program Files/Sprut Technology/SprutCAM 19/Bin64"; var dllPath = Path.Combine(currentFolder, "STGeomFile.dll"); if (!File.Exists(dllPath)) throw new Exception($"{dllPath} not found"); if (!File.Exists(dllPath)) throw new Exception("STGeomFile.dll not found: " + dllPath); var geomFile = NativeLibLoader.CreateComObject<ISTGeomFiler, GetGeomFilerDelegate>(dllPath, "CreateGeomFiler", out var objectPointer, out var dllPointer) ?? throw new Exception("Error creating geomFiler"); try { Import(geomFile, svgFile, sgfFilePath); } finally { NativeLibLoader.FreeDll(geomFile, objectPointer, dllPointer); } } private static void ReadSvg(string svgFile, ISTGeomReceiver geomReceiver) { var converter = new SvgToCamConverter(); var isFirst = true; TST3DPoint firstPoint = default; var id = ""; var callbacks = new SvgReaderCallbacks { OnMoveTo = (entityId, p) => { firstPoint = p; id = entityId; isFirst = false; geomReceiver.StartCurve3d(id, p); }, OnLineTo = p => { if (isFirst) throw new Exception("First point is not set (by OnModeTo)"); geomReceiver.CutTo3d(p); }, OnCircleTo = (entityId, radius, centerX, centerY) => { var vT = new TST3DPoint { X = centerX, Y = centerY, Z = 0 }; var vZ = new TST3DPoint { X = 0, Y = 0, Z = 1 }; var vX = new TST3DPoint { X = 1, Y = 0, Z = 0 }; geomReceiver.CreateCircle(entityId, radius, vT, vZ, vX); geomReceiver.AddEntity(entityId, $"svg({entityId})"); }, OnEllipseTo = (entityId, majRadius, minRadius, centerX, centerY, rotationDegrees ) => { var vT = new TST3DPoint { X = centerX, Y = centerY, Z = 0 }; var vZ = new TST3DPoint { X = 0, Y = 0, Z = 1 }; var angleRad = rotationDegrees * Math.PI / 180.0; var vX = new TST3DPoint { X = Math.Cos(angleRad), Y = Math.Sin(angleRad), Z = 0 }; geomReceiver.CreateEllipse(entityId, majRadius, minRadius, vT, vZ, vX); geomReceiver.AddEntity(entityId, $"svg({entityId})"); }, OnSetLineColor = color => { geomReceiver.SetCurrentColor(color); }, OnSetLineWidth = width => { geomReceiver.SetCurrentLineWidth(width); }, OnClosePath = closeCurve => { geomReceiver.CutTo3d(firstPoint); if (closeCurve) geomReceiver.CloseCurve3d(true); geomReceiver.AddEntity(id, $"svg({id})"); isFirst = false; } }; converter.ImportSvg(svgFile, callbacks); } private static bool Import(ISTGeomFiler geomFile, string inputFile, string outputFile) { bool succeed; if (File.Exists(outputFile)) File.Delete(outputFile); // beginning of the file if (!geomFile.StartFile(outputFile)) throw new Exception("Can't start file: " + outputFile); if (geomFile is not ISTGeomReceiver geomReceiver) throw new Exception("Can`t cast geomFile to geomReceiver"); try { try { // set point, we are going to use it as a coordinate system geomReceiver.SetCurrentTransform(T3DMatrix.Unit.vT, T3DMatrix.Unit.vZ, T3DMatrix.Unit.vX); // item in geometry objects tree geomReceiver.StartGroupEntity("svg_entities"); try { ReadSvg(inputFile, geomReceiver); succeed = true; } finally { geomReceiver.CloseGroupEntity(); } } finally { geomReceiver.CloseModel(); } } finally { geomFile.CloseFile(); } return succeed; } }