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

195 lines
8.8 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections;
using System.Windows.Forms;
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.DB.Structure;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using uBIM_EarthTools;
using TriangleNet;
namespace uBIM_EarthTools
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
class GeologyCylinder : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
string pathstring;
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择Excel文件…";
//openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//桌面路径 //注意这里写路径时要用c:\\而不是c:\
openFileDialog.Filter = "文本文件|*.xls";
openFileDialog.RestoreDirectory = false;
openFileDialog.FilterIndex = 1;
if (openFileDialog.ShowDialog() == DialogResult.OK)
pathstring = openFileDialog.FileName;
else
return Result.Cancelled;
List<Borehole> boreholeList = ExcelHelper.GetDataFromExcel(pathstring);
List<string> typesList = ExcelHelper.GetGeologyType(pathstring).Select(x => "地质" + x.Key + "-" + x.Value + "层").ToList();
TransactionStatus status = TransactionStatus.Uninitialized;
TransactionGroup transGroup = new TransactionGroup(doc, "地质钻孔圆柱建模");
if (transGroup.Start() == TransactionStatus.Started)
{
Transaction transaction = new Transaction(doc);
FailureHandlingOptions failureHandlingOptions = transaction.GetFailureHandlingOptions();
FailureHandler failureHandler = new FailureHandler();
failureHandlingOptions.SetFailuresPreprocessor(failureHandler);
failureHandlingOptions.SetClearAfterRollback(true);
transaction.SetFailureHandlingOptions(failureHandlingOptions);
#region ,
IEnumerable<Element> familys = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_GenericModel)
.OfClass(typeof(FamilySymbol)).Where(x => x.Name == "地质钻孔圆柱");
if (!familys.Any())
{
transaction.Start("Load Family");
byte[] bit = uBIM_EarthTools.Resource. as byte[];
string filepath = AppConfig.APP_TEMP_PATH + "\\地质钻孔圆柱.rfa";
File.WriteAllBytes(filepath, bit);
doc.LoadFamily(filepath);
File.Delete(filepath);
transaction.Commit();
}
Family family = (new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_GenericModel).OfClass(typeof(FamilySymbol))
.Where(x => x.Name == "地质钻孔圆柱").First() as FamilySymbol).Family;
Autodesk.Revit.DB.Document fdoc = doc.EditFamily(family);
Transaction trans = new Transaction(fdoc);
trans.Start("Create FamilySymbol");
if (null != fdoc)
{
FamilyManager fm = fdoc.FamilyManager;
foreach (string type in typesList)
{
try
{
FamilyType ft = fm.NewType(type);
}
catch
{
}
}
}
trans.Commit();
LoadOpts loadOptions = new LoadOpts();
family = fdoc.LoadFamily(doc, loadOptions);
#endregion
#region
IList<Element> mtset = new FilteredElementCollector(doc)
.WherePasses(new ElementClassFilter(typeof(Material))).ToElements();
transaction.Start("Create Material");
foreach (string Type in typesList)
{
if (mtset.Select(x => x.Name).ToList().Contains(Type))
continue;
else
{
Material material = CreateMaterial(doc, Type, false);
Random randomNumFirst = new Random((int)DateTime.Now.Ticks);
System.Threading.Thread.Sleep(randomNumFirst.Next(50));
Random randomNumSencond = new Random((int)DateTime.Now.Ticks);
int intRed = randomNumFirst.Next(256);
int intGreen = randomNumSencond.Next(256);
int intBlue = (intRed + intGreen > 400) ? 0 : 400 - intRed - intGreen;
intBlue = (intBlue > 255) ? 255 : intBlue;
material.Color = new Color((byte)intRed, (byte)intGreen, (byte)intBlue);
material.MaterialClass = "地质材质";
mtset.Add(material);
}
}
transaction.Commit();
#endregion
int count = 0;
boreholeList.ForEach(x => count += x.ValueList.Count);
#region
using (FilterProgressForm prf1 = new FilterProgressForm("生成", "{0} of " + count.ToString(), count))
{
transaction.Start("Create FamilyInstance");
foreach (Borehole borehole in boreholeList)
{
for (int i = 1; i < borehole.ValueList.Count; i++)
{
GeologyLayer geologyLayer = borehole.ValueList[i];
FamilySymbol familySymbol = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_GenericModel).OfClass(typeof(FamilySymbol))
.First(x => x.Name == geologyLayer.Type) as FamilySymbol;
if (!familySymbol.IsActive)
{
familySymbol.Activate();
}
FamilyInstance familyInstance = doc.Create.NewFamilyInstance(geologyLayer.Point, familySymbol,
StructuralType.NonStructural);
familyInstance.LookupParameter("深度")
.Set(borehole.ValueList[i - 1].Point.Z - geologyLayer.Point.Z);
familyInstance.LookupParameter("材质")
.Set(mtset.First(x => x.Name == familyInstance.Name).Id);
familyInstance.LookupParameter("孔号").Set(borehole.Name);
if (prf1.progressBar1.Tag.ToString() == "Cancel")
break;
prf1.Increment();
System.Windows.Forms.Application.DoEvents();
}
}
}
transaction.Commit();
#endregion
}
status = transGroup.Assimilate();
return Result.Succeeded;
}
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("uBIM", 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;
}
}
}