学了一阵二开的课程,有一点点心得,把课程作业大概做出个样板出来:
使用结构样板,先创建好相交的轴网,然后执行,可生成结构柱里面的第一个混凝土矩形柱.并把轴网的相交的名称附值进"注释"内.
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ElementCUD
{
[Transaction(TransactionMode.Manual)]
class CreateColumn : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var doc = commandData.Application.ActiveUIDocument.Document;
var uidoc = commandData.Application.ActiveUIDocument;
try
{
var tran = new Transaction(doc, "创建柱");
tran.Start();
#region 找出交点
var gridList = (from element in new FilteredElementCollector(doc).OfClass(typeof(Grid)) select element as Grid).ToList();
List<Line> gridCurveList = new List<Line>();
foreach (Grid item in gridList)
{
var gridCurve = item.Curve as Line;
gridCurveList.Add(gridCurve);
}
List<XYZ> intersetionPointsList = new List<XYZ>();
List<string> intersetionName = new List<string>();
string numName;
string codeName;
for (int i = 0; i < gridCurveList.Count; i++)
{
numName = gridList[i].Name.ToString();
for (int j = i + 1; j < gridCurveList.Count; j++)
{
if (!(gridCurveList[i].Direction.CrossProduct(gridCurveList[j].Direction)).IsAlmostEqualTo(XYZ.Zero))
{
IntersectionResultArray intersectionPoint = new IntersectionResultArray();
var result = gridCurveList[i].Intersect(gridCurveList[j], out intersectionPoint);
if (result == SetComparisonResult.Overlap)
{
var point = intersectionPoint.get_Item(0).XYZPoint;
intersetionPointsList.Add(point);
codeName = numName + gridList[j].Name.ToString();
intersetionName.Add(codeName);
}
}
}
}
#endregion
#region 生成柱
var symbolList = (from ele in new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol))
let symb = ele as FamilySymbol
where symb.Category.Name == "结构柱" && symb.FamilyName.Contains("矩形")
select symb).ToList();
FamilySymbol symbol = symbolList?.FirstOrDefault();
if (!symbol.IsActive) symbol.Activate();
var levelList = (from ele in new FilteredElementCollector(doc).OfClass(typeof(Level))
let le = ele as Level
where le.Name == "标高 1"
select le).ToList();
var level = levelList?.FirstOrDefault();
for (int i = 0; i < intersetionPointsList.Count; i++)
{
XYZ location = intersetionPointsList[i];
var column = doc.Create.NewFamilyInstance(location, symbol, level, StructuralType.Beam);
column.LookupParameter("注释").Set(intersetionName[i]);
}
tran.Commit();
#endregion
// TaskDialog.Show("revit", intersetionPointsList.Count().ToString());测试下有多少个交点
}
catch (Exception E)
{
TaskDialog.Show("revit", E.ToString());
}
return Result.Succeeded;
}
}
}