uBIMEarthTools/地质建模/Old/DWGDataExport.cs
2018-10-22 19:28:56 +08:00

291 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
namespace EarthLayerModel
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class uBIM_EarthTools : IExternalCommand
{
public Result Execute(Autodesk.Revit.UI.ExternalCommandData CommandData, ref string Message, ElementSet elementset)
{
Autodesk.Revit.ApplicationServices.Application Revit = CommandData.Application.Application;
Autodesk.Revit.UI.UIDocument uidoc = CommandData.Application.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = CommandData.Application.ActiveUIDocument.Document;
ICollection<ElementId> currentselectid = uidoc.Selection.GetElementIds();
Autodesk.Revit.DB.View curview = doc.ActiveView;
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\data.csv";
//MessageBox.Show("注意要在±0平面视图运行。", "向日葵", MessageBoxButtons.OK);
//所有文字
List<TextNote> textnoteList = new List<TextNote>();
ICollection<ElementId> textnoteid_list = (new FilteredElementCollector(doc, curview.Id)).
WherePasses(new ElementClassFilter(typeof(TextNote))).ToElementIds();
foreach (ElementId eid in textnoteid_list)
textnoteList.Add(doc.GetElement(eid) as TextNote);
//所有线条
//List<DetailCurve> detaillineList = new List<DetailCurve>();
//ICollection<ElementId> detaillineidList = (new FilteredElementCollector(doc, curview.Id)).
// WherePasses(new CurveElementFilter(CurveElementType.DetailCurve)).ToElementIds();
//foreach (ElementId eid in detaillineidList)
// detaillineList.Add(doc.GetElement(eid) as DetailCurve);
//所有1000的水平分格线
//List<DetailLine> dl_fg_list = new List<DetailLine>();
//foreach (DetailCurve dltmp in detailline_list)
//{
// if (dltmp.GetType().Name != "DetailLine")
// continue;
// DetailLine dl = dltmp as DetailLine;
// if (dltmp.GeometryCurve.Length < 900 / 304.8 || dltmp.GeometryCurve.Length > 1100 / 304.8)
// continue;
// XYZ pp1 = dl.GeometryCurve.GetEndPoint(0);
// XYZ pp2 = dl.GeometryCurve.GetEndPoint(1);
// if (Math.Abs(pp1.Y - pp2.Y) < 0.1)
// dl_fg_list.Add(dl);
//}
XYZ origin = new XYZ();
XYZ origin2 = new XYZ();
try
{
origin = uidoc.Selection.PickPoint(ObjectSnapTypes.Endpoints, "点击图框左上角……");
origin2 = uidoc.Selection.PickPoint(ObjectSnapTypes.Endpoints, "点击第二个图框左上角……");
}
catch
{
return Result.Cancelled;
}
string allstr = ""; //总记录
List<int> maybe_error_list = new List<int>(); //可能出错的行
//——————————————以下为深国际商业及写字楼的dwg定位数据——————————————
//double column1_x1 = 2390 / 304.8; //第一列地层编号左侧x坐标
//double column1_x2 = 3390 / 304.8; //第一列地层编号右侧x坐标
//double column3_x1 = 4390 / 304.8; //第三列层底高程左侧x坐标
//double column3_x2 = 5390 / 304.8; //第三列层底高程右侧x坐标
//double column_y = -9000 / 304.8; //此Y坐标以下为地层数据
//——————————————以下为dwg定位数据——————————————
double column1_x1 = 43.2 / 304.8; //地层编号左侧x坐标
double column1_x2 = 52.9896 / 304.8; //地层编号右侧x坐标
double column3_x1 = 13.8312 / 304.8; //层底高程左侧x坐标
double column3_x2 = 23.6208 / 304.8; //层底高程右侧x坐标
double column_y = -62.3 / 304.8; //此Y坐标以下为地层数据
TransactionStatus status = TransactionStatus.Uninitialized;
TransactionGroup transGroup = new TransactionGroup(doc, "地质建模");
if (transGroup.Start() == TransactionStatus.Started)
{
List<TextNote> del_textnote_list = new List<TextNote>(); //被归并的textnote后面被排除
//int k = 0;
//do
for (int k = 0; k <= 7; k++) //钻点数量
{
//求第i格的数字表示地层编号
//try
//{
XYZ origin_k = origin + new XYZ(k * (origin2.X - origin.X), 0, 0);
List<TextNote> textnote_k_list = new List<TextNote>(); //当前图框里的textnote
foreach (TextNote tntmp in textnoteList)
{
//tntmp.Coord.Y > origin_k.Y - 29106 / 304.8 && tntmp.Coord.Y < origin_k.Y)
if (tntmp.Coord.X > origin_k.X && tntmp.Coord.X < origin_k.X + 178 / 304.8 &&
tntmp.Coord.Y > origin_k.Y - 267 / 304.8 && tntmp.Coord.Y < origin_k.Y)
{
//消重
Boolean dub = false;
for (int i = 0; i <= textnote_k_list.Count - 1; i++)
{
TextNote tntmp1 = textnote_k_list[i];
if (tntmp.Coord.DistanceTo(tntmp1.Coord) < 10 / 304.8 && tntmp.Text == tntmp1.Text)
{
dub = true;
break;
}
}
if (dub == false)
textnote_k_list.Add(tntmp);
}
}
if (textnote_k_list.Count == 0) //结束
break;
//——————————————以下为深国际商业及写字楼的dwg定位数据——————————————
//TextNote zkbh_tn = Textnote_At_Point(origin_k + new XYZ(12890 / 304.8, -4350 / 304.8, 0), textnote_k_list); //钻孔编号
//TextNote kkbg_tn = Textnote_At_Point(origin_k + new XYZ(5200 / 304.8, -5220 / 304.8, 0), textnote_k_list); //孔口标高
//TextNote x_tn = Textnote_At_Point(origin_k + new XYZ(8490 / 304.8, -5220 / 304.8, 0), textnote_k_list); //孔口X
//TextNote y_tn = Textnote_At_Point(origin_k + new XYZ(8490 / 304.8, -6100 / 304.8, 0), textnote_k_list); //孔口Y
//——————————————以下为深国际住宅旋挖桩的dwg定位数据——————————————
TextNote zkbh_tn = Textnote_At_Point(origin_k + new XYZ(24.73 / 304.8, -21.46 / 304.8, 0), textnote_k_list); //钻孔编号
TextNote kkbg_tn = Textnote_At_Point(origin_k + new XYZ(24.73 / 304.8, -30.4 / 304.8, 0), textnote_k_list); //孔口标高
TextNote x_tn = Textnote_At_Point(origin_k + new XYZ(61.75 / 304.8, -21.46 / 304.8, 0), textnote_k_list); //孔口X
TextNote y_tn = Textnote_At_Point(origin_k + new XYZ(61.75 / 304.8, -30.4 / 304.8, 0), textnote_k_list); //孔口Y
if (zkbh_tn == null || kkbg_tn == null) //钻孔编号跟孔口标高不对应
continue;
//归并类似3-1的文字
foreach (TextNote tntmp1 in textnote_k_list)
{
if (tntmp1.Coord.X > origin_k.X + column1_x2)
continue;
if (del_textnote_list.Contains(tntmp1))
continue;
foreach (TextNote tntmp2 in textnote_k_list)
{
if (del_textnote_list.Contains(tntmp2))
continue;
if (tntmp2.Coord.X > origin_k.X + column1_x2)
continue;
if (tntmp1.Id == tntmp2.Id)
continue;
//三重过滤X相近、Y相近、字高不一
if (Math.Abs(tntmp1.Coord.X - tntmp2.Coord.X) < 6 / 304.8 &&
Math.Abs(tntmp1.Coord.Y - tntmp2.Coord.Y) < 4 / 304.8 &&
Math.Abs(tntmp1.Height - tntmp2.Height) > 0.00001 / 304.8)
{
//TaskDialog.Show("Show", (Math.Abs(tntmp1.Coord.X - tntmp2.Coord.X) * 304.8).ToString());
Transaction transaction = new Transaction(doc, "yy"); transaction.Start();
if (tntmp1.Height > tntmp2.Height)
{
tntmp1.Text = "=\"" + tntmp1.Text + "-" + tntmp2.Text + "\"";
del_textnote_list.Add(tntmp2);
}
else
{
tntmp2.Text = "=\"" + tntmp2.Text + "-" + tntmp1.Text + "\"";
del_textnote_list.Add(tntmp1);
}
transaction.Commit();
}
}
}
textnote_k_list = textnote_k_list.Except(del_textnote_list).ToList<TextNote>();
List<TextNote> dcbh_list = new List<TextNote>(); //地层编号
List<double> dcbh_Y_list = new List<double>(); //地层编号Y坐标
List<TextNote> dcmc_list = new List<TextNote>(); //地层名称
List<double> dcmc_Y_list = new List<double>(); //地层名称Y坐标
string record1 = zkbh_tn.Text + "," + kkbg_tn.Text + ",";
string record2 = zkbh_tn.Text + "," + kkbg_tn.Text + ",";
for (int i = 0; i <= textnote_k_list.Count - 1; i++)
{
TextNote tntmp = textnote_k_list[i];
if (tntmp.Coord.Y > origin_k.Y + column_y)
continue;
if (tntmp.Coord.X > origin_k.X + column1_x1 && tntmp.Coord.X < origin_k.X + column1_x2)
{
dcbh_list.Add(tntmp);
dcbh_Y_list.Add(tntmp.Coord.Y);
}
if (tntmp.Coord.X > origin_k.X + column3_x1 && tntmp.Coord.X < origin_k.X + column3_x2)
{
dcmc_list.Add(tntmp);
dcmc_Y_list.Add(tntmp.Coord.Y);
}
}
dcbh_Y_list.Sort();
dcbh_Y_list.Reverse(); //从高到低
dcmc_Y_list.Sort();
dcmc_Y_list.Reverse(); //从高到低
for (int i = 0; i < dcbh_list.Count; i++)
{
if (i > dcmc_list.Count - 1)
break;
string dcbh_i = "";
string dcmc_i = "";
foreach (TextNote tn in dcbh_list)
{
if (tn.Coord.Y == dcbh_Y_list[i])
dcbh_i = tn.Text;
}
foreach (TextNote tn in dcmc_list)
{
if (tn.Coord.Y == dcmc_Y_list[i])
dcmc_i = tn.Text;
}
record1 += dcbh_i + ",";
record2 += dcmc_i + ",";
}
//补齐空格
for (int i = 1; i <= 16 - dcbh_list.Count; i++)
{
record1 += " ,";
record2 += " ,";
}
record1 += x_tn.Text + "," + y_tn.Text;
record2 += x_tn.Text + "," + y_tn.Text;
allstr += record1 + "\r\n" + record2 + "\r\n";
//k++;
//}
//catch
//{
// MessageBox.Show(k + "\n" + "OK", "向日葵", MessageBoxButtons.OK);
// break;
//}
}
//while (k > 0);
Transaction transaction10 = new Transaction(doc, "yy"); transaction10.Start();
foreach (TextNote tn in del_textnote_list)
doc.Delete(tn.Id);
transaction10.Commit();
File.WriteAllText(path, allstr, Encoding.Default);
}
status = transGroup.RollBack();
string tips = "已导出到" + path + "。数据请查对。";
//foreach (int t in maybe_error_list)
// tips += t.ToString() + " , ";
//MessageBox.Show(tips, "向日葵", MessageBoxButtons.OK);
return Result.Succeeded;
}
//求某点处的textnote在textnote_list范围内
public TextNote Textnote_At_Point(XYZ p, List<TextNote> textnote_list)
{
TextNote tn = null;
foreach (TextNote tntmp in textnote_list)
{
if (tntmp.Coord.DistanceTo(new XYZ(p.X, p.Y, tntmp.Coord.Z)) < 5 / 304.8)
{
tn = tntmp;
}
}
return tn;
}
}
}