[Transaction(TransactionMode.Manual)]
public class OpenFamilyInstanceInWallCmd : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Result result = Result.Succeeded;
SysCommandData m_Cmd = new SysCommandData(commandData);
SysTransaction.TransStart(m_Cmd.Doc);
try
{
var wallele = m_Cmd.uiDoc.Selection.PickObject(ObjectType.Element,new ElementFilter<Wall>());
Element element = m_Cmd.Doc.GetElement(wallele.ElementId);
Wall wall = element as Wall;
var familyele = m_Cmd.uiDoc.Selection.PickObject(ObjectType.Element, new ElementFilter<FamilyInstance>());
Element familyelement = m_Cmd.Doc.GetElement(familyele.ElementId);
FamilyInstance door = familyelement as FamilyInstance;
Document doc = m_Cmd.Doc;
XYZ dir = wall.Orientation;
CurveLoop curveLoop = ExporterIFCUtils.GetInstanceCutoutFromWall(
doc, wall, door, out dir);
foreach (Curve curve in curveLoop)
{
doc.Create.NewModelCurve(curve, SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(dir, curve.GetEndPoint(0))));
}
SysTransaction.TransEnd();
}
catch (Exception)
{
SysTransaction.RollBack();
}
return result;
}
}