Client/Desktop/KMBIM3.0/23.10.18/Cmd/Sprinkler/SprinKler.cs

707 lines
28 KiB
C#

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using System.Diagnostics;
using System.Collections.Generic;
using System.Windows.Forms;
using Autodesk.Revit.UI.Selection;
//using SpinKler;
using System.Drawing;
using System.IO;
//using System.Windows.Media; // WindowsBase
//using System.Windows.Media.Imaging; // PresentationCore
using Size = System.Drawing.Size;
using KDCS.Utils;
using View = Autodesk.Revit.DB.View;
using Autodesk.Revit.DB.Structure;
using KMBIM.Revit.Tools;
namespace KMBIM
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
public class CmdSprinKler : IExternalCommand
{
UIApplication m_application;
Autodesk.Revit.Creation.ItemFactoryBase m_CreationBase;
Autodesk.Revit.Creation.Application creApp;
UIDocument m_document;
Autodesk.Revit.DB.Document doc;
Autodesk.Revit.ApplicationServices.Application app;
FamilySymbol INSERTSB;
public double m_PlaneOffset = 0;
public const double PI = 3.14159265358;
public Autodesk.Revit.UI.ExternalCommandData m_revit;
public double ksv = 2300; //2300을 pit로 변환해놓은값
public int workPlane_Idx = 0;
public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
{
if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded;
m_application = revit.Application;
m_document = m_application.ActiveUIDocument;
doc = m_document.Document;
app = doc.Application;
if (m_document.Document.IsFamilyDocument)
m_CreationBase = m_document.Document.FamilyCreate;
else
m_CreationBase = m_document.Document.Create;
try
{
/* FilteredElementCollector collector = new FilteredElementCollector(revit.Application.ActiveUIDocument.Document);
Level level = collector.OfClass(typeof(Level)).FirstElement() as Level;
*/
/*
FilteredElementCollector collector = new FilteredElementCollector(m_document.Document);
collector.WherePasses(new ElementClassFilter(typeof(Level)));
var elements33 = from element in collector where element.Name == m_document.ActiveView.Name select element;
Level level = elements33.Cast<Level>().ElementAt<Level>(0);*/
m_revit = revit;
Level level = doc.ActiveView.GenLevel;
FormSprinKler aaaa = new FormSprinKler();
aaaa.revit = m_revit;
// 일단 레지스트리 값을가져온다.
if (aaaa.ShowDialog() == DialogResult.OK)
{
if(aaaa.Rad_Idx == 1)//천장 배치
{
INSERTSB = aaaa.insertsb;
SprinKler_Ceiling(revit.Application.ActiveUIDocument.Document, level);
}
else if(aaaa.Rad_Idx == 2)//작업 기준면에 배치
{
INSERTSB = aaaa.insertsb;
m_PlaneOffset = aaaa.m_Offset;
Sprinkler_WorkPlane(revit.Application.ActiveUIDocument.Document, level, aaaa.str_Workplane);
}
//if (aaaa.RTcode == 1)//작업 기준면에 배치
//{
// INSERTSB = aaaa.insertsb;
// m_PlaneOffset = aaaa.m_Offset;
// Sprinkler_WorkPlane(revit.Application.ActiveUIDocument.Document, level);
//}
//else if (aaaa.RTcode == 2)//현재 레벨에 배치
//{
// //SprayRadius();//살수반경
//
//
//}
//else if (aaaa.RTcode == 3)//천장 배치
//{
// INSERTSB = aaaa.insertsb;
// SprinKler_Ceiling(revit.Application.ActiveUIDocument.Document, level);
//}
}
else
{
return Autodesk.Revit.UI.Result.Succeeded;
}
}
catch (Exception e)
{
//message = e.Message;
return Autodesk.Revit.UI.Result.Failed;
}
return Autodesk.Revit.UI.Result.Succeeded;
}
//현재 레벨에 배치
public void Sprinkler_CurrentLevel(Document document, Level level)
{
XYZ vc1, vc2;
double startAng = 0.0, endAng = Math.PI * 2;
SketchPlane sketchPlane;
Level level2;
string m_bname, stmp;
XYZ p1 = new XYZ();
XYZ p2 = new XYZ();
XYZ p3 = new XYZ();
XYZ inpt = new XYZ();
double xdst = (double)0, ydst = (double)0, distx = (double)0, disty = (double)0, xangle = (double)0, yangle = (double)0;
int i, j, xcnt, ycnt;
ObjectSnapTypes snapTypes = ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections |
ObjectSnapTypes.Midpoints | ObjectSnapTypes.Nearest | ObjectSnapTypes.WorkPlaneGrid | ObjectSnapTypes.Points | ObjectSnapTypes.Quadrants | ObjectSnapTypes.Tangents;
p1 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "기준점");
p2 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "첫번째 구석");
p3 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "두번째 구석");
double ang = 45 / 180.0 * PI;
ydst = 2 * ksv * System.Math.Sin(ang);
xdst = 2 * ksv * System.Math.Cos(ang);
//각도
yangle = p1.AngleTo(p3);
xangle = p1.AngleTo(p2);
//거리
disty = Unit.FeetToMM(p1.DistanceTo(p3));
distx = Unit.FeetToMM(p1.DistanceTo(p2));
//헤드수량
ycnt = Convert.ToInt32(disty / ydst);
xcnt = Convert.ToInt32(distx / xdst);
//검사후 재 계산
bool flg = false;
if (distx > xcnt * xdst)
{
xcnt += 1;
xdst = distx / xcnt;
ydst = disty / ycnt;
flg = true;
}
if (disty > ycnt * ydst)
{
ycnt += 1;
xdst = distx / xcnt;
ydst = disty / ycnt;
}
ydst = disty / ycnt;
xdst = distx / xcnt;
//조건 변경 대화상자
Radius dlg = new Radius();
//dlg.txt_radius.Text = ((int)(ksv / 0.00328)).ToString();
dlg.txt_radius.Text = ksv.ToString();
dlg.txt_length1.Text = Math.Floor(distx).ToString();
dlg.txt_cnt1.Text = xcnt.ToString();
dlg.txt_length2.Text = Math.Floor(disty).ToString();
dlg.txt_cnt2.Text = ycnt.ToString();
dlg.m_xdst = xdst;
dlg.m_ydst = ydst;
if (dlg.ShowDialog() == DialogResult.OK)
{
//ksv = Convert.ToDouble(dlg.txt_radius.Text) * 0.00328;
xcnt = Convert.ToInt32(dlg.txt_cnt1.Text);
ycnt = Convert.ToInt32(dlg.txt_cnt2.Text);
ydst = Unit.MMToFeet(dlg.m_ydst);
xdst = Unit.MMToFeet(dlg.m_xdst);
//ydst = dlg.m_ydst;
//xdst = dlg.m_xdst;
}
else
return;
XYZ vector1 = p2 - p1;
XYZ vector2 = p3 - p1;
vc1 = vector1.Normalize();
vc2 = vector2.Normalize();
p1 = p1 + vc1 * (xdst / 2.0);
p1 = p1 + vc2 * (ydst / 2.0);
//현재 참조면 생성하기.
//SketchPlane plane = CreateSketchPlane();
using (Transaction trans = new Transaction(doc))
{
trans.Start("start");
for (i = 0; i < xcnt; i++)
{
inpt = p1 + vc1 * (xdst * i);
for (j = 0; j < ycnt; j++)
{
if (null != INSERTSB)
{
//2020-10-22 스프링클러 간격띄우기,레벨참조하여 생성되도록 수정.
FamilyInstance family = document.Create.NewFamilyInstance(level.GetPlaneReference(), inpt, inpt, INSERTSB);
Parameter param = family.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM);
param.Set(Unit.MMToFeet(m_PlaneOffset));
}
else
throw new Exception("No column types found.");
inpt = inpt + vc2 * ydst;
}
}
trans.Commit();
}
}
//작업 기준면에 배치
public void Sprinkler_WorkPlane(Autodesk.Revit.DB.Document document, Level level,string str_workPlane)
{
XYZ vc1, vc2;
double startAng = 0.0, endAng = Math.PI * 2;
SketchPlane sketchPlane;
Level level2;
string m_bname, stmp;
XYZ p1 = new XYZ();
XYZ p2 = new XYZ();
XYZ p3 = new XYZ();
XYZ inpt = new XYZ();
double xdst = (double)0, ydst = (double)0, distx = (double)0, disty = (double)0, xangle = (double)0, yangle = (double)0;
int i, j, xcnt, ycnt;
//FilteredElementCollector collector = new FilteredElementCollector(document).OfClass(typeof(SketchPlane));
//ICollection<Element> elemIDLst = collector.ToElements();
SketchPlane CurskPlane = doc.ActiveView.SketchPlane;
SketchPlane skPlane = null;
try
{
Level WorkLevel = null;
ReferencePlane referPlane = null;
//작업 기준면 가져오기
IList<Element> levelLst = new FilteredElementCollector(doc).OfClass(typeof(Level)).ToElements();
IList<Element> referPlaneLst = new FilteredElementCollector(doc).OfClass(typeof(ReferencePlane)).ToElements();
foreach (Element elem in levelLst)
{
Level lvl = elem as Level;
if (lvl.Name == str_workPlane)
WorkLevel = lvl;
}
foreach (Element elem in referPlaneLst)
{
ReferencePlane refPlane = elem as ReferencePlane;
if (refPlane.Name == str_workPlane)
referPlane = refPlane;
}
using (Transaction trans = new Transaction(doc))
{
trans.Start("start");
if (CurskPlane == null)
{
Plane plane = Plane.CreateByNormalAndOrigin(
document.ActiveView.ViewDirection,
document.ActiveView.Origin);
skPlane = SketchPlane.Create(document, plane);
Level lev = document.ActiveView.GenLevel;
skPlane.Name = lev.Name + " - 스프링클러";
//skPlane.get_Parameter()
document.ActiveView.SketchPlane = skPlane;
document.ActiveView.ShowActiveWorkPlane();
doc.Regenerate();
}
else
{
//현재 작업기준면 그리드 on
document.ActiveView.ShowActiveWorkPlane();
}
trans.Commit();
}
ObjectSnapTypes snapTypes = ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections |
ObjectSnapTypes.Midpoints | ObjectSnapTypes.Nearest | ObjectSnapTypes.WorkPlaneGrid | ObjectSnapTypes.Points | ObjectSnapTypes.Quadrants | ObjectSnapTypes.Tangents;
p1 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "기준점");
p2 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "첫번째 구석");
p3 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "두번째 구석");
//p1 = m_revit.Application.ActiveUIDocument.Selection.PickPoint("기준점");
//p2 = m_revit.Application.ActiveUIDocument.Selection.PickPoint( "첫번째 구석");
//p3 = m_revit.Application.ActiveUIDocument.Selection.PickPoint( "두번째 구석");
double ang = 45 / 180.0 * PI;
ydst = 2 * ksv * System.Math.Sin(ang);
xdst = 2 * ksv * System.Math.Cos(ang);
//각도
yangle = p1.AngleTo(p3);
xangle = p1.AngleTo(p2);
//거리
disty = Unit.FeetToMM(p1.DistanceTo(p3));
distx = Unit.FeetToMM(p1.DistanceTo(p2));
//헤드수량
ycnt = Convert.ToInt32(disty / ydst);
xcnt = Convert.ToInt32(distx / xdst);
//검사후 재 계산
bool flg = false;
if (distx > xcnt * xdst)
{
xcnt += 1;
xdst = distx / xcnt;
ydst = disty / ycnt;
flg = true;
}
if (disty > ycnt * ydst)
{
ycnt += 1;
xdst = distx / xcnt;
ydst = disty / ycnt;
}
ydst = disty / ycnt;
xdst = distx / xcnt;
//조건 변경 대화상자
Radius dlg = new Radius();
//dlg.txt_radius.Text = ((int)(ksv / 0.00328)).ToString();
dlg.txt_radius.Text = ksv.ToString();
dlg.txt_length1.Text = Math.Floor(distx).ToString();
dlg.txt_cnt1.Text = xcnt.ToString();
dlg.txt_length2.Text = Math.Floor(disty).ToString();
dlg.txt_cnt2.Text = ycnt.ToString();
dlg.m_xdst = xdst;
dlg.m_ydst = ydst;
if (dlg.ShowDialog() == DialogResult.OK)
{
//ksv = Convert.ToDouble(dlg.txt_radius.Text) * 0.00328;
xcnt = Convert.ToInt32(dlg.txt_cnt1.Text);
ycnt = Convert.ToInt32(dlg.txt_cnt2.Text);
ydst = Unit.MMToFeet(dlg.m_ydst);
xdst = Unit.MMToFeet(dlg.m_xdst);
//ydst = dlg.m_ydst;
//xdst = dlg.m_xdst;
}
else
{
using(Transaction trans = new Transaction(doc))
{
trans.Start("gride_delete");
document.ActiveView.HideActiveWorkPlane();
trans.Commit();
}
return;
}
XYZ vector1 = p2 - p1;
XYZ vector2 = p3 - p1;
vc1 = vector1.Normalize();
vc2 = vector2.Normalize();
p1 = p1 + vc1 * (xdst / 2.0);
p1 = p1 + vc2 * (ydst / 2.0);
//현재 참조면 생성하기.
//SketchPlane plane = CreateSketchPlane();
using (Transaction trans = new Transaction(doc))
{
trans.Start("Create");
for (i = 0; i < xcnt; i++)
{
inpt = p1 + vc1 * (xdst * i);
for (j = 0; j < ycnt; j++)
{
if (null != INSERTSB)
{
FamilyInstance family = null;
if (WorkLevel != null)
family = document.Create.NewFamilyInstance(WorkLevel.GetPlaneReference(), inpt, inpt, INSERTSB);
else if (referPlane != null)
family = document.Create.NewFamilyInstance(referPlane.GetReference(), inpt, inpt, INSERTSB);
//2020-10-22 스프링클러 간격띄우기,레벨참조하여 생성되도록 수정
//FamilyInstance family = document.Create.NewFamilyInstance(level.GetPlaneReference(), inpt, inpt, INSERTSB);
//FamilyInstance family = document.Create.NewFamilyInstance(WorkPlane.GetPlaneReference(), inpt, inpt, INSERTSB);
//FamilyInstance family = document.Create.NewFamilyInstance(inpt,INSERTSB,level,StructuralType.NonStructural);
Parameter param = family.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM);
param.Set(Unit.MMToFeet(m_PlaneOffset));
}
else
throw new Exception("No column types found.");
inpt = inpt + vc2 * ydst;
}
}
//현재 작업기준면 그리드 삭제.
doc.Regenerate();
document.ActiveView.HideActiveWorkPlane();
trans.Commit();
}
}
catch (Exception e)
{
using (Transaction trans = new Transaction(doc))
{
trans.Start("Hide");
document.ActiveView.HideActiveWorkPlane();
trans.Commit();
}
//MessageBox.Show("" + e);
}
//m_document.Document.ActiveView.SketchPlane = plane;
//m_document.Document.ActiveView.HideActiveWorkPlane();
}
//천장 배치
public void SprinKler_Ceiling(Autodesk.Revit.DB.Document document, Level level)
{
XYZ vc1, vc2;
XYZ p1 = new XYZ();
XYZ p2 = new XYZ();
XYZ p3 = new XYZ();
XYZ inpt = new XYZ();
double xdst = (double)0, ydst = (double)0, distx = (double)0, disty = (double)0, xangle = (double)0, yangle = (double)0;
int i, j, xcnt, ycnt;
bool CeilingTF = false;
WorksetId asdf = m_document.Document.ActiveView.WorksetId;
UIDocument uidoc = new UIDocument(document);
//ISelectionFilter selFilter = new CeilingSelectionFilter();
try
{
Face:
//ObjectType objtype = ObjectType.Face | ObjectType.LinkedElement;
ObjectType objtype = ObjectType.Face;
Reference refs = m_revit.Application.ActiveUIDocument.Selection.PickObject(objtype, "작업면을 선택하세요.");
ElementId TmpElemID = refs.ElementId;
Element TmpElement = document.GetElement(refs.ElementId);
//RevitLinkInstance rvtInst = TmpElement as RevitLinkInstance;
//
//foreach (Document d in app.Documents)
//{
// if (d.IsLinked)
// {
// FilteredElementCollector ceilings = new FilteredElementCollector(d).OfClass(typeof(Ceiling));
//
// foreach (Element e in ceilings)
// {
// Ceiling ceil = e as Ceiling;
// Parameter param = ceil.get_Parameter(BuiltInParameter.CEILING_HEIGHTABOVELEVEL_PARAM);
// double hgt = param.AsDouble();
// double mm_hgt = Unit.FeetToMM(hgt);
// MessageBox.Show("" + e.Name + "\n" + e.Id.IntegerValue);
// }
// }
//}
if (TmpElement.Category.Name == "Ceilings" || TmpElement.Category.Name == "천장")
CeilingTF = true;
if (CeilingTF == false)
{
MessageBox.Show("선택하신 면이 천장이 아닙니다. 다시 선택하세요.");
goto Face;
}
List<Face> ttt = Util.GetFacesAll(m_revit.Application.ActiveUIDocument, TmpElement);
Face face = ttt[1];
if (m_revit.Application.ActiveUIDocument.ActiveView.SketchPlane == null)
{
MessageBox.Show("Work Plane을 설정한 후 시도 하십시오.");
return;
}
ObjectSnapTypes snapTypes = ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections | ObjectSnapTypes.Midpoints
| ObjectSnapTypes.Nearest | ObjectSnapTypes.WorkPlaneGrid | ObjectSnapTypes.Points | ObjectSnapTypes.Quadrants | ObjectSnapTypes.Tangents;
p1 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "기준점");
p2 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "첫번째 구석");
p3 = m_revit.Application.ActiveUIDocument.Selection.PickPoint(snapTypes, "두번째 구석");
double ang = 45 / 180.0 * PI;
ydst = 2 * ksv * Math.Sin(ang);
xdst = 2 * ksv * Math.Cos(ang);
//각도
xangle = p1.AngleTo(p2);
yangle = p1.AngleTo(p3);
//거리
disty = Unit.FeetToMM(p1.DistanceTo(p3));
distx = Unit.FeetToMM(p1.DistanceTo(p2));
//헤드수량
xcnt = Convert.ToInt32(distx / xdst);
ycnt = Convert.ToInt32(disty / ydst);
//검사후 재 계산
bool flg = false;
if (distx > xcnt * xdst)
{ //면적에 꽉 차는가?
xcnt += 1;
xdst = distx / xcnt;
ydst = disty / ycnt;//System.Math.Sqrt(ksv * ksv - System.Math.Pow(0.5 * xdst, 2.0)) * 2.0;
flg = true;
}
if (disty > ycnt * ydst)
{
ycnt += 1;
ydst = disty / ycnt;
xdst = distx / xcnt;
//if (!flg) xdst = System.Math.Sqrt(ksv * ksv - System.Math.Pow(0.5 * ydst, 2.0)) * 2.0;
}
ydst = disty / ycnt;
xdst = distx / xcnt;
//초건 변경 대화상자
Radius dlg = new Radius();
dlg.txt_radius.Text = ksv.ToString();
dlg.txt_length1.Text = Math.Floor(distx).ToString();
dlg.txt_cnt1.Text = xcnt.ToString();
dlg.txt_length2.Text = Math.Floor(disty).ToString();
dlg.txt_cnt2.Text = ycnt.ToString();
dlg.m_xdst = xdst;
dlg.m_ydst = ydst;
if (dlg.ShowDialog() == DialogResult.OK)
{
//ksv = Convert.ToDouble(dlg.txt_radius.Text) * 0.00328;
xcnt = Convert.ToInt32(dlg.txt_cnt1.Text);
ycnt = Convert.ToInt32(dlg.txt_cnt2.Text);
ydst = Unit.MMToFeet(dlg.m_ydst);
xdst = Unit.MMToFeet(dlg.m_xdst);
}
else
return;
XYZ vector1 = p2 - p1;
XYZ vector2 = p3 - p1;
vc1 = vector1.Normalize();
vc2 = vector2.Normalize();
p1 = p1 + vc1 * (xdst / 2.0);
p1 = p1 + vc2 * (ydst / 2.0);
using (Transaction trans = new Transaction(doc))
{
trans.Start("Start");
for (i = 0; i < xcnt; i++)
{
inpt = p1 + vc1 * (xdst * i);
for (j = 0; j < ycnt; j++)
{
if (null != INSERTSB)
{
//document.Create.NewFamilyInstance(face, inpt, inpt, INSERTSB);
//2021-02-02 스프링클러 간격띄우기,레벨참조하여 생성되도록 수정
FamilyInstance family = document.Create.NewFamilyInstance(inpt, INSERTSB, level, StructuralType.NonStructural);
Parameter param = family.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM);
param.Set(Unit.MMToFeet(m_PlaneOffset));
}
else
{
throw new Exception("No column types found.");
}
inpt = inpt + vc2 * ydst;
}
}
trans.Commit();
}
}
catch
{
}
}
internal SketchPlane CreateSketchPlane()
{
Autodesk.Revit.DB.View view = doc.ActiveView;
Plane geometryPlane = view.SketchPlane.GetPlane();
//Plane geometryPlane = m_application.Application.Create.NewPlane(normal, origin);
Transaction createSketchPlane = new Transaction(m_document.Document, "Create a sketch plane.");
createSketchPlane.Start();
SketchPlane plane = SketchPlane.Create(m_document.Document, geometryPlane);
m_document.Document.ActiveView.SketchPlane = plane;
//m_document.Document.ActiveView.ShowActiveWorkPlane();
createSketchPlane.Commit();
return plane;
}
public void SprayRadius()
{
Autodesk.Revit.DB.View view = doc.ActiveView;
double radius = 2300 * 0.00328;
IList<Element> Elementlist = m_revit.Application.ActiveUIDocument.Selection.PickElementsByRectangle();
for (int i = 0; i < Elementlist.Count; i++)
{
if (Elementlist[i].Category.Name == "Sprinklers")
{
Autodesk.Revit.DB.LocationPoint asdf = Elementlist[i].Location as Autodesk.Revit.DB.LocationPoint;
Plane pp = m_revit.Application.ActiveUIDocument.Document.ActiveView.SketchPlane.GetPlane();
Plane plane = view.SketchPlane.GetPlane();
//Plane plane = m_revit.Application.Application.Create.NewPlane(pp.Origin, asdf.Point);
XYZ normal = XYZ.BasisZ;
SketchPlane sketchPlane1 = SketchPlane.Create(m_document.Document, plane);
Arc arc1 = Arc.Create(plane, radius, 0.0, Math.PI * 2);
ModelCurve TmpCurve = m_document.Document.Create.NewModelCurve(arc1, m_revit.Application.ActiveUIDocument.Document.ActiveView.SketchPlane);
}
}
}
public void MakePreView(FamilySymbol sb)
{
ElementId typeId = sb.GetTypeId();
ElementType type = m_document.Document.GetElement(typeId) as ElementType;
Size imgSize = new Size(200, 200);
Bitmap image = type.GetPreviewImage(imgSize);
string filename = "a.jpg";
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
file.Close();
Process.Start(filename);
}
}
public class CeilingSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element element)
{
if (element.Category == null) return false;
if (element.Category.Name == "Ceilings")
{
return true;
}
return false;
}
public bool AllowReference(Reference refer, XYZ point)
{
return false;
}
}
}