Client/Desktop/KMBIM3.0/KMBIM3.0_23.08.16_수정최종/Cmd/Extend2Level/Extend2Level.cs

752 lines
30 KiB
C#

using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
//using SpinKler;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using KDCS.Utils;
using KMBIM.Revit.Tools.Cmd.DuctSize;
using KMBIM.Revit.Tools.Properties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace KMBIM
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
class Extend2Level : IExternalCommand
{
UIApplication uiapp;
UIDocument uidoc;
Autodesk.Revit.DB.Document doc;
Autodesk.Revit.Creation.Application creApp;
Autodesk.Revit.Creation.Document creDoc;
Autodesk.Revit.UI.ExternalCommandData m_commandData;
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
m_commandData = commandData;
uiapp = commandData.Application;
uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
doc = uidoc.Document;
creApp = uiapp.Application.Create;
creDoc = doc.Create;
List<Element> m_SelElemLst = new List<Element>();
List<Pipe> m_PipeLst = new List<Pipe>();
List<Duct> m_DuctLst = new List<Duct>();
List<Pipe> m_VerPipeLst = new List<Pipe>();
List<Duct> m_VerDuctLst = new List<Duct>();
try
{
//if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded;
FormExtend2Level dlg = new FormExtend2Level();
dlg.revit = m_commandData;
dlg.ShowDialog();
if (dlg.DialogResult == DialogResult.Cancel) return Result.Succeeded;
XYZ PickPoint = null;
IList<Reference> pickrefs = commandData.Application.ActiveUIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, new SelectionFilter(), Resources.Ext2Lvl_Select);
if (pickrefs != null)
{
foreach (Reference refer in pickrefs)
{
PickPoint = refer.GlobalPoint;
ElementId tt = refer.ElementId;
Element e = doc.GetElement(tt) as Element;
//m_SelElemLst.Add(selElem);
m_PipeLst.Clear();
m_DuctLst.Clear();
if (e is Pipe)
{
Pipe pipe = e as Pipe;
bool bf = VerticalElem(e);
if (bf)
m_VerPipeLst.Add(pipe);
else
m_PipeLst.Add(pipe);
}
else if (e is Duct)
{
Duct duct = e as Duct;
bool bf = VerticalElem(e);
if (bf)
m_VerDuctLst.Add(duct);
else
m_DuctLst.Add(duct);
}
using (Transaction trans = new Transaction(doc))
{
trans.Start("ext");
if (dlg.m_LvlExtend == dlg.m_LvlCurrent)
{
MessageBox.Show("현재 레벨과 선택한 레벨이 같습니다.");
return Result.Failed;
}
//수직 객체만 레벨 올리기.
if (m_VerPipeLst.Count != 0 || m_VerDuctLst.Count != 0)
VerExtendLevel(m_VerPipeLst, m_VerDuctLst, dlg.m_LvlExtend, dlg.m_LvlCurrent, dlg.Offset, PickPoint);
//수평일 경우 엘보로 레벨 올리기.
if (m_PipeLst.Count != 0 || m_DuctLst.Count != 0)
HorExtendLevel(m_PipeLst, m_DuctLst, dlg.m_LvlExtend, dlg.m_LvlCurrent, dlg.Offset, PickPoint);
trans.Commit();
}
}
}
else
return Result.Succeeded;
//oldType = IsConnectToElbow(m_SelElemLst[0]);
//수평등 커넥터 z값 같은값은 걸러냄.
//m_PipeLst = getVerticalElem(m_SelElemLst);
//foreach (Element e in m_SelElemLst)
//{
// if (e is Pipe)
// {
// Pipe pipe = e as Pipe;
// bool bf = VerticalElem(e);
// if (bf)
// m_VerPipeLst.Add(pipe);
// else
// m_PipeLst.Add(pipe);
// }
// else if (e is Duct)
// {
// Duct duct = e as Duct;
// bool bf = VerticalElem(e);
// if (bf)
// m_VerDuctLst.Add(duct);
// else
// m_DuctLst.Add(duct);
// }
//}
//MessageBox.Show("파이프 수직 : " + m_VerPipeLst.Count + "\n파이프 수평 : " + m_PipeLst.Count + "\n덕트 수직 : " + m_VerDuctLst.Count + "\n덕트 수평 : " + m_DuctLst.Count);
//using (Transaction trans = new Transaction(doc))
//{
// trans.Start("ext");
// //수직 객체만 레벨 올리기.
// if (m_VerPipeLst.Count != 0 || m_VerDuctLst.Count != 0)
// VerExtendLevel(m_VerPipeLst, m_VerDuctLst, dlg.m_LvlExtend, dlg.m_LvlCurrent, dlg.Offset);
// //수평일 경우 엘보로 레벨 올리기.
// if (m_PipeLst.Count != 0 || m_DuctLst.Count != 0)
// HorExtendLevel(m_PipeLst, m_DuctLst, dlg.m_LvlExtend, dlg.m_LvlCurrent, dlg.Offset);
// trans.Commit();
//}
}
catch (Autodesk.Revit.Exceptions.ArgumentException)
{
MessageBox.Show("현재 레벨과 연장할 레벨이 같습니다.","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return Result.Failed;
}
//catch (Exception ex)
//{
// //MessageBox.Show(ex.ToString());
//}
return Result.Succeeded;
}
public bool VerticalElem(Element Elem)
{
List<Pipe> resElemLst = new List<Pipe>();
List<XYZ> connectorpts = new List<XYZ>();
if (Elem is Pipe)
{
Pipe pipe = Elem as Pipe;
ConnectorManager connectorManager1 = pipe.ConnectorManager;
ConnectorSet connectorSet1 = connectorManager1.Connectors;
foreach (Connector con in connectorSet1)
{
connectorpts.Add(con.Origin);
}
if (Math.Abs(connectorpts[0].Z - connectorpts[1].Z) < 0.001)
return false;
else
return true;
}
else if (Elem is Duct)
{
Duct duct = Elem as Duct;
ConnectorManager connectorManager1 = duct.ConnectorManager;
ConnectorSet connectorSet1 = connectorManager1.Connectors;
foreach (Connector con in connectorSet1)
{
connectorpts.Add(con.Origin);
}
if (Math.Abs(connectorpts[0].Z - connectorpts[1].Z) < 0.001)
return false;
else
return true;
}
return false;
}
//수직 파이프 리스트, 수직 덕트 리스트, 확장할 레벨, 현재 레벨, 오프셋
public void VerExtendLevel(List<Pipe> VerPipeElemLst, List<Duct> VerDuctElemLst, string ExtendLevelName, string currentLevelName, double m_Offset, XYZ pickPoint)
{
UIApplication uiapp = m_commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = uidoc.Document;
Autodesk.Revit.DB.View view = doc.ActiveView;
List<Element> ElemList = new List<Element>();
Element m_CurLvlElem = null, m_ExtLvlELem = null;
Parameter level = view.LookupParameter("Associated Level");
FilteredElementCollector lvlCollector = new FilteredElementCollector(doc);
ICollection<Element> lvlCollection = lvlCollector.OfClass(typeof(Level)).ToElements();
foreach (Element l in lvlCollection)
{
Level lvl = l as Level;
if (lvl.Name == ExtendLevelName)
{
//확장 레벨의 Element
m_ExtLvlELem = l;
}
if (lvl.Name == currentLevelName)
{
//현재 레벨의 Element
m_CurLvlElem = l;
}
}
Level m_ExtLevel = m_ExtLvlELem as Level;
double d_Ext = m_ExtLevel.Elevation;
Level m_CurLevel = m_CurLvlElem as Level;
//double d_cur = m_CurLevel.Elevation;
double d_offset = Unit.MMToFeet(m_Offset);
//DeleteElbow(doc, PipeElemLst);
double reshgt = d_Ext + d_offset;
PipeStretch(VerPipeElemLst, reshgt);
DuctStretch(VerDuctElemLst, reshgt);
}
//수평 파이프 리스트, 수평 덕트 리스트, 확장할 레벨, 현재 레벨, 오프셋
public void HorExtendLevel(List<Pipe> HorPipeElemLst, List<Duct> HorDuctElemLst, string ExtendLevelName, string currentLevelName, double m_Offset, XYZ Pickpoint)
{
UIApplication uiapp = m_commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = uidoc.Document;
Autodesk.Revit.DB.View view = doc.ActiveView;
List<Element> ElemList = new List<Element>();
Element m_CurLvlElem = null, m_ExtLvlELem = null;
Parameter level = view.LookupParameter("Associated Level");
FilteredElementCollector lvlCollector = new FilteredElementCollector(doc);
ICollection<Element> lvlCollection = lvlCollector.OfClass(typeof(Level)).ToElements();
foreach (Element l in lvlCollection)
{
Level lvl = l as Level;
if (lvl.Name == ExtendLevelName)
{
//확장 레벨의 Element
m_ExtLvlELem = l;
}
if (lvl.Name == currentLevelName)
{
//현재 레벨의 Element
m_CurLvlElem = l;
}
}
Level m_ExtLevel = m_ExtLvlELem as Level;
double d_Ext = m_ExtLevel.Elevation;
Level m_CurLevel = m_CurLvlElem as Level;
//double d_cur = m_CurLevel.Elevation;
//double d_offset = Unit.MMToFeet(m_Offset, DisplayUnitType.DUT_MILLIMETERS);
double d_offset = Unit.MMToFeet(m_Offset);
//DeleteElbow(doc, PipeElemLst);
double reshgt = d_Ext + d_offset;
foreach (Pipe pipe in HorPipeElemLst)
{
//파이프 레벨연장
CreatePipe(pipe, reshgt, Pickpoint);
}
foreach (Duct duct in HorDuctElemLst)
{
CreateDuct(duct, reshgt, Pickpoint);
}
}
public bool PipeStretch(List<Pipe> m_list, double hgt)
{
foreach (Pipe pipe in m_list)
{
List<Connector> pipeConLst = Util.GetElementConnectors(pipe);
foreach (Connector con in pipeConLst)
{
//커넥터에 객체가 연결안되었을 때
if (con.IsConnected == false)
{
Connector OtherCon = Util.GetOtherConnector(con);
if (OtherCon != null)
{
if (con.Origin.Z > OtherCon.Origin.Z)
con.Origin = new XYZ(OtherCon.Origin.X, OtherCon.Origin.Y, hgt);
else
OtherCon.Origin = new XYZ(con.Origin.X, con.Origin.Y, hgt);
}
}
}
}//foreach end
return true;
}
public bool DuctStretch(List<Duct> m_list, double hgt)
{
foreach (Duct duct in m_list)
{
List<Connector> ductConLst = Util.GetElementConnectors(duct);
foreach (Connector con in ductConLst)
{
//커넥터에 객체가 연결안되었을 때
if (con.IsConnected == false)
{
Connector OtherCon = Util.GetOtherConnector(con);
if (OtherCon != null)
{
if (con.Origin.Z > OtherCon.Origin.Z)
con.Origin = new XYZ(OtherCon.Origin.X, OtherCon.Origin.Y, hgt);
else
OtherCon.Origin = new XYZ(con.Origin.X, con.Origin.Y, hgt);
}
}
}
}
return true;
}
public void CreatePipe(Pipe pipe, double Height)
{
List<Pipe> m_PipeLst = new List<Pipe>();
PipeType pipetype = pipe.PipeType;
Level level = pipe.ReferenceLevel;
ElementId pipeSysTypeId = pipe.MEPSystem.GetTypeId();
//파이프 끝점 올리기위해 점 찾기
Line pipeLine = (pipe.Location as LocationCurve).Curve as Line;
XYZ pipEndpt = pipeLine.GetEndPoint(1);
//Util.Pyosi(doc,pipEndpt);
Pipe newPipe = null;
//ConnectorManager connectorManager = pipe.ConnectorManager;
ConnectorSet connectorSet = pipe.ConnectorManager.Connectors;
foreach (Connector con in connectorSet)
{
if (con.IsConnected == false)
{
//conLst.Add(con);
//if (pipEndpt.IsAlmostEqualTo(con.Origin))
//{
XYZ a = new XYZ(con.Origin.X, con.Origin.Y, con.Origin.Z);
//Util.Pyosi(doc, a, false);
XYZ VerPt = new XYZ(con.Origin.X, con.Origin.Y, Height);
//Util.Pyosi(doc,VerPt);
//using (Transaction trans = new Transaction(doc))
//{
// trans.Start("CreatePipe");
newPipe = Pipe.Create(doc, pipeSysTypeId, pipetype.Id, level.Id, con.Origin, VerPt);
Parameter pipeParam = pipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM);
Connector con1 = newPipe.ConnectorManager.Connectors.Cast<Connector>().First();
con1.Radius = pipeParam.AsDouble() / 2.0;
//ConnectorManager conMngr = newPipe.ConnectorManager;
ConnectorSet conSet = newPipe.ConnectorManager.Connectors;
foreach (Connector connector in conSet)
{
if (connector.Origin.IsAlmostEqualTo(con.Origin))
{
ElementId oldType = IsConnectToElbow(pipe as Element);
FamilyInstance fitting = doc.Create.NewElbowFitting(con, connector);
//if (oldType != null)
// fitting.ChangeTypeId(oldType);
}
}
// trans.Commit();
//}
//}
}
}
}
//Pickpoint를 기준으로 가까운 쪽을 연장
public void CreatePipe(Pipe pipe, double Height, XYZ Pickpoint)
{
List<Pipe> m_PipeLst = new List<Pipe>();
PipeType pipetype = pipe.PipeType;
Level level = pipe.ReferenceLevel;
ElementId pipeSysTypeId = pipe.MEPSystem.GetTypeId();
//파이프 끝점 올리기위해 점 찾기
Line pipeLine = (pipe.Location as LocationCurve).Curve as Line;
XYZ pipEndpt = pipeLine.GetEndPoint(1);
//Util.Pyosi(doc,pipEndpt);
Pipe newPipe = null;
//ConnectorManager connectorManager = pipe.ConnectorManager;
ConnectorSet connectorSet = pipe.ConnectorManager.Connectors;
List<XYZ> EndpointLst = new List<XYZ>();
foreach (Connector fncon in connectorSet)
{
XYZ Endpoint = new XYZ(fncon.Origin.X, fncon.Origin.Y, fncon.Origin.Z);
EndpointLst.Add(Endpoint);
}
XYZ Midpoint = Util.Midpoint(EndpointLst[0], EndpointLst[1]);
ElementId elbow = IsConnectToElbow(pipe);
foreach (Connector con in connectorSet)
{
XYZ Conpt = new XYZ(con.Origin.X, con.Origin.Y, con.Origin.Z);
if (elbow == null)
{
double pickDist = Conpt.DistanceTo(Pickpoint);
double midDist = Conpt.DistanceTo(Midpoint);
if (pickDist > midDist) continue;
}
if (con.IsConnected == false)
{
//conLst.Add(con);
//if (pipEndpt.IsAlmostEqualTo(con.Origin))
//{
XYZ VerPt = new XYZ(con.Origin.X, con.Origin.Y, Height);
//Util.Pyosi(doc,VerPt);
//using (Transaction trans = new Transaction(doc))
//{
// trans.Start("CreatePipe");
newPipe = Pipe.Create(doc, pipeSysTypeId, pipetype.Id, level.Id, con.Origin, VerPt);
Parameter pipeParam = pipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM);
Connector con1 = newPipe.ConnectorManager.Connectors.Cast<Connector>().First();
con1.Radius = pipeParam.AsDouble() / 2.0;
//ConnectorManager conMngr = newPipe.ConnectorManager;
ConnectorSet conSet = newPipe.ConnectorManager.Connectors;
foreach (Connector connector in conSet)
{
if (connector.Origin.IsAlmostEqualTo(con.Origin))
{
ElementId oldType = IsConnectToElbow(pipe as Element);
FamilyInstance fitting = doc.Create.NewElbowFitting(con, connector);
//if (oldType != null)
// fitting.ChangeTypeId(oldType);
}
}
// trans.Commit();
//}
//}
}
}
}
public Connector CreateDuct(Duct duct, double Height)
{
List<Duct> m_DuctLst = new List<Duct>();
Connector resCon = null;
DuctType ductType = duct.DuctType;
Level level = duct.ReferenceLevel;
ElementId pipeSysTypeId = duct.MEPSystem.GetTypeId();
//파이프 끝점 올리기위해 점 찾기
//Line ductLine = (duct.Location as LocationCurve).Curve as Line;
Duct newDuct = null;
ConnectorSet connectorSet = duct.ConnectorManager.Connectors;
//덕트 시작 끝점 구하기.
//덕트의 시작점을 올리면 덕트의 폭 높이가 반대로 작도되는 현상때문에 비교해야 함.
XYZ m_DuctSp = null, m_DuctEp = null;
Util.GetStartEndPoint(duct, ref m_DuctSp, ref m_DuctEp);
foreach (Connector con in connectorSet)
{
if (con.IsConnected == false)
{
XYZ VerPt = new XYZ(con.Origin.X, con.Origin.Y, Height);
//Pyosi(con.Origin,0);
//Pyosi(m_DuctEp, 0);
//newDuct = Duct.Create(doc, pipeSysTypeId, ductType.Id, level.Id, con.Origin, VerPt);
newDuct = Duct.Create(doc, pipeSysTypeId, ductType.Id, level.Id, VerPt, con.Origin);
Parameter ductParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM);
Connector con1 = newDuct.ConnectorManager.Connectors.Cast<Connector>().First();
con1.Width = ductParam.AsDouble();
ductParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM);
con1.Height = ductParam.AsDouble();
bool Paralell = Util.IsParallel(con1.CoordinateSystem.BasisX, con.CoordinateSystem.BasisX);
if (Paralell != true)
{
//MessageBox.Show("not paralell");
double ang = con1.CoordinateSystem.BasisX.AngleTo(con.CoordinateSystem.BasisX);
bool b_rotElem = Util.RotateElement(newDuct, ang);
//조정 후 90도로 잘못 꺾일 경우 존재하여 다시한번 조정
con1 = newDuct.ConnectorManager.Connectors.Cast<Connector>().First();
bool re_Paralell = Util.IsParallel(con1.CoordinateSystem.BasisX, con.CoordinateSystem.BasisX);
if (re_Paralell != true)
{
ang = con1.CoordinateSystem.BasisX.AngleTo(con.CoordinateSystem.BasisX);
b_rotElem = Util.RotateElement(newDuct, ang);
}
}
ConnectorSet conSet = newDuct.ConnectorManager.Connectors;
//엘보작도
//foreach (Connector connector in conSet)
//{
// if (connector.Origin.IsAlmostEqualTo(con.Origin))
// {
// ElementId oldType = IsConnectToElbow(duct as Element);
// FamilyInstance fitting = doc.Create.NewElbowFitting(con, connector);
// //if (oldType != null)
// // fitting.ChangeTypeId(oldType);
// resCon = connector;
// }
//}
}
}
return resCon;
}
//Pickpoint를 기준으로 가까운곳을 연장
public Connector CreateDuct(Duct duct, double Height, XYZ Pickpoint)
{
List<Duct> m_DuctLst = new List<Duct>();
Connector resCon = null;
DuctType ductType = duct.DuctType;
Level level = duct.ReferenceLevel;
ElementId pipeSysTypeId = duct.MEPSystem.GetTypeId();
DuctSizeCmd cmd = new DuctSizeCmd();
//파이프 끝점 올리기위해 점 찾기
//Line ductLine = (duct.Location as LocationCurve).Curve as Line;
Duct newDuct = null;
ConnectorSet connectorSet = duct.ConnectorManager.Connectors;
//덕트 시작 끝점 구하기.
//덕트의 시작점을 올리면 덕트의 폭 높이가 반대로 작도되는 현상때문에 비교해야 함.
XYZ m_DuctSp = null, m_DuctEp = null;
Util.GetStartEndPoint(duct, ref m_DuctSp, ref m_DuctEp);
List<XYZ> EndpointLst = new List<XYZ>();
foreach (Connector con in connectorSet)
{
XYZ Endpoint = new XYZ(con.Origin.X, con.Origin.Y, con.Origin.Z);
EndpointLst.Add(Endpoint);
}
XYZ Midpoint = Util.Midpoint(EndpointLst[0], EndpointLst[1]);
ElementId elbow = IsConnectToElbow(duct);
foreach (Connector con in connectorSet)
{
XYZ Conpt = new XYZ(con.Origin.X, con.Origin.Y, con.Origin.Z);
if (elbow == null)
{
double pickDist = Conpt.DistanceTo(Pickpoint);
double midDist = Conpt.DistanceTo(Midpoint);
if (pickDist > midDist) continue;
}
if (con.IsConnected == false)
{
XYZ VerPt = new XYZ(con.Origin.X, con.Origin.Y, Height);
//Pyosi(m_DuctEp, 0);
//newDuct = Duct.Create(doc, pipeSysTypeId, ductType.Id, level.Id, con.Origin, VerPt);
newDuct = Duct.Create(doc, pipeSysTypeId, ductType.Id, level.Id, VerPt, con.Origin);
Parameter ductParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM);
Connector con1 = newDuct.ConnectorManager.Connectors.Cast<Connector>().First();
con1.Width = ductParam.AsDouble();
ductParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM);
con1.Height = ductParam.AsDouble();
bool Paralell = Util.IsParallel(con1.CoordinateSystem.BasisX, con.CoordinateSystem.BasisX);
if (Paralell != true)
{
//MessageBox.Show("not paralell");
double ang = con1.CoordinateSystem.BasisX.AngleTo(con.CoordinateSystem.BasisX);
bool b_rotElem = Util.RotateElement(newDuct, ang);
//조정 후 90도로 잘못 꺾일 경우 존재하여 다시한번 조정
con1 = newDuct.ConnectorManager.Connectors.Cast<Connector>().First();
bool re_Paralell = Util.IsParallel(con1.CoordinateSystem.BasisX, con.CoordinateSystem.BasisX);
if (re_Paralell != true)
{
ang = con1.CoordinateSystem.BasisX.AngleTo(con.CoordinateSystem.BasisX);
b_rotElem = Util.RotateElement(newDuct, ang);
}
}
ConnectorSet conSet = newDuct.ConnectorManager.Connectors;
foreach (Connector connector in conSet)
{
if (connector.Origin.IsAlmostEqualTo(con.Origin))
{
ElementId oldType = IsConnectToElbow(duct as Element);
FamilyInstance fitting = doc.Create.NewElbowFitting(con, connector);
//if (oldType != null)
// fitting.ChangeTypeId(oldType);
resCon = connector;
}
}
}
}
return resCon;
}
//커넥터중 엘보가 있다면 엘보의 타입을 가져옴
public ElementId IsConnectToElbow(Element elem)
{
ConnectorManager connectorManager;
ConnectorSet connectorSet = null;
if (elem is Pipe)
{
Pipe pipe = elem as Pipe;
connectorManager = pipe.ConnectorManager;
connectorSet = connectorManager.Connectors;
}
else if (elem is Duct)
{
Duct duct = elem as Duct;
connectorManager = duct.ConnectorManager;
connectorSet = connectorManager.Connectors;
}
foreach (Connector con in connectorSet)
{
if (con.IsConnected == true)
{
MEPSystem mepSystem = con.MEPSystem;
if (null != mepSystem)
{
if (con.IsConnected == true)
{
ConnectorSet conSet = con.AllRefs;
ConnectorSetIterator csi = conSet.ForwardIterator();
while (csi.MoveNext())
{
Connector connected = csi.Current as Connector;
if (null != connected)
{
if (connected.Owner is FamilyInstance)
{
FamilyInstance familyInstance = connected.Owner as FamilyInstance;
return familyInstance.GetTypeId();
}
}
}
}
}
}
}
return null;
}
public class SelectionFilter : ISelectionFilter
{
public bool AllowElement(Element element)
{
if (element.Category == null) return false;
if (element.Category.Id.IntegerValue == (int)BuiltInCategory.OST_DuctCurves || element.Category.Id.IntegerValue == (int)BuiltInCategory.OST_PipeCurves)
{
return true;
}
return false;
}
public bool AllowReference(Reference refer, XYZ point)
{
return false;
}
}
}
}