我们知道,手工创建一条带颜色的线过程如下:
- 新建族,例如,使用模板“Generic Annotation.rft”
- 点击菜单“创建” > “直线”,画一条线
- 选中该线,“管理” > ”对象样式",可以看见里面有多个类别
- 选中“常规注释”,修改子类别的“新建”按钮高亮,点击“新建”,新建一个子类别,并设置颜色和线宽
- 关闭窗口,再次选择该线
- 在“修改|线”,子类别下面的多选框中就出现了我们新建的子类别,可以选择它。至此带颜色的线创建完成。
那么这个过程在API中应该怎么实现呢?
- 首先,我们画的线是DetailLine,所以,应该使用Document.FamilyCreate.NewDetailCurve方法来创建。
- 而设置线形可以使用DetailLine.LineStyle属性。
- 创建子类别使用Categories.NewSubcategory(Category parentCategory, string name)方法。
- 目前唯一的问题就剩下NewSubcategory里面的参数parentCategory是什么了。
这里可以借助RevitLookup工具,既然该线有LineSylte属性,我们就不妨看看它自己的Category是什么,选中线,执行RevitLookup > Snoop Current Selection...:
这里OST_GenericAnnotation对应的就是上一张图中的“常规注释”了,所以,通过Categories.get_Item(BuiltInCategory.OST_GenericAnnotation)就能获得该类别了。
综上,代码如下,注意把它放到Transaction里面执行:
public void CreateSubCategoryAndDetailLine(Document doc)
{
var categories = doc.Settings.Categories;
var subCategoryName = "MySubCategory";
Category category = doc.Settings.Categories.
get_Item(BuiltInCategory.OST_GenericAnnotation);
Category subCategory = null;
if (!category.SubCategories.Contains(subCategoryName))
{
subCategory = categories.NewSubcategory(category,
subCategoryName);
var newcolor = new Color(250, 10, 0);
subCategory.LineColor = newcolor;
subCategory.SetLineWeight(10, GraphicsStyleType.Projection);
}
else
subCategory = category.SubCategories.get_Item(subCategoryName);
Line newLine = Line.CreateBound(
new XYZ(0, 1, 0), new XYZ(-1, 0, 0));
var detailLine = doc.FamilyCreate.NewDetailCurve(
doc.ActiveView, newLine);
detailLine.LineStyle = subCategory.GetGraphicsStyle(
GraphicsStyleType.Projection);
}
执行的结果: