using System; using System.Runtime.InteropServices; using CommandLine; using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; namespace SolidWorksBoxGenerator { // Class to hold the parsed command-line options public class Options { [Option('o', "output", Required = true, HelpText = "Absolute path for the output .SLDPRT file.")] public string OutputFile { get; set; } [Option('w', "width", Default = 500.0, HelpText = "Total width of the box.")] public double Width { get; set; } [Option('l', "length", Default = 500.0, HelpText = "Total length of the box.")] public double Length { get; set; } [Option('h', "height", Default = 80.0, HelpText = "Height of the box walls.")] public double Height { get; set; } [Option('t', "thickness", Default = 3.0, HelpText = "Sheet metal thickness.")] public double Thickness { get; set; } [Option('r', "radius", Default = 1.0, HelpText = "Bend radius for sheet metal.")] public double Radius { get; set; } } class Program { static void Main(string[] args) { Parser.Default.ParseArguments(args) .WithParsed(o => { try { Console.WriteLine("Attempting to connect to SolidWorks..."); SldWorks swApp = GetSldWorks(); if (swApp == null) { Console.WriteLine("Could not connect to SolidWorks. Please ensure it is running."); return; } Console.WriteLine("Successfully connected to SolidWorks."); GenerateBox(swApp, o); } catch (Exception e) { Console.WriteLine($"An error occurred: {e.Message}"); Console.WriteLine(e.StackTrace); } }); } private static SldWorks GetSldWorks() { // Connect to a running instance of SolidWorks try { return (SldWorks)Marshal.GetActiveObject("SldWorks.Application"); } catch (COMException) { return null; } } private static void GenerateBox(SldWorks swApp, Options opts) { // Convert all measurements from mm to meters for SolidWorks double width = opts.Width / 1000.0; double length = opts.Length / 1000.0; double height = opts.Height / 1000.0; double thickness = opts.Thickness / 1000.0; double radius = opts.Radius / 1000.0; // --- Step 1: Create a New Part Document --- Console.WriteLine("Creating new part document..."); ModelDoc2 swModel = (ModelDoc2)swApp.NewPart(); if (swModel == null) { Console.WriteLine("Failed to create new part."); return; } FeatureManager featMan = swModel.FeatureManager; SketchManager skMan = swModel.SketchManager; swModel.ClearSelection2(true); // --- Step 2: Create the Base Flange --- Console.WriteLine("Creating base flange..."); // Select the Top Plane (defined as "Plane3" internally by the API) swModel.Extension.SelectByID2("Plane3", "PLANE", 0, 0, 0, false, 0, null, 0); skMan.InsertSketch(true); skMan.CreateCenterRectangle(0, 0, 0, width / 2, length / 2, 0); skMan.InsertSketch(true); Feature sheetMetalFeature = featMan.InsertSheetMetalBaseFlange2(thickness, false, radius, 0, 0, 0, 0.5, 0, 0, 0, false, false, false, false); if(sheetMetalFeature == null) { Console.WriteLine("Failed to create base flange."); swApp.CloseDoc(swModel.GetTitle()); return; } swModel.ClearSelection2(true); // --- Step 3: Create Edge Flanges (Walls) --- Console.WriteLine("Creating edge flanges for walls..."); object[] edges = new object[4]; edges[0] = GetEdgeByVertex(swModel, width / 2, length / 2, 0); // Front-Right edge edges[1] = GetEdgeByVertex(swModel, -width / 2, length / 2, 0); // Front-Left edge edges[2] = GetEdgeByVertex(swModel, -width / 2, -length / 2, 0); // Back-Left edge edges[3] = GetEdgeByVertex(swModel, width / 2, -length / 2, 0); // Back-Right edge // Selecting all 4 edges at once to create mitered corners automatically swModel.Extension.SelectByID2(((IEntity)edges[0]).GetSelectionId(), "EDGE", 0,0,0, true, 1, null, 0); swModel.Extension.SelectByID2(((IEntity)edges[1]).GetSelectionId(), "EDGE", 0,0,0, true, 1, null, 0); swModel.Extension.SelectByID2(((IEntity)edges[2]).GetSelectionId(), "EDGE", 0,0,0, true, 1, null, 0); swModel.Extension.SelectByID2(((IEntity)edges[3]).GetSelectionId(), "EDGE", 0,0,0, true, 1, null, 0); featMan.InsertSheetMetalEdgeFlange(height, radius, (90.0 * Math.PI / 180.0), (int)swSheetMetalFlangeLengthMethod_e.swSheetMetalFlangeLengthMethod_OuterVirtualSharp, 0, (int)swSheetMetalFlangePosition_e.swSheetMetalFlangePosition_MaterialInside, false, 0, 0, 0, 0, false, false); swModel.ClearSelection2(true); // --- Step 4: Save and Close --- Console.WriteLine($"Saving file to {opts.OutputFile}..."); bool saveSuccess = swModel.Extension.SaveAs(opts.OutputFile, (int)swSaveAsVersion_e.swSaveAsCurrentVersion, (int)swSaveAsOptions_e.swSaveAsOptions_Silent, null, 0, 0); if (saveSuccess) { Console.WriteLine("File saved successfully."); } else { Console.WriteLine("Failed to save the file."); } swApp.CloseDoc(swModel.GetTitle()); } // Helper function to find an edge based on one of its vertices' coordinates private static IEdge GetEdgeByVertex(ModelDoc2 model, double x, double y, double z) { var body = ((PartDoc)model).GetBodies2((int)swBodyType_e.swSolidBody, true)[0] as IBody2; var vertex = body.GetFinniestVertex(x,y,z) as IVertex; return vertex.GetEdges()[0] as IEdge; } } }