Add move-copy body feature with coincident mate using SOLIDWORKS API
{ width=150 }
C# VSTA macro example which finds the largest planar face of the selected body and inserts move-copy body feature in part and adds coincident mate with Front Plane using SOLIDWORKS API.
- Open part document
- Select any body which contains the planar face
- Run the macro. As the result move-copy body feature is inserted via IFeatureManager::InsertMoveCopyBody2 SOLIDWORKS API method. Then coincident mate is added between the largest face of the body and front plane using IMoveCopyBodyFeatureData::AddMate SOLIDWORKS API method.
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Linq;
using System.Runtime.InteropServices;
namespace MoveBodyMate
{
public partial class SolidWorksMacro
{
public void Main()
{
try
{
var model = swApp.IActiveDoc2;
var body = model.ISelectionManager.GetSelectedObject6(1, -1) as IBody2;
if (body == null)
{
throw new NullReferenceException("Select body to move");
}
var plane = FindFrontPlane(model);
var face = FindLargestPlanarFace(body);
AddCoincidentMate(model, body, plane as IEntity, face as IEntity);
}
catch(Exception ex)
{
swApp.SendMsgToUser2(ex.Message, (int)swMessageBoxIcon_e.swMbStop, (int)swMessageBoxBtn_e.swMbOk);
}
}
private static void AddCoincidentMate(ModelDoc2 model, IBody2 body, IEntity mateEnt, IEntity mateEntOnBody)
{
var selData = model.ISelectionManager.CreateSelectData();
selData.Mark = 1;
if (!body.Select2(false, selData))
{
throw new InvalidOperationException("Failed to select body");
}
var moveCopyBodyFeat = model.FeatureManager.InsertMoveCopyBody2(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, 1);
var featData = moveCopyBodyFeat.GetDefinition() as IMoveCopyBodyFeatureData;
if (featData.AccessSelections(model, null))
{
int err;
var mate = featData.AddMate(new DispatchWrapper[]
{
new DispatchWrapper(mateEnt),
new DispatchWrapper(mateEntOnBody)
}, (int)swMateType_e.swMateCOINCIDENT, (int)swMateAlign_e.swMateAlignCLOSEST, 0, 0, out err);
if (mate == null)
{
throw new NullReferenceException(string.Format("Failed to add mate: {0}", (swAddMateError_e)err));
}
if (!moveCopyBodyFeat.ModifyDefinition(featData, model, null))
{
throw new InvalidOperationException("Failed to apply feature changes");
}
}
else
{
throw new InvalidOperationException("Failed to access the definition");
}
}
private IFeature FindFrontPlane(IModelDoc2 model)
{
var feat = model.IFirstFeature();
while (feat != null && feat.GetTypeName2() != "RefPlane")
{
feat = feat.IGetNextFeature();
}
if (feat == null)
{
throw new NullReferenceException("Failed to find the front plane");
}
return feat;
}
private IFace2 FindLargestPlanarFace(IBody2 body)
{
var faces = body.GetFaces() as object[];
if (faces == null)
{
throw new NullReferenceException("Body doesn't contain faces");
}
var face = faces.Cast<IFace2>()
.Where(f => f.IGetSurface().IsPlane())
.OrderBy(f => f.GetArea()).LastOrDefault();
if (face == null)
{
throw new NullReferenceException("There are no planar faces in this body");
}
return face;
}
public SldWorks swApp;
}
}