476 lines
20 KiB
C#
476 lines
20 KiB
C#
using Autodesk.Revit.DB;
|
||
using Autodesk.Revit.DB.Structure;
|
||
using Autodesk.Revit.UI;
|
||
using Microsoft.Win32;
|
||
using NPOI.HSSF.UserModel;
|
||
using NPOI.SS.UserModel;
|
||
using NPOI.XSSF.UserModel;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Data;
|
||
using System.Windows.Documents;
|
||
using System.Windows.Input;
|
||
using System.Windows.Media;
|
||
using System.Windows.Media.Imaging;
|
||
using System.Windows.Navigation;
|
||
using System.Windows.Shapes;
|
||
|
||
namespace CivilModelCreator
|
||
{
|
||
/// <summary>
|
||
/// WpfCivilCreator.xaml 的交互逻辑
|
||
/// </summary>
|
||
public partial class WpfCivilCreator
|
||
{
|
||
Document doc;
|
||
Autodesk.Revit.ApplicationServices.Application app;
|
||
IWorkbook workbook = null;
|
||
DataTable dt = new DataTable();
|
||
string famPath;
|
||
Family fam;
|
||
Document famdoc;
|
||
public WpfCivilCreator(Autodesk.Revit.ApplicationServices.Application app, Document doc)
|
||
{
|
||
this.doc = doc;
|
||
this.app = app;
|
||
|
||
InitializeComponent();
|
||
}
|
||
|
||
private void BtnExcelPath_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
string filter = "读取Excel(*.xlsx;*.xls)|*.xlsx;*.xls";
|
||
OpenFileDialog openDialog = new OpenFileDialog();
|
||
openDialog.Filter = filter;
|
||
openDialog.Title = "选择Excel文件";
|
||
if (openDialog.ShowDialog() == true)
|
||
{
|
||
var path = openDialog.FileName;
|
||
if (path != null)
|
||
{
|
||
tbExcelPath.Text = path;
|
||
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
|
||
{
|
||
if (path.IndexOf(".xlsx") > 0) // 2007版本
|
||
workbook = new XSSFWorkbook(fs);
|
||
else if (path.IndexOf(".xls") > 0) // 2003版本
|
||
workbook = new HSSFWorkbook(fs);
|
||
}
|
||
int SheetCount = workbook.NumberOfSheets;
|
||
List<string> sheetli = new List<string>();
|
||
for (int i = 0; i < SheetCount; i++)
|
||
{
|
||
sheetli.Add(workbook.GetSheetName(i));
|
||
}
|
||
CBSheetName.ItemsSource = sheetli;
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
private void BtnCreater_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
ModelType mt = new ModelType();
|
||
Level level = null;
|
||
IList<Element> levels = new FilteredElementCollector(doc).OfClass(typeof(Level)).ToElements();
|
||
foreach (Level l in levels)
|
||
{
|
||
if (l.Name == "标高 1")
|
||
{
|
||
level = l;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (CBType.SelectedItem != null && CBSheetName.SelectedItem != null)
|
||
{
|
||
mt = (ModelType)CBType.SelectedIndex;
|
||
switch (mt)
|
||
{
|
||
case ModelType.墙:
|
||
|
||
break;
|
||
case ModelType.梁:
|
||
//PlaceBeam();
|
||
break;
|
||
case ModelType.板:
|
||
if (tbExcelPath != null)
|
||
{
|
||
PlaceFloors(level);
|
||
}
|
||
break;
|
||
case ModelType.柱:
|
||
if (tbExcelPath != null && tbRfaPath != null)
|
||
{
|
||
//ColumnAddParas(famPath);
|
||
PlaceColumns(level);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
private CurveArray Skeptch(double x, double y, double l, double w)
|
||
{
|
||
XYZ cp = new XYZ(x, y, 0);
|
||
XYZ p1 = new XYZ(x - l / 2, y + w / 2, 0);
|
||
XYZ p2 = new XYZ(x + l / 2, y + w / 2, 0);
|
||
XYZ p3 = new XYZ(x + l / 2, y - w / 2, 0);
|
||
XYZ p4 = new XYZ(x - l / 2, y - w / 2, 0);
|
||
Autodesk.Revit.DB.Line line1 = Autodesk.Revit.DB.Line.CreateBound(p1, p2);
|
||
Autodesk.Revit.DB.Line line2 = Autodesk.Revit.DB.Line.CreateBound(p2, p3);
|
||
Autodesk.Revit.DB.Line line3 = Autodesk.Revit.DB.Line.CreateBound(p3, p4);
|
||
Autodesk.Revit.DB.Line line4 = Autodesk.Revit.DB.Line.CreateBound(p4, p1);
|
||
CurveArray skeptch = new CurveArray();
|
||
skeptch.Append(line1);
|
||
skeptch.Append(line2);
|
||
skeptch.Append(line3);
|
||
skeptch.Append(line4);
|
||
return skeptch;
|
||
}
|
||
private void PlaceFloors(Level level)
|
||
{
|
||
var fts = new FilteredElementCollector(doc).OfClass(typeof(FloorType));
|
||
FloorType defft = (FloorType)(new FilteredElementCollector(doc).OfClass(typeof(FloorType)).FirstOrDefault());
|
||
|
||
//Hashtable fts = new Hashtable();
|
||
using (Transaction trans = new Transaction(doc, "布置板"))
|
||
{
|
||
trans.Start();
|
||
for (int r = 1; r < dt.Rows.Count; r++)
|
||
{
|
||
//string typeName = dt.Rows[r][1].ToString();
|
||
//ft = fts[typeName] as FloorType;
|
||
FloorType ft = null;
|
||
try
|
||
{
|
||
ft = (FloorType)defft.Duplicate(dt.Rows[r][1].ToString());
|
||
}
|
||
catch (Exception)
|
||
{
|
||
foreach (FloorType f in fts)
|
||
{
|
||
if (f.Name == dt.Rows[r][1].ToString())
|
||
{
|
||
ft = f;
|
||
}
|
||
}
|
||
}
|
||
finally
|
||
{
|
||
|
||
double x = Convert.ToDouble(dt.Rows[r][6]) * 1000 / 304.8;
|
||
double y = Convert.ToDouble(dt.Rows[r][7]) * 1000 / 304.8;
|
||
double l = Convert.ToDouble(dt.Rows[r][8]) * 1000 / 304.8 ;
|
||
double w = Convert.ToDouble(dt.Rows[r][9]) * 1000 / 304.8;
|
||
double h = Convert.ToDouble(dt.Rows[r][10]) * 1000 / 304.8;
|
||
double t = (Convert.ToDouble(dt.Rows[r][10]) - Convert.ToDouble(dt.Rows[r][5])) * 1000 / 304.8;
|
||
Floor f = doc.Create.NewFloor(Skeptch(x, y, l, w), ft, level, true);
|
||
|
||
var le = f.get_Parameter(BuiltInParameter.LEVEL_PARAM).Set(level.Id);
|
||
var of = f.get_Parameter(BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM).Set(h);
|
||
}
|
||
//var thick = f.get_Parameter(BuiltInParameter.FLOOR_ATTR_DEFAULT_THICKNESS_PARAM).Set(t);
|
||
}
|
||
trans.Commit();
|
||
}
|
||
}
|
||
private void PlaceBraces(Autodesk.Revit.DB.UV point2D1, Autodesk.Revit.DB.UV point2D2, Level baseLevel, Level topLevel, FamilySymbol braceType, bool isXDirection)
|
||
{
|
||
//get the start points and end points of location lines of two braces
|
||
double topHeight = topLevel.Elevation;
|
||
double baseHeight = baseLevel.Elevation;
|
||
double middleElevation = (topHeight + baseHeight) / 2;
|
||
double middleHeight = (topHeight - baseHeight) / 2;
|
||
Autodesk.Revit.DB.XYZ startPoint = new Autodesk.Revit.DB.XYZ(point2D1.U, point2D1.V, middleElevation);
|
||
Autodesk.Revit.DB.XYZ endPoint = new Autodesk.Revit.DB.XYZ(point2D2.U, point2D2.V, middleElevation);
|
||
Autodesk.Revit.DB.XYZ middlePoint;
|
||
|
||
if (isXDirection)
|
||
{
|
||
middlePoint = new Autodesk.Revit.DB.XYZ((point2D1.U + point2D2.U) / 2, point2D2.V, topHeight);
|
||
}
|
||
else
|
||
{
|
||
middlePoint = new Autodesk.Revit.DB.XYZ(point2D2.U, (point2D1.V + point2D2.V) / 2, topHeight);
|
||
}
|
||
|
||
//create two brace and set their location line
|
||
StructuralType structuralType = StructuralType.Brace;
|
||
Autodesk.Revit.DB.ElementId levelId = topLevel.Id;
|
||
Autodesk.Revit.DB.ElementId startLevelId = baseLevel.Id;
|
||
Autodesk.Revit.DB.ElementId endLevelId = topLevel.Id;
|
||
|
||
Autodesk.Revit.DB.Line line1 = Autodesk.Revit.DB.Line.CreateBound(startPoint, middlePoint);
|
||
if (!braceType.IsActive)
|
||
braceType.Activate();
|
||
FamilyInstance firstBrace = doc.Create.NewFamilyInstance(line1, braceType, baseLevel, structuralType);
|
||
|
||
Parameter referenceLevel1 = firstBrace.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);
|
||
if (null != referenceLevel1)
|
||
{
|
||
referenceLevel1.Set(levelId);
|
||
}
|
||
|
||
Autodesk.Revit.DB.Line line2 = Autodesk.Revit.DB.Line.CreateBound(endPoint, middlePoint);
|
||
FamilyInstance secondBrace = doc.Create.NewFamilyInstance(line2, braceType, baseLevel, structuralType);
|
||
|
||
Parameter referenceLevel2 = secondBrace.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);
|
||
if (null != referenceLevel2)
|
||
{
|
||
referenceLevel2.Set(levelId);
|
||
}
|
||
}
|
||
|
||
private void PlaceBeams(Autodesk.Revit.DB.UV point2D1, Autodesk.Revit.DB.UV point2D2, Level baseLevel, Level topLevel, FamilySymbol beamType)
|
||
{
|
||
double height = topLevel.Elevation;
|
||
Autodesk.Revit.DB.XYZ startPoint = new Autodesk.Revit.DB.XYZ(point2D1.U, point2D1.V, height);
|
||
Autodesk.Revit.DB.XYZ endPoint = new Autodesk.Revit.DB.XYZ(point2D2.U, point2D2.V, height);
|
||
Autodesk.Revit.DB.ElementId topLevelId = topLevel.Id;
|
||
|
||
Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(startPoint, endPoint);
|
||
StructuralType structuralType = Autodesk.Revit.DB.Structure.StructuralType.Beam;
|
||
if (!beamType.IsActive)
|
||
beamType.Activate();
|
||
doc.Create.NewFamilyInstance(line, beamType, topLevel, structuralType);
|
||
}
|
||
|
||
private void PlaceColumns(Level level)
|
||
{
|
||
//FilteredElementCollector col = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).OfClass(typeof(Family));
|
||
using (Transaction trans = new Transaction(doc, "布置柱"))
|
||
{
|
||
trans.Start();
|
||
ISet<ElementId> ids = fam.GetFamilySymbolIds();
|
||
//FamilySymbol familysy = doc.GetElement(fam.GetFamilySymbolIds().TakeWhile) as FamilySymbol
|
||
for (int i = 1; i < dt.Rows.Count; i++)
|
||
{
|
||
for (int j = 0; j < ids.Count; j++)
|
||
{
|
||
FamilySymbol fs = (FamilySymbol)doc.GetElement(ids.ElementAt(j));
|
||
if (!fs.IsActive)
|
||
fs.Activate();//设为Activate状态
|
||
if (fs != null && fs.Name == dt.Rows[i][1].ToString())
|
||
{
|
||
double x = Convert.ToDouble(dt.Rows[i][6]) * 1000 / 304.8;
|
||
double y = Convert.ToDouble(dt.Rows[i][7]) * 1000 / 304.8;
|
||
double z = Convert.ToDouble(dt.Rows[i][5]) * 1000 / 304.8;
|
||
double z0 = Convert.ToDouble(dt.Rows[i][10]) * 1000 / 304.8;
|
||
XYZ p = new XYZ(x, y, z);
|
||
FamilyInstance fi = doc.Create.NewFamilyInstance(p, fs, level, Autodesk.Revit.DB.Structure.StructuralType.Column);
|
||
fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM).Set(level.Id);
|
||
fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM).Set(level.Id);
|
||
fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM).Set(z);
|
||
fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).Set(z0);
|
||
|
||
//ColumnAttachment.AddColumnAttachment(doc, fi, level, 0, ColumnAttachmentCutStyle.None, ColumnAttachmentJustification.Minimum, z);
|
||
|
||
//ColumnAttachment.AddColumnAttachment(doc, fi, level, 0, ColumnAttachmentCutStyle.None, ColumnAttachmentJustification.Tangent, z0);
|
||
|
||
for (int k = 2; k < dt.Columns.Count; k++)
|
||
{
|
||
var para = fi.LookupParameter(dt.Columns[k].ToString());
|
||
para.Set(dt.Rows[i][k].ToString());
|
||
}
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
//MessageBox.Show("不存在此类型的族。");
|
||
}
|
||
}
|
||
}
|
||
trans.Commit();
|
||
}
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="isFirstRowColumn"></param>
|
||
/// <returns></returns>
|
||
private DataTable ExcelToDataTable(bool isFirstRowColumn)
|
||
{
|
||
ISheet sheet = null;
|
||
DataTable data = new DataTable();
|
||
int startRow = 0;
|
||
//IWorkbook workbook = null;
|
||
string sheetName = CBSheetName.SelectedValue.ToString();
|
||
if (sheetName != null)
|
||
{
|
||
sheet = workbook.GetSheet(sheetName);
|
||
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
|
||
{
|
||
sheet = workbook.GetSheetAt(0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sheet = workbook.GetSheetAt(0);
|
||
}
|
||
if (sheet != null)
|
||
{
|
||
IRow firstRow = sheet.GetRow(0);
|
||
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
|
||
if (isFirstRowColumn)
|
||
{
|
||
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
|
||
{
|
||
ICell cell = firstRow.GetCell(i);
|
||
if (cell != null)
|
||
{
|
||
string cellValue = "";
|
||
switch (cell.CellType)
|
||
{
|
||
case NPOI.SS.UserModel.CellType.Unknown:
|
||
cellValue = "Unknown";
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.Numeric:
|
||
cellValue = cell.NumericCellValue.ToString();
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.String:
|
||
cellValue = cell.StringCellValue;
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.Formula:
|
||
cellValue = cell.CellFormula.ToString();
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.Blank:
|
||
cellValue = "";
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.Boolean:
|
||
cellValue = cell.BooleanCellValue.ToString();
|
||
break;
|
||
case NPOI.SS.UserModel.CellType.Error:
|
||
cellValue = "Error";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
if (cellValue != null)
|
||
{
|
||
DataColumn column = new DataColumn(cellValue);
|
||
data.Columns.Add(column);
|
||
}
|
||
}
|
||
}
|
||
startRow = sheet.FirstRowNum + 1;
|
||
}
|
||
else
|
||
{
|
||
startRow = sheet.FirstRowNum;
|
||
}
|
||
|
||
//最后一列的标号
|
||
//int rowCount = sheet.LastRowNum;
|
||
int rowCount = sheet.PhysicalNumberOfRows;
|
||
for (int i = startRow; i <= rowCount; ++i)
|
||
{
|
||
IRow row = sheet.GetRow(i);
|
||
if (row == null)
|
||
{
|
||
continue; //没有数据的行默认是null
|
||
}
|
||
|
||
DataRow dataRow = data.NewRow();
|
||
for (int j = row.FirstCellNum; j < cellCount; ++j)
|
||
{
|
||
if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
|
||
{
|
||
dataRow[j] = row.GetCell(j).ToString();
|
||
}
|
||
}
|
||
data.Rows.Add(dataRow);
|
||
}
|
||
|
||
}
|
||
return data;
|
||
}
|
||
|
||
private void CBSheetName_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||
{
|
||
if (CBSheetName.SelectedItem != null)
|
||
{
|
||
|
||
dt = ExcelToDataTable(true);
|
||
dataGrid.ItemsSource = dt.DefaultView;
|
||
}
|
||
}
|
||
|
||
private void BtnRfaPath_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
string filter = "载入族文件(*.rfa)|*.rfa";
|
||
OpenFileDialog openDialog = new OpenFileDialog();
|
||
openDialog.Filter = filter;
|
||
openDialog.Title = "选择族文件";
|
||
if (openDialog.ShowDialog() == true)
|
||
{
|
||
famPath = openDialog.FileName;
|
||
if (famPath != null)
|
||
{
|
||
tbRfaPath.Text = famPath;
|
||
}
|
||
}
|
||
}
|
||
|
||
private void ColumnAddParas(string path)
|
||
{
|
||
famdoc = app.OpenDocumentFile(path);
|
||
//Document famdoc = app.OpenDocumentFile(path);
|
||
|
||
if (famdoc.IsFamilyDocument)
|
||
{
|
||
using (Transaction trans = new Transaction(famdoc))
|
||
{
|
||
trans.Start("新建族类型、参数");
|
||
|
||
FamilyManager fm = famdoc.FamilyManager;
|
||
for (int i = 1; i < dt.Rows.Count; i++)
|
||
{
|
||
try
|
||
{
|
||
FamilyType ft = fm.NewType(dt.Rows[i][1].ToString());
|
||
fm.CurrentType = ft;
|
||
foreach (FamilyParameter para in fm.Parameters)
|
||
{
|
||
//设置结构柱b
|
||
if (para.Definition.Name == "b")
|
||
{
|
||
fm.Set(para, Convert.ToDouble(dt.Rows[i][8]) * 1000 / 304.8);
|
||
}
|
||
//设置结构柱h
|
||
if (para.Definition.Name == "h")
|
||
{
|
||
fm.Set(para, Convert.ToDouble(dt.Rows[i][9]) * 1000 / 304.8);
|
||
}
|
||
|
||
ft.AsDouble(para);
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
for (int colindex = 2; colindex < dt.Columns.Count; colindex++)
|
||
{
|
||
FamilyParameter fp = fm.AddParameter(dt.Columns[colindex].ToString(), BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES, ParameterType.Text, true);
|
||
}
|
||
trans.Commit();
|
||
fam = famdoc.LoadFamily(doc);
|
||
famdoc.Close(false);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|