uBIMEarthTools/地质建模/地质建模 - 副本 (2).cs
2018-10-22 19:28:56 +08:00

1375 lines
70 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.Data;
using System.Collections;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Data.OleDb;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Creation;
using Autodesk.Revit.DB.Structure;
namespace EarthLayerModel
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class EarthLayerModel : IExternalCommand
{
public Result Execute(Autodesk.Revit.UI.ExternalCommandData CommandData, ref string Message, ElementSet elementset)
{
int page_index = 1; //页面每个excel文件不一样应该要做个窗口下拉。从1算起。
int x_column = 20; //XY通常是反的这里是按真实的XY读取
int y_column = 19;
int z_column = 2; //“孔口标高”
int begin_row = 1; //从第几行开始是正式坐标数据。从1算起。
MessageBox.Show("当前Z坐标使用孔口相对坐标。" + "\n" + "OK", "向日葵", MessageBoxButtons.OK);
//找两个孔口,用绝对坐标对应相对坐标。
//XYZ p1_abs = new XYZ(97447290 / 304.8, 15426770 / 304.8, 5000 / 304.8); //P1绝对坐标
//XYZ p2_abs = new XYZ(97508030 / 304.8, 15496130 / 304.8, 5000 / 304.8); //P2绝对坐标
//XYZ p1_relative = new XYZ(-26559.4706 / 304.8, -5303.8028 / 304.8, 0); //P1相对坐标
//XYZ p2_relative = new XYZ(65390.1059 / 304.8, 1436.5661 / 304.8, 0); //P2相对坐标
XYZ p1_abs = new XYZ(0, 0, 0);
XYZ p2_abs = new XYZ(0, 0, 0);
XYZ p1_relative = new XYZ(0, 0, 0);
XYZ p2_relative = new XYZ(0, 0, 0);
double angle = -Math.PI * (ang_of_vector(p1_relative, p2_relative) - ang_of_vector(p1_abs, p2_abs)) / 180;
Transform tf = Transform.Identity;
tf.Origin = p1_relative - p1_abs;
tf.BasisX = XYZ.BasisX;
tf.BasisY = XYZ.BasisY;
tf.BasisZ = XYZ.BasisZ;
Transform tf2 = Transform.Identity;
tf2.Origin = XYZ.Zero;
tf2.BasisX = new XYZ(Math.Cos(angle), Math.Sin(angle), 0);
tf2.BasisY = new XYZ(-Math.Sin(angle), Math.Cos(angle), 0);
tf2.BasisZ = XYZ.BasisZ;
Transform tf3 = Transform.Identity;
tf3.Origin = p1_relative - tf2.Inverse.OfPoint(p1_relative);
tf3.BasisX = XYZ.BasisX;
tf3.BasisY = XYZ.BasisY;
tf3.BasisZ = XYZ.BasisZ;
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 tmppath = System.IO.Path.GetTempPath();
List<string> delfile_list = new List<string>();
#region//求实体填充
ElementId solidid = ElementId.InvalidElementId;
IList<Element> fplist = (new FilteredElementCollector(doc)).OfClass(typeof(FillPatternElement)).ToElements();
foreach (Element ee in fplist)
{
if (ee.Name == "实体填充")
{
solidid = ee.Id;
break;
}
if (solidid == ElementId.InvalidElementId)
{
MessageBox.Show("找不到名为“实体填充”的填充样式,请先新建一个。", "向日葵", MessageBoxButtons.OK);
return Autodesk.Revit.UI.Result.Succeeded;
}
}
#endregion
TransactionStatus status = TransactionStatus.Uninitialized;
TransactionGroup transGroup = new TransactionGroup(doc, "地质建模");
if (transGroup.Start() == TransactionStatus.Started)
{
#region//加共享参数-常规模型
String newfName = Revit.RecordingJournalFilename;
string sharepara_txt = "*META VERSION MINVERSION" + "\r\n";
sharepara_txt += "META 2 1" + "\r\n";
sharepara_txt += "*GROUP ID NAME" + "\r\n";
sharepara_txt += "GROUP 1 地质参数" + "\r\n";
sharepara_txt += "*PARAM GUID NAME DATATYPE DATACATEGORY GROUP VISIBLE DESCRIPTION USERMODIFIABLE" + "\r\n";
sharepara_txt += "PARAM" + "\t" + "11b28335-372f-479d-acf5-ddc3103cd76d" + "\t" + "孔号1" + " TEXT 1 1 1" + "\r\n";
sharepara_txt += "PARAM" + "\t" + "64331fcb-5a1c-4f30-bc6c-4fae29921a9e" + "\t" + "孔号2" + " TEXT 1 1 1" + "\r\n";
sharepara_txt += "PARAM" + "\t" + "85345026-1981-45b9-b1fb-460805a7d924" + "\t" + "孔号3" + " TEXT 1 1 1" + "\r\n";
String fName = newfName.Substring(0, newfName.LastIndexOf("\\")) + "\\地质建模Para.txt";
StreamWriter sw = new StreamWriter(fName, false, Encoding.Unicode);
sw.Write(sharepara_txt);
sw.Close();
Revit.SharedParametersFilename = fName;
DefinitionFile sharedParametersFile_gm = Revit.OpenSharedParameterFile();
DefinitionGroup group_gm = sharedParametersFile_gm.Groups.get_Item("地质参数");
CategorySet catSet_gm = Revit.Create.NewCategorySet();
catSet_gm.Insert(doc.Settings.Categories.get_Item(BuiltInCategory.OST_GenericModel));
Autodesk.Revit.DB.Binding binding_gm = Revit.Create.NewInstanceBinding(catSet_gm);
Transaction transaction21 = new Transaction(doc, "共享参数"); transaction21.Start();
foreach (Definition df in group_gm.Definitions)
doc.ParameterBindings.Insert(df, binding_gm);
transaction21.Commit();
#endregion
//加载族
Transaction transaction = new Transaction(doc, "load the FamilySymbol"); transaction.Start();
IEnumerable<FamilySymbol> familysymbols_bj = from elem in new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol))
let fstmp = elem as FamilySymbol
where fstmp.Name.Contains("钻孔标记")
select fstmp;
if (familysymbols_bj.Count() == 0)
{
MessageBox.Show("请先加载配套的“钻孔标记”族。", "向日葵", MessageBoxButtons.OK);
status = transGroup.Assimilate();
return Result.Succeeded;
}
FamilySymbol fs_bj = doc.GetElement(familysymbols_bj.First().Id) as FamilySymbol;
fs_bj.Activate();
transaction.Commit();
List<Solid> solid_list = new List<Solid>();
List<String> layername_list = new List<String>();
List<int> index1_list = new List<int>();
List<int> index2_list = new List<int>();
List<int> index3_list = new List<int>();
List<String> kh1_list = new List<String>();
List<String> kh2_list = new List<String>();
List<String> kh3_list = new List<String>();
List<XYZ> delta_list = new List<XYZ>();
List<int> int_list = new List<int>();
string pathstring = "";
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择Excel文件…";
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//桌面路径 //注意这里写路径时要用c:\\而不是c:\
openFileDialog.Filter = "文本文件|*.xls";
openFileDialog.RestoreDirectory = true;
openFileDialog.FilterIndex = 1;
if (openFileDialog.ShowDialog() == DialogResult.OK)
pathstring = openFileDialog.FileName;
else
return Result.Succeeded;
Microsoft.Office.Interop.Excel.Workbook wb = null;
Microsoft.Office.Interop.Excel.Worksheet ws = null;
//ArrayList columnArr = new ArrayList();//列字段表
//DataSet myDs = new DataSet();
//System.Data.DataTable xlsTable = myDs.Tables.Add("show");
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//lauch excel application
if (excel != null)
{
excel.Visible = true;
//excel.UserControl = true;
// 以只读的形式打开EXCEL文件
wb = excel.Workbooks.Open(pathstring, missing, true, missing, missing, missing,
missing, missing, missing, true, missing, missing, missing, missing, missing);
ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(page_index);
//取得总记录行数(包括标题列)
int rowsint = ws.UsedRange.Rows.Count; //得到行数
//int rowsint = begin_row + 2*10;
int columnsint = ws.UsedRange.Columns.Count;//得到列数
List<string> name_list = new List<string>(); //string值集合用来区分过滤器
List<string> kh_list = new List<string>(); //孔号集合
List<XYZ> point_list = new List<XYZ>();
List<List<string>> str_list_list = new List<List<string>>(); //每一个点对应有一列string
List<List<XYZ>> point_list_list = new List<List<XYZ>>(); //每一个点对应有一列点Z坐标不同
for (int m = begin_row; m <= rowsint; m++)
{
if (ws.Cells[m, z_column].Text == "")
continue;
if (m / 2 != (m + 1) / 2) //m为奇数
{
List<string> newstring_list = new List<string>();
List<XYZ> newpoint_list = new List<XYZ>();
double x = 0;
double y = 0;
double z = 0;
x = double.Parse((ws.Cells[m, x_column]).Text.Replace("Y=", "")) * 1000 / 304.8;
y = double.Parse((ws.Cells[m, y_column]).Text.Replace("X=", "")) * 1000 / 304.8;
z = double.Parse((ws.Cells[m, z_column]).Text) * 1000 / 304.8;
//加上相对坐标转换
point_list.Add(tf3.OfPoint(tf2.Inverse.OfPoint(tf.OfPoint(new XYZ(x, y, z)))));
newpoint_list.Add(tf3.OfPoint(tf2.Inverse.OfPoint(tf.OfPoint(new XYZ(x, y, z)))));
//第i个string对应第i个点与第i+1个点
for (int n = z_column + 1; n < Math.Min(x_column, y_column); n++)
{
string name = ws.Cells[m, n].Text.ToString();
//try
//{
// double test = 0;
// if (!name.Contains("-"))
// test = double.Parse(name);
// else
// test = double.Parse(name.ElementAt(0).ToString()); //奇怪,不能用""来过滤
//}
//catch
//{
// //MessageBox.Show(m + "\n" + n, "向日葵", MessageBoxButtons.OK);
// continue;
//}
if (!(name.Contains("0") || name.Contains("1") || name.Contains("2") || name.Contains("3") || name.Contains("4") ||
name.Contains("5") || name.Contains("6") || name.Contains("7") || name.Contains("8") || name.Contains("9")))
continue;
if (name == "")
continue;
//if (name == "1")
// name += " 填土(填石)";
//if (name == "2")
// name += " 淤泥";
//if (name == "3-1")
// name += " 黏土";
//if (name == "3-2")
// name += " 砾砂";
//if (name == "4")
// name += " 砂质黏性土";
//if (name == "5-1")
// name += " 全风化花岗岩";
//if (name == "5-2")
// name += " 强风化花岗岩";
//if (name == "5-3")
// name += " 中风化花岗岩";
//if (name == "5-4")
// name += " 微风化花岗岩";
if (ws.Cells[m, n].Text != "")
{
if (!name_list.Contains(name))
name_list.Add(name);
newstring_list.Add(name);
try
{
double zp = z - double.Parse((ws.Cells[m + 1, n]).Text) * 1000 / 304.8; //相对Z坐标
//double zp = double.Parse((ws.Cells[m + 1, n]).Text) * 1000 / 304.8; //绝对Z坐标
newpoint_list.Add(tf3.OfPoint(tf2.Inverse.OfPoint(tf.OfPoint(new XYZ(x, y, zp)))));
}
catch
{
//MessageBox.Show((ws.Cells[m, n]).Text + "\n" + m + "\n" + n, "向日葵", MessageBoxButtons.OK);
}
}
}
str_list_list.Add(newstring_list);
point_list_list.Add(newpoint_list);
kh_list.Add(ws.Cells[m, 1].Text);
}
}
//MessageBox.Show(str_list_list[0][0] + "\n" + str_list_list[0][1], "向日葵", MessageBoxButtons.OK);
//求包络外框
double x_min = point_list[0].X; double x_max = point_list[0].X;
double y_min = point_list[0].Y; double y_max = point_list[0].Y;
double z_mmm = point_list[0].Z + 1000 / 304.8;
foreach (XYZ p in point_list)
{
if (p.X > x_max)
x_max = p.X;
if (p.X < x_min)
x_min = p.X;
if (p.Y > y_max)
y_max = p.Y;
if (p.Y < y_min)
y_min = p.Y;
}
x_min -= 20000 / 304.8;
y_min -= 20000 / 304.8;
x_max += 20000 / 304.8;
y_max += 20000 / 304.8;
XYZ left_bottom = new XYZ(x_min, y_min, z_mmm);
XYZ right_top = new XYZ(x_max, y_max, z_mmm);
//建楼板
Curve c1 = Line.CreateBound(new XYZ(x_min, y_min, z_mmm), new XYZ(x_max, y_min, z_mmm));
Curve c2 = Line.CreateBound(new XYZ(x_max, y_min, z_mmm), new XYZ(x_max, y_max, z_mmm));
Curve c3 = Line.CreateBound(new XYZ(x_max, y_max, z_mmm), new XYZ(x_min, y_max, z_mmm));
Curve c4 = Line.CreateBound(new XYZ(x_min, y_max, z_mmm), new XYZ(x_min, y_min, z_mmm));
CurveArray ca = new CurveArray();
ca.Append(c1); ca.Append(c2); ca.Append(c3); ca.Append(c4);
Transaction transaction40 = new Transaction(doc, "yy"); transaction40.Start();
Floor floor = doc.Create.NewFloor(ca, true);
transaction40.Commit();
//求三角剖分
Transaction transaction2 = new Transaction(doc, "yy");
FailureHandlingOptions failureHandlingOptions2 = transaction2.GetFailureHandlingOptions();
FailureHandler failureHandler2 = new FailureHandler();
failureHandlingOptions2.SetFailuresPreprocessor(failureHandler2);
failureHandlingOptions2.SetClearAfterRollback(true);
transaction2.SetFailureHandlingOptions(failureHandlingOptions2);
transaction2.Start();
int k = -1;
foreach (XYZ p in point_list)
{
k = (-1) * k;
XYZ newp = new XYZ(p.X, p.Y, p.Z + k * 1000 / 304.8);
SlabShapeEditor sse = floor.SlabShapeEditor;
sse.DrawPoint(newp);
}
transaction2.Commit();
List<Curve> curve_list = new List<Curve>();
SlabShapeEditor sse_ok = floor.SlabShapeEditor;
foreach (SlabShapeCrease ssc in sse_ok.SlabShapeCreases)
{
Curve cc = Line.CreateBound(new XYZ(ssc.Curve.GetEndPoint(0).X, ssc.Curve.GetEndPoint(0).Y, 0),
new XYZ(ssc.Curve.GetEndPoint(1).X, ssc.Curve.GetEndPoint(1).Y, 0));
curve_list.Add(cc);
}
//先放标记
Transaction transaction35 = new Transaction(doc, "yy"); transaction35.Start();
for (int i = 0; i <= point_list.Count - 1; i++)
{
FamilyInstance fi_bj = doc.Create.NewFamilyInstance(point_list[i], fs_bj, StructuralType.NonStructural);
fi_bj.LookupParameter("孔号").Set(kh_list[i]);
}
transaction35.Commit();
#region //地形建模
//求三角面
List<int[]> itr_list = new List<int[]>();
for (int i = 0; i <= point_list.Count - 3; i++)
{
for (int t = i + 1; t <= point_list.Count - 2; t++)
{
XYZ p1 = point_list[i];
XYZ p2 = point_list[t];
XYZ p10 = new XYZ(p1.X, p1.Y, 0);
XYZ p20 = new XYZ(p2.X, p2.Y, 0);
//if (p10.DistanceTo(p20) > 50000 / 304.8) //大于50米不考虑连接
// continue;
for (int r = t + 1; r <= point_list.Count - 1; r++)
{
XYZ p3 = point_list[r];
XYZ p30 = new XYZ(p3.X, p3.Y, 0);
//if (p30.DistanceTo(p10) > 50000 / 304.8 || p30.DistanceTo(p20) > 50000 / 304.8) //大于50米不考虑连接
// continue;
Curve ctmp1 = null;
Curve ctmp2 = null;
Curve ctmp3 = null;
for (int a = 0; a <= curve_list.Count - 1; a++)
{
if (curve_list[a].GetEndPoint(0).DistanceTo(p10) < 0.01 && curve_list[a].GetEndPoint(1).DistanceTo(p20) < 0.01)
ctmp1 = curve_list[a];
if (curve_list[a].GetEndPoint(1).DistanceTo(p10) < 0.01 && curve_list[a].GetEndPoint(0).DistanceTo(p20) < 0.01)
ctmp1 = curve_list[a];
if (curve_list[a].GetEndPoint(0).DistanceTo(p10) < 0.01 && curve_list[a].GetEndPoint(1).DistanceTo(p30) < 0.01)
ctmp2 = curve_list[a];
if (curve_list[a].GetEndPoint(1).DistanceTo(p10) < 0.01 && curve_list[a].GetEndPoint(0).DistanceTo(p30) < 0.01)
ctmp2 = curve_list[a];
if (curve_list[a].GetEndPoint(0).DistanceTo(p20) < 0.01 && curve_list[a].GetEndPoint(1).DistanceTo(p30) < 0.01)
ctmp3 = curve_list[a];
if (curve_list[a].GetEndPoint(1).DistanceTo(p20) < 0.01 && curve_list[a].GetEndPoint(0).DistanceTo(p30) < 0.01)
ctmp3 = curve_list[a];
}
if (ctmp1 != null && ctmp2 != null && ctmp3 != null)
{
//现在有三个inti、t、r互相连接
int[] itr = new int[3];
itr[0] = i;
itr[1] = t;
itr[2] = r;
itr_list.Add(itr);
}
}
}
}
foreach (int[] itr in itr_list)
{
int i = itr[0];
int t = itr[1];
int r = itr[2];
List<XYZ> xyz_i = point_list_list[i];
List<XYZ> xyz_t = point_list_list[t];
List<XYZ> xyz_r = point_list_list[r];
List<string> str_i = str_list_list[i];
List<string> str_t = str_list_list[t];
List<string> str_r = str_list_list[r];
List<int> int_i_list = new List<int>(); //i列已经用了的index
List<int> int_t_list = new List<int>(); //t列已经用了的index
List<int> int_r_list = new List<int>(); //r列已经用了的index
//汇总三个点的所有Z坐标最下面一点除外因为第i个str对应第i个点和第i+1个点排序
List<double> z_list = new List<double>();
for (int q = 0; q < xyz_i.Count - 1; q++)
{
XYZ p = xyz_i[q];
Boolean add = true;
foreach (double d in z_list)
{
if (Math.Abs(d - p.Z) < 0.001)
{
add = false;
break;
}
}
if (add)
z_list.Add(p.Z);
}
for (int q = 0; q < xyz_t.Count - 1; q++)
{
XYZ p = xyz_t[q];
Boolean add = true;
foreach (double d in z_list)
{
if (Math.Abs(d - p.Z) < 0.001)
{
add = false;
break;
}
}
if (add)
z_list.Add(p.Z);
}
for (int q = 0; q < xyz_r.Count - 1; q++)
{
XYZ p = xyz_r[q];
Boolean add = true;
foreach (double d in z_list)
{
if (Math.Abs(d - p.Z) < 0.001)
{
add = false;
break;
}
}
if (add)
z_list.Add(p.Z);
}
z_list.Sort();
z_list.Reverse();
//MessageBox.Show(z_list[0]*304.8 + "\n" + z_list[1] * 304.8, "向日葵", MessageBoxButtons.OK);
//MessageBox.Show(xyz_i[0].Z * 304.8 + "\n" + xyz_i[1].Z * 304.8, "向日葵", MessageBoxButtons.OK);
//从高到低依次检测各点
for (int q = 0; q < z_list.Count; q++)
{
int index_i = -1;
int index_ii = -1;
int index_t = -1;
int index_tt = -1;
int index_r = -1;
int index_rr = -1;
string layername = "";
double dd = z_list[q];
for (int y = 0; y < str_i.Count; y++)
{
if (int_i_list.Contains(index_i))
continue;
if (int_i_list.Count > 0)
{
if (y < int_i_list[int_i_list.Count - 1])
continue;
}
if (Math.Abs(dd - xyz_i[y].Z) < 0.001)
{
index_i = y;
break;
}
}
for (int y = 0; y < str_t.Count; y++)
{
if (int_t_list.Contains(index_t))
continue;
if (int_t_list.Count > 0)
{
if (y < int_t_list[int_t_list.Count - 1])
continue;
}
if (Math.Abs(dd - xyz_t[y].Z) < 0.001)
{
index_t = y;
break;
}
}
for (int y = 0; y < str_r.Count; y++)
{
if (int_r_list.Contains(index_r))
continue;
if (int_r_list.Count > 0)
{
if (y < int_r_list[int_r_list.Count - 1])
continue;
}
if (Math.Abs(dd - xyz_r[y].Z) < 0.001)
{
index_r = y;
break;
}
}
//MessageBox.Show(index_i + "\n" + index_t + "\n" + index_r, "向日葵", MessageBoxButtons.OK);
if (index_i != -1) //当前检测点属于i列
{
index_ii = index_i + 1;
layername = str_i[index_i];
for (int y = 0; y < str_t.Count; y++)
{
if (int_t_list.Contains(y))
continue;
if (int_t_list.Count > 0)
{
if (y < int_t_list[int_t_list.Count - 1])
continue;
}
if (str_t[y] == str_i[index_i])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_i[index_i].Z - xyz_t[y].Z) / xyz_i[index_i].DistanceTo(xyz_t[y]) < 0.5)
{
index_t = y; //t列有
index_tt = y + 1;
break;
}
}
}
if (index_t == -1) //t列没有
{
if (int_t_list.Count == 0)
index_t = 0;
else
index_t = int_t_list.Count - 1;
index_tt = index_t;
}
for (int y = 0; y < str_r.Count; y++)
{
if (int_r_list.Contains(y))
continue;
if (int_r_list.Count > 0)
{
if (y < int_r_list[int_r_list.Count - 1])
continue;
}
if (str_r[y] == str_i[index_i])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_i[index_i].Z - xyz_r[y].Z) / xyz_i[index_i].DistanceTo(xyz_r[y]) < 0.5)
{
index_r = y; //r有
index_rr = y + 1;
break;
}
}
}
if (index_r == -1) //r列没有
{
if (int_r_list.Count == 0)
index_r = 0;
else
index_r = int_r_list.Count - 1;
index_rr = index_r;
}
}
else if (index_t != -1) //当前检测点属于t列
{
index_tt = index_t + 1;
layername = str_t[index_t];
for (int y = 0; y < str_i.Count; y++)
{
if (int_i_list.Contains(y))
continue;
if (int_i_list.Count > 0)
{
if (y < int_i_list[int_i_list.Count - 1])
continue;
}
if (str_i[y] == str_t[index_t])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_t[index_t].Z - xyz_i[y].Z) / xyz_t[index_t].DistanceTo(xyz_i[y]) < 0.5)
{
index_i = y; //i列有
index_ii = y + 1;
break;
}
}
}
if (index_i == -1) //i列没有
{
if (int_i_list.Count == 0)
index_i = 0;
else
index_i = int_i_list.Count - 1;
index_ii = index_i;
}
for (int y = 0; y < str_r.Count; y++)
{
if (int_r_list.Contains(y))
continue;
if (int_r_list.Count > 0)
{
if (y < int_r_list[int_r_list.Count - 1])
continue;
}
if (str_r[y] == str_t[index_t])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_t[index_t].Z - xyz_r[y].Z) / xyz_t[index_t].DistanceTo(xyz_r[y]) < 0.5)
{
index_r = y; //r有
index_rr = y + 1;
break;
}
}
}
if (index_r == -1) //r列没有
{
if (int_r_list.Count == 0)
index_r = 0;
else
index_r = int_r_list.Count - 1;
index_rr = index_r;
}
}
else if (index_r != -1) //当前检测点属于r列
{
index_rr = index_r + 1;
layername = str_r[index_r];
for (int y = 0; y < str_t.Count; y++)
{
if (int_t_list.Contains(y))
continue;
if (int_t_list.Count > 0)
{
if (y < int_t_list[int_t_list.Count - 1])
continue;
}
if (str_t[y] == str_r[index_r])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_r[index_r].Z - xyz_t[y].Z) / xyz_r[index_r].DistanceTo(xyz_t[y]) < 0.5)
{
index_t = y; //t列有
index_tt = y + 1;
break;
}
}
}
if (index_t == -1) //t列没有
{
if (int_t_list.Count == 0)
index_t = 0;
else
index_t = int_t_list.Count - 1;
index_tt = index_t;
}
for (int y = 0; y < str_i.Count; y++)
{
if (int_i_list.Contains(y))
continue;
if (int_i_list.Count > 0)
{
if (y < int_i_list[int_i_list.Count - 1])
continue;
}
if (str_i[y] == str_r[index_r])
{
//看Z坐标是否符合要求要求斜度不要太大
if ((xyz_r[index_r].Z - xyz_i[y].Z) / xyz_r[index_r].DistanceTo(xyz_i[y]) < 0.5)
{
index_i = y; //i有
index_ii = y + 1;
break;
}
}
}
if (index_i == -1) //i列没有
{
if (int_i_list.Count == 0)
index_i = 0;
else
index_i = int_i_list.Count - 1;
index_ii = index_i;
}
}
if (index_i == -1)
{
index_i = 0;
index_ii = 0;
}
if (index_t == -1)
{
index_t = 0;
index_tt = 0;
}
if (index_r == -1)
{
index_r = 0;
index_rr = 0;
}
//if (index_i >= xyz_i.Count - 1)
//{
// index_i = xyz_i.Count - 1;
// index_ii = xyz_i.Count - 1;
//}
//if (index_t >= xyz_t.Count - 1)
//{
// index_t = xyz_t.Count - 1;
// index_tt = xyz_t.Count - 1;
//}
//if (index_r >= xyz_r.Count - 1)
//{
// index_r = xyz_r.Count - 1;
// index_rr = xyz_r.Count - 1;
//}
//MessageBox.Show(index_i + "\n" + index_t + "\n" + index_r, "向日葵", MessageBoxButtons.OK);
try
{
XYZ delta = xyz_i[index_i];
XYZ p1a = xyz_i[index_i] - delta;
XYZ p2a = xyz_t[index_t] - delta;
XYZ p3a = xyz_r[index_r] - delta;
XYZ p1b = xyz_i[index_ii] - delta;
XYZ p2b = xyz_t[index_tt] - delta;
XYZ p3b = xyz_r[index_rr] - delta;
if (p1a.IsAlmostEqualTo(p1b) && p2a.IsAlmostEqualTo(p2b) && p3a.IsAlmostEqualTo(p3b)) //为什么会有这种情况?
continue;
if (p1a.IsAlmostEqualTo(p1b))
p1b += new XYZ(0, 0, -0.01);
if (p2a.IsAlmostEqualTo(p2b))
p2b += new XYZ(0, 0, -0.01);
if (p3a.IsAlmostEqualTo(p3b))
p3b += new XYZ(0, 0, -0.01);
Curve curve1a = Line.CreateBound(p1a, p2a);
Curve curve2a = Line.CreateBound(p2a, p3a);
Curve curve3a = Line.CreateBound(p3a, p1a);
Curve curve1b = Line.CreateBound(p1b, p2b);
Curve curve2b = Line.CreateBound(p2b, p3b);
Curve curve3b = Line.CreateBound(p3b, p1b);
CurveLoop cla = new CurveLoop();
CurveLoop clb = new CurveLoop();
cla.Append(curve1a); cla.Append(curve2a); cla.Append(curve3a);
clb.Append(curve1b); clb.Append(curve2b); clb.Append(curve3b);
Solid solid = null;
try
{
solid = GeometryCreationUtilities.CreateBlendGeometry(cla, clb, null);
}
catch
{ }
if (solid != null)
{
solid_list.Add(solid);
layername_list.Add(layername);
kh1_list.Add(kh_list[i]);
kh2_list.Add(kh_list[t]);
kh3_list.Add(kh_list[r]);
delta_list.Add(delta);
int_list.Add(index_i);
index1_list.Add(i);
index2_list.Add(t);
index3_list.Add(r);
int_i_list.Add(index_i);
int_t_list.Add(index_t);
int_r_list.Add(index_r);
}
}
catch
{
continue;
}
//}
//}
}
}
//材质集合
FilteredElementCollector m_collector = new FilteredElementCollector(doc);
ElementClassFilter m_typefilter = new ElementClassFilter(typeof(Material));
IList<Element> mtset = m_collector.WherePasses(m_typefilter).ToElements();
IList<string> mtnameset = new List<string>();
foreach (Element e in mtset)
{
mtnameset.Add(e.Name);
}
//做材质
for (int i = 0; i < name_list.Count; i++)
{
string str = name_list[i];
if (mtnameset.Contains(str))
continue;
Transaction transaction0 = new Transaction(doc, "yy");
FailureHandlingOptions failureHandlingOptions = transaction0.GetFailureHandlingOptions();
FailureHandler failureHandler = new FailureHandler();
failureHandlingOptions.SetFailuresPreprocessor(failureHandler);
failureHandlingOptions.SetClearAfterRollback(true);
transaction0.SetFailureHandlingOptions(failureHandlingOptions);
transaction0.Start();
Material m = creatematerial(doc, str, false);
Random RandomNum_First = new Random((int)DateTime.Now.Ticks);
System.Threading.Thread.Sleep(RandomNum_First.Next(50));
Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);
int int_Red = RandomNum_First.Next(256);
int int_Green = RandomNum_Sencond.Next(256);
int int_Blue = (int_Red + int_Green > 400) ? 0 : 400 - int_Red - int_Green;
int_Blue = (int_Blue > 255) ? 255 : int_Blue;
m.Color = new Color((byte)int_Red, (byte)int_Green, (byte)int_Blue);
m.MaterialClass = "地质材质";
mtset.Add(m);
transaction0.Commit();
}
//新材质集合
FilteredElementCollector m_collector2 = new FilteredElementCollector(doc);
ElementClassFilter m_typefilter2 = new ElementClassFilter(typeof(Material));
IList<Element> mtset2 = m_collector2.WherePasses(m_typefilter2).ToElements();
int t1 = solid_list.Count;
string s1 = "{0} of " + t1.ToString();
string caption1 = "生成";
using (FilterProgressForm prf1 = new FilterProgressForm(caption1, s1, t1))
{
//for (int i = 0; i <= 10; i++)
for (int i = 0; i <= solid_list.Count - 1; i++)
{
//做族
string templateFileName = Revit.FamilyTemplatePath + "\\公制常规模型.rft";
Autodesk.Revit.DB.Document familydoc_gd = Revit.NewFamilyDocument(templateFileName);
Autodesk.Revit.Creation.FamilyItemFactory creationFamily_gd = familydoc_gd.FamilyCreate;
Transaction transactionff = new Transaction(familydoc_gd, "yy"); transactionff.Start();
FamilyParameter fp = familydoc_gd.FamilyManager.AddParameter("材质", BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, true);
Element e = FreeFormElement.Create(familydoc_gd, solid_list[i]);
familydoc_gd.FamilyManager.AssociateElementParameterToFamilyParameter(e.LookupParameter("材质"), fp);
transactionff.Commit();
string tmp_fName = tmppath;
tmp_fName += "\\地质" + layername_list[i] + "层_" + index1_list[i] + "_" + index2_list[i] + "_" + index3_list[i] + "_";
tmp_fName += int_list[i].ToString() + ".rfa";
try
{
familydoc_gd.SaveAs(tmp_fName);
}
catch
{ }
familydoc_gd.Close(false);
delfile_list.Add(tmp_fName);
Transaction transaction23 = new Transaction(doc, "yy"); transaction23.Start();
doc.LoadFamily(tmp_fName);
transaction23.Commit();
string familyname = tmp_fName.Substring(tmp_fName.LastIndexOf("\\") + 1, tmp_fName.Length - tmp_fName.LastIndexOf("\\") - 5);
IEnumerable<FamilySymbol> familysymbols = from elem in new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol))
let fstmp = elem as FamilySymbol
where fstmp.Name == familyname
select fstmp;
FamilySymbol symbol = doc.GetElement(familysymbols.First().Id) as FamilySymbol;
Transaction transaction82 = new Transaction(doc, "yy"); transaction82.Start();
symbol.Activate();
transaction82.Commit();
Transaction transaction8 = new Transaction(doc, "yy"); transaction8.Start();
FamilyInstance fi = doc.Create.NewFamilyInstance(delta_list[i], symbol, curview.GenLevel, StructuralType.NonStructural);
transaction8.Commit();
Transaction transaction9 = new Transaction(doc, "yy"); transaction9.Start();
fi.LookupParameter("注释").Set(layername_list[i]);
fi.LookupParameter("孔号1").Set(kh1_list[i]);
fi.LookupParameter("孔号2").Set(kh2_list[i]);
fi.LookupParameter("孔号3").Set(kh3_list[i]);
foreach (Element me in mtset2)
{
if (me.Name == layername_list[i])
{
fi.LookupParameter("材质").Set(me.Id);
break;
}
}
transaction9.Commit();
if (prf1.progressBar1.Tag.ToString() == "Cancel")
break;
prf1.Increment();
}
}
#endregion
ICollection<ElementId> categories = new List<ElementId>();
foreach (Category c in doc.Settings.Categories)
{
BuiltInCategory bic = (BuiltInCategory)c.Id.IntegerValue;
if (c.Name == "常规模型")
categories.Add(c.Id);
}
//加过滤器
for (int i = 0; i < name_list.Count; i++)
{
string str = name_list[i];
FilterRule fr = null;
try
{
fr = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(-1010106), str, true);
}
catch
{
continue;
}
List<FilterRule> fr_list = new List<FilterRule>();
fr_list.Add(fr);
Transaction transaction00 = new Transaction(doc, "yy");
transaction00.Start();
try
{
ParameterFilterElement pf = ParameterFilterElement.Create(doc, str, categories, fr_list);
//Random RandomNum_First = new Random((int)DateTime.Now.Ticks);
//System.Threading.Thread.Sleep(RandomNum_First.Next(50));
//Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);
//// 为了在白色背景上显示,尽量生成深色
//int int_Red = RandomNum_First.Next(256);
//int int_Green = RandomNum_Sencond.Next(256);
//int int_Blue = (int_Red + int_Green > 400) ? 0 : 400 - int_Red - int_Green;
//int_Blue = (int_Blue > 255) ? 255 : int_Blue;
//OverrideGraphicSettings ogs = new OverrideGraphicSettings();
//ogs.SetProjectionLineColor(new Autodesk.Revit.DB.Color(0, 0, 0));
//ogs.SetProjectionLinePatternId(ElementId.InvalidElementId);
//ogs.SetProjectionFillColor(new Autodesk.Revit.DB.Color((byte)int_Red, (byte)int_Green, (byte)int_Blue));
//ogs.SetProjectionFillPatternId(solidid);
curview.AddFilter(pf.Id);
curview.SetFilterVisibility(pf.Id, true);
//curview.SetFilterOverrides(pf.Id, ogs);
}
catch
{ }
transaction00.Commit();
}
Transaction transaction1 = new Transaction(doc, "yy"); transaction1.Start();
curview.DisplayStyle = DisplayStyle.ShadingWithEdges;
transaction1.Commit();
Transaction transaction100 = new Transaction(doc, "yy"); transaction100.Start();
doc.Delete(floor.Id);
transaction100.Commit();
}
excel.Quit();
excel = null;
}
status = transGroup.Assimilate();
foreach (string delpath in delfile_list)
{
System.IO.File.Delete(delpath);
}
return Result.Succeeded;
}
//求b点相对于a点的角度从aX转到ab的角度从0到360。
public double ang_of_vector(XYZ a, XYZ b)
{
Double angle = 0;
if (a.X == b.X)
{
if (a.Y > b.Y)
angle = 270;
else
angle = 90;
}
if (a.Y == b.Y)
{
if (a.X > b.X)
angle = 180;
else
angle = 0;
}
if (a.X != b.X && a.Y != b.Y)
{
double atan = Math.Atan((b.Y - a.Y) / (b.X - a.X)) * 180 / Math.PI;
if (b.X > a.X && b.Y > a.Y)
angle = atan;
if (b.X < a.X)
angle = atan + 180;
if (b.X > a.X && b.Y < a.Y)
angle = atan + 360;
}
return angle;
}
//创建新材质
public Material creatematerial(Autodesk.Revit.DB.Document doc, string name, Boolean stru)
{
Material material = null;
try
{
ElementId materialId = Material.Create(doc, name);
material = doc.GetElement(materialId) as Material;
StructuralAsset strucAsset = new StructuralAsset("创筑", StructuralAssetClass.Undefined);
strucAsset.Behavior = StructuralBehavior.Isotropic;
PropertySetElement propertySet = PropertySetElement.Create(doc, strucAsset);
propertySet.get_Parameter(BuiltInParameter.PROPERTY_SET_NAME).Set(name);
propertySet.get_Parameter(BuiltInParameter.PHY_MATERIAL_PARAM_CLASS).Set((int)StructuralMaterialType.Undefined);
propertySet.get_Parameter(BuiltInParameter.PHY_MATERIAL_PARAM_UNIT_WEIGHT).Set(232);
material.SetMaterialAspectByPropertySet(Autodesk.Revit.DB.MaterialAspect.Structural, propertySet.Id);
}
catch
{ }
return material;
}
}
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class DWGDataExport : 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";
//所有文字
List<TextNote> textnote_list = new List<TextNote>();
ICollection<ElementId> textnoteid_list = (new FilteredElementCollector(doc, curview.Id)).
WherePasses(new ElementClassFilter(typeof(TextNote))).ToElementIds();
foreach (ElementId eid in textnoteid_list)
textnote_list.Add(doc.GetElement(eid) as TextNote);
//所有线条
List<DetailCurve> detailline_list = new List<DetailCurve>();
ICollection<ElementId> detaillineid_list = (new FilteredElementCollector(doc, curview.Id)).
WherePasses(new CurveElementFilter(CurveElementType.DetailCurve)).ToElementIds();
foreach (ElementId eid in detaillineid_list)
detailline_list.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(-2390 / 304.8, 9216 / 304.8, 0);
XYZ origin2 = new XYZ(-2390 / 304.8, 9216 / 304.8, 0);
try
{
origin = uidoc.Selection.PickPoint(ObjectSnapTypes.Endpoints, "点击图框左上角……");
origin2 = uidoc.Selection.PickPoint(ObjectSnapTypes.Endpoints, "点击第二个图框左上角……");
}
catch
{
return Result.Succeeded;
}
string allstr = ""; //总记录
List<int> maybe_error_list = new List<int>(); //可能出错的行
double column1_x1 = 1000 / 304.8; //第2列地层编号左侧x坐标
double column1_x2 = 2000 / 304.8; //第2列地层编号右侧x坐标
double column3_x1 = 2000 / 304.8; //第3列层底高程左侧x坐标
double column3_x2 = 3000 / 304.8; //第3列层底高程右侧x坐标
double column_y = -8000 / 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后面被排除
foreach (TextNote tntmp in textnote_list)
{
if (tntmp.Text == "汤世志" || tntmp.Text == "编 录")
del_textnote_list.Add(tntmp);
}
int k = 0;
string test = "";
do
//for (int k = 0; k <= 10; k++) //钻点数量
{
//求第i格的数字表示地层编号
try
{
XYZ origin_k = origin + new XYZ(k * 21000 / 304.8, 0, 0);
List<TextNote> textnote_k_list = new List<TextNote>(); //当前图框里的textnote
foreach (TextNote tntmp in textnote_list)
{
//图框尺寸
if (tntmp.Coord.X > origin_k.X && tntmp.Coord.X < origin_k.X + 18000 / 304.8 &&
tntmp.Coord.Y > origin_k.Y - 48700 / 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);
}
}
TextNote zkbh_tn = Textnote_At_Point(origin_k + new XYZ(2000 / 304.8, -3550 / 304.8, 0), textnote_k_list); //钻孔编号
TextNote kkbg_tn = Textnote_At_Point(origin_k + new XYZ(2600 / 304.8, -5400 / 304.8, 0), textnote_k_list); //孔口标高
TextNote x_tn = Textnote_At_Point(origin_k + new XYZ(5970 / 304.8, -4426 / 304.8, 0), textnote_k_list); //孔口X
TextNote y_tn = Textnote_At_Point(origin_k + new XYZ(5970 / 304.8, -5413 / 304.8, 0), textnote_k_list); //孔口Y
test = zkbh_tn.Text;
//归并类似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) < 300 / 304.8 &&
Math.Abs(tntmp1.Coord.Y - tntmp2.Coord.Y) < 50 / 304.8 &&
Math.Abs(tntmp1.Height - tntmp2.Height) > 0.001)
{
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> dcgc_list = new List<TextNote>(); //地层高程(层底)
List<double> dcgc_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)
{
dcgc_list.Add(tntmp);
dcgc_Y_list.Add(tntmp.Coord.Y);
}
}
dcbh_Y_list.Sort();
dcbh_Y_list.Reverse(); //从高到低
dcgc_Y_list.Sort();
dcgc_Y_list.Reverse(); //从高到低
//MessageBox.Show(dcgc_list[0].Text + "\n" + dcgc_list[1].Text + "\n" + dcgc_list[2].Text + "\n" + dcgc_list[3].Text + "\n" + dcgc_list[4].Text + "\n" + dcgc_list[5].Text + "\n" + dcgc_list[6].Text + "\n" + dcgc_list[7].Text , "向日葵", MessageBoxButtons.OK);
//MessageBox.Show(k + "\n" + zkbh_tn.Text + "\n" + dcbh_Y_list.Count + "\n" + dcgc_Y_list.Count, "向日葵", MessageBoxButtons.OK);
for (int i = 0; i < dcbh_list.Count; i++)
{
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 dcgc_list)
{
if (tn.Coord.Y == dcgc_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" + "fail" + "\n" + test, "向日葵", 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(p) < 200 / 304.8)
{
tn = tntmp;
}
}
return tn;
}
}
public class FailureHandler : IFailuresPreprocessor
{
public string ErrorMessage { set; get; }
public string ErrorSeverity { set; get; }
public FailureHandler()
{
ErrorMessage = "";
ErrorSeverity = "";
}
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
IList<FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages();
foreach (FailureMessageAccessor failureMessageAccessor in failureMessages)
{
FailureDefinitionId id = failureMessageAccessor.GetFailureDefinitionId();
try
{
ErrorMessage = failureMessageAccessor.GetDescriptionText();
}
catch
{
ErrorMessage = "Unknown Error";
}
try
{
FailureSeverity failureSeverity = failureMessageAccessor.GetSeverity();
ErrorSeverity = failureSeverity.ToString();
if (failureSeverity == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(failureMessageAccessor);
}
else
{
failuresAccessor.ResolveFailure(failureMessageAccessor);
return FailureProcessingResult.ProceedWithCommit;
}
}
catch
{ }
}
return FailureProcessingResult.Continue;
}
}
}