Revit二次开发之“创建尺寸标注”
运行该命令,选中一个可标注的对象,即实现标注。
from:http://revit.5d6d.com/thread-866-1-4.html
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
public class TestCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
Document doc = uiDoc.Document;
Autodesk.Revit.DB.View view = doc.ActiveView;
ViewType vt = view.ViewType;
if (vt == ViewType.FloorPlan || vt == ViewType.Elevation)
{
Reference eRef = uiDoc.Selection.PickObject(ObjectType.Element, "Please pick a curve based element like wall.");
if (eRef != null && eRef.Element != null)
{
XYZ dirVec = new XYZ();
XYZ viewNormal = view.ViewDirection;
LocationCurve locCurve = eRef.Element.Location as LocationCurve;
if (locCurve == null || locCurve.Curve == null)
{
TaskDialog.Show("Prompt", "Selected element isn’t curve based!");
return Result.Cancelled;
}
// location curve needs to be perpendicular to view normal
XYZ dirCur = locCurve.Curve.get_EndPoint(0).Subtract(locCurve.Curve.get_EndPoint(1)).Normalize();
double d = dirCur.DotProduct(viewNormal);
if (d > -0.000000001 && d < 0.000000001)
{
dirVec = dirCur.CrossProduct(viewNormal);
XYZ p1 = locCurve.Curve.get_EndPoint(0);
XYZ p2 = locCurve.Curve.get_EndPoint(1);
XYZ dirLine = XYZ.Zero.Add(p1);
XYZ newVec = XYZ.Zero.Add(dirVec);
newVec = newVec.Normalize().Multiply(3);
dirLine = dirLine.Subtract(p2);
p1 = p1.Add(newVec);
p2 = p2.Add(newVec);
// move the dimension line a little away the element’s curve
Line newLine = app.Create.NewLine(p1, p2, true);
ReferenceArray arrRefs = new ReferenceArray();
Options options = app.Create.NewGeometryOptions();
options.ComputeReferences = true;
options.DetailLevel = DetailLevels.Fine;
GeometryElement element = eRef.Element.get_Geometry(options);
GeometryObjectArray geoObjectArray = element.Objects;
//enum the geometry element
for (int j = 0; j < geoObjectArray.Size; j++)
{
GeometryObject geoObject = geoObjectArray.get_Item(j);
Solid solid = geoObject as Solid;
if (solid == null)
continue;
FaceArrayIterator fIt = solid.Faces.ForwardIterator();
while (fIt.MoveNext())
{
PlanarFace p = fIt.Current as PlanarFace;
if (p == null)
continue;
p2 = p.Normal.CrossProduct(dirLine);
if (p2.IsZeroLength())
{
arrRefs.Append(p.Reference);
}
if (2 == arrRefs.Size)
{
break;
}
}
if (2 == arrRefs.Size)
{
break;
}
}
if (arrRefs.Size != 2)
{
TaskDialog.Show("Prompt", "Couldn’t find enough reference for creating dimension");
return Result.Cancelled;
}
Transaction trans = new Transaction(doc, "create dimension");
trans.Start();
doc.Create.NewDimension(doc.ActiveView, newLine, arrRefs);
trans.Commit();
}
else
{
TaskDialog.Show("Prompt", "Selected element isn’t curve based!");
return Result.Cancelled;
}
}
}
else
{
TaskDialog.Show("Prompt", "Only support Plan View or Elevation View");
}
return Result.Succeeded;
}
}
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
public class TestCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
Document doc = uiDoc.Document;
Autodesk.Revit.DB.View view = doc.ActiveView;
ViewType vt = view.ViewType;
if (vt == ViewType.FloorPlan || vt == ViewType.Elevation)
{
Reference eRef = uiDoc.Selection.PickObject(ObjectType.Element, "Please pick a curve based element like wall.");
if (eRef != null && eRef.Element != null)
{
XYZ dirVec = new XYZ();
XYZ viewNormal = view.ViewDirection;
LocationCurve locCurve = eRef.Element.Location as LocationCurve;
if (locCurve == null || locCurve.Curve == null)
{
TaskDialog.Show("Prompt", "Selected element isn’t curve based!");
return Result.Cancelled;
}
// location curve needs to be perpendicular to view normal
XYZ dirCur = locCurve.Curve.get_EndPoint(0).Subtract(locCurve.Curve.get_EndPoint(1)).Normalize();
double d = dirCur.DotProduct(viewNormal);
if (d > -0.000000001 && d < 0.000000001)
{
dirVec = dirCur.CrossProduct(viewNormal);
XYZ p1 = locCurve.Curve.get_EndPoint(0);
XYZ p2 = locCurve.Curve.get_EndPoint(1);
XYZ dirLine = XYZ.Zero.Add(p1);
XYZ newVec = XYZ.Zero.Add(dirVec);
newVec = newVec.Normalize().Multiply(3);
dirLine = dirLine.Subtract(p2);
p1 = p1.Add(newVec);
p2 = p2.Add(newVec);
// move the dimension line a little away the element’s curve
Line newLine = app.Create.NewLine(p1, p2, true);
ReferenceArray arrRefs = new ReferenceArray();
Options options = app.Create.NewGeometryOptions();
options.ComputeReferences = true;
options.DetailLevel = DetailLevels.Fine;
GeometryElement element = eRef.Element.get_Geometry(options);
GeometryObjectArray geoObjectArray = element.Objects;
//enum the geometry element
for (int j = 0; j < geoObjectArray.Size; j++)
{
GeometryObject geoObject = geoObjectArray.get_Item(j);
Solid solid = geoObject as Solid;
if (solid == null)
continue;
FaceArrayIterator fIt = solid.Faces.ForwardIterator();
while (fIt.MoveNext())
{
PlanarFace p = fIt.Current as PlanarFace;
if (p == null)
continue;
p2 = p.Normal.CrossProduct(dirLine);
if (p2.IsZeroLength())
{
arrRefs.Append(p.Reference);
}
if (2 == arrRefs.Size)
{
break;
}
}
if (2 == arrRefs.Size)
{
break;
}
}
if (arrRefs.Size != 2)
{
TaskDialog.Show("Prompt", "Couldn’t find enough reference for creating dimension");
return Result.Cancelled;
}
Transaction trans = new Transaction(doc, "create dimension");
trans.Start();
doc.Create.NewDimension(doc.ActiveView, newLine, arrRefs);
trans.Commit();
}
else
{
TaskDialog.Show("Prompt", "Selected element isn’t curve based!");
return Result.Cancelled;
}
}
}
else
{
TaskDialog.Show("Prompt", "Only support Plan View or Elevation View");
}
return Result.Succeeded;
}
}
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。