1629 lines
70 KiB
C#
1629 lines
70 KiB
C#
using Autodesk.Revit.DB;
|
|
using Autodesk.Revit.DB.Plumbing;
|
|
using Autodesk.Revit.UI;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
//using COME4Revit.WinForm;
|
|
using System.Windows.Forms;
|
|
using System;
|
|
using System.Text;
|
|
using KDCS.Utils;
|
|
|
|
namespace KMBIM
|
|
{
|
|
//[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
|
|
class CM_TORCOIL1
|
|
{
|
|
|
|
double cdst = 0, wdst = 0, wdst2 = 0, tdst = 0, xdst = 0;
|
|
bool FLG12 = false, FLG23 = false, FLG34 = false, FLG41 = false;
|
|
double welNum = 0;
|
|
|
|
double pch12, pch23, pch34, pch41; //외기부분 코일간격 조정을 대비해서 각 면 방향의 피치값을 설정함.
|
|
double dst12, dst23, dst34, dst41, dst_to;
|
|
XYZ trm1, trm2, trm3, trm4, vec12, vec23, vec34, vec41;
|
|
List<XYZ> PntLst, PntLst2;
|
|
bool exFlg = true, ExFlg1 = true, ExFlg2 = true;
|
|
double OrgRem23, OrgRem12;
|
|
Document doc;
|
|
UIDocument uidoc;
|
|
|
|
public bool DrawTorCoil1(UIApplication uiapp, double coildst, double walldst, double walldst2, double totaldst, double outdst, double offset, double coilDia, PipeType CoilType, PipingSystemType CoilSysType)
|
|
{
|
|
//UIApplication uiapp = commandData.Application;
|
|
uidoc = uiapp.ActiveUIDocument;
|
|
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
|
|
doc = uidoc.Document;
|
|
Autodesk.Revit.Creation.Application creApp = uiapp.Application.Create;
|
|
Autodesk.Revit.Creation.Document creDoc = doc.Create;
|
|
Autodesk.Revit.DB.View view = doc.ActiveView;
|
|
|
|
|
|
cdst = Unit.MMToFeet(coildst);
|
|
wdst = Unit.MMToFeet(walldst);
|
|
wdst2 = Unit.MMToFeet(walldst2);
|
|
tdst = Unit.MMToFeet(totaldst);
|
|
xdst = Unit.MMToFeet(outdst);
|
|
coilDia = Unit.MMToFeet(coilDia);
|
|
offset = Unit.MMToFeet(offset);
|
|
|
|
XYZ rm1 = new XYZ();
|
|
XYZ rm2 = new XYZ();
|
|
XYZ rm3 = new XYZ();
|
|
XYZ rm4 = new XYZ();
|
|
List<XYZ> pts = new List<XYZ>();
|
|
Element elem;
|
|
List<Element> lstElem = new List<Element>();
|
|
//List<XYZ> pts1 = new List<XYZ>();
|
|
int yn = 0;
|
|
|
|
if (Util.PickPoint(uidoc, KMBIM.Revit.Tools.Properties.Resources.HCoil_Select_1st/*"시작점 지정 : "*/, ref rm1) == false) return false;
|
|
if (Util.PickPoint(uidoc, KMBIM.Revit.Tools.Properties.Resources.HCoil_Select_2nd/*"두번째 점 지정 : "*/, ref rm2) == false) return false;
|
|
|
|
//XYZ te = (rm1 - rm2).Normalize();
|
|
//XYZ test = rm1 + te * 0.328084;
|
|
//Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), rm1, test);
|
|
//Pyosi(uiapp, doc, rm1);
|
|
//return true;
|
|
//TaskDialog.Show("t", "" + Unit.CovertFromAPI(DisplayUnitType.DUT_MILLIMETERS, rm1.DistanceTo(rm2)));
|
|
|
|
if (FeetToMM(rm1, rm2) < cdst * 4)
|
|
{
|
|
TaskDialog.Show("오류", "지정된 방의 크기가 작아서 작도할 수 없습니다.");
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
using (Transaction transaction = new Transaction(doc))
|
|
{
|
|
transaction.Start("Start");
|
|
|
|
elem = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), rm1, rm2);
|
|
lstElem.Add(elem);
|
|
|
|
transaction.Commit();
|
|
}
|
|
|
|
}
|
|
|
|
if (Util.PickPoint(uidoc, KMBIM.Revit.Tools.Properties.Resources.HCoil_Select_3rd/*"세번째 점 지정 : "*/, ref rm3) == false)
|
|
{
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
return false;
|
|
}
|
|
|
|
if (FeetToMM(rm2, rm3) < cdst * 4)
|
|
{
|
|
TaskDialog.Show("오류", "지정된 방의 크기가 작아서 작도할 수 없습니다.");
|
|
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
using (Transaction transaction = new Transaction(doc))
|
|
{
|
|
transaction.Start("Start");
|
|
|
|
elem = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), rm2, rm3);
|
|
lstElem.Add(elem);
|
|
|
|
transaction.Commit();
|
|
}
|
|
|
|
}
|
|
|
|
if (Util.PickPoint(uidoc, KMBIM.Revit.Tools.Properties.Resources.HCoil_Select_4th/*"네번째 점 지정 : "*/, ref rm4) == false)
|
|
{
|
|
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
return false;
|
|
}
|
|
|
|
if (FeetToMM(rm3, rm4) < cdst * 4)
|
|
{
|
|
TaskDialog.Show("오류", "지정된 방의 크기가 작아서 작도할 수 없습니다.");
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
using (Transaction transaction = new Transaction(doc))
|
|
{
|
|
transaction.Start("Start");
|
|
|
|
elem = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), rm3, rm4);
|
|
lstElem.Add(elem);
|
|
elem = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), rm4, rm1);
|
|
lstElem.Add(elem);
|
|
|
|
transaction.Commit();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pch12 = cdst; pch23 = cdst; pch34 = cdst; pch41 = cdst;
|
|
trm1 = rm1; trm2 = rm2; trm3 = rm3; trm4 = rm4;
|
|
rm1 = trm1; rm2 = trm2; rm3 = trm3; rm4 = trm4;
|
|
//TaskDialog.Show("s", "" + System.Math.Round(Util.RTD(vec12.AngleTo(XYZ.BasisX)),3));
|
|
dst12 = rm1.DistanceTo(rm2);
|
|
vec12 = (rm2 - rm1).Normalize();
|
|
|
|
dst23 = rm2.DistanceTo(rm3);
|
|
vec23 = (rm3 - rm2).Normalize();
|
|
|
|
dst34 = rm3.DistanceTo(rm4);
|
|
vec34 = (rm4 - rm3).Normalize();
|
|
|
|
dst41 = rm4.DistanceTo(rm1);
|
|
vec41 = (rm1 - rm4).Normalize();
|
|
//TaskDialog.Show("t", "" + ang12 + " " + ang23 + " " + ang34 + " " + ang41 + " ");
|
|
PntLst = PLINE_DRW_TORCOIL1(trm1, trm2, trm3, trm4, 0, uiapp, doc);
|
|
//dst_to = VRT_PL_DRW1(uidoc,doc, PntLst);
|
|
dst_to = VRT_PL_DRW1(uiapp, doc, PntLst);
|
|
dst_to = Unit.FeetToMM(dst_to) / 1000;
|
|
//dst_to = Unit.CovertFromAPI(DisplayUnitType.DUT_METERS, dst_to);
|
|
|
|
PntLst.Clear();
|
|
|
|
FLG12 = false; FLG23 = false; FLG34 = false; FLG41 = false;
|
|
|
|
FormCoilZone zoneDlg = new FormCoilZone();
|
|
zoneDlg.CoilLength = dst_to;
|
|
zoneDlg.ZoneCount = 1;
|
|
|
|
if (zoneDlg.ShowDialog() != DialogResult.OK)
|
|
{
|
|
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
return false;
|
|
}
|
|
else
|
|
yn = zoneDlg.ZoneCount;
|
|
|
|
int orgYn = yn;
|
|
|
|
if (yn == 1)
|
|
{
|
|
while (ExFlg1)
|
|
{
|
|
Reference r = null;
|
|
try
|
|
{
|
|
r = uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "외기부분 코일간격을 조정할 면을 선택 또는 명령취소(esc) : ");
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
|
|
if (r == null)
|
|
{
|
|
exFlg = false;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
Element LineElement = doc.GetElement(r.ElementId);
|
|
|
|
if (LineElement.Id == lstElem[0].Id)
|
|
{
|
|
pch12 = cdst * 0.5;
|
|
FLG12 = true; ExFlg1 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[1].Id)
|
|
{
|
|
pch23 = cdst * 0.5;
|
|
FLG23 = true; ExFlg1 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[2].Id)
|
|
{
|
|
pch34 = cdst * 0.5;
|
|
FLG34 = true; ExFlg1 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[3].Id)
|
|
{
|
|
pch41 = cdst * 0.5;
|
|
FLG41 = true; ExFlg1 = false;
|
|
}
|
|
else
|
|
{
|
|
TaskDialog.Show("오류", "잘못 선택된 면입니다. 다시 선택하세요.");
|
|
}
|
|
}
|
|
|
|
while (ExFlg2)
|
|
{
|
|
Reference r2 = null;
|
|
try
|
|
{
|
|
r2 = uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "외기부분 코일간격을 조정할 면을 선택 또는 명령취소(esc) : ");
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
|
|
if (r2 == null)
|
|
{
|
|
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
goto End;
|
|
}
|
|
else
|
|
{
|
|
Element LineElement = doc.GetElement(r2.ElementId);
|
|
|
|
if (LineElement.Id == lstElem[0].Id)
|
|
{
|
|
pch12 = cdst * 0.5;
|
|
FLG12 = true; ExFlg2 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[1].Id)
|
|
{
|
|
pch23 = cdst * 0.5;
|
|
FLG23 = true; ExFlg2 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[2].Id)
|
|
{
|
|
pch34 = cdst * 0.5;
|
|
FLG34 = true; ExFlg2 = false;
|
|
}
|
|
else if (LineElement.Id == lstElem[3].Id)
|
|
{
|
|
pch41 = cdst * 0.5;
|
|
FLG41 = true; ExFlg2 = false;
|
|
}
|
|
else
|
|
{
|
|
TaskDialog.Show("오류", "잘못 선택된 면입니다. 다시 선택하세요.");
|
|
}
|
|
}
|
|
|
|
}//while end
|
|
}//while end
|
|
|
|
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
if (exFlg == true)
|
|
{
|
|
FormCoilOutAir OutAirDlg = new FormCoilOutAir();
|
|
OutAirDlg.OutAirCoilCnt = 2;
|
|
OutAirDlg.ShowDialog();
|
|
if (OutAirDlg.OutAirCoilCnt / 2 == 0)
|
|
exFlg = false;
|
|
|
|
welNum = OutAirDlg.OutAirCoilCnt;
|
|
}
|
|
|
|
if (welNum != 0)
|
|
welNum = Math.Floor(welNum / 2);
|
|
|
|
List<Element> pipeElem = new List<Element>();
|
|
using (Transaction transaction = new Transaction(doc))
|
|
{
|
|
transaction.Start("Start");
|
|
PntLst = PLINE_DRW_TORCOIL1(rm1, rm2, rm3, rm4, 0, uiapp, doc);
|
|
dst_to = VRT_PL_DRW1(uiapp, doc, PntLst);
|
|
List<XYZ> newPntLst = PtsElevation(PntLst, offset);
|
|
if (newPntLst == null) return false;
|
|
|
|
pipeElem = PIPE_ELEM_LIST(uiapp, doc, newPntLst);
|
|
|
|
CreatePipe1(uidoc, doc, pipeElem, coilDia, CoilType, CoilSysType);
|
|
PntLst.Clear();
|
|
//TaskDialog.Show("결과", "코일 길이 : " + Math.Floor(dst_to) + "m ");
|
|
TaskDialog.Show("결과", "코일 길이 : " + Math.Round(Unit.FeetToMM(dst_to / 1000.0),2) + "m ");
|
|
transaction.Commit();
|
|
}
|
|
}//yn 존의 수가 1일 때
|
|
else
|
|
{//존의 수가 1개 이상일 때
|
|
//임시 라인 삭제
|
|
List<Element> pipeElem = new List<Element>();
|
|
Util.DeleteElement(doc, lstElem); // 임시 박스 삭제
|
|
|
|
|
|
double ydst1;
|
|
XYZ rm1_2, rm2_2, rm3_2, rm4_2;
|
|
double InNum, tpNum, tot_dst;
|
|
XYZ vecTrm, plrpt;
|
|
|
|
ydst1 = Math.Floor((trm1.DistanceTo(trm2) / yn) / cdst);
|
|
if (FLG41) pch41 = cdst;//존이 여러개인 경우 41라인의 피치는 cdst로 맞춰야 함.
|
|
|
|
vecTrm = (trm1 - trm2).Normalize();
|
|
rm1_2 = rm2 + vecTrm * (cdst * ydst1);//나뉘는 점을 구함 rm,rm4를 기준으로
|
|
vecTrm = (trm4 - trm1).Normalize();
|
|
plrpt = rm1_2 + vecTrm * cdst;
|
|
rm4_2 = GetIntersectionPoint(trm3, trm4, rm1_2, plrpt);
|
|
|
|
if (rm1_2.DistanceTo(rm2) > rm2.DistanceTo(rm3))
|
|
{
|
|
OrgRem12 = cdst / 2;
|
|
OrgRem23 = (dst34 % cdst) / 2;
|
|
}
|
|
else
|
|
{
|
|
OrgRem12 = (dst12 % cdst) / 2;
|
|
OrgRem23 = cdst / 2;
|
|
}
|
|
|
|
InNum = Math.Floor((dst12 - (OrgRem12 * 2)) / cdst);
|
|
if (wdst > OrgRem12 * 0.5)//벽과 코일의 간격이 최소거리 미만인 경우 코일간격을 더한다.//wdst2 -> wdst 변경//2020-10-29
|
|
{
|
|
InNum = InNum - 1;
|
|
OrgRem12 = ((OrgRem12 * 2) + cdst) / 2;
|
|
}
|
|
|
|
vecTrm = (rm1 - rm2).Normalize();
|
|
rm2_2 = rm2 + vecTrm * OrgRem12;
|
|
vecTrm = (rm4 - rm3).Normalize();
|
|
rm3_2 = rm3 + vecTrm * OrgRem12;
|
|
|
|
tpNum = Math.Floor(rm1_2.DistanceTo(rm2) / cdst);
|
|
|
|
if (orgYn == 2)//마무리를 위해 라인수를 홀수로 정렬//orgYn==2
|
|
{
|
|
vecTrm = (rm1_2 - rm2_2).Normalize();
|
|
|
|
if (tpNum % 2 == 0)
|
|
rm1_2 = rm2_2 + vecTrm * (cdst * (tpNum - 1));
|
|
else
|
|
rm1_2 = rm2_2 + vecTrm * (cdst * tpNum);
|
|
}
|
|
else
|
|
{
|
|
if (tpNum % 2 == 0)
|
|
rm1_2 = rm2_2 + vecTrm * (cdst * (tpNum - 3));
|
|
else
|
|
rm1_2 = rm2_2 + vecTrm * (cdst * (tpNum - 2));
|
|
}
|
|
|
|
vecTrm = (rm3 - rm2).Normalize();
|
|
XYZ plrpt2 = rm1_2 + vecTrm * cdst;
|
|
rm4_2 = GetIntersectionPoint(trm3, trm4, rm1_2, plrpt2);
|
|
tot_dst = OrgRem12 + (cdst * tpNum);
|
|
|
|
PntLst2 = WYN_PLINE_DRW1(rm1_2, rm2_2, rm3_2, rm4_2, yn, uiapp, doc);
|
|
PntLst2.RemoveAt(PntLst2.Count() - 1);//중첩되는 점 때문에 원생성
|
|
|
|
if (PntLst2 == null || PntLst2.Count() == 0)
|
|
goto End;
|
|
else
|
|
{
|
|
using (Transaction trans = new Transaction(doc))
|
|
{
|
|
trans.Start("CreatePipe");
|
|
List<XYZ> newPntLst = PtsElevation(PntLst2, offset);
|
|
if (newPntLst == null) return false;
|
|
pipeElem = END_PLINE_DRW1(newPntLst, yn, rm1_2, rm2_2, rm3_2, rm4_2, rm1, rm2, rm3, rm4, uiapp, doc, offset);
|
|
CreatePipe1(uidoc, doc, pipeElem, coilDia, CoilType, CoilSysType);
|
|
trans.Commit();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if (FLG23)//존이 여러개인 경우 두번째 존부터 23라인의 피치는 cdst로 맞춰야 함
|
|
pch23 = cdst;
|
|
|
|
yn = yn - 1;
|
|
|
|
while (yn > 0)
|
|
{
|
|
if (FLG41 && yn == 1)
|
|
{
|
|
pch41 = cdst * 0.5;//존이 여러개인 경우 41라인의 피치는 설정값으로 재보정해야 함.
|
|
}
|
|
rm3 = rm4_2 + vec34 * cdst;//일단 코일간격으로 두번째존의 좌표를 재설정한다.
|
|
XYZ vecTrm2 = (trm1 - trm2).Normalize();
|
|
rm2 = rm1_2 + vecTrm2 * cdst;
|
|
rm2 = rm2 + vec23 * (cdst * 2);//두번째 존에서는 벽과 코일간의 거리를 보정해야 함.
|
|
|
|
if (yn == 1)
|
|
{
|
|
vecTrm2 = (trm1 - trm2).Normalize();
|
|
plrpt2 = rm2 + vecTrm2 * cdst;
|
|
rm1_2 = GetIntersectionPoint(trm1, trm4, rm2, plrpt2);
|
|
vecTrm2 = (trm4 - trm3).Normalize();
|
|
plrpt2 = rm3 + vecTrm2 * cdst;
|
|
rm4_2 = GetIntersectionPoint(trm1, trm4, rm3, plrpt2);
|
|
|
|
rm1_2 = rm1_2 + vec12 * OrgRem12;
|
|
|
|
vecTrm2 = (rm3 - rm4).Normalize();
|
|
rm4_2 = rm4_2 + vecTrm2 * OrgRem12;
|
|
}
|
|
else
|
|
{
|
|
if (tpNum % 2 == 1)
|
|
tpNum = tpNum - 1;//아래에서 다시 1을 -시키므로 홀수인지 체크해서 처리함.
|
|
if (orgYn > 3 && yn == 2)
|
|
{
|
|
vecTrm2 = (trm1 - trm2).Normalize();
|
|
rm1_2 = rm2 + vecTrm2 * (cdst * (tpNum + 1));
|
|
}
|
|
else
|
|
{
|
|
vecTrm2 = (trm1 - trm2).Normalize();
|
|
rm1_2 = rm2 + vecTrm2 * (cdst * (tpNum - 1));
|
|
}
|
|
|
|
vecTrm2 = (trm3 - trm2).Normalize();
|
|
plrpt2 = rm1_2 + vecTrm2 * cdst;
|
|
rm4_2 = GetIntersectionPoint(trm3, trm4, rm1_2, plrpt2);
|
|
|
|
}
|
|
|
|
tot_dst = tot_dst + (cdst * (tpNum + 1));
|
|
PntLst2.RemoveRange(0, PntLst2.Count() - 1);
|
|
PntLst2 = WYN_PLINE_DRW1(rm1_2, rm2, rm3, rm4_2, yn, uiapp, doc);
|
|
PntLst2.RemoveAt(PntLst2.Count() - 1);//중첩되는 점 때문에 원이 생김.
|
|
|
|
if (PntLst2 == null || PntLst2.Count() == 0) break;
|
|
using (Transaction trans = new Transaction(doc))
|
|
{
|
|
trans.Start("CreatePipe");
|
|
List<XYZ> newPntLst = PtsElevation(PntLst2, offset);
|
|
if (newPntLst == null) return false;
|
|
pipeElem.Clear();
|
|
pipeElem = END_PLINE_DRW1(newPntLst, yn, rm1_2, rm2, rm3, rm4_2, trm1, trm2, trm3, trm4, uiapp, doc, offset);
|
|
CreatePipe1(uidoc, doc, pipeElem, coilDia, CoilType, CoilSysType);
|
|
trans.Commit();
|
|
}
|
|
yn--;
|
|
}//while end
|
|
|
|
}//존수가 1개이상일 때 end
|
|
|
|
End:
|
|
|
|
return true;
|
|
}
|
|
|
|
public List<Element> END_PLINE_DRW1(List<XYZ> app, int yynn, XYZ prm1, XYZ prm2, XYZ prm3, XYZ prm4, XYZ rm1, XYZ rm2, XYZ rm3, XYZ rm4, UIApplication uiapp, Document doc, double offset)
|
|
{
|
|
Level level = doc.ActiveView.GenLevel;
|
|
XYZ pet0, pet1, pet00, pet11, plrpt, vec;
|
|
List<Element> ElemList = new List<Element>();
|
|
|
|
pet0 = app.First();
|
|
pet1 = app.Last();
|
|
|
|
pet00 = GetIntersectionPoint(rm1, rm4, pet0, app.ElementAt(1));
|
|
vec = (rm2 - rm1).Normalize();
|
|
plrpt = pet1 + vec * 1;
|
|
pet11 = GetIntersectionPoint(rm1, rm4, pet1, plrpt);
|
|
pet11 = new XYZ(pet11.X, pet11.Y, level.Elevation + offset);
|
|
app.Add(pet11);
|
|
app.Reverse();
|
|
pet00 = new XYZ(pet00.X, pet00.Y, level.Elevation + offset);
|
|
app.Add(pet00);
|
|
app.Reverse();
|
|
app.RemoveAt(1);//시작점과 두번째점 사이에 중간점이 있어 삭제
|
|
//using (Transaction transaction = new Transaction(doc))
|
|
//{
|
|
// transaction.Start("Start");
|
|
Autodesk.Revit.DB.View view = doc.ActiveView;
|
|
|
|
for (int i = 0; i < app.Count() - 1; i++)
|
|
{
|
|
var newLine = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), app.ElementAt(i), app.ElementAt(i + 1));
|
|
ElemList.Add(newLine);
|
|
}
|
|
//acdbEntLast(ads_Main);
|
|
|
|
// transaction.Commit();
|
|
//}
|
|
|
|
return ElemList;
|
|
}
|
|
|
|
public List<XYZ> PLINE_DRW_TORCOIL1(XYZ rm11, XYZ rm22, XYZ rm33, XYZ rm44, int wyn, UIApplication uiapp, Document doc)
|
|
{
|
|
if (FeetToMM(rm11, rm22) < cdst * 4 && FeetToMM(rm22, rm33) < cdst * 4)
|
|
{
|
|
TaskDialog.Show("오류", "지정된 방의 크기가 작아서 작도할 수 없습니다.");
|
|
return null;
|
|
}
|
|
|
|
double dst12 = 0, dst23 = 0, dst34 = 0, dst41 = 0;
|
|
double comDist = 0, comDst1, comDst2, flgDst, tmPdst = 0, InNum, rem11;
|
|
double wpch12, wpch21, wpch23, wpch32, wpch34, wpch43, wpch41, wpch14;
|
|
List<XYZ> app1 = new List<XYZ>(), app2 = new List<XYZ>();
|
|
XYZ vec12, vec23, vec34, vec41, vec21, vec32, vec43, vec14;
|
|
|
|
dst12 = rm11.DistanceTo(rm22); vec12 = (rm22 - rm11).Normalize();
|
|
dst23 = rm22.DistanceTo(rm33); vec23 = (rm33 - rm22).Normalize();
|
|
dst34 = rm33.DistanceTo(rm44); vec34 = (rm44 - rm33).Normalize();
|
|
dst41 = rm44.DistanceTo(rm11); vec41 = (rm11 - rm44).Normalize();
|
|
vec21 = (rm11 - rm22).Normalize(); vec32 = (rm22 - rm33).Normalize();
|
|
vec43 = (rm33 - rm44).Normalize(); vec14 = (rm44 - rm11).Normalize();
|
|
|
|
if (dst12 > dst23)
|
|
comDist = dst23;
|
|
else
|
|
comDist = dst12;
|
|
|
|
if ((FLG12 == true && FLG34 == true) && (FLG23 == true && FLG41 == true))
|
|
{
|
|
tmPdst = comDist - ((cdst * 0.5 * ((welNum * 2) - 1)) * 2);
|
|
InNum = System.Math.Floor(Unit.FeetToMM(tmPdst) / Unit.FeetToMM(cdst));
|
|
rem11 = tmPdst - (InNum * cdst);
|
|
if (wdst > rem11 * 0.5)//wdst2 -> wdst 변경//2020-10-29
|
|
{
|
|
InNum = InNum - 1;
|
|
rem11 = tmPdst - (InNum * cdst);
|
|
}
|
|
InNum = InNum + (welNum * 4);
|
|
}
|
|
else if (FLG12 == true || FLG23 == true || FLG34 == true || FLG41 == true)
|
|
{
|
|
tmPdst = comDist - ((cdst * 0.5) * ((welNum * 2) - 1));
|
|
InNum = System.Math.Floor(tmPdst / cdst);
|
|
rem11 = tmPdst - (InNum * cdst);
|
|
if (wdst > (rem11 * 0.5))//wdst2 -> wdst 변경//2020-10-29
|
|
{
|
|
InNum = InNum - 1;
|
|
rem11 = tmPdst - (InNum * cdst);
|
|
}
|
|
InNum = InNum + (welNum * 2);
|
|
}
|
|
else
|
|
{
|
|
InNum = System.Math.Floor(comDist / cdst);
|
|
rem11 = comDist - (InNum * cdst);
|
|
if (wdst > (rem11 * 0.5))//wdst2 -> wdst 변경//2020-10-29
|
|
{
|
|
InNum = InNum - 1;
|
|
rem11 = comDist - (InNum * cdst);
|
|
}
|
|
}
|
|
|
|
if (dst12 > dst23)
|
|
{
|
|
wpch12 = wdst; wpch21 = wdst; wpch23 = rem11 * 0.5; wpch32 = rem11 * 0.5;
|
|
wpch34 = wdst; wpch43 = wdst; wpch41 = rem11 * 0.5; wpch14 = rem11 * 0.5;
|
|
}
|
|
else
|
|
{
|
|
wpch12 = rem11 * 0.5; wpch21 = rem11 * 0.5; wpch23 = wdst; wpch32 = wdst;
|
|
wpch34 = rem11 * 0.5; wpch43 = rem11 * 0.5; wpch41 = wdst; wpch14 = wdst;
|
|
}
|
|
|
|
|
|
//TaskDialog.Show("길이", "나머지 : " + Unit.MMToFeet(rem11,DisplayUnitType.DUT_MILLIAMPERES) + "\n코일라인 수 : " + InNum);
|
|
|
|
XYZ srt1 = null, srt11 = null, srt2 = null, srt22 = null, srt3 = null, srt33 = null, srt4 = null
|
|
, srt44 = null, tmPt = null, rt1 = null, rt2 = null, rt3 = null, rt4 = null
|
|
, rt11 = null, rt22 = null, rt33 = null, rt44 = null;
|
|
|
|
srt1 = rm11 + vec14 * wpch14;
|
|
rt1 = rm11 + vec14 * (pch12 + wpch14);
|
|
//Pyosi(uiapp, doc, srt1);
|
|
//Pyosi(uiapp, doc, rt1);
|
|
app1.Add(srt1);//바깥쪽 코일 시작점
|
|
app2.Add(rt1);//안쪽 코일 시작점
|
|
|
|
bool wFlg = true;
|
|
int rep = 0;
|
|
|
|
while (wFlg)
|
|
{
|
|
if (rep % 4 == 0)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt11 = CRS_DST_PNT(rm22, rm33, srt1, vec21, wpch21, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst12 - wpch21)) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt1 = srt11;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt1, srt2, srt4, Util.Polar(srt4, rm11, rm22, dst12));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt11 = Util.Polar(tmPt, vec21, cdst + pch23);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt11 = Util.Polar(tmPt, vec21, cdst * 2);
|
|
else
|
|
srt11 = Util.Polar(tmPt, vec21, pch23 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt11));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt4));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
srt1 = srt11;
|
|
}
|
|
app1.Add(srt1);
|
|
}
|
|
else if (rep % 4 == 1)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt22 = CRS_DST_PNT(rm33, rm44, srt1, vec32, wpch32, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst23 - (wpch23 + wpch32))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt2 = srt22;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt2, srt3, srt1, Util.Polar(srt1, rm22, rm33, dst23));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt22 = Util.Polar(tmPt, vec32, cdst + pch34);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt22 = Util.Polar(tmPt, vec32, cdst * 2);
|
|
else
|
|
srt22 = Util.Polar(tmPt, vec32, pch34 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt22));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt1));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
srt2 = srt22;
|
|
}
|
|
app1.Add(srt2);
|
|
}
|
|
else if (rep % 4 == 2)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt33 = CRS_DST_PNT(rm44, rm11, srt2, vec43, wpch43, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst34 - (wpch34 + wpch43))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt3 = srt33;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt3, srt4, srt2, Util.Polar(srt2, rm33, rm44, dst34));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt33 = Util.Polar(tmPt, vec43, cdst + pch41);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt33 = Util.Polar(tmPt, vec43, cdst * 2);
|
|
else
|
|
srt33 = Util.Polar(tmPt, vec43, pch41 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt33));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt2));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
srt3 = srt33;
|
|
}
|
|
app1.Add(srt3);
|
|
}
|
|
else if (rep % 4 == 3)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt44 = CRS_DST_PNT(rm11, rm22, srt3, vec14, wpch14 + (pch12 * 2.0), uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst41 - (wpch41 + wpch14 + (pch12 * 2)))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt4 = srt44;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt4, srt1, srt3, Util.Polar(srt3, rm44, rm11, dst41));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt44 = Util.Polar(tmPt, vec14, cdst + pch12);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt44 = Util.Polar(tmPt, vec14, cdst * 2);
|
|
else
|
|
srt44 = Util.Polar(tmPt, vec14, pch12 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt44));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt3));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
srt4 = srt44;
|
|
}
|
|
app1.Add(srt4);
|
|
}
|
|
rep++;
|
|
}//while end
|
|
|
|
////////////////////////////////////////리턴배관
|
|
wFlg = true; rep = 0;
|
|
|
|
while (wFlg)
|
|
{
|
|
if (rep % 4 == 0)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rt1 = CRS_DST_PNT(rm22, rm33, rt1, vec21, wpch21 + pch23, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst12 - (wpch12 + pch23))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rt1, rt2, rt4, Util.Polar(rt4, rm11, rm22, dst12));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rt11 = Util.Polar(tmPt, vec21, cdst * 2);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rt11 = Util.Polar(tmPt, vec21, cdst * 2);
|
|
else
|
|
rt11 = Util.Polar(tmPt, vec21, pch23 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rt11));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rt4));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rt1 = rt11;
|
|
}
|
|
app2.Add(rt1);
|
|
}
|
|
else if (rep % 4 == 1)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rt2 = CRS_DST_PNT(rm33, rm44, rt1, vec32, wpch32 + pch34, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst23 - (wpch23 + wpch32 + pch34 + pch12))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rt2, rt3, rt1, Util.Polar(rt1, rm22, rm33, dst23));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rt22 = Util.Polar(tmPt, vec32, cdst * 2);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rt22 = Util.Polar(tmPt, vec32, cdst * 2);
|
|
else
|
|
rt22 = Util.Polar(tmPt, vec32, pch34 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rt22));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rt1));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rt2 = rt22;
|
|
}
|
|
app2.Add(rt2);
|
|
}
|
|
else if (rep % 4 == 2)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rt3 = CRS_DST_PNT(rm44, rm11, rt2, vec43, wpch43 + pch41, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst34 - (wpch34 + wpch43 + pch23 + pch41))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rt3, rt4, rt2, Util.Polar(rt2, rm33, rm44, dst34));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rt33 = Util.Polar(tmPt, vec43, cdst * 2);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rt33 = Util.Polar(tmPt, vec43, cdst * 2);
|
|
else
|
|
rt33 = Util.Polar(tmPt, vec43, pch41 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rt33));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rt2));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rt3 = rt33;
|
|
}
|
|
app2.Add(rt3);
|
|
}
|
|
else if (rep % 4 == 3)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rt4 = CRS_DST_PNT(rm11, rm22, rt3, vec14, wpch14 + (pch12 * 3), uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst41 - (wpch41 + wpch14 + (pch12 * 3)))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
if (Unit.FeetToMM(rt3.DistanceTo(rt4)) < Unit.FeetToMM(cdst * 2) || Math.Abs(rt3.DistanceTo(rt4) - (cdst * 2)) < 0.0000328084)
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rt4, rt1, rt3, Util.Polar(rt3, rm44, rm11, dst41));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rt44 = Util.Polar(tmPt, vec14, cdst * 2);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rt44 = Util.Polar(tmPt, vec14, cdst * 2);
|
|
else
|
|
rt44 = Util.Polar(tmPt, vec14, pch12 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rt44));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rt3));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rt4 = rt44;
|
|
}
|
|
app2.Add(rt4);
|
|
//Pyosi(uiapp, doc, rt4);
|
|
}
|
|
rep++;
|
|
}//while end
|
|
|
|
XYZ lastPt1, lastPt2;
|
|
lastPt1 = app1.Last();
|
|
lastPt2 = app2.Last();
|
|
|
|
if (Unit.FeetToMM(lastPt1.DistanceTo(lastPt2)) < Unit.FeetToMM(cdst * 2))
|
|
{
|
|
app1.RemoveAt(app1.Count - 1);
|
|
app2.RemoveAt(app2.Count - 1);
|
|
}
|
|
//내부 마지막점에서 선이 매끄럽게 연결되도록 교차점 찾아 추가
|
|
|
|
//2020-10-20 파이프 내부 선 대각선으로 그리는 현상 조정
|
|
XYZ app1Last_1 = app1.Last(), app1Last_2 = app1[app1.Count() - 2], app1Last_3 = app1[app1.Count() - 3];
|
|
XYZ app2Last_1 = app2.Last(), app2Last_2 = app2[app2.Count() - 2], app2Last_3 = app2[app2.Count() - 3];
|
|
double dst1 = app1Last_1.DistanceTo(app1Last_2), dst2 = app1Last_2.DistanceTo(app1Last_3);
|
|
|
|
app1Last_1 = app1.Last(); app1Last_2 = app1[app1.Count() - 2]; app1Last_3 = app1[app1.Count() - 3];
|
|
app2Last_1 = app2.Last(); app2Last_2 = app2[app2.Count() - 2]; app2Last_3 = app2[app2.Count() - 3];
|
|
|
|
XYZ Newpt1 = Util.Polar(app1Last_2, app1Last_2, app1Last_1, (app1Last_1.DistanceTo(app1Last_2) + cdst) / 2);
|
|
XYZ Newpt2 = Util.Polar(app2Last_2, app2Last_2, app2Last_1, (app2Last_1.DistanceTo(app2Last_2) + cdst) / 2);
|
|
//Pyosi(uiapp, doc, Newpt1);
|
|
//Pyosi(uiapp, doc, Newpt2);
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
app1.Add(Newpt1);
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
app2.Add(Newpt2);
|
|
|
|
app2.Reverse();
|
|
app1.AddRange(app2);
|
|
|
|
|
|
return app1;
|
|
}
|
|
|
|
public List<XYZ> WYN_PLINE_DRW1(XYZ rm11, XYZ rm22, XYZ rm33, XYZ rm44, int wyn, UIApplication uiapp, Document doc)
|
|
{
|
|
if (rm11.DistanceTo(rm22) < cdst * 4 || rm22.DistanceTo(rm33) < cdst * 4)
|
|
{
|
|
TaskDialog.Show("오류", "지정된 방의 크기가 작아서 작도할 수 없습니다.");
|
|
return null;
|
|
}
|
|
|
|
double dst12, dst23, dst34, dst41, comDist, comDst1, comDst2, flgDst,
|
|
wpch21, wpch23, wpch32, wpch34, wpch43, wpch41, wpch14;
|
|
XYZ srt1 = null, srt11 = null, srt2 = null, srt22 = null, srt3 = null, srt33 = null
|
|
, srt4 = null, srt44 = null, rrt1 = null, rrt11 = null, rrt2 = null, rrt22 = null
|
|
, rrt3 = null, rrt33 = null, rrt4 = null, rrt44 = null, tmPt = null,
|
|
lastPt1 = null, lastPt2 = null, vec12, vec21, vec23, vec32, vec34, vec43, vec41, vec14;
|
|
List<XYZ> app1 = new List<XYZ>();
|
|
List<XYZ> app2 = new List<XYZ>();
|
|
|
|
dst12 = rm11.DistanceTo(rm22); vec12 = (rm22 - rm11).Normalize();
|
|
dst23 = rm22.DistanceTo(rm33); vec23 = (rm33 - rm22).Normalize();
|
|
dst34 = rm33.DistanceTo(rm44); vec34 = (rm44 - rm33).Normalize();
|
|
dst41 = rm44.DistanceTo(rm11); vec41 = (rm11 - rm44).Normalize();
|
|
vec21 = (rm11 - rm22).Normalize(); vec32 = (rm22 - rm33).Normalize();
|
|
vec43 = (rm33 - rm44).Normalize(); vec14 = (rm44 - rm11).Normalize();
|
|
|
|
if (dst12 > dst23)
|
|
comDist = dst23;
|
|
else
|
|
comDist = dst12;
|
|
|
|
|
|
wpch21 = 0.0; wpch23 = OrgRem12; wpch32 = OrgRem23;
|
|
wpch34 = 0.0; wpch43 = 0.0; wpch41 = OrgRem23; wpch14 = OrgRem23;
|
|
|
|
//srt1 = rm11 + vec23 * wpch14;//서플라이 시작점
|
|
srt1 = Util.Polar(rm11, vec23, wpch14);//서플라이 시작점
|
|
//rrt1 = rm11 + vec23 * (pch12 + wpch14);//리턴 시작점
|
|
rrt1 = Util.Polar(rm11, vec23, pch12 + wpch14);//리턴 시작점
|
|
app1.Add(srt1);
|
|
app2.Add(rrt1);
|
|
|
|
bool wFlg = true; int rep = 0;
|
|
|
|
////////////////////////서플라이 배관 포인트 구하는 루틴/////////////////////////////////
|
|
XYZ plrpt, VecRm;
|
|
while (wFlg)
|
|
{
|
|
if (rep % 4 == 0)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt11 = GetIntersectionPoint(rm22, rm33, srt1, Util.Polar(srt1, rm11, rm22, pch23));
|
|
if (Math.Floor(Unit.FeetToMM(dst12 - wpch21)) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt1 = srt11;
|
|
//Pyosi(uiapp, doc, srt1);
|
|
//MessageBox.Show("srt1 / rep : "+rep);
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt1, srt2, srt4, Util.Polar(srt4, rm11, rm22, dst12));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt11 = Util.Polar(tmPt, vec21, cdst + pch23);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt11 = Util.Polar(tmPt, vec21, cdst * 2);
|
|
else
|
|
srt11 = Util.Polar(tmPt, vec21, pch23 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt11));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt4));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)//나머지가 피치의 두배보다 작으면 while 종료
|
|
wFlg = false;
|
|
|
|
srt1 = srt11;//포인트 환원
|
|
//Pyosi(uiapp, doc, srt1);
|
|
//MessageBox.Show("srt1 / rep : " + rep);
|
|
}
|
|
app1.Add(srt1);
|
|
}
|
|
if (rep % 4 == 1)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt22 = CRS_DST_PNT(rm33, rm44, srt1, vec32, wpch32, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst23 - (wpch23 + wpch32))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt2 = srt22;
|
|
//Pyosi(uiapp, doc, srt2);
|
|
//MessageBox.Show("srt2 / rep : " + rep);
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt2, srt3, srt1, Util.Polar(srt1, rm22, rm33, dst23));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt22 = Util.Polar(tmPt, vec32, cdst + pch34);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt22 = Util.Polar(tmPt, vec32, cdst * 2);
|
|
else
|
|
srt22 = Util.Polar(tmPt, vec32, pch34 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt22));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt1));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)//나머지가 피치의 두배보다 작으면 while 종료
|
|
wFlg = false;
|
|
|
|
srt2 = srt22;//포인트 환원
|
|
//Pyosi(uiapp, doc, srt2);
|
|
//MessageBox.Show("srt2 / rep : " + rep);
|
|
}
|
|
app1.Add(srt2);
|
|
}
|
|
if (rep % 4 == 2)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
//VecRm = (rm44 - rm33).Normalize();
|
|
//plrpt = srt2 + VecRm * pch41;
|
|
|
|
srt33 = GetIntersectionPoint(rm44, rm11, srt2, Util.Polar(srt2, rm33, rm44, pch41));
|
|
if (Math.Floor(Unit.FeetToMM(dst34 - (wpch34 + wpch43))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt3 = srt33;
|
|
//Pyosi(uiapp, doc, srt3);
|
|
//MessageBox.Show("srt3 / rep : " + rep);
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt3, srt4, srt2, Util.Polar(srt2,rm33,rm44,dst34));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt33 = Util.Polar(tmPt, vec43, cdst + pch41);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt33 = Util.Polar(tmPt, vec43, cdst * 2);
|
|
else
|
|
srt33 = Util.Polar(tmPt, vec43, pch41 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt33));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt2));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)//나머지가 피치의 두배보다 작으면 while 종료
|
|
wFlg = false;
|
|
|
|
srt3 = srt33;//포인트 환원
|
|
//Pyosi(uiapp, doc, srt3);
|
|
//MessageBox.Show("srt3 / rep : " + rep);
|
|
}
|
|
app1.Add(srt3);
|
|
}
|
|
if (rep % 4 == 3)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
srt44 = CRS_DST_PNT(rm11, rm22, srt3, vec14, wpch14 + (pch12 * 2.0), uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst41 - (wpch41 + wpch14) + (pch12 * 2))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
|
|
srt4 = srt44;
|
|
//Pyosi(uiapp, doc, srt4);
|
|
//MessageBox.Show("srt4 / rep : " + rep);
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(srt4, srt1, srt3, Util.Polar(srt3, rm44, rm11, dst41));
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
srt44 = Util.Polar(tmPt, vec14, cdst + pch12);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
srt44 = Util.Polar(tmPt, vec14, cdst * 2);
|
|
else
|
|
srt44 = Util.Polar(tmPt, vec14, pch12 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(srt44));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(srt3));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)//나머지가 피치의 두배보다 작으면 while 종료
|
|
wFlg = false;
|
|
|
|
srt4 = srt44;//포인트 환원
|
|
//Pyosi(uiapp, doc, srt4);
|
|
//MessageBox.Show("srt4 / rep : " + rep);
|
|
}
|
|
app1.Add(srt4);
|
|
}
|
|
rep++;
|
|
}//while end
|
|
|
|
|
|
|
|
|
|
wFlg = true; rep = 0;//리턴배관 포인트를 위해 설정.
|
|
|
|
/////////////////////////////리턴 배관 포인트 구하는 루틴////////////////////////////////
|
|
|
|
while (wFlg)
|
|
{
|
|
if (rep % 4 == 0)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rrt1 = CRS_DST_PNT(rm22, rm33, rrt1, vec21, pch23, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst12 - (wpch21 + pch23))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rrt1, rrt2, rrt4, Util.Polar(rrt4, rm11, rm22, dst12));
|
|
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rrt11 = Util.Polar(tmPt, vec21, cdst * 2);//(cdst + pch23)
|
|
//rrt11 = tmPt + vec21 * (cdst * 2);
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rrt11 = Util.Polar(tmPt, vec21, cdst * 2);
|
|
else
|
|
rrt11 = Util.Polar(tmPt, vec21, pch23 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rrt11));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rrt4));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.001)
|
|
wFlg = false;
|
|
|
|
rrt1 = rrt11;
|
|
}
|
|
app2.Add(rrt1);
|
|
}//fmod==0
|
|
if (rep % 4 == 1)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rrt2 = CRS_DST_PNT(rm33, rm44, rrt1, vec32, wpch32 + pch34, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst23 - (wpch23 + wpch32 + pch34 + pch12))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rrt2, rrt3, rrt1, Util.Polar(rrt1,rm22,rm33,dst23));
|
|
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rrt22 = Util.Polar(tmPt, vec32, cdst * 2);//(cdst+pch34)
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rrt22 = Util.Polar(tmPt, vec32, cdst * 2);
|
|
else
|
|
rrt22 = Util.Polar(tmPt, vec32, pch34 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rrt22));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rrt1));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rrt2 = rrt22;
|
|
}
|
|
app2.Add(rrt2);
|
|
}//fmod==1
|
|
if (rep % 4 == 2)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rrt3 = CRS_DST_PNT(rm44, rm11, rrt2, vec43, pch12, uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst34 - (wpch34 + wpch43 + pch23 + pch41))) > Unit.FeetToMM(pch23 + pch41))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rrt3, rrt4, rrt2, Util.Polar(rrt2, rm33, rm44, dst34));
|
|
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rrt33 = Util.Polar(tmPt, vec43, cdst * 2);//(cdst+pch34)
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rrt33 = Util.Polar(tmPt, vec43, cdst * 2);
|
|
else
|
|
rrt33 = Util.Polar(tmPt, vec43, pch41 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rrt33));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rrt2));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rrt3 = rrt33;
|
|
}
|
|
app2.Add(rrt3);
|
|
}//fmod==2
|
|
if (rep % 4 == 3)
|
|
{
|
|
if (rep < 4)
|
|
{
|
|
rrt4 = CRS_DST_PNT(rm11, rm22, rrt3, vec14, wpch14 + (pch12 * 3), uiapp, doc);
|
|
if (Math.Floor(Unit.FeetToMM(dst41 - (wpch41 + wpch14 + (pch12 * 3) + pch34))) > Unit.FeetToMM(pch34 + pch12))
|
|
wFlg = true;
|
|
else
|
|
wFlg = false;
|
|
}
|
|
else
|
|
{
|
|
tmPt = GetIntersectionPoint(rrt4, rrt1, rrt3, Util.Polar(rrt3, rm44, rm11, dst41));
|
|
|
|
if (Math.Floor((double)rep / 4) == welNum)
|
|
rrt44 = Util.Polar(tmPt, vec14, cdst * 2);//(cdst+pch34)
|
|
else if (Math.Floor((double)rep / 4) > welNum)
|
|
rrt44 = Util.Polar(tmPt, vec14, cdst * 2);
|
|
else
|
|
rrt44 = Util.Polar(tmPt, vec14, pch12 * 2);
|
|
|
|
comDst1 = Unit.FeetToMM(tmPt.DistanceTo(rrt44));
|
|
comDst2 = Unit.FeetToMM(tmPt.DistanceTo(rrt3));
|
|
flgDst = Math.Floor(comDst2 - comDst1);
|
|
if (flgDst < Unit.FeetToMM(cdst * 2) || Math.Abs(flgDst - Unit.FeetToMM(cdst * 2)) < 0.01)
|
|
wFlg = false;
|
|
|
|
rrt4 = rrt44;
|
|
}
|
|
app2.Add(rrt4);
|
|
}//fmod==3
|
|
rep++;
|
|
}//while end
|
|
|
|
lastPt1 = app1.Last();
|
|
lastPt2 = app2.Last();
|
|
|
|
if (Unit.FeetToMM(cdst * 2) > Unit.FeetToMM(lastPt1.DistanceTo(lastPt2)))//마지막 포인트의 거리가 피치보다 작으면 마지막 점 제외
|
|
{
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
}
|
|
|
|
//내부 마지막점에서 선이 매끄럽게 연결되도록 교차점 찾아 추가
|
|
|
|
//2020-10-20 파이프 내부 선 대각선으로 그리는 현상 조정
|
|
if (app1.Last().IsAlmostEqualTo(app1[app1.Count() - 2], 0.0000328084))
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
if (app2.Last().IsAlmostEqualTo(app2[app2.Count() - 2], 0.0000328084))
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
XYZ app1Last_1 = app1.Last(), app1Last_2 = app1[app1.Count() - 2], app1Last_3 = app1[app1.Count() - 3];
|
|
XYZ app2Last_1 = app2.Last(), app2Last_2 = app2[app2.Count() - 2], app2Last_3 = app2[app2.Count() - 3];
|
|
double dst1 = app1Last_1.DistanceTo(app1Last_2), dst2 = app1Last_2.DistanceTo(app1Last_3);
|
|
|
|
//Pyosi(uiapp, doc, app1Last_1);
|
|
//Pyosi(uiapp, doc, app1Last_2);
|
|
//Pyosi(uiapp, doc, app1Last_3);
|
|
|
|
if (dst1 > dst2)
|
|
{
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
|
|
app1Last_1 = app1.Last(); app1Last_2 = app1[app1.Count() - 2]; app1Last_3 = app1[app1.Count() - 3];
|
|
app2Last_1 = app2.Last(); app2Last_2 = app2[app2.Count() - 2]; app2Last_3 = app2[app2.Count() - 3];
|
|
|
|
XYZ Newpt1 = Util.Polar(app1Last_2, app1Last_2, app1Last_1, (app1Last_1.DistanceTo(app1Last_2) + cdst) / 2);
|
|
XYZ Newpt2 = Util.Polar(app2Last_2, app2Last_2, app2Last_1, (app2Last_1.DistanceTo(app2Last_2) + cdst) / 2);
|
|
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
app1.Add(Newpt1);
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
app2.Add(Newpt2);
|
|
|
|
}
|
|
else
|
|
{
|
|
app1Last_1 = app1.Last(); app1Last_2 = app1[app1.Count() - 2]; app1Last_3 = app1[app1.Count() - 3];
|
|
app2Last_1 = app2.Last(); app2Last_2 = app2[app2.Count() - 2]; app2Last_3 = app2[app2.Count() - 3];
|
|
|
|
XYZ Newpt1 = Util.Polar(app1Last_2, app1Last_2, app1Last_1, (app1Last_1.DistanceTo(app1Last_2) + cdst) / 2);
|
|
XYZ Newpt2 = Util.Polar(app2Last_2, app2Last_2, app2Last_1, (app2Last_1.DistanceTo(app2Last_2) + cdst) / 2);
|
|
|
|
app1.RemoveAt(app1.Count() - 1);
|
|
app1.Add(Newpt1);
|
|
app2.RemoveAt(app2.Count() - 1);
|
|
app2.Add(Newpt2);
|
|
}
|
|
|
|
//Pyosi(uiapp, doc, Newpt1);
|
|
//Pyosi(uiapp, doc, Newpt2);
|
|
//app1.RemoveAt(app1.Count - 1);
|
|
//app2.Add(ttt);
|
|
|
|
app2.Reverse();
|
|
app1.AddRange(app2);
|
|
|
|
|
|
return app1;
|
|
}
|
|
|
|
|
|
public XYZ CRS_DST_PNT(XYZ tp1, XYZ tp2, XYZ t1, XYZ tVec, double tPach, UIApplication uiapp, Document doc)
|
|
{
|
|
XYZ tp3, rPt, ttt;
|
|
tVec.Normalize();
|
|
tp3 = t1 + tVec * tPach;
|
|
|
|
ttt = GetIntersectionPoint(tp1, tp2, tp3, t1);
|
|
//Pyosi(uiapp, doc, ttt);
|
|
|
|
rPt = ttt + tVec * tPach;
|
|
|
|
|
|
return rPt;
|
|
}
|
|
|
|
public double VRT_PL_DRW1(UIApplication uiapp, Document doc, List<XYZ> VAPP)
|
|
{
|
|
Autodesk.Revit.DB.View view = doc.ActiveView;
|
|
double total_dst = 0, m_dst = 0;
|
|
for (int i = 0; i < VAPP.Count() - 2; i++)
|
|
{
|
|
//Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), VAPP[i], VAPP[i + 1]);
|
|
m_dst = VAPP[i].DistanceTo(VAPP[i + 1]);
|
|
total_dst = total_dst + m_dst;
|
|
}
|
|
|
|
|
|
return total_dst;
|
|
}
|
|
public List<Element> PIPE_ELEM_LIST(UIApplication uiapp, Document doc, List<XYZ> VAPP)
|
|
{
|
|
Autodesk.Revit.DB.View view = doc.ActiveView;
|
|
double total_dst = 0, m_dst = 0;
|
|
List<Element> ElemList = new List<Element>();
|
|
|
|
for (int i = 0; i < VAPP.Count() - 1; i++)
|
|
{
|
|
var newLine = Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), VAPP[i], VAPP[i + 1]);
|
|
m_dst = VAPP[i].DistanceTo(VAPP[i + 1]);
|
|
total_dst = total_dst + m_dst;
|
|
ElemList.Add(newLine);
|
|
}
|
|
|
|
|
|
return ElemList;
|
|
}
|
|
|
|
public double FeetToMM(XYZ spt, XYZ ept)
|
|
{
|
|
double res = 0;
|
|
res = System.Math.Round(Unit.FeetToMM(spt.DistanceTo(ept)), 4);
|
|
return res;
|
|
}
|
|
public double MMToFeet(XYZ spt, XYZ ept)
|
|
{
|
|
double res = 0;
|
|
res = System.Math.Round(Unit.MMToFeet(spt.DistanceTo(ept)), 4);
|
|
return res;
|
|
}
|
|
public double Angle2D(XYZ spt, XYZ ept)
|
|
{
|
|
double degree = 0;
|
|
XYZ vec;
|
|
vec = (ept - spt).Normalize();
|
|
degree = System.Math.Round(Util.RTD(vec.AngleTo(XYZ.BasisX)), 3);
|
|
return degree;
|
|
}
|
|
public bool Pyosi(UIApplication uiapp, Document doc, XYZ pt)
|
|
{
|
|
|
|
XYZ pt1 = new XYZ(pt.X - 0.328084, pt.Y + 0.328084, pt.Z);
|
|
XYZ pt2 = new XYZ(pt.X + Unit.MMToFeet(100), pt.Y + Unit.MMToFeet(100), pt.Z);
|
|
XYZ pt3 = new XYZ(pt.X + 0.328084, pt.Y - 0.328084, pt.Z);
|
|
XYZ pt4 = new XYZ(pt.X - 0.328084, pt.Y - 0.328084, pt.Z);
|
|
//using(Transaction trans = new Transaction(doc))
|
|
//{
|
|
// trans.Start("pyosi");
|
|
Autodesk.Revit.DB.View view = doc.ActiveView;
|
|
Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), pt1, pt3);
|
|
Util.NewModelLine(uiapp, view.SketchPlane.GetPlane(), pt2, pt4);
|
|
|
|
// trans.Commit();
|
|
//}
|
|
|
|
return true;
|
|
}
|
|
public XYZ GetIntersectionPoint(XYZ p1, XYZ p2, XYZ p3, XYZ p4)
|
|
{
|
|
double d = (p1.X - p2.X) * (p3.Y - p4.Y) - (p1.Y - p2.Y) * (p3.X - p4.X);
|
|
if (d == 0) return null;
|
|
|
|
double pre = (p1.X * p2.Y - p1.Y * p2.X), post = (p3.X * p4.Y - p3.Y * p4.X);
|
|
double x = (pre * (p3.X - p4.X) - (p1.X - p2.X) * post) / d;
|
|
double y = (pre * (p3.Y - p4.Y) - (p1.Y - p2.Y) * post) / d;
|
|
|
|
XYZ resPt = new XYZ(x, y, p1.Z);
|
|
|
|
return resPt;
|
|
}
|
|
|
|
|
|
public void CreatePipe1(UIDocument uidoc, Document document, List<Element> elementlist, double Coil_Dia, PipeType pipeType, PipingSystemType pipeSysType)
|
|
{
|
|
|
|
// (1) pipe 생성하기
|
|
|
|
// 1-1) pipe 생성에 필요한 속성 임의로 가져오기
|
|
|
|
//PipeType pipeType = new FilteredElementCollector(document).OfClass(typeof(PipeType)).FirstOrDefault() as PipeType;
|
|
//FilteredElementCollector collector = new FilteredElementCollector(document);
|
|
//ICollection<Element> collection = collector.OfClass(typeof(PipeType)).ToElements();
|
|
//PipeType pipeType = null;
|
|
//foreach (Element elem in collection)
|
|
//{
|
|
// if(elem is PipeType)
|
|
// {
|
|
// pipeType = elem as PipeType;
|
|
//
|
|
// }
|
|
//}
|
|
|
|
|
|
//Level level = new FilteredElementCollector(document).OfClass(typeof(Level)).First() as Level;
|
|
Level level = document.ActiveView.GenLevel;
|
|
//FilteredElementCollector sysCollector = new FilteredElementCollector(document);
|
|
////sysCollector.OfClass(typeof(PipingSystemType));
|
|
//sysCollector.OfCategory(BuiltInCategory.OST_PipingSystem);
|
|
//ElementId pipeSysTypeId = sysCollector.FirstElementId();
|
|
|
|
|
|
//bool flag = true;
|
|
|
|
// Extract all pipe system types
|
|
|
|
// 1-2) 변수선언
|
|
Pipe newpipe = null;
|
|
|
|
|
|
// 1-3) geometryElements 생성하기
|
|
List<Curve> geometryCurve = new List<Curve>();
|
|
|
|
for (int i = 0; i < elementlist.Count(); i++)
|
|
{
|
|
if (elementlist[i] is ModelLine)
|
|
{
|
|
ModelLine model = elementlist[i] as ModelLine;
|
|
Curve cur = model.GeometryCurve;
|
|
geometryCurve.Add(cur);
|
|
}
|
|
//MessageBox.Show("1123");
|
|
|
|
//GeometryElement geometry = elementlist.ElementAt(i).get_Geometry(new Options());
|
|
//geometryElements.Add(geometry);
|
|
}
|
|
|
|
|
|
|
|
// 1-4) 트랜젝션 실행
|
|
//using (Transaction trans = new Transaction(document))
|
|
//{
|
|
|
|
|
|
try
|
|
{
|
|
//trans.Start("Create pipe");
|
|
|
|
// 1-5) 파이프 생성 후 리스트에 담기
|
|
List<Pipe> pipes = new List<Pipe>();
|
|
List<Element> elePipe = new List<Element>();
|
|
//foreach (GeometryElement geometryele in geometryElements)
|
|
//{
|
|
// foreach (GeometryObject obj in geometryele)
|
|
// {
|
|
foreach (Curve cur in geometryCurve)
|
|
{
|
|
|
|
|
|
//Line line = cur as Line;
|
|
|
|
|
|
XYZ start = cur.GetEndPoint(0);
|
|
XYZ end = cur.GetEndPoint(1);
|
|
if (pipeType != null)
|
|
{
|
|
|
|
newpipe = Pipe.Create(document, pipeSysType.Id, pipeType.Id, level.Id, start, end);
|
|
pipes.Add(newpipe);
|
|
//MessageBox.Show("1");
|
|
|
|
Element element = document.GetElement(newpipe.Id as ElementId);
|
|
elePipe.Add(element);
|
|
|
|
// 1-6) fitting 할 elbow 굵기에 맞게 pipe 굵기 설정하기
|
|
ElementId elementId = newpipe.Id as ElementId;
|
|
//Parameter parameter = element.LookupParameter("지름");
|
|
newpipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM).Set(Coil_Dia);
|
|
|
|
|
|
//// 1-7) Pipe 의 연결할 elbow Type 지정하기
|
|
//// Revit api 로 pipe fitting 할 경우 연결할 elbowType의 기본값이 none이기 때문에 꼭! Routing Preferences에서 설정해주어야한다.
|
|
//ElementType elbowType = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_PipeFitting).OfClass(typeof(ElementType)).Cast<ElementType>().Where(x => x.FamilyName.Contains("M_엘보")).FirstOrDefault();
|
|
//RoutingPreferenceManager rpm = newpipe.PipeType.RoutingPreferenceManager;
|
|
//rpm.AddRule(RoutingPreferenceRuleGroupType.Elbows, new RoutingPreferenceRule(elbowType.Id, "Set Elbow fitting Type"));
|
|
//int routingPerenceGroupCnt = rpm.GetNumberOfRules(RoutingPreferenceRuleGroupType.Elbows);
|
|
//if (routingPerenceGroupCnt > 1)
|
|
//{
|
|
// for (int k = 0; k < routingPerenceGroupCnt - 1; k++)
|
|
// {
|
|
// rpm.RemoveRule(RoutingPreferenceRuleGroupType.Elbows, 0);
|
|
// }
|
|
//}
|
|
}
|
|
// }
|
|
// }
|
|
}
|
|
|
|
|
|
// (2) Pipe 연결시키기
|
|
|
|
// 2-1) transaction 안에서 종류 설정했으므로 중간에 새로고침하여 elbow 종류 설정한 값 적용되도록 하기
|
|
document.Regenerate();
|
|
// 2-2) 연결시킬 2개의 파이프 connector 가져오기위해, connectormanager로 connectors 뽑아내기
|
|
|
|
for (int i = 0; i < pipes.Count() - 1; i++)
|
|
{
|
|
|
|
ConnectorManager pipe_connectorManager1 = pipes.ElementAt(i).ConnectorManager;
|
|
ConnectorSet pipe_connectorSet1 = pipe_connectorManager1.Connectors;
|
|
ConnectorManager pipe_connectorManager2 = pipes.ElementAt(i + 1).ConnectorManager;
|
|
ConnectorSet pipe_connectorSet2 = pipe_connectorManager2.Connectors;
|
|
|
|
|
|
// 2-3) 파이프가 가지고 있는 connectors 에서 연결시킬 connector 뽑아내기
|
|
|
|
Connector pipe_connector1 = null;
|
|
Connector pipe_connector2 = null;
|
|
double minDist = double.MaxValue;
|
|
foreach (Connector connector1 in pipe_connectorSet1)
|
|
{
|
|
foreach (Connector connector2 in pipe_connectorSet2)
|
|
{
|
|
double d = connector1.Origin.DistanceTo(connector2.Origin);
|
|
if (d < minDist)
|
|
{
|
|
pipe_connector1 = connector1;
|
|
pipe_connector2 = connector2;
|
|
minDist = d;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 2-4) 2개의 파이프 연결시키기
|
|
try
|
|
{
|
|
FamilyInstance fitting = document.Create.NewElbowFitting(pipe_connector1, pipe_connector2);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
//MessageBox.Show("" + e);
|
|
}
|
|
|
|
}
|
|
|
|
//trans.Commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
//MessageBox.Show("" + e);
|
|
//MessageBox.Show("Pipe 간의 각도가 너무 크거나 작습니다. \n조정 후 다시 시도해주세요");
|
|
//trans.RollBack();
|
|
}
|
|
|
|
// pipe와 겹치는 line 삭제하기
|
|
foreach (Element element in elementlist)
|
|
{
|
|
if (element == null) continue;
|
|
ElementId elementId = element.Id;
|
|
document.Delete(elementId);
|
|
}
|
|
//}
|
|
}
|
|
|
|
//포인트들 현재 레벨의 z값만큼 올리기.
|
|
public List<XYZ> PtsElevation(List<XYZ> m_Ptlst, double offset)
|
|
{
|
|
List<XYZ> ptLst = new List<XYZ>();
|
|
|
|
Level level = doc.ActiveView.GenLevel;
|
|
|
|
if(level == null)
|
|
{
|
|
TaskDialog.Show("뷰 오류", "현재 뷰에서 레벨을 참조할 수 없습니다.");
|
|
return null;
|
|
}
|
|
|
|
foreach (XYZ pt in m_Ptlst)
|
|
{
|
|
XYZ ElevationPt = new XYZ(pt.X, pt.Y, level.Elevation + offset);
|
|
ptLst.Add(ElevationPt);
|
|
}
|
|
|
|
|
|
return ptLst;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|